The final config that actually is read by i3 is created using j4-make-config. This is done in the Xinitrc.

Simple usage:

j4-make-config -a $(hostname).config archlinux

This creates ~/.config/i3/config by merging ~/.config/i3/config.base and ~/.config/i3/$HOSTNAME.config, and adds the 'archlinux' theme (included with j4-make-config). Optionally, you can add -r to tell i3 to reload the config after j4-make-config has completed.

Since using j4-make-config, the command for reloading the config has been changed to the following:

# rebuild and reload the configuration file
bindsym $mod+Shift+c exec "j4-make-config -r -a $HOSTNAME.config archlinux"

This differs depending on if you're using ALSA or Pulseaudio. Thus, I include these instructions in the host-specific configs instead of the base config


# Alsa Volume controls
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer set Master 5%+ #increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id amixer set Master 5%- #decrease sound volume
bindsym XF86AudioMute exec --no-startup-id amixer set Master toggle # mute sound


# PulseAudio Volume controls
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% #increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% #decrease sound volume
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle # mute sound

Brightness can be universal unless the utility for changing brightness differs between machines, so this snippit lives in the base config.

# Sreen brightness controls (requires light(1) from the AUR)
bindsym XF86MonBrightnessUp exec light -A 10 # increase screen brightness
bindsym XF86MonBrightnessDown exec light -U 10 # decrease screen brightness

This also is universal if the same tool is being used across hosts. I use playerctl mainly for its compatibility with Spotify's Linux client.

# Music Player controls
bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause
bindsym XF86AudioNext exec --no-startup-id playerctl next
bindsym XF86AudioPrev exec --no-startup-id playerctl previous

The screen locker is already set up in Xinitrc, so all that is necessary in the i3 config is to set the key combination that should spawn xautolock -locknow.

# Ctrl+Alt+L to lock the screen
# Locker is set in ~/.xinitrc
bindsym Mod1+Control+l exec "xautolock -locknow"

This is another host-specific configuration, since bar {} has host-specific options apart from just the i3status config. It also includes the j4-make-config theme placeholder, since the theme definitions for the bar are separate from the main config.

I'll only demonstrate the most complicated of my current i3bar configuration. The rest can be viewed on the git repo.

bar {
        status_command i3status -c ~/.config/i3/status/$HOSTNAME.config
        tray_output primary 
	output eDP1 # Which display should i3bar be bound to?
	# $i3-theme-bar

Most of the i3Status configuration is pretty standard, and is well documented by the upstream docs, so I'll only document the specific directives I crafted/modified myself

This directive chooses ALSA by default, PulseAudio can be specified by adding device = "pulse" to the end of this directive.

volume master {
	format = "🔈%volume" # U+1F508
	format_muted = "🔇" # U+1F507

This is a simple pidfile watcher used with one of my VPN configurations that gets started with systemd.

run_watch SPVPN {
        pidfile = "/var/run/spvpn@*.pid"

The nagbar is intensely annoying to encounter mainly because you can only use the mouse for interacting with it. It has been removed from my config altogether, and I plan on replacing it with dmenu in the future.