Managed with GNU Stow — my personal development and desktop environment configuration.
This repository contains my personalised configuration files (dotfiles) for a wide range of command-line tools, desktop environments, window managers, and development tools. Everything is organised as GNU Stow packages under one root.
- Packages without a leading
_in their directory name are installed automatically byinstall.shvia:stow --dotfiles -vS -t "$HOME" <package>
- Packages with a leading
_are un-stowed (i.e. not symlinked to$HOME). Their files are copied or referenced individually, typically to avoid conflicts with other tools. - Each package subdirectory uses the
dot-*prefix convention so that stow's--dotfilesoption mapsdot-X→.Xat the target.
curl -L https://git.io/JtJ7M | bash(bootstrap.sh pulls the repo and runs install.sh)
./install.sh# Update tmux plugins via TPM
just update
# Or manually
git submodule update --init
tmux/dot-config/tmux/plugins/tpm/bin/install_plugins| Package / Tool | Description | Status |
|---|---|---|
_alacritty |
Alacritty terminal emulator — Catppuccin Mocha theme | ✓ Active |
atuin |
Shell history sync daemon | ✓ Active |
bat |
cat replacement with syntax highlighting |
✓ Active |
_bottom |
btm system monitor (Catppuccin Mocha colours) |
✓ Active |
_broot |
br directory tree navigator |
✓ Active |
_btop |
btop resource monitor |
✓ Active |
direnv |
Environment-load-on-cd with Poetry layout helper | ✓ Active |
dunst |
Notification daemon (launch script + Catppuccin Mocha) | ✓ Active |
dwm |
Dynamic Window Manager scripts/polybar scripts | ✓ Active |
_foot |
Foot terminal emulator — Catppuccin Mocha colours | ✓ Active |
git |
Global gitconfig, delta diff viewer, attributes, ignore | ✓ Active |
gitui |
TUI git client — Catppuccin Mocha theme, custom keybinds | ✓ Active |
_htop |
htop configuration (copied, not stowed) | ✓ Active |
hyprland |
Hyprland compositor config + mocha colours, idle, lock, paper | ✓ Active |
imv |
Image viewer — Catppuccin Mocha background | ✓ Active |
lf |
Terminal file manager — preview, open, icons | ✓ Active |
mpv |
Video player config + vim-like keybindings | ✓ Active |
nix |
Nix package manager config (flakes + nix-command) | ✓ Active |
npm |
npm config (XDG dirs + Zscaler CA) | ✓ Active |
paru |
AUR helper config | ✓ Active |
polybar |
Polybar config — workspaces, weather, bluetooth, updates, etc. | ✓ Active |
presenterm |
Terminal presentation tool | ✓ Active |
python |
Python REPL startup (history via XDG_STATE) | ✓ Active |
_qutebrowser |
Qutebrowser browser — Catppuccin Mocha, YouTube ad filter | ✓ Active |
_ranger |
Ranger file manager — devicons, previews, scope script | ✓ Active |
rofi |
Application launcher — Catppuccin Mocha, fuzzy matching | ✓ Active |
ruff |
Python linter/formatter config (all rules) | ✓ Active |
sheldon |
Zsh plugin manager config | ✓ Active |
shell |
Shared shell env, aliases, functions, keybindings, fzf | ✓ Active |
starship |
Starship prompt — Catppuccin Mocha palette | ✓ Active |
stylua |
Lua formatter config | ✓ Active |
swappy |
Screenshot annotation tool | ✓ Active |
swhkd |
SWHKD hotkey daemon config | ✓ Active |
tmux |
Tmux config — Catppuccin Mocha, vim keys, plugins | ✓ Active |
topgrade |
System-wide upgrade tool | ✓ Active |
_user-dirs |
XDG user directories config | ✓ Active |
_vifm |
Vifm file manager config | ✓ Active |
waybar |
Waybar status bar — Catppuccin Mocha CSS | ✓ Active |
wezterm |
Wezterm terminal emulator — Lua config, vim keys | ✓ Active |
X11 |
X11 Xresources (Gruvbox) + xinitrc | ✓ Active |
xplr |
Xplr file manager — Lua config, plugins | ✓ Active |
xsuspender |
X11 window suspender config | ✓ Active |
yazi |
Yazi file manager — Catppuccin Mocha flavor, plugins | ✓ Active |
ytfzf |
YouTube search/play from terminal | ✓ Active |
zathura |
PDF viewer — Catppuccin Mocha, vim keys | ✓ Active |
zellij |
Zellij multiplexer — Catppuccin Mocha, custom keybinds | ✓ Active |
zsh |
Zsh shell — .zshenv, .zprofile, .zshrc | ✓ Active |
Files: alacritty.toml, catppuccin-mocha.toml, gruvbox_dark_theme.yaml
Issues:
- Typo in font family:
bold_italic.family = "FiraCode NerdFont"(missing space) — should be"FiraCode Nerd Font"for consistency. - Orphaned theme file:
gruvbox_dark_theme.yaml(YAML format, not TOML) is never referenced — Alacritty expects.toml. Either remove it or convert and add an import. - Empty
[env]section: Only setsTERM = "xterm-256color"which is fine, but could be documented or removed if relying on system default.
Recommendations:
- Fix the font name typo in
bold_italic.family. - Remove
gruvbox_dark_theme.yaml(unused) or convert to TOML.
Files: config.toml
Issues:
- Self-hosted sync address:
sync_address = "http://atuin.riemer.page:8888"— hardcoded hostname. If that host is not always reachable or the DNS name changes, the config breaks silently. - Excessive commented defaults: The file is ~90% comments with only ~6 active lines. This makes real settings hard to find.
enter_accept = false: Consider whether you want this —trueis the modern default and reduces keystrokes.
Recommendations:
- Trim all default-commented lines to the 6-8 active settings for clarity.
- Consider making the sync address configurable via environment variable.
Files: config, themes/*.tmTheme
Issues:
--paging=always: This is set, but the custom--pageronly applies when paging is needed.--paging=alwaysmeansbatalways pipes throughlesseven for single-line output. Consider--paging=auto.
Recommendations:
- Change
--paging=alwaysto--paging=autofor shorter outputs. - The Catppuccin themes look correct; no changes needed.
Files: bottom.toml
Issues:
- Very slow update rate:
rate = 10000(10 seconds) anddefault_time_value = 600000(10 minutes) — the default widget time span is extremely long, making graphs mostly flat lines. - Both
hide_table_gap = trueandtable_header_colorset — the Catppuccin Mocha colours look good.
Recommendations:
- Reduce
rateto2000(2 seconds) for smoother CPU/memory updates. - Reduce
default_time_valueto120000(2 minutes) for more useful graphs.
Files: conf.toml
Issues:
- No custom skin/colours: The config only defines a few verbs (
edit,create,view, quit onctrl-c). No colour scheme is set; all skin lines are commented out.
Recommendations:
- Add a Catppuccin Mocha-inspired skin or at least a dark theme so it visually matches the rest of the system.
Files: btop.conf
Issues:
color_theme = "/usr/share/btop/themes/gruvbox_dark.theme": References a system path that may not exist on all installations. Theme is Gruvbox, not Catppuccin Mocha, unlike most other tools.update_ms = 5000is reasonable.proc_mem_bytes = True— shows memory in bytes; this can be hard to read for large processes.
Recommendations:
- Either install a Catppuccin Mocha btop theme or keep Gruvbox if that is the intended look. Whichever is chosen, document the expectation.
- Consider
proc_mem_bytes = Falsefor human-readable percentages.
Files: direnvrc
Issues:
- Single-purpose layout: Only provides
layout_poetry()— nolayout_python,layout_venv, or other common layouts. This is fine if Poetry is the only use case.
Recommendations:
- Add a
layout_uv()function for the neweruvPython tool sinceenv.shalready exportsUV_LINK_MODE=copy.
Files: dunstrc, launch.sh, normal.png, critical.png
Issues:
- All urgency levels have
timeout = 0: Notifications never auto-dismiss. This is deliberate but may cause clutter. transparency = 20: Deprecated in newer dunst — usebackground transparencyor per-urgency alpha settings.browser = brave --new-tab: Hardcoded browser.- Old commented Gruvbox theme block: Leftover from a previous configuration.
Recommendations:
- Consider setting
timeout = 5for low urgency,timeout = 10for normal, and keep 0 only for critical. - Remove the old commented-out urgency section.
- Clean up the commented Gruvbox entries.
Files: Various status bar scripts (clock, cpu, disk, etc.), autostart.sh, startdwm.sh
Issues:
xrdbcalled twice inautostart.sh(lines 6-7):xrdb -mergethenxrdb— the second call overwrites the first merged result.polybar launchcalled twice ifDISPLAYis empty (lines 33 & 35): Both inside theif [[ -z "${DISPLAY}" ]]block.$HOSTvariable: The block for "work" is heavily commented out — consider cleaning up dead code.- Hardcoded hostname checks:
if [ "$HOST" == "work" ]— fragile; environment variables or condition files are more maintainable. xfce4-power-manageris launched even though the session uses DWM/Hyprland, not XFCE.
Recommendations:
- Remove duplicate
xrdbcall (keep only line 6 or 7). - Fix duplicate
polybar launch— likely meant one for the host-specific bar and one generic. - Clean up the heavily commented VirtualBox block.
- Consider
xfce4-power-managerremoval in favour oftlpor just the kernel's power management.
Files: foot.ini
Issues:
- Most of the file is commented-out defaults: Only
[colors]is active. The file is ~237 lines with ~17 lines of actual config. - Font is hardcoded to
FiraCodeNerdFont:size=10: No fallback. - All keybindings are commented out: Fine if defaults are acceptable, but you may want custom shortcuts.
Recommendations:
- Strip commented defaults to a minimal file for readability.
- Add a fallback font or use
font=monospaceas base.
Files: config, ignore, attributes, catppuccin.gitconfig
Issues:
- Delta features reference
catppuccin-frappeas default (line 23) butcatppuccin.gitconfigprovides Latte, Frappe, Macchiato, Mocha. If you use Mocha everywhere else, consider changing the default tocatppuccin-mocha. diff "preview.sh"(line 132-134) — binary diff driver referencinglf/preview.sh— this may be slow for large binaries.diff "dyff"has a duplicatecommand(lines 130-131): The first is commented out by the second; only the second takes effect.http.sslVerify = falseat the end (line 220): This overrides line 1-2[https] sslverify = truefor all HTTP remotes. If this was intended only for a specific host, it should be scoped to[http "https://specific.host"].difftool "difftastic"usesdifft(notdifftasticordifftalias). Check which binary is actually installed.gpg.format = ssh(line 175) together withgpg.defaultKeyCommand— works well but requiresallowedSignersFile.
Recommendations:
- Consider changing default delta features to
catppuccin-mocha. - Remove duplicate dyff command.
- Scope
http.sslVerify = falseto specific hosts if possible. - Clean up the
ignorefile — there are duplicate entries (*.yang.uml,*.yang.yin,Cargo.lock,*.ccls-cache/,doc/tags-te, etc.).
Files: theme.ron, key_config.ron, mocha.ron, frappe.ron, macchiato.ron, latte.ron
Issues:
theme.ronis an empty/null theme — it overrides all values toNone, which means gitui uses its built-in default theme. This may hide the Catppuccin themes.- Default shell alias (
alias gitui='gitui -t mocha.ron') — ensures the Mocha theme is loaded, which compensates for the null theme file. key_config.ronis fully specified with layered keybindings — good, but very long.
Recommendations:
- Either remove
theme.ron(let gitui use defaults) or populate it withmocha.roncontents. An empty theme file is misleading. - Clean up
.ron.oldfiles if they are no longer needed.
Files: htoprc
Issues:
- Auto-generated format: The comment warns "Beware! This file is rewritten by htop when settings are changed" — but the file is stow-copied, not stowed. Any change in htop's UI will overwrite it if the file is writable.
delay=70(centiseconds = 0.7s) — quite fast; fine for desktop use.- Screen tabs are disabled (
screen_tabs=0) — only the main screen is configured.
Recommendations:
- Consider making the file read-only after install since htop will rewrite it.
- Add a second I/O screen tab if desired (the
I/Oscreen is already defined).
Files: hyprland.conf, mocha.conf, hyprlock.conf, hypridle.conf, battery_notif.sh, cleanup_after_start.sh, hyprpaper.conf, hyprsuspender.toml, opacity.sh, xdg-portal-hyprland
Issues:
cleanup_after_start.shhas asleep 10before resetting window rules — fragile; window classes may not be ready.battery_notif.shusesupowerwhich is deprecated on some systems — consideracpiorsysfsdirectly.xdg-portal-hyprlandscript:killallis race-prone — the portal may start between the kill and the new launch. A more robust approach usespkill -0checks and retries.hyprpaper.confreferences a wallpaper file (~/.config/wallpapers/VC7Z0339.jpg) — this path is not part of the repo and will error on a fresh install.cleanup_after_start.shwindow rules are hardcoded withsleep 10— if applications start slowly, this may have no effect. Consider using Hyprland'swindowruledirectly in the config with workspace assignments.$locker=swaylockis set buthyprlockis also installed — unused variable.opacity.shuseshyprctl setpropwhich works but the regex for extractingWIDmay break with different locale settings.
Recommendations:
- Replace
sleep 10incleanup_after_start.shwith a loop that polls for window existence. - Add the single wallpaper used to the repo or create a placeholder script.
- Fix race conditions in
xdg-portal-hyprlandwith PID checking. - Remove unused
$lockervariable.
Files: config
Issues:
- Minimal config: Only sets background, overlay text/background colours. Fine for basic use.
Recommendations:
- None (it does its job correctly).
Files: lfrc, open.sh, preview.sh
Issues:
preview.sh— duplicate pattern branches:*.jpg,*.jpegetc. appear twice (lines 33 and 40), once withchafacommented out and once withviu. Only the second wins.open.sh— hardcoded image viewer: Usessxiveven though the system may preferimvorswayimg.preview.sh— typo on line 40:| .git | *.GIF— should be*.gif | *.GIF(pipe in wrong position).open.sh— background processes: Usessetsid ... >/dev/null 2>&1 &but doesn'tdisown, so the shell may get SIGHUP.open.sh—casestatements are sequential, not exclusive: The archive mount block (lines 24-35) runs first, then the mime-type block runs on the same file. For zip files, both branches may execute.preview.sh— line 69: Missingexit 0orexit 1after processing — if none of the cases match, it falls through tobat --color alwaysfor everything.
Recommendations:
- Remove the duplicate image handler in
preview.sh(keepviu, remove the commentedchafaline). - Fix typo on line 40 (
.git→*.gif). - Add
disownaftersetsidinopen.sh. - Restructure
open.shto useelifso only one branch runs. - Add
exit 0at end ofpreview.shor handle the unary case.
Files: mpv.conf, input.conf
Issues:
- Limited config: Most settings are commented out. Only
osd-font-size=20and screenshot directory are set. screenshot-directoryuses a non-XDG path (~/dl/mpvscreenshots).- Most keyboard shortcuts in
input.confare standard mpv defaults and may not need explicit definition.
Recommendations:
- Consider using XDG paths for screenshots:
$XDG_PICTURES_DIR/screenshots. - Clean up commented-out settings.
Files: nix.conf
Issues:
- Single line: Only enables
nix-commandandflakes. This is correct for minimal usage but will use the systemnixconfig as base.
Recommendations:
- Consider adding
auto-optimise-store,experimental-features = nix-command flakes, andsubstitutersif you use binary caches.
Files: npmrc
Issues:
- Hardcoded CA path:
cafile=/home/heiko/.zscaler-certs/ca-bundle-with-zscaler.pem— this is user-specific and may not exist. If the CA file is missing, npm will fail on HTTPS. tmpuses${XDG_RUNTIME_DIR}which is typically session-specific and may be cleaned on logout — npm may lose temporary files mid-operation.
Recommendations:
- Make the CA file check conditional: only set if the file exists.
- Consider using
$HOME/.tmpfor npm temp instead of XDG_RUNTIME_DIR.
Files: paru.conf
Issues:
RemoveMakeappears twice (lines 17 and 24) — harmless but redundant.FileManager = lf— works but only iflfis installed. Paru may fall back silently.BottomUpis commented out — if you want the package list on top, enable it.
Recommendations:
- Remove duplicate
RemoveMake. - Consider adding
SkipReviewif you trust AUR packages (reduces interaction).
Files: config.ini, launch.sh, updates-arch.sh, weather.sh, polybar-bluetoothctl.sh
Issues:
- Two separate colour blocks (lines 19-48 and 50-55) — the first block is all commented-out/inactive and the second is active. This is confusing.
modules-rightfor the base bar (line 90) includes bothpulseaudioand notemperatureonartix(line 110) but theworkbar (line 114) has no bluetoothctl — inconsistency between bar variants.font-sizeset topixelsize=8— very small on high-DPI displays.- Duplicated
bluetoothctlmodule — it has its own custom script module (line 125-132) and is also listed inmodules-right. launch.shusesHOSThostname as bar name — expects a bar section named exactly[bar/<hostname>].weather.shlikely calls an external API rate-limited to 3600s — if it fails, the bar shows nothing.
Recommendations:
- Consolidate into one colour section.
- Add a fallback in
weather.shto return a static string on failure. - Improve font size for HiDPI (e.g.
pixelsize=12orpixelsize=14). - Clean up unused
[module/alsa](pulseaudio is used instead).
Files: config.yaml
Issues:
- No issues found — the config is comprehensive and well-structured.
Recommendations:
- None (clean config).
Files: pythonrc
Issues:
is_vanilla()checks for__IPYTHON__andbpython— but the function checks__builtins__which may not have the attribute in all Python versions. Safer:__IPYTHON__is a module-level global, not a builtin.- No tab completion is enabled.
Recommendations:
- Add
readline.parse_and_bind('tab: complete')for basic tab completion. - Fix the
__IPYTHON__check to look at__builtins__as a dict or module depending on Python version.
Files: config.py, autoconfig.yml, catppuccin/setup.py
Issues:
filter_ytblocks ALL YouTube requests (line 20-21) — after the ad block on line 19, there's an unconditionalinfo.block()for all YouTube URLs. This breaks YouTube entirely in qutebrowser!c.url.searchengines['DEFAULT']points to a local IPhttp://10.7.7.2:9010/search?q={}— this only works on the local network.c.editor.commandusesos.environ['EDITOR']which may not be set at import time — safer to useconfig.source.
Recommendations:
- Critical fix: Remove the unconditional
info.block()on line 20-21, or change it to only block ads (/get_video_infowith&adformat=). - Make search engine configurable or provide a fallback.
- Use
config.get_editor_command()or check forEDITORat runtime.
Files: rc.conf, commands.py, devicons.py, scope.sh, plugins/
Issues:
preview_images_method w3m: w3m is Linux-specific and may not work in all terminals (e.g. tmux, wezterm). Considerkittyoriterm2if your terminal supports it.default_linemode deviconsrequiresdevicons.pyplugin — confirmed present.- Large, comprehensive config with many vim-like bindings copied from defaults.
Recommendations:
- Test if
ueberzugorchafapreview method works better with your terminal stack. - Consider removing the default rc.conf copy if it duplicates built-in defaults (ranger loads default rc if not suppressed via
RANGER_LOAD_DEFAULT_RC=FALSE).
Files: config.rasi, catppuccin-mocha.rasi
Issues:
selected-colis same asbg-col(both#1e1e2e): The selected item background is identical to the normal background, making selection invisible (line 5 vs line 2).element selected text-colorusesfg-col2(#f38ba8red): The selected foreground is red on black — readable but unconventional. Most themes use a highlighted background.columns: 3andlines: 15— can look grid-like; may work better withlinesset higher andcolumns: 1for a list.icon-theme: "Reversal"— only works if that icon theme is installed.
Recommendations:
- Change
selected-colto a lighter surface colour like#45475a(surface1) for visible selection. - Clean up commented-out
@themelines.
Files: pyproject.toml
Issues:
select = ["ALL"]in addition toextend-select: This enables all rules globally, andextend-selectadds nothing on top. Justselect = ["ALL"]withignoreis cleaner.fixable = ["ALL"]— be aware that some "fixes" may change semantics (e.g.PLCrules).ignoreincludesCOM812,ISC001which are formatting-related — these usually conflict with the formatter. Good to exclude them.
Recommendations:
- Remove
extend-selectsinceselect = ["ALL"]already covers everything. - Consider adding
unsafe-fixes = trueif you want maximum auto-fix.
Files: plugins.toml
Issues:
zsh-autocomplete(marlonrichert) can conflict withzsh-autosuggestions: Both try to control the completion UI. Autocomplete may override suggestions.emoji-cliis a niche plugin — verify it still works with newer Zsh versions.
Recommendations:
- Either remove
zsh-autocompleteorzsh-autosuggestionsto avoid conflict. - Consider adding
zsh-history-substring-searchforctrl-rstyle search.
Files: alias.sh, env.sh, functions.sh, keybinding.sh, fuzzy_functions.sh, ssh_agent.sh, themes.sh
This is the largest and most complex package.
Issues:
env.sh:
$BROWSERis set toelinksby default (line 56), then switched toqutebrowserif$DISPLAYis set — but onlyqutebrowseris handled.braveis commented out.FIREFOX_PROFILE(line 37) — hardcodes.mozilla/firefoxwhich may be overridden by XDG env.ICEAUTHORITYandTERMINFOuse broken curly-brace syntax:{$XDG_CACHE_HOME:-$HOME/.cache}(lines 162-165). The braces should wrap the whole default expression:${XDG_CACHE_HOME:-$HOME/.cache}.$EDITORfallback chain:vim→nvim(lines 52-53). Good.$OPENERfallback:xdg-open→mimeopen(lines 61-64). Good.LF_ICONSis extremely long (lines 336-406) — makesenv.shhard to navigate. Consider moving to a separate file.
alias.sh:
7. ls aliases conflict — if both lsd and eza are installed, the lsd aliases on lines 5-6 run but are overwritten by the eza block on lines 7-24. The lsd block is dead code on systems with eza.
8. alias gitui='gitui -t mocha.ron' — hardcoded path; works only if mocha.ron is in the gitui config dir.
9. alias top='htop' — if btop is also installed, this may not be the monitor you want.
10. alias X="startx" — likely a typo; lowercase x might be intended.
keybinding.sh:
11. bindkey '^[[A' fzf-history-widget maps Up arrow to fzf-history-widget — this replaces the default up-line-or-history for all uses, not just the history menu. Consider binding to ^R instead.
12. bindkey -s '^[x' 'fconf\n' — uses -s (string) which may interfere with other plugins.
functions.sh:
13. supported_colors() uses a bare NONE variable that is never defined.
14. explain_command() reads whatis for a random command — this may fail silently or produce "nothing appropriate".
15. ggs() modifies files in /home/heiko/.cache/git-global/ — fragile to hardcoded paths.
16. public_ip() calls ipinfo.io without HTTPS.
fuzzy_functions.sh:
17. fja and fj reference JiraIssueCache*.issues files in $XDG_CACHE_HOME — if these files don't exist, the functions fail silently.
18. fdc and fdi (Docker fzf functions) — echo $images and echo $iid on lines 511-512 output debug info that should probably be removed.
19. fgi() has a --bind 'enter:become(...)' on line 194 — but --expect is also used on line 193. Fzf doesn't support both simultaneously for the same key; --expect wins for enter, and become never runs.
Recommendations:
- Fix the brace syntax in
ICEAUTHORITYandTERMINFOvariables. - Move
LF_ICONSor other large data into separate files sourced on demand. - Resolve
lsalias conflicts (lsd vs eza). - Fix
public_ip()to use HTTPS. - Fix
fgi()enter binding conflict. - Remove debug
echolines fromfdi.
Files: starship.toml
Issues:
- Git status shows
staged = " $count"but the format doesn't include the$stagedvariable explicitly. It's included via$all_statusinformat, so this may work. usernamealways shown withshow_always = true— may be redundant if the prompt already hashostname.shellmodule disabled by default — fine, but some users may want to see the current shell indicator.
Recommendations:
- No major issues; the config is well-structured with a beautiful Catppuccin Mocha palette.
Files: stylua.toml
Issues:
- Simple config: 160 column width, Unix line endings, 4-space indent, single quotes, no call parentheses. All good.
Files: config
Issues:
save_dir=$HOME/media/pix/screenshots— uses$HOMEwhich is not expanded at config parse time by swappy. Depending on the version, this may use the literal$HOMEstring as the directory name.
Recommendations:
- Verify that
$HOMEis expanded — if not, use an absolute path like/home/heiko/media/pix/screenshots.
Files: swhkdrc
Issues:
- BSPWM-specific keybinds (lines 13-14, 22-23, 28) — uses
bspc nodecommands. This file is misplaced — it belongs with the BSPWM stow package, not as a standalone. On non-BSPWM systems these keys do nothing. - Deprecated
scrotusage (line 5) —scrotis unmaintained. Considermaim,grim(Wayland), or justimportfrom ImageMagick. - Hardware-specific keybinds —
XF86LaunchA,XF86LaunchBmay not exist on all keyboards.
Recommendations:
- Rename the package to
_swhkdto indicate it's not auto-stowed, or move the BSPWM-specific parts into a dedicated package. - Replace
scrotwithmaimor make it conditional.
Files: tmux.conf, plugins/vim-tmux-navigator (submodule)
Issues:
set -g default-terminal "${TERM}"(line 20) — This evaluates$TERMat config load time. Inside tmux,TERMis set totmux-256colororscreen-256color, but the quoted value may be empty if loaded early. Prefer a literal.default-terminalis not set to a concrete value liketmux-256color— the terminfo database lookup may fail ifTERMwasn't set.- Standalone
run-shellfortmux-thumbs(line 110) — usually handled by TPM, but it runs twice (once viarun-shell, once via TPM's automatic run). Check for duplicate plugin initialisation. @thumbs-reqexp-2typo:reqexpinstead ofregexp(line 193) — this option is silently ignored, so URL matching falls back to defaults.@continuum-restore 'on'appears twice (lines 100 and 154) — the first is commented out but the second is active. With@resurrect-strategy-nvim 'session'enabled, ensuretmux-resurrectandtmux-continuumplugins are also loaded (they are commented out on lines 99-100).- No explicit
set -g default-terminal "tmux-256color"set for true color support — relies entirely on terminal-overrides.
Recommendations:
- Fix typo
@thumbs-reqexp-2→@thumbs-regexp-2. - Set
default-terminalto"tmux-256color"explicitly. - Remove the duplicate
run-shellline if TPM manages thumbs. - Verify
continuum-restoreis paired with an active plugin load (uncomment lines 99-100).
Files: topgrade.toml
Issues:
remote_topgrade_pathhardcoded to/home/heiko/.nix-profile/bin/topgrade— only valid if Nix is installed on that specific path.reposlist only contains personal repos — nopull_predefinedconfig, meaning Topgrade will not pull the default set of repos. That's fine if intentional.skip_notify = true— no notification of completion. If you want a summary, consider setting tofalse.
Recommendations:
- None critical; config is clean.
Files: user-dirs.dirs, user-dirs.locale
Issues:
- Mismatch with
env.sh:XDG_PICTURES_DIRis$HOME/pixin this file (line 15), but$HOME/media/pixinenv.sh(line 22). These should be consistent. XDG_TEMPLATES_DIRis$HOME/media/temp— unusual; normally it would point to a Templates directory.- This file is generated by
xdg-user-dirs-updateand may be overwritten if that utility runs.
Recommendations:
- Align
user-dirs.dirswith the values inenv.shfor consistency.
Files: vifmrc, scripts/README
Issues:
vifmrcnot inspected in detail — only ascripts/READMEexists beyond the mainvifmrc.
Recommendations:
- Consider adding a colour scheme to match Catppuccin Mocha.
Files: config.jsonc, style.css, mocha.css
Issues:
- Hardcoded
width: 1920(line 5) — this won't work on non-1080p monitors or multiple monitors. Set it to 100% or remove for auto-width. on-clickactions hardcodest -e(lines 51, 74) —stmay not be installed; consider using the$TERMINALvariable.backlightmodule useslight -T(lines 91-92) — thelightutility may not be installed. Considerbrightnessctlas used in Hyprland bindings.- No styling for selected workspace — the
#workspaces button.activeinstyle.cssuses generic colours (#64727D), not Catppuccin Mocha palette variables. style.cssimportsmocha.css(line 1) but doesn't use the CSS variables from it for most module background colours — many modules have hardcoded hex colours.
Recommendations:
- Change
widthto100%or remove it. - Replace
st -ewith$TERMINAL -eor a generic launcher. - Use Catppuccin Mocha CSS variables (from
mocha.css) throughoutstyle.cssinstead of hardcoded colours. - Switch backlight to
brightnessctlfor Wayland compatibility.
Files: wezterm.lua
Issues:
window_background_opacityset twice (lines 27 and 98) — the second value (0.90vs0.9) overrides the first. Remove the duplicate.animation_fps = 1(line 87) — very low; cursor blink will be sluggish. The default (60) is fine.cursor_blink_rate = 600(line 92) atanimation_fps = 1means the cursor only changes state once per second.config.fontusesfont_with_fallbackwith three fonts — good practice. Consider addingNoto Color Emojias the last fallback for emoji support.- Split keybindings use
LEADER+|for vertical split and-for horizontal — these are reversed vs. tmux conventions (-for horizontal,|for vertical). Verify this is intentional.
Recommendations:
- Remove duplicate
window_background_opacity. - Increase
animation_fpsto 60 or remove it (default). - Split semantic: swap
|(vertical) and-(horizontal) if they don't match your muscle memory. - Add emoji fallback font.
Files: Xresources, xinitrc
Issues:
- Gruvbox colours only — no Catppuccin Mocha. This is fine for X11 sessions, but the theme mismatch with the rest of the system is notable.
xinitrcloadsXresourcestwice (lines 22-24 and 34-37) — once unconditionally at the start, and once after checking forsysresources. This is a no-op but confusing.xinitrcis a complex shell script — theget_session()function duplicates the session launching logic that~/.xinitrcnormally delegates to a display manager.Xresourceshas duplicate color definitions — lines 17-23 set*background,*foreground, etc., then lines 78-80 set*.background,*.foregroundagain with the same values.Xresourcesline 43 —*color12is#835a98(a pinkish-purple) instead of the correct Gruvbox blue#83a598— this looks like a typo (835avs83a5).
Recommendations:
- Fix the
*color12typo on line 43 (#835a98→#83a598). - Remove duplicate colour definitions in
Xresources. - Simplify
xinitrcor consider using a display manager. - Consider adding a Catppuccin Mocha Xresources variant.
Files: init.lua
Issues:
git cloneininit.lua(line 9) — cloning external repos from within a config file is unusual and raises security concerns. Prefer a plugin manager or manual install.- Version pinned to
0.21.2(line 1) — may be outdated; newer xplr versions may have breaking changes. - Fzf plugin key conflicts —
ctrl-f(line 43) but line 32 also binds fzf in several places. Check for overlaps.
Recommendations:
- Instead of cloning in
init.lua, useinstall.shto set up xplr plugins. - Update the version constraint.
Files: xsuspender.conf
Issues:
Defaultsection is identical tohyprsuspender.toml— but this is for X11 (xsuspender) whereashyprland/hyprsuspender.tomlis for Wayland (hyprsuspender). Both are maintained separately, which is good.resume_every = 57andresume_for = 3— windows resume for 3 seconds every ~1 minute. This is minimal but works.
Recommendations:
- None critical.
Files: init.lua, theme.toml, keymap.toml, package.toml, package.toml.orig, flavors/catppuccin-mocha.yazi, plugins/
Issues:
package.toml.orig— an orphaned backup file; should be removed.- Key
zis used twice inkeymap.toml: once forjump zoxide(line 101) and once forplugin mermaid -- toggle-mode(line 304) in the prepend section. The prepend keymap takes priority, soztoggles mermaid instead of zoxide. init.luaonly referenceseza-previewandduckdb— but the plugins listed inpackage.toml(via install.sh) includegit,diff,chmod, etc. Many plugins are installed but not configured ininit.lua.- Key
Lis used twice: once forplugin bypass(tab manager prepend line 33) and once forplugin duckdb +1(line 287-290). The prepend keymap block on line 283 overrides the one on line 33 forL.
Recommendations:
- Remove
package.toml.orig. - Resolve the key conflict for
zandL. - Add configuration for the installed-but-unconfigured plugins (
git,chmod,diff,mount, etc.).
Files: conf.sh
Issues:
thumb_disp_method="ueberzug"— ueberzug is unmaintained. Considerchafa,catimg, orviu.history_fileuses$cache_dirwithout the variable being sourced first —cache_diris defined inconf.sh(line 41), so it works within the file scope. OK.is_downloaddefined twice (lines 135 and 161) — the second overrides the first; harmless but redundant.external_menu(line 62-65) callsdmenuexplicitly inside the function —dmenumay not handle the 40-line menu height on all setups.
Recommendations:
- Replace
ueberzugwithchafaorviu. - Remove duplicate
is_download. - Consider rofi as alternative external menu.
Files: zathurarc, catppuccin-mocha
Issues:
set sandbox none(line 19) — disables zathura's sandbox for following links. This is a security trade-off (necessary forsynctexlinks). Document this.map g goto top(line 22) — overrides the scroll-to-top key. OK.recolorenabled (line 49) — inverts PDF colours for dark mode. This may break PDFs with alpha transparency.window-widthandwindow-height— set to 768x1024, fixed. Consider not setting these for auto-sizing.
Recommendations:
- Add a comment explaining why
sandbox noneis needed. - Set
window-widthandwindow-heightdynamically or remove them.
Files: config.kdl
Issues:
keybinds clear-defaults=true— this wipes all default keybinds and redefines everything from scratch. This is powerful but means any new Zellij feature won't have a keybind until manually added.theme "catppuccin-mocha"(line 249) — uses a built-in Zellij theme name. Verify this matches an installed theme; Zellij 0.40+ ships withcatppuccin-mocha.pane_frames false(line 217) — hides pane borders for a cleaner look. Fine.- The locked mode only has one key (
Ctrl g) to unlock — if you forget this, you're locked out until you restart the session. Ctrl bappears in bothpaneandshared_except "tmux"(lines 33, 46, 181) —Ctrl bin pane mode (line 33) switches to Normal mode, but in the shared tmux section (line 181)Ctrl bswitches to Tmux mode. Theclear-defaults=truemeans they won't conflict.
Recommendations:
- Add more keybinds to
lockedmode (e.g., a short hint). - Consider not clearing all defaults — use individual
unbindstatements instead, so new Zellij features get automatic keybinds.
Files: .zshenv, dot-config/zsh/zprofile, dot-config/zsh/zshrc
Issues:
zprofilesourceszshrc(line 2) — this means every login shell also loads thezshrcwhich contains interactive-only settings (prompt, keybinds, completions). This may break non-interactive SSH commands or scripts..zshenvsources bothenv.shandzshrc(lines 2-3) — same problem:zshrc(with prompt, keybinds, completions) is loaded for every shell, even non-interactive ones. The[[ $- == *i* ]]check at the top ofzshrc(line 2) mitigates this, but sourcingfzfkeybindings in non-interactive shells is unnecessary.HISTORY_IGNORE(line 15) — only works with thehist_ignore_all_dupsoption set. Currently onlyHIST_EXPIRE_DUPS_FIRSTis enabled (line 16). History ignore will not work without both.bindkey -v(line 68) enables vi-mode, butKEYTIMEOUT=1(line 69) is extremely short (10ms) — may cause Esc to not register properly on slow terminals.$PROMPT_COMMANDsets the terminal title (lines 22-29) —PROMPT_COMMANDis a bash construct; in Zsh the equivalent isprecmd(). This should be aprecmdhook, notPROMPT_COMMAND.- VBoxClient checks (lines 32-39) — only relevant inside a VirtualBox VM. This clutters every shell startup on bare metal.
aichatintegration (lines 41-53) — nice feature, butaichat -eis called synchronously and blocks the shell prompt while generating.
Recommendations:
- Move interactive-only sourcing (fzf, sheldon, starship, etc.) to
zshrconly (which already happens), but fixzprofileto not sourcezshrc. - Fix
HISTORY_IGNOREby addingsetopt HIST_IGNORE_ALL_DUPSorsetopt HIST_IGNORE_SPACE. - Replace
PROMPT_COMMANDwith a Zshprecmdhook:autoload -Uz add-zsh-hook; add-zsh-hook precmd '...'. - Move VirtualBox checks to a separate script sourced only when needed.
- Consider making
aichatasync or adding a timeout.
Issues:
- XDG variable exports duplicate the definitions in
env.sh(lines 6-18) — ifenv.shchanges,install.shmay become inconsistent. fdused for stow operations (lines 37-39) — requiresfdto be installed before running. Consider a fallback tofind.mkdir -p "$XDG_MUSIC_DIR" 3>/dev/null(line 27) — typo:3>/dev/nullshould be2>/dev/nullfor stderr redirection.cd ~/optthencd -(lines 45, 52) — if~/optdoes not exist,cd ~/optfails, and the rest of the block is skipped. The||guard on the second cd is good.sheldon lock --update(line 69) — runs before any stow operations finish, which may be fine but could conflict if sheldon is still being set up.- Age key generation (lines 107-131) — generates two age keys with different methods. The second key (
${USER}@$(cat /etc/hostname).age) is encrypted with a password and may not be auto-detected bySOPS_AGE_KEY_FILE.
Issues:
run_as_rootfunction installs specific package list — assumesartix-archlinux-supportis desired. On vanilla Arch this breaks.read -r -pon lines 38, 57 — missing prompt string argument for-p. This causes a syntax error on some shells.- Network config (lines 39-42) — hardcoded to
192.168.1.xsubnet. Not portable. newgrp docker(line 45) — opens a new shell as thedockergroup, which interrupts the script execution. The rest of the script won't run.
Issues:
- The
updaterecipe doesgit fetch...rebaseand thengit pull— redundant.pullwill fetch again and try to merge the already-rebased HEAD. It should just begit pull --rebase --recurse-submodules. $just --list(line 3) uses$justwhich is an infinite recursion if invoked asjust.
This repository is licensed under the MIT License. See LICENSE for details.
Generated and maintained by Heiko Riemer