These are my dotfiles. Take anything you want, but at your own risk.
| Package | Description | Module |
|---|---|---|
| Neovim | Editor ($EDITOR / $VISUAL) |
- |
| Git | Version control | tools |
| delta | Git pager (side-by-side diffs) | tools |
| fzf | Fuzzy finder (used in git aliases) | tools |
| jq | JSON processor (used by toggle-monitor.sh) |
bin |
| libnotify | notify-send desktop notifications |
bin |
| Jujutsu (jj) | Alternative VCS | tools |
| Claude Code | AI coding CLI (settings/statusline symlinked to ~/.claude/) |
tools |
| Package | Description | Module |
|---|---|---|
| Zsh | Primary shell | zsh |
| Bash | Fallback shell | bash |
| Starship | Cross-shell prompt (optional, disabled by default) | tools |
| NVM | Node version manager (optional) | - |
| Package | Description | Module |
|---|---|---|
| Hyprland | Wayland compositor | ui |
| Waybar | Status bar | ui |
| Wofi | Application launcher | ui |
| Hyprlock | Lock screen | ui |
| Swaybg | Wallpaper (expects ~/wallpapers/bg.jpg) |
ui |
| Dunst | Notification daemon | tools |
| Cliphist | Clipboard manager | ui |
| wl-clipboard | Wayland copy/paste (wl-copy, wl-paste) |
ui |
| Grim + Slurp | Screenshots | ui |
| pavucontrol | PulseAudio volume control | ui |
| hyprpolkitagent | Polkit authentication agent | ui |
| WirePlumber | wpctl audio control (volume keys + Waybar module) |
ui |
| brightnessctl | Backlight control (brightness keys + Waybar module) | ui |
| playerctl | Media key control (play/pause/next/prev) | ui |
| PCManFM | File manager | tools |
| Package | Description | Module |
|---|---|---|
| Ghostty | Terminal emulator | tools |
| MPV | Video player | video |
| Superfile | Terminal file explorer | tools |
| htop | Process monitor | tools |
| Package | Description |
|---|---|
| Ubuntu Mono | GTK and Qt UI font (ttf-ubuntu-font-family, family Ubuntu Mono) |
| Geist | Hyprland OSD and Hyprlock (ttf-geist-variable, family Geist) |
| Geist Mono | Terminal font (otf-geist-mono-nerd, family GeistMono Nerd Font). Note: Geist Mono is not a resolvable family |
| JetBrainsMono Nerd Font | Glyph fallback (Waybar, Wofi) |
| Neon Noir (custom, inline) | Muted cyan/magenta-on-blue-black scheme across terminal/shell apps (Ghostty, Waybar, Wofi, Hyprlock, Dunst, Btop, Starship, Lazygit, Superfile, jj, mpv OSD, Claude statusline) |
| Neon Noir (CLI tools) | fzf, eza and man-page colors via config/shared-exports.sh; bat and delta use ansi so they follow the terminal palette |
| Tokyonight-Dark | GTK2/3/4 app theme (tokyonight-gtk-theme-git) |
| Catppuccin Mocha Sky | Qt theme via Kvantum (kvantum-theme-catppuccin-git) |
| Papirus-Dark | Icon theme (GTK and Qt). Folder color set with papirus-folders |
| Simp1e Tokyo Night | Cursor theme (xcursor-simp1e-tokyo-night, Xcursor only — no hyprcursor build) |
| Kvantum + qt6ct | Qt theming |
Folder icons are recolored with a system-wide command, not a config file. It
rewrites the SVGs under /usr/share/icons/Papirus-Dark:
sudo papirus-folders -C violet --theme Papirus-Darkviolet is #7e57c2, close to the palette violet #8a7ac4, and pairs with the
violet active-tab outline in gtk-3.0/gtk.css. Cyan stays reserved for
selection state so the two markers don't compete. Avoid plain cyan
(#00bcd4) — full-saturation Material cyan, which glares against the #121824
base.
A
papirus-icon-themeupgrade silently reverts this and folders go back to the default blue. Re-run the command after upgrading. It is deliberately not inbin/apply-gtk-theme.sh, which runs at login and must not needsudo.
git clone https://github.com/nclsprsn/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
cp config/config.sh.default config/config.sh
nvim config/config.sh
./INSTALL.shThe install script symlinks *.symlink files to your home directory and ~/.config/.
Edit config/config.sh to set your OS, environment, user role, and excluded modules.
In config/config.sh:
| Option | Values | Description |
|---|---|---|
DOTFILES_OS |
Arch, Debian |
Target distribution |
DOTFILES_ENV |
Desktop, Server |
Environment type |
DOTFILES_USER |
Admin, User, Root |
User role |
DOTFILES_STARSHIP_ENABLED |
true, false |
Use Starship prompt |
DOTFILES_EXCLUDE |
Module names | Modules to skip during install |
Available modules: zsh, bash, ui, video, tools.
Machine-specific overrides go in custom/ (gitignored). Drop scripts in custom/bin/
and per-machine env/boot tweaks there so they stay out of version control.
Note: The
uimodule (Hyprland, Waybar, etc.) ships with hardware-specific defaults (monitor layout, French AZERTY keyboard, AMD GPU env vars) that you will need to adapt to your own setup.
cd ~/.dotfiles
./UNINSTALL.sh --dry-run # show what would be removed
./UNINSTALL.shIt reads .installed.list and removes only symlinks that still point into
~/.dotfiles; anything else at a recorded path is reported and left alone. If
the installer made a *.backup copy of a file it replaced, that copy is
restored. Afterwards, remove the ~/.dotfiles folder.
INSTALL.sh applies the same rule when you remove a module: it compares the
previous .installed.list with the new one and prunes any symlink it no longer
owns. So adding a module to DOTFILES_EXCLUDE and re-running the installer
actually uninstalls that module rather than leaving its symlinks behind.
tools/claude/ is symlinked into ~/.claude/:
| Source | Target |
|---|---|
settings.json.symlink |
~/.claude/settings.json — permissions, hooks, statusline, plugins |
CLAUDE.md.symlink |
~/.claude/CLAUDE.md — global instructions |
statusline.sh.symlink |
~/.claude/statusline.sh — Neon Noir statusline (context, cost, rate limits, git) |
subagent-statusline.sh.symlink |
~/.claude/subagent-statusline.sh — one JSON line per running task, not a second status line |
claude-powerline.json.symlink |
~/.claude/claude-powerline.json — Neon Noir theme for claude-powerline |
hooks/*.sh.symlink |
~/.claude/hooks/ — pre/post tool-use guards |
commands/*.md.symlink |
~/.claude/commands/ — /reload-ui, /theme-check, /dotfiles-install |
skills/<name>/SKILL.md.symlink |
~/.claude/skills/<name>/SKILL.md — currently herdr, generated by the herdr binary |
Hooks are standalone scripts rather than inline JSON, so they are linted by CI
and covered by tools/claude/hooks/test.sh. They block writes to credential and
system paths, and block destructive shell commands. They are a guard rail
against accidents, not a sandbox.
Machine-specific bits (local MCP servers) go in ~/.claude/settings.local.json;
see tools/claude/settings.local.json.example.
Utility scripts in bin/ (added to $PATH):
| Script | Description |
|---|---|
apply-gtk-theme.sh |
Push the GTK theme/icons/cursor/font into dconf (run from the Hyprland autostart; dconf overrides gtk-3.0/settings.ini for portal-based apps) |
toggle-waybar.sh |
Show/hide Waybar, going edge-to-edge while hidden (bound to $mainMod+B); delegates spacing to toggle-gaps.sh |
toggle-gaps.sh |
Window spacing — gaps, border and rounding (bound to $mainMod+G). off puts windows flush at 0,0; takes on/off, or toggles with no argument; needs jq |
toggle-monitor.sh |
Enable/disable a monitor by name (bound to $mainMod+P / $mainMod+SHIFT+P); needs jq + notify-send |
waybar-unmapped-classes.sh |
List open windows with no window-rewrite icon rule in the Waybar config, so they can be given a workspace icon; needs jq + hyprctl |
disk.sh |
Live block-device + filesystem usage (uses dfc if present, else df) |
treeview.sh |
ASCII tree of a directory |
jd-captcha-watcher.py |
Move JDownloader captcha popups to a dedicated workspace (opt-in; uncomment it in the hyprland.start handler in hyprland.lua) |
You can discuss using the issues section. To contribute, create an issue, and send a pull request.
The dotfiles are available under the Beerware license.
