Setting up a development environment

Published on 02 November 2025
3 min read
systemd
workflow
development
Setting up a development environment

Setting up a system

Recently I was helping a friend over discord set-up a new system. Don’t get me wrong, setting up a new system can be intense; there are so many rabbit holes to go down. I figured that I would share my thoughts and experiences on setting up a system for general use. I guess general use also includes

  • Listening to music
  • Managing emails
  • Watching movies
  • Writing code
  • (Insert your favourite pastime here)

And I found myself doing a few common things. I’ll be going over those things in this post.

Selecting a display server

I don’t really have too much to say on this, as I’ve only ever really used X for managing a display daemon. If you’d like to learn more about X, see this excellent post by Marco Antonion Carcano.

Starting a display server will basically execute whatever you have in your ~/.xinitrc file which is basically a “fancy shell script”. In it, you can put what you want, but the most important thing, is to make sure that you have this at the bottom of it:

sh
exec /usr/bin/your_display_manager_goes_here

Setting up a wallpaper

The first step to truly making a system yours is to select a wallpaper. Honestly there’s no judgement here, whatever looks good to you. If you’ll recall the ~/.xinitrc file, you’ll want to put the program that sets your wallpaper above executing your window manager.

There are 2 really decent wallpaper ‘setters’ that I know of as of this moment.

  1. xwallpaper - A minimal wallpaper setter designed to be used with X.
  2. feh - A more general image viewer that can also be used to set wallpapers.

xwallpaper example

sh
xwallpaper --clear --output HDMI-1 --maximize ~/Pictures/wallpaper.png
xwallpaper --clear --output eDP-1 --zoom ~/Pictures/wallpaper_2.png

feh example

sh
feh --bg-scale ~/Pictures/wallpaper.png

They both do similar things, but I prefer feh, as the documentation and command line arguments are more straightforward.

Terminals

There are the best terminals (in my opinion)

  • kitty
  • wezterm
  • st (suckless terminal)

I personally use st, as it is highly minimal, patch-based, and compiled. You can use whichever you see fit.

Program selector

In a minimal workflow environment such as if you are using

  • bspwm
  • i3
  • dwm
  • hyprland

or any other non-desktop-environment workflow, you basically have two main options.

  1. dmenu - a dynamic menu for x
  2. rofi - A “dmenu replacement” according to the documentation

Dmenu

dmenu is the default for dwm, i3, and basically every other window manager. It is not that aesthetic, but it gets the job done.

Rofi

For those that are looking for a more ‘aesthetic’ user experience, Rofi may be what you’re looking for. It offers extensive customization abilities and is often used in conjunction with more ‘aesthetic’ programs such as picom and polybar.

A full example, using DWM as the display manager might look like this:

sh
#!/usr/bin/env bash

[ -f "~/.Xresources" ] && xrdb -merge "~/.Xresources"
[ -f "~/.Xmodmap" ]    && xmodmap "~/.Xmodmap"

BAT=$(acpi | head -1)
xsetroot -solid "#002b36"
xbanish -t 2 &
setxkbmap us -variant colemak -option ctrl:nocaps
dwmbar &

systemctl --user import-environment DISPLAY

xset -r -b

exec dwm

Which (roughly translates to) a few of the things that you see below. (This is what it looked like when I was writing this).

Desktop preview image