Managed by chezmoi. Two-repo setup: public (~/.dotfiles) + private (~/.dotfiles-private). Bootstrap: install.sh.
- Naming:
dot_→ dotfiles,executable_→ +x,private_→ restricted perms,empty_→ empty files - Boundary rule: secrets, auth tokens, or personal tooling config → private repo. Everything else → public repo.
.claude/*lives in the private repo (dot_claude/)- Git hooks:
.githooks/dir in public repo, configured viacore.hooksPath
- Always edit chezmoi source (
~/.dotfiles/or~/.dotfiles-private/), thenhome apply— never edit target (~/.config/,~/.*) directly - keybinds.conf ↔ keyb.yml must stay in sync — always update both when changing tmux bindings
_tmux_exit_codemust be first precmd — captures$?before OMP modifies it- tmux mouse selection is pane-aware — drag selects within pane, copies to system clipboard via OSC 52; Shift+drag falls back to native Ghostty selection
- tmux names Shift-Tab as
BTab(e.g.,M-BTab), notM-S-Tab - Dual keybindings for Alt+Shift combos — bind both
M-S-D(CSI u) andM-D(legacy) to the same action. Ghostty 1.3.0+ (#9406) breaksM-S-*in modifyOtherKeys mode by stripping the Shift modifier from Option-modified keys on macOS.extkeysis intentionally omitted fromterminal-featuresto keep Ghostty in legacy mode where case is preserved (M-dvsM-D). See keybinds.conf and tmux.conf comments for details Ctrl+Ris atuin, not fzf — atuin initialized with--disable-up-arrow- Emacs mode default (
bindkey -e) withC-ztoggle to vi — required for Alt keybinds without lag - Popup scripts live in
dot_config/tmux/scripts/, notdot_bin/ - OMP v29+ manages its own cache — no custom
cached_evalzfor prompt init cached_evalzinvalidates on binary mtime only — if a tool needs config-based invalidation, use custom cache logic- Shell integration: cursor + sudo only (not command_status — exit codes handled by zsh precmd)
- Sizes: 70%x80% (lazygit), 75%x80% (switcher), 37%x60% (keyb-popup), 20%x5 (new session)
- Command palette uses native
display-menu(no popup size — tmux auto-sizes) - Border: rounded, white
- fzf color scheme: catppuccin mocha via
FZF_MOCHA_COLORSincolors.sh - Tab/Shift-Tab cycles categories in switcher and keyb-popup
- Scripts use
fzf-tmux -pfor fzf-based pickers; lazygit and new-session usedisplay-popup
- Three-zone slant layout via
status-format[0]— theme.conf header comments are the canonical reference - Left (surface1 bg + slant): window dots with names, zoom/prefix indicators
- Centre (transparent, rounded pill): session name only
- Right (slant + surface1 bg): session squares
- Update theme.conf header comments when changing indicator logic
- tmux ↔ neovim:
C-M-h/j/k/lforwarded via@pane-is-vim(requires smart-splits.nvim) - tmux ↔ zsh:
_tmux_exit_codeprecmd →@last_exit_codewindow option → status bar error dot - tmux ↔ ghostty: terminal features (hyperlinks, clipboard — no extkeys) +
macos-option-as-altfor Alt binds.terminal-featuresreset withset -subefore appending to prevent duplicates on config reload - zsh ↔ yazi:
C-fwidget opens yazi;y()wrapper handles cd-on-exit via temp cwd file
- Ghostty:
ghostty +show-config - tmux:
tmux source-file ~/.config/tmux/tmux.conf - Dotfiles health:
home check - Dotfiles sync:
home sync - Shell scripts:
shellcheck(advisory — doesn't support zsh, SC1071 expected)