My personal configuration for an Arch-based Linux desktop, built around Niri on Wayland. It covers the compositor, session/autostart plumbing, shell, audio, terminal, editor, multiplexer, media, and default applications.
These are hand-maintained dotfiles with no installer or dotfiles manager β I copy files into $HOME by hand. The repository layout mirrors $HOME, so individual files can be copied along the same paths, but do not copy the whole tree into $HOME blindly; review each file and adjust the machine-specific values noted below.
| Path | Contents |
|---|---|
.config/niri/ |
Niri config, keybinds, layout, rules, outputs |
.local/bin/ |
Session helpers and utility scripts (start-comp, autostart*, β¦) |
.config/autostart.env |
Autostart options (wallpaper mode, theme, cursor) |
.bashrc, .profile, .config/aliasrc |
Shell, history, aliases, PATH |
.config/pipewire/, .config/wireplumber/ |
Audio drop-ins (clock, ROC mic, ATH-M40x EQ) |
.config/foot/, .config/fuzzel/, .config/fnott/ |
Terminal, launcher, notifications |
.config/nvim/, .config/tmux/ |
Editor and terminal multiplexer |
.config/xdg-desktop-portal/, .config/mimeapps.list |
Portals and default applications |
.local/share/applications/ |
Desktop entries for the default apps |
Required for the setup as configured:
- Niri (Wayland compositor). X11 apps require
xwayland-satelliteβ₯ 0.7 onPATH; since niri 25.08 it is detected and started automatically, so this repository does not launch it. - foot (
foot --server+footclient), fuzzel (launcher), fnott (notifications). - PipeWire + WirePlumber; wl-clipboard + cliphist, wlsunset, brightnessctl.
- swaybg (wallpaper), hyprlock / hypridle, imv, mpv, pcmanfm-qt, firefox.
- flavours (base16 colour generation).
- Neovim β₯ 0.12, tmux β₯ 3.0, plus
tree-sitter-cli, a C compiler,curlandtarfor parser installation. - fzf (with optional bat previews) for shell integration.
Optional or conditional:
- pipewire-roc β only for the ROC network microphone input.
- mpv-shim-default-shaders β provides
CAS-scaled.glslfor mpv'smodern-hardwareprofile (the bundledFSRCNNXshader ships here). - libva-utils (
vainfo) β used by the mpv auto-profile script to pick a GPU profile; playback works without it. - openrgb, gnome-keyring, yt-dlp, wlr-randr β used when present, skipped otherwise.
The fonts and cursor theme referenced by the configs are assumed to be installed; they are not part of this repository.
start-comp <compositor> (for example start-comp niri-session) sets the Wayland/XDG environment and execs the compositor. Niri spawns autostart at startup, which waits for the compositor, clears stale daemons, starts the keyring, imports the environment into systemd and D-Bus, launches a polkit agent, and then runs autostart-services and autostart-wallpaper. Wallpaper mode, theme mode and cursor are set in .config/autostart.env.
Audio uses small PipeWire drop-ins under .config/pipewire/pipewire.conf.d/:
10-clock.confpinsdefault.clock.quantum = 1024andmin-quantum = 256; everything else uses upstream defaults.roc-source.confexposes the ROC network microphone as anAudio/Sourcenamed Phone Mic (ROC). It is guarded withflags = [ ifexists nofail ], so it stays inert unlesspipewire-rocis installed β normal audio works either way.20-ath-m40x-eq.confadds a parametric EQ (AutoEq/oratory1990, Harman target) as a virtual sink named ATH-M40x (AutoEq Harman). It does not change the default output: select it manually inpavucontrol/wpctland route it to a real sink. The profile path inside it is absolute and must be adjusted for a different$HOME. There is no automatic headphone-jack detection.
.config/wireplumber/examples/51-disable-suspension.conf.example is an inactive example (idle-suspend disable) and is not loaded by default.
- Portals β
niri-portals.confsetsdefault=gnome;gtk;(GNOME preferred, then GTK) for every interface without an explicit override; Access, Notification and FileChooser are pinned to GTK, while Secret triesoo7-portalthengnome-keyring. Requiresxdg-desktop-portalwith the GTK and GNOME backends. - Default apps β
mimeapps.listmaps common types to desktop entries in.local/share/applications/. Archive (lxqt-archiver.desktop) and torrent (torrent.desktop) associations are not shipped here and rely on an installed archiver/client. - mpv β a
modern-hardwareprofile enables GPU decoding and shader sharpening (bundledFSRCNNXplus externalCAS-scaled.glsl); automatic profile selection lives in.config/mpv/scripts/auto-profile.lua. - Neovim β
nvim-treesittertracks themainbranch (Neovim β₯ 0.12); parsers are installed asynchronously on first launch. - tmux β needs
tmux β₯ 3.0(theC-\binding relies on its parser). The<C-f>Neovim mapping expects an externaltmux-sessionizeronPATH, which is not provided here.
Copy the files you need into $HOME, keeping the same relative paths. Review the machine-specific values first: the absolute EQ path in 20-ath-m40x-eq.conf, monitor names in outputs.kdl/keybinds.kdl, and the paths in .config/autostart.env. Optional components (ROC microphone, ATH-M40x EQ, external shaders, vainfo-based profile selection) only activate when their dependency is installed.