My Linux setup: one shared shell and toolset, plus a desktop profile, either gnome or niri (with
DankMaterialShell). Colors come from the wallpaper via matugen.
install.sh installs no software. Install these first, or it fails partway through.
Every machine
-
git,stow,zsh -
Oh My Zsh. Install it before
install.sh(its installer refuses to run once~/.oh-my-zshexists) and delete the~/.zshrcit writes:sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended rm ~/.zshrc chsh -s "$(command -v zsh)"
-
eza,bat,fastfetch. The shell calls these on every start (ls,cat,--help). Without them, every new terminal shows errors. On Debian/Ubuntu the binary isbatcat, so addmkdir -p ~/.local/bin && ln -s /usr/bin/batcat ~/.local/bin/bat.
gnome profile
- GNOME itself (
gsettings)
niri profile
- niri, DankMaterialShell (
dms), DMS Files (dfiles)
git clone https://github.com/jgoedde/dotfiles ~/dotfiles
cd ~/dotfiles
./install.sh gnome # or: ./install.sh niriThe profile is remembered. After a git pull, run plain ./install.sh.
If stow reports conflicts, nothing has been changed yet. An app already wrote its own config where this repo
puts one. Move the listed files away and run install.sh again. On niri this is expected for
~/.config/niri/config.kdl and ~/.config/dms/*.json.
Then create the first theme: put images in ~/Pictures/Walls and press Super+Ctrl+W (GNOME) or Mod+Ctrl+W
(niri). Until then, bat, fzf, micro and ghostty run without their matugen colors.
None of these write over the linked config files, so install them in any order, whenever you like:
- matugen (needed for theming)
- ghostty, micro, btop, fzf + fd (on Debian/Ubuntu fd is
fdfind, link it to~/.local/bin/fd), zoxide, pay-respects - jq and xdg-user-dirs (used by the wallpaper scripts)
- wl-clipboard (fzf
Ctrl+Ycopy) - Claude Code, plus Node.js for its status line (
npx ccstatusline) - pywalfox (Firefox colors), Obsidian
gnomeonly: Albert launcher (Ctrl+O)
One rule: ~/.zshrc is a link into this repo. Don't let installers edit it. The shell already sets up nvm,
pnpm, pyenv, Homebrew, deno, go and zoxide if they are present.
- nvm:
PROFILE=/dev/nullbefore its install command - fzf from git:
./install --no-update-rc(or just use your package manager) - deno, pnpm and others: decline any "add to your shell profile" step
If one slipped through: git -C ~/dotfiles checkout zsh/.zshrc.
- Package: a top-level folder that mirrors
$HOME(e.g.zsh/,ghostty/), linked by stow. - Profile: a list of packages,
profiles/<name>.txt, plus an optional setup scriptprofiles/<name>.sh. Every machine getscommonplus one desktop profile.
wallpaper-change.sh (Super/Mod+Ctrl+W) picks a random image from ~/Pictures/Walls, sets it, and runs
matugen-apply.sh, which renders the matugen templates for the current wallpaper. Run matugen-apply.sh by
hand to re-theme without changing the wallpaper. On niri, matugen-sync.path also re-themes when the
wallpaper or light/dark mode changes in DMS.
Both scripts live in Common and ask a desktop adapter for anything desktop-specific. A package in
each desktop profile ships one at ~/.local/bin/desktop-adapter: dms/ for niri (DMS IPC, session and settings),
matugen-gnome/ for gnome (gsettings, scheme-content, contrast 0). Its interface:
| Command | Does |
|---|---|
wallpaper |
print the current wallpaper path, exit non-zero if none |
set-wallpaper PATH |
show PATH as the wallpaper |
mode |
print light or dark |
scheme |
print the matugen scheme, e.g. scheme-tonal-spot |
contrast |
print the matugen contrast |
reload |
after a matugen run, re-theme the desktop's own UI (may do nothing) |
A new desktop profile only needs its own adapter. Without one, both scripts exit with an error.
Machine-local changes, without touching the repo:
~/.config/zsh/custom/<file>replaces the same file from~/.config/zsh/~/.zshrc_customis sourced last~/.local/bin/wallpaper-post.shruns after every re-theme (seewallpaper-post.example.sh)
- Stefan Raabe, https://github.com/mylinuxforwork/dotfiles
- rockyzhang24, https://github.com/rockyzhang24/dotfiles