Personal dotfiles and setup automation for macOS development machines.
# 1. Install Homebrew packages
make brew # work machine
make brew-all # personal machine (includes extra apps)
# 2. Symlink dotfiles
make sync
# 3. Setup fish (plugins + set as default shell)
make fish
# 4. Optional extras (vim-plug, tmux plugins, docker completions)
make post-install
# 5. Apply macOS preferences
make config| Target | Description |
|---|---|
make |
Full setup: brew-all + sync + fish + post-install + config |
make brew |
Install Homebrew packages from Brewfile |
make brew-personal |
Install personal packages from Brewfile.personal |
make brew-all |
Install both Brewfile and Brewfile.personal |
make sync |
Symlink all dotfiles to their locations |
make fish |
Install fisher plugins and set fish as default shell |
make vim-plugins |
Install vim-plug and plugins |
make tmux-plugins |
Install tmux plugin manager |
make docker-completions |
Install Docker fish completions |
make claude-npx |
Install Claude Code npx packages |
make claude-plugins |
Install Claude Code marketplaces and plugins |
make claude-plugins-prune |
Same as above, plus remove unlisted items |
make post-install |
Run all optional installs (tmux, vim, docker, claude) |
make config |
Run macOS system preferences script |
make clean |
Remove all symlinked dotfiles |
- Shell: Fish with fisher plugin manager
- Terminal: Ghostty with Gruvbox theme (auto dark/light)
- Multiplexer: tmux with vim-style navigation
- Automatic theme sync (delta, bat, fzf, mitmproxy, Claude Code) with macOS dark/light mode via dark-notify
- Claude Code plugin management via
claude/marketplaces.txtandclaude/plugins.txt - GNU coreutils prioritized over BSD versions
- Global git hooks with gitleaks for secret detection
These files are created by make sync but not tracked in git:
~/.gitconfig.local- Local git config (user email)~/.config/fish/local.fish- Local fish config (secrets, machine-specific)~/.config/opencode/opencode.local.json- Local opencode config~/.ssh/config.local- Local SSH config (host overrides, IdentityAgent)~/.psqlrc.local- Local psql config
The default ssh/config uses 1Password agent. For GPG/YubiKey, override in ~/.ssh/config.local:
# Override to use GPG agent
Host *
IdentityAgent ${SSH_AUTH_SOCK}
And configure the agent socket in ~/.config/fish/local.fish:
# GPG/YubiKey
set -x GPG_TTY (tty)
set -x SSH_AUTH_SOCK (gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agentFor local verification of SSH-signed commits, create ~/.config/git/allowed_signers:
your@email.com ssh-ed25519 AAAA...your-public-key
another@email.com ssh-ed25519 AAAA...your-public-key
List each email you sign commits with, followed by your public signing key.