This repo is the source of truth for setting up a new MacBook. It owns machine bootstrap, selected app settings, and a curated set of developer tools without committing secrets or machine-local noise.
Brewfilefor Homebrew formulae, casks, taps, and VS Code extensionsmisefor runtimes and cli toolshome/for files that will be symlinked into$HOMEbin/setupfor one-command first-run machine setupbin/bootstrapfor lower-level bootstrap workbin/link-dotfilesfor idempotent linking plus backups of replaced targetsmacos/defaults.shfor safe automatable macOS defaultsnvim/as a git submodule, linked to~/.config/nvim
- Edit the tracked source in this repo, not the live file under
$HOME. - Keep package ownership clean:
- Prefer
masfor GUI apps that exist in the Mac App Store. - Prefer
home/.config/mise/config.tomlfor language runtimes and globally installed developer tools whenmisesupports them. - Use
Brewfilefor Homebrew formulae, casks, taps, VS Code extensions, and anything that does not belong inmasormise.
- Prefer
- Do not add secrets, tokens, private emails, machine-local paths, or auth exports to tracked files.
- Preserve the repo's bootstrap model: clone repo, run
./bin/setup, and end in a usable state on a fresh Mac. - Preserve idempotency. Re-running bootstrap or link steps should not corrupt an existing machine.
- If changing
bin/link-dotfiles, keep its backup behavior intact unless there is a strong reason to change it. - Treat
nvim/as its own repo. Do not edit submodule contents from here unless the task is explicitly about the Neovim config repo.
- Keep
Brewfileentries alphabetized inside their sections unless there is a deliberate grouping reason. - Prefer adding new managed dotfiles under
home/and then wiring them throughbin/link-dotfiles. - If a new tracked config needs a local-only companion, keep the tracked piece generic and put local-only data under ignored paths such as
home/.config/local/. - macOS automation should stay conservative and reversible. Avoid aggressive
defaults writechanges unless they are clearly safe for a fresh-machine bootstrap. - If you add a new managed file or workflow, update
README.mdso the bootstrap story stays accurate.
After meaningful changes, prefer the smallest relevant checks:
bash -n bin/bootstrap
bash -n bin/setup
bash -n bin/link-dotfiles
bash -n bin/install-apps
bash -n macos/defaults.sh
git diff --checkFor setup or app-install changes, also use the relevant dry-run path such as ./bin/setup --dry-run or ./bin/install-apps --dry-run.
For dependency changes, also sanity-check the ownership split:
- Mac App Store apps belong in the
masinventory. - Runtime/tool versions belong in
home/.config/mise/config.tomlwhen supported bymise. - Homebrew packages belong in
Brewfileonly aftermasandmisehave been ruled out.
- Be practical and keep this repo boring. Reliability matters more than cleverness.
- Before changing setup ownership, bootstrap boundaries, app install ownership, or other durable architecture decisions, read
DECISIONS.mdand update it when the rationale changes. - When the user asks to add or update an app or tool, choose ownership in this order:
masfor Mac App Store apps, thenmisefor supported runtimes/developer tools, then Homebrew throughBrewfile. - If you notice config drift between the README, bootstrap scripts, and managed files, fix it rather than documenting a lie.