Collapse redundant template tags into a cleaner data model: - drop the desktop tag (use "not laptop"); replace hyprland/niri with compositor = "hyprland"|"niri"; replace cs2/entertainment with an apps list (gated via has); drop the dead waybar tag. - move app->workspace->monitor routing into a portable [[data.placement]] table keyed by monitor role (left/right/primary), resolved per machine with fallback to the primary monitor. workspaces.lua.tmpl and rules.lua.tmpl now generate the workspace/window rules from it, so single-monitor machines work with no hardcoded monitor names. Update CLAUDE.md / AGENTS.md / GEMINI.md schema references to match.
3.8 KiB
CLAUDE.md — chezmoi dotfiles
Chezmoi source tree for a Linux desktop (Hyprland + Neovim + Zsh/Zim).
Commands
chezmoi diff # preview pending changes
chezmoi apply # render templates and apply to $HOME
chezmoi status # show managed file status
After applying, reload the affected tool:
- Hyprland:
hyprctl reload - Waybar:
pkill waybar && waybar & - Neovim: reopen or
:source - Zsh:
exec zsh
Chezmoi file naming
| Prefix/Suffix | Meaning |
|---|---|
dot_ |
maps to . (e.g. dot_config/ → ~/.config/) |
executable_ |
sets executable bit |
private_ |
restricts permissions (600/700) |
symlink_ |
creates a symlink |
.tmpl |
Go template rendered at apply time |
##hostname.<name> |
host-specific variant |
Template data (chezmoi.toml)
Config lives at ~/.config/chezmoi/chezmoi.toml (not tracked). Access via .chezmoi.config.data.<key>.
The data model separates concerns:
tags— boolean machine traits only:laptop,touchscreen,pipewire,dev,bluetooth. The desktop case isnot (index $tags "laptop")(there is nodesktoptag).compositor— string,"hyprland"or"niri". Branch witheq .chezmoi.config.data.compositor "hyprland".apps— list of optional programs present on this machine (e.g.["steam", "spotify", "jellyfin"]). Gate withhas "steam" .chezmoi.config.data.apps.data.monitors— array (size varies per machine). Each hasname, optionalprimary = true, and arole("primary"/"left"/"right") used by placement.data.placement— array of app-home workspaces:id,name,role,apps(window classes routed here),silent, optionallayout/layoutopts/on_created_empty/requires. Aroleresolves to the monitor carrying it, falling back to the primary monitor when absent (single-monitor machines "just work").requiresdrops the entry unless that program is inapps. Consumed byhypr/hyprland.d.lua/workspaces.lua.tmpl(workspace_rule) andrules.lua.tmpl(window_rule).data.microphones— array; only meaningful whenpipewire = true.
Architecture
dot_config/hypr/— Hyprland. Entry point:hyprland.conf. Modular includes inhyprland.d/. New settings go in the appropriatehyprland.d/file.dot_config/nvim/— Neovim (Lua + lazy.nvim).init.luabootstraps lazy. Plugins:lazy_setup.lua. General settings:polish.lua. 2-space indents; seedot_stylua.toml+selene.toml.dot_config/waybar/— Waybar config and styles. Host-specific variants via##hostname.<name>.dot_config/zsh/— Zsh + Zim + Powerlevel10k. Aliases:aliases.zsh.dot_local/bin/— User scripts (allexecutable_prefixed)..chezmoiscripts/—run_onchange_*hooks run onchezmoi apply.
Theming — apex-aeon / apex-neon
Two custom themes (apex-aeon dark, apex-neon neon) are applied across nvim, zsh, waybar, alacritty, kitty, ghostty, btop, fuzzel, gtk4, spicetify, swaync, wezterm, zathura, zed.
Theme files are not edited by hand — they are synced from ~/Dev/Themes/apex/dist using:
refresh-apex-themes
This copies built theme artifacts into the appropriate dot_config/*/themes/ directories.
Local documentation
| Topic | Path |
|---|---|
| chezmoi | ~/.local/share/docs/chezmoi-docs/ |
| Hyprland | ~/.local/share/docs/hyprland.wiki/ |
| Waybar | ~/.local/share/docs/waybar.wiki/ (also man 5 waybar) |
| Nushell | ~/.local/share/docs/nushell-book/ |
| Ghostty | /usr/share/ghostty |
Commit convention
scope: imperative subject
Examples: hypr: adjust keybinds, waybar: tweak clock format, nvim: add plugin
For visual/UI changes include screenshots in the PR description, along with affected paths.