Tiling#

Tiling window managers arrange windows in a non-overlapping layout, driven by keyboard. The operator picks one for three reasons: keyboard-only workflow leaves no mouse-driven artifact in screen recordings, layouts are reproducible across hosts, and configuration is text the operator versions and ports.

The tiling ecosystem splits along display server (X11 vs Wayland) and dynamic-vs-manual layout. Dynamic WMs (dwm, awesome, xmonad) compute layouts; manual WMs (i3, sway) let the operator place each window deliberately. Hyprland and River are newer wlroots compositors with rich animations and IPC.

WM

Server

Style

Notes

i3

X11

Manual

The keyboard-centric default. Stable, well-documented.

sway

Wayland

Manual

Drop-in replacement for i3 on Wayland. Compatible config.

dwm

X11

Dynamic

suckless. Configured by editing C and recompiling.

awesome

X11

Dynamic

Configured in Lua. Wide widget ecosystem.

xmonad

X11

Dynamic

Configured in Haskell. Best when the operator writes Haskell.

bspwm

X11

Binary tree

Layouts as binary trees. Driven by external scripts via bspc.

qtile

X11 / Wayland

Dynamic

Configured in Python.

hyprland

Wayland

Manual

wlroots; rich animations and per-monitor workspaces.

river

Wayland

Dynamic

wlroots; layout generators as separate processes.

niri

Wayland

Scrollable

Infinite horizontal workspace; no traditional tiling.

Tools#

i3#

$ i3-msg workspace 2
$ i3-msg [class="Firefox"] focus
$ i3-msg restart                               # reload after config edit

sway#

Same protocol as i3, plus Wayland-specific extensions.

$ swaymsg workspace 2
$ swaymsg -t get_tree | jq '..|.name? // empty'
$ swaymsg reload

hyprland#

$ hyprctl workspaces
$ hyprctl activewindow
$ hyprctl reload

dwm#

Configuration is config.h. Recompile to apply.

$ sudo make clean install                      # in the dwm source tree

Files#

Configuration#

Path

Purpose

~/.config/i3/config

i3 config (and keybindings).

~/.config/sway/config

sway config; mirrors i3 syntax.

~/.config/hypr/hyprland.conf

Hyprland config.

~/.xmonad/xmonad.hs

xmonad config; Haskell module.

~/.config/awesome/rc.lua

awesome config; Lua.

~/.config/bspwm/bspwmrc

bspwm startup script; sxhkdrc for hotkeys.

Common Tasks#

Identify the running tiler.

$ wmctrl -m            # X11
$ pgrep -af 'sway|hyprland|river|niri|dwm|i3|bspwm|awesome|xmonad|qtile'

Reload config without restarting the session.

$ swaymsg reload                               # sway
$ hyprctl reload                               # hyprland
$ i3-msg reload                                # i3
$ bspc wm -r                                   # bspwm

References#