Personal macOS configuration: shell (zsh + bash), git, vim, Claude Code, agent-deck, direnv, Homebrew. Stow-based, with a one-shot bootstrap script for fresh laptops.
Prerequisite: Xcode Command Line Tools — xcode-select --install.
git clone git@github.com:maclir/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
make bootstrapmake bootstrap runs bin/bootstrap.sh, which:
- Verifies Xcode CLT
- Installs Homebrew (if missing)
- Runs
brew bundleagainst the trackedBrewfile - Moves any pre-existing real
.zshrc/.gitconfig/etc. aside as*.preexisting - Stows every package into
$HOME(make install) - Symlinks the tracked
direnv/code/{work,personal}/.envrcfiles into place (make direnv) - Seeds
~/.env.shfromshell/.env.sh.example(chmod 600) - Installs vim plugins (
vim +PlugInstall +qall) - Prints the remaining manual checklist
The script is idempotent; rerun it any time.
These can't be automated:
- Restore
~/.ssh/keys from a secure transfer;ssh-add --apple-use-keychain ~/.ssh/id_ed25519 - Edit
~/.env.shand fill in tokens (GITHUB_TOKEN, etc.) - Recreate the per-directory git config includes referenced from
git/.gitconfig:~/code/work/.gitconfig— work email + signing key~/code/personal/.gitconfig— personal email + signing key~/go-workspace/src/work/.gitconfig~/go-workspace/src/personal/.gitconfig
direnv allow ~/code/work && direnv allow ~/code/personal- Restore GPG keys if signing commits
- Sign in to:
gcloud auth loginandgcloud auth application-default logingh auth login(andgh auth login --hostname ghe.spotify.netfor work)- SDKMAN (
sdk install java,sdk install kotlinas needed)
- Install GUI apps not covered by the Brewfile
| Target | Behavior |
|---|---|
install |
stow -t ~ <packages> — symlinks all tracked configs into $HOME (default) |
uninstall |
Removes the symlinks |
update |
git pull && make install |
pull |
git pull only |
bootstrap |
One-shot fresh-laptop setup (runs bin/bootstrap.sh) |
direnv |
Symlinks direnv/**/.envrc files into $HOME/... and prints direnv allow reminders |
brew |
brew bundle --file ./Brewfile |
dump-brew |
Regenerate Brewfile from currently installed Homebrew packages |
.
├── Makefile / Brewfile / README.md
├── bin/bootstrap.sh
├── git/ → ~/.gitconfig, ~/.git-templates/, ~/.git-*.sh helpers
├── shell/ → ~/.profile, ~/.zshrc, ~/.zprofile, ~/.bash_profile, ~/.env.sh.example
├── vim/ → ~/.vimrc, ~/.vim/
├── gitignore/ → ~/.config/git/ignore
├── agent-deck/ → ~/.agent-deck/config.toml
├── claude/ → ~/.claude/, ~/.claude-work/ (settings.json, CLAUDE.md)
└── direnv/ → symlinked into ~/code/{work,personal}/.envrc by `make direnv`
~/.env.shis intentionally not tracked. Holds local tokens.Brewfileincludes thespotify/sptapstap which requires GHE access. On non-Spotify machines the entries from that tap will fail; comment them out or remove them.- Vim plugins are managed by vim-plug.
Bootstrap runs
:PlugInstallautomatically; rerun withvim +PlugInstall +qall.