Personal dotfiles managed with chezmoi. One repo, several machines.
chezmoi init --apply collieiscute -v| OS | Package manager | Status |
|---|---|---|
| macOS | Homebrew | daily-driven |
| Arch / CachyOS | pacman + paru | daily-driven |
| Ubuntu / Debian / Linux Mint | apt | CI-tested only |
- Catppuccin by default on macOS and non-Noctalia apps. On Linux, Noctalia renders Kitty, Alacritty, and Ghostty colors from the current wallpaper.
- Theme files for kitty and alacritty are pulled from the upstream
catppuccin/*repos via.chezmoiexternal.toml.tmplwithrefreshPeriod = "168h"; Ghostty uses its built-in Catppuccin theme. - Font: JetBrainsMono Nerd Font across every terminal / bar / lock screen.
Two Hyprland machines (home + office) share one config but pin different monitors to ws1/2/3. Office hosts get desc-keyed workspace rules; home hosts use Hyprland's default per-monitor assignment (which already gives 1/2/3) — hand-rolled rules would otherwise reserve those slots even when the matching monitor isn't connected (see hyprland.lua.tmpl head comment for the underlying bug).
To mark a machine as office: edit ~/.config/chezmoi/chezmoi.toml →
[data]
location = "office"Then chezmoi apply.
run_onchange_*scripts only re-run when their rendered content changes. Manifest files (fish_plugins,Brewfile) that aren't templated into the script bodies don't trigger reruns. Both are pinned via embedded sha256 hash comments — seerun_onchange_after_1-setup-fish-and-its-plugins.sh.tmplandinstall-packages_darwin.tmpl.- All apt-based distros share
.packages.ubuntu.aptand the lazygit-from-GitHub fallback (lazygit isn't in Ubuntu apt). - Fonts use the Nerd Font patched family (
JetBrainsMono Nerd Font), not the un-patched JetBrains Mono — drop that distinction and bar icons disappear.
- Prefix is
C-z(soC-bstays free for vim). - Splits:
prefix |(horizontal),prefix -(vertical), inheriting the current pane's path. set-clipboard on+allow-passthrough→ OSC 52 yank works over SSH without X11 forwarding.- Sessions auto-restore via tmux-resurrect + tmux-continuum on tmux start.
- Used on macOS specifically because AeroSpace tiles each Ghostty native tab as a separate window — Kitty's custom tab bar appears as a single AXWindow.
cmd+option/Alt key bindings deliberately avoided (macOS 26 Tahoe intercepts them).- macOS loads Catppuccin Macchiato directly. Linux keeps Catppuccin as a fallback and then
globincludes Noctalia's generatedthemes/noctalia.confso wallpaper changes can update Kitty without Noctalia editingkitty.conf. - Alacritty and Ghostty use the same ownership model: chezmoi owns the main config, while Noctalia only rewrites generated theme overlays under each terminal's theme directory.
- 6 Lua
hl.monitor(...)rules (3 home + 3 office) — desc-keyed so the right machine picks the right monitors automatically. - Cursor: Catppuccin Mocha Teal (Hyprcursor) with Catppuccin Mocha Green as XCursor fallback.
- Electron / fcitx5 / GTK theming env vars set centrally.
- Noctalia v5 owns the desktop shell layer (bar, launcher, notifications, wallpaper, lock screen, idle, screenshots, clipboard).
- Wallpapers are deployed by chezmoi to
~/.config/wallpapers; Noctalia reads that path directly. - Noctalia is the Linux wallpaper/theme owner. App theme integrations should write generated theme files and reload apps, not mutate chezmoi-managed main config files.
- Noctalia desktop/lockscreen widget placement is generated from monitor roles and ratios in
20-widgets.generated.toml.tmpl; runchezmoi applyafter moving between home/office monitor layouts. - If widgets are edited in Noctalia's GUI, remove
[desktop_widgets]and[lockscreen_widgets]from~/.local/state/noctalia/settings.tomlor fold the new ratios back into the template; state overrides win over declarative config.
$SUPER = Windows / Cmd key. $ALT = Option / Meta. $CTRL = Control.
| Bind | Action |
|---|---|
SUPER+T |
open Kitty |
SUPER+E |
open Nautilus |
SUPER+C |
close window |
SUPER+M |
exit Hyprland |
SUPER+V |
toggle floating |
SUPER+P |
pseudotile |
SUPER+RETURN |
true fullscreen |
SUPER+N |
toggle Noctalia notifications |
SUPER+S |
toggle scratchpad workspace |
SUPER+SHIFT+S |
move window to scratchpad |
SUPER+SPACE |
Noctalia launcher |
ALT+L |
Noctalia lock screen |
ALT+J |
toggle split |
ALT+P |
Noctalia region screenshot → clipboard |
CTRL+RETURN |
maximize |
SUPER+H/J/K/L |
focus left/down/up/right |
SUPER+1..9,0 |
switch workspace 1..10 |
SUPER+SHIFT+1..9,0 |
move window to workspace |
SUPER+SHIFT+H/L |
move window to prev/next monitor |
SUPER+scroll |
cycle workspaces |
SUPER+LMB/RMB drag |
move/resize floating window |
XF86Audio* |
volume / mute / mic mute |
XF86MonBrightness* |
screen brightness |
| Bind | Action |
|---|---|
prefix | |
split horizontal (keep cwd) |
prefix - |
split vertical (keep cwd) |
prefix v (copy mode) |
begin selection |
prefix C-v (copy mode) |
rectangle toggle |
prefix y (copy mode) |
copy + cancel |
C-←/↓/↑/→ |
resize pane (smart-splits) |
prefix I |
install plugins (TPM) |
prefix U |
update plugins (TPM) |
| Bind | Action |
|---|---|
Cmd+T |
new tab |
Cmd+W |
close tab |
Cmd+Shift+]/[ |
next / previous tab |
Cmd+Shift+→/← |
move tab forward / backward |
Cmd+D |
new window (split) |
Cmd+Shift+D |
close window |
Ctrl+Shift+]/[ |
next / previous window |
Cmd+Shift+J/K |
scroll line down / up |
Cmd+Shift+N/U |
scroll page down / up |
Cmd+Shift+Home/End |
scroll to top / bottom |
Cmd+C / Cmd+V |
copy / paste |
Cmd+Shift+F5 |
reload config |
Cmd+Shift+F6 |
debug config |
Ctrl+± / Ctrl+0 |
font size + / − / reset |
| Alias | Expands to |
|---|---|
vi |
nvim (when nvim is installed) |
buu |
brew update && brew upgrade -y && fisher update (macOS only) |
fish— primary shell.tmux— primary multiplexer.zellij— secondary multiplexer (Catppuccin Mocha built-in theme).
neovim— LazyVim distro on top.
kitty— macOS daily driver (AeroSpace-friendly tabs).wezterm— cross-platform fallback.ghostty— newer GPU terminal, Catppuccin Macchiato fallback.alacritty— minimal GPU terminal.
hyprland— Wayland compositor.noctalia— desktop shell: bar, launcher, notifications, wallpaper, lock screen, idle behavior, screenshots, clipboard, and control center.sddm— bootstrap and fallback display manager for fresh Arch installs.greetd+Noctalia Greeter— final Wayland login greeter after AUR packages are installed.fcitx5+ chewing — Chinese input.
- Fresh Arch installs should use
SDDMfromarchinstallfirst; chezmoi switches togreetdonly afternoctalia-greeter-sessionis installed and setup succeeds. SDDMstays installed as the fallback display manager.- The switch script only enables/disables services; it does not stop/start the current graphical session.
- If Noctalia Greeter shows a black screen, switch to a TTY with
Ctrl+Alt+F2and runsudo systemctl disable --now greetd.service && sudo systemctl enable --now sddm.service. - If TTY switching does not work, boot with
systemd.unit=multi-user.targetfrom GRUB, then run the same service switch.
aerospace— tiling WM.karabiner-elements— keyboard remapper.raycast— launcher.- Desktop wallpaper is deployed by chezmoi to
~/.config/wallpapersand applied byrun_onchange_after_3-configure-macos-wallpaper.sh.tmpl.
- File / dir:
eza,fd,ripgrep,bat,zoxide,fzf. - System info:
btop,fastfetch. - Git:
lazygit,tig,gh,glab,onefetch. - Build / dev:
gnu-tar,bear,cmake,mold,ninja,llvm,clang-format,cppcheck,uv. - Containers: macOS Apple silicon
container+ third-partycontainer-compose; Linuxpodman. - Docs:
hugo,typst,tldr. - OpenCode zh-TW linting:
zhtw-mcpis configured as a local MCP server at~/.local/bin/zhtw-mcp. Until upstream publishes releases, install it from source withmake installso OpenCode can use the fixed binary path. - OpenCode Claude Code plugin:
@khalilgharbaoui/opencode-claude-code-pluginis loaded through OpenCode's native npm plugin support; after changing the plugin list, runchezmoi apply /home/collie/.config/opencode/opencode.jsonand restart OpenCode.
home/.chezmoidata/ai.yamlis the single inventory for user skills, marketplaces, and plugins across Claude Code, Codex, and OpenCode. Entries intentionally track upstream latest releases.run_after_5-sync-ai-extensions.sh.tmplsynchronizes Claude Code and Codex plugins and copies listed skills to each CLI's user skill directory on everychezmoi apply. Removing an entry from the inventory does not uninstall existing local content.- OpenCode plugins are rendered into
~/.config/opencode/opencode.json; OpenCode installs them at startup. Review and trust new Codex hooks manually with/hooks.
Fish plugins (managed by fisher)
catppuccin/fish— colour theme.edc/bass— run bash scripts in fish.jorgebucaran/nvm.fish— Node version manager.patrickf1/fzf.fish— fzf integrations.pure-fish/pure— minimal prompt.
Tmux plugins (managed by TPM)
catppuccin/tmux— status-bar theme.mrjones2014/smart-splits.nvim—Ctrl+Arrowresize, plays nice with neovim.tmux-plugins/tmux-sensible— sensible defaults.tmux-plugins/tmux-continuum— auto-save/restore on start.tmux-plugins/tmux-resurrect— manual save/restore + nvim session capture.
zbirenbaum/copilot.lua— Copilot.giuxtaposition/blink-cmp-copilot— Copilot source for blink.cmp.neovim/nvim-lspconfig+p00f/clangd_extensions.nvim— LSP, with extra clangd polish.nvim-treesitter/nvim-treesitter— syntax.ibhagwan/fzf-lua— fuzzy finder.sphamba/smear-cursor.nvim— animated cursor.folke/snacks.nvim— utility collection.
home/ # chezmoi source root (.chezmoiroot=home)
├── .chezmoidata/packages.yaml # canonical package list (pacman + apt)
├── .chezmoiexternal.toml.tmpl # auto-pulled theme files
├── .chezmoiscripts/ # run_once / run_onchange bootstrap
├── .chezmoitemplates/ # macOS install template (Brewfile pass-thru)
└── dot_config/ # → ~/.config/...