My Arch setup: niri as the compositor, Noctalia for the bar and shell, kitty as the terminal.
| Component | Notes |
|---|---|
| niri | scrollable tiling on Wayland, config split across config.kdl + includes |
| Noctalia | quickshell-based bar, launcher and settings; generates the colour scheme |
| kitty | JetBrains Mono, theme file written by Noctalia |
| fastfetch | classic layout: Doom sprite on the left, system info on the right |
| bash | prompt, aliases, a couple of PATH entries |
There is no hand-picked palette in here. Noctalia derives one from the current
wallpaper and writes it out through its template system — kitty/themes/noctalia.conf
is the result, and it changes whenever the wallpaper does. Same mechanism feeds
noctalia/templates/vivaldi.css for the browser.
That is also why the wallpaper matters: it is the theme. Noctalia is set to
wallpaperChangeMode: random, so it rotates through ~/Pictures/Wallpapers
and the whole setup re-themes itself as it goes. The one in the screenshot is
the DOOM (2016) reverse cover illustration by Sergey Kolesov.
Both come from niri, not from the terminal. See niri/window-rules.kdl:
focused terminals sit at opacity 0.9, unfocused ones drop to 0.6, each with
background-effect { blur true }. Rules exist for kitty, Ghostty and Alacritty
so it survives switching terminals.
noctalia/hooks/video-wallpaper.sh is a small addition of my own. If the
selected wallpaper has a video file of the same name next to it — foo.png
plus foo.mp4 — it plays the video on niri's bottom layer instead of the
still. Pick a plain image again and it stops, revealing Noctalia's own
wallpaper surface.
The Doom sprite in the fetch output comes from doomfetch, which I wrote for exactly this. It reads a Doom IWAD and renders the sprites to ANSI art.
fastfetch cannot run a command to produce its logo, only read a file. So
fastfetch/dfetch writes a random sprite to ~/.cache/doomfetch-logo and then
calls fastfetch with --logo-type file-raw pointing at it. That is what gives
the classic layout with the art on the left and the info block on the right.
.bashrc calls dfetch; calling plain fastfetch still works and shows
whichever sprite was cached last.
The logo pool is restricted to monsters on purpose — they are tall and narrow, where weapons run up to 45 columns wide and would push the info block off the edge of an 80-something column terminal.
Two other layouts sit next to the active config: config.jsonc.minimal (sprite
plus a one-line status bar, no logo column) and config.jsonc.pokemon for
pokemon-colorscripts.
git clone https://github.com/lukida99/dotfiles
cd dotfiles
./install.sh --dry-run # see what would happen
./install.sh # symlink everything into place
./install.sh kitty niri # or just some of itWhatever is already there gets moved to <name>.bak-<date> first, so nothing
is lost. Symlinks that already point into this repo are left alone.
Went the other way and edited a config in place? ./sync.sh copies the live
files back into the repo, then git diff shows what changed.
niri, quickshell + noctalia-shell, kitty, fastfetch,
ttf-jetbrains-mono-nerd (the status line uses Nerd Font glyphs), mpvpaper
for animated wallpapers, and doomfetch for the sprite.
