Personal config files managed with GNU Stow.
git clone <repo-url> ~/Documents/setup/dotfiles
cd ~/Documents/setup/dotfiles
# Setup secrets
cp secrets.env.example secrets.env
# Edit secrets.env with real values
# Bootstrap everything
./bootstrap.shdotfiles/
├── stow/ # Stow packages (each dir = one package)
│ ├── git/ # .gitconfig
│ ├── zsh/ # .zshrc (modular loader) + .zsh/ modules
│ ├── npm/ # .npmrc (token from secrets)
│ ├── claude/ # .claude/settings.json (token from secrets)
│ ├── xdg-config/ # ~/.config/* (zed, gh, raycast, opencode)
│ └── vscode/ # VS Code settings
├── scripts/ # link-secrets.sh, macos-defaults.sh
├── Brewfile # Homebrew bundle
├── bootstrap.sh # Full setup script
└── secrets.env.example # Secret template
mkdir -p stow/tmux
mv ~/.tmux.conf stow/tmux/.tmux.conf
cd stow && stow -t $HOME tmuxvim stow/zsh/.zshrc # symlink auto-updatescd stow && stow -t $HOME -D zsh # unstow
rm -rf stow/zsh/- Never commit secrets.env or any file with tokens/keys
- zsh loads secrets via
source ~/.secrets.env - npmrc gets NPM_TOKEN via
scripts/link-secrets.sh - Claude Code settings.json gets model/compact-window env vars via
scripts/link-secrets.sh(templatestow/claude/.claude/settings.jsonholds${VAR}placeholders; jq injects real values into~/.claude/settings.jsonas a regular file). No proxy/auth-token injection — Claude Code uses the official Anthropic subscription. - On new machine:
cp secrets.env.example secrets.env→ fill values →./scripts/link-secrets.sh
xcode-select --install- Clone this repo
cp secrets.env.example secrets.env→ fill secrets./bootstrap.shgh auth login- Restart terminal
.zshrc loads modules from ~/.zsh/ in order:
env → path → plugins → aliases → bindings → secrets → local.zsh
local.zshis gitignored — machine-specific overrides without forking~/.secrets.envis gitignored — API keys, tokens