On a brand new Mac, run:
curl -fsSL https://raw.githubusercontent.com/pruett/dotfiles/main/bootstrap | bashThe bootstrap script is idempotent (safe to re-run) and handles everything needed to install these dotfiles and push changes back to this repo:
- Installs Xcode Command Line Tools (which provides
git) - Installs Homebrew
- Clones this repo to
~/.dotfilesover HTTPS โ public, so no auth needed yet (or pulls if already present) - Installs all formulae and casks from the Brewfile via
brew bundle(includingghandstow) - Authenticates with GitHub via
gh auth login(SSH key generated and uploaded for you), then switches theoriginremote to SSH so you can push - Prompts for your git identity and writes it to the gitignored
home/.gitconfig.local - Symlinks every package with
dot link(GNU Stow underneath), backing up any conflicting existing files to<file>.pre-dotfiles, then links skills for Claude Code withskills sync
Afterwards, review MACOS.md for the manual System Preferences checklist.
Everything below is done automatically by bootstrap, but documented here for one-off use.
$ cd ~/.dotfiles && brew bundledot (home/.local/bin/dot) owns all linking into ~:
$ dot status # what's out of date: unlinked files, folded dirs, dangling links
$ dot link # stow every package, link folded dirs, remove dangling links
$ dot edit # open this repo in $EDITOR (bare `dot` in zsh also cds here)A package is any top-level directory with tracked files (today just home); dot-directories like .plugins and .tools (CLI projects whose bin/ is symlinked from home/.local/bin) are never stowed. .stowrc sets --no-folding, so most files get their own link and a new file needs dot link. The directories in folded_dirs (~/.agents/skills, ~/.config/zsh) are instead one symlink to the repo folder, so files added there appear immediately. Edits to existing files never need relinking. Paths in ignored_paths (e.g. .gitconfig.local.sample) stay in the repo and never get a link.
home/.gitconfig includes the gitignored ~/.gitconfig.local for your identity and signing keys. bootstrap creates it from home/.gitconfig.local.sample, which also covers GPG signing setup; to do it by hand:
$ cp home/.gitconfig.local.sample home/.gitconfig.local && dot linkAdd SSH/GPG keys to GitHub at https://github.com/settings/keys.
See home/.config/cloudflared/README.md. The tunnel runs as a root LaunchDaemon, so it is not stowed; cloudflared-tunnel install (needs the gitignored token.local) writes it into place, and cloudflared-tunnel status checks it end to end.