Personal dev environment managed with GNU Stow. Home-facing configs live in home/.
home/: single Stow package targeting~home/.config/: app configs (Stow targets~/.config/)home/.claude/: Claude Code subsystemhooks/: PostToolUse hooks:format.py(prettierd auto-format),ts_lint.py(ESLint reporter),notification.py;update-marketplace.shto sync plugin marketplacescripts/integrations/: Python CLI wrappers (github, gmail, jira, calendar); shared Google OAuth inlib/google_auth.py; entry pointquery.pyscripts/launchd/: macOS scheduled job plists
home/bin/: personal scripts onPATHBrewfile: managed viadotfiles packages
dotfiles init # Full environment setup
dotfiles packages # Install Homebrew packages from Brewfile
dotfiles sync # Sync config symlinks via Stow
dotfiles update # Update dotfiles and packages
dotfiles doctor # Health check, use to VERIFY any changes
dotfiles doctor --verbose
dotfiles backup # Backup existing configs before changes
dotfiles ds_store # Clean .DS_Store filesAfter config changes, run dotfiles doctor to verify system health.
Test tmux changes: tmux source-file ~/.config/tmux/tmux.conf
$DOTFILES: path to this repo$THEME_FLAVOUR: Catppuccin variant (frappe/latte/macchiato/mocha); pre-set tomacchiatoinhome/zsh/zsh.d/00-env.zsh. Override per-shell if needed.
.env(gitignored, repo root): API keys, sourced byhome/zsh/zsh.d/80-integrations.zshhome/.claude/scripts/integrations/.tokens/(gitignored): OAuth tokens (Google, etc.)- Never commit either; pre-commit hook + global safety rules enforce this
After adding or modifying plugins in home/.claude/plugins/:
bash home/.claude/hooks/update-marketplace.sh- Stow symlinks
home/.config/<app>/to~/.config/<app>/; editing either side modifies the same file - Neovim entry:
init.lualoadsrequire("kriscard"); don't rename without updating both .stow-local-ignorecontrols what Stow skips insidehome/; repo files outsidehome/are never stowed