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 Loop:
@bybrawe/opencode-loop@0.5.1is loaded through OpenCode's native npm plugin support, with/loop*command stubs managed under~/.config/opencode/commands/. - OpenCode Claude Code plugin:
@khalilgharbaoui/opencode-claude-code-plugin@0.6.2is loaded through OpenCode's native npm plugin support; after changing the plugin path, runchezmoi apply /home/collie/.config/opencode/opencode.jsonand restart OpenCode.
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/...