Automated macOS dev environment — reproducible from scratch in one command.
What's inside
A curated, pinned set of tools assembled over time — automated with Ansible and wired together with GNU Stow.
Every package declared in mac/Brewfile with pinned versions and inline docs. --no-upgrade prevents drift. Critical tools are brew pin'd.
Dotfiles live in the repo. Stow creates symlinks into $HOME. Conflict-safe: existing files are backed up to *.pre-stow before linking.
Replaces oh-my-zsh entirely. Loads plugins in parallel, uses OMZ snippets without the framework overhead. 3× faster shell startup.
v3.14.0One tool replaces nvm, sdkman, pyenv, goenv. Node, Python, Go pinned in .config/mise/config.toml. Per-project overrides via .mise.toml.
Cross-shell prompt showing git branch/status, active k8s context, runtime versions (node/python/go/rust), AWS profile, and command duration.
v1.25.1One playbook wires everything: installs packages, configures ZSH, pins runtimes. Idempotent — safe to re-run. Works on fresh Mac and existing setups.
IdempotentSetup
Three steps from zero to a fully configured dev environment.
Xcode Command Line Tools must be installed first. The install script checks for this and exits cleanly if missing.
Clone the repo anywhere, then run the bootstrap script. It installs Homebrew, Ansible, all packages, and stows your dotfiles.
After reopening your shell, install the pinned Node, Python, and Go versions via mise.
In action
Three key moments — install, first shell, runtime setup.
Reference
All packages pinned. Versions in mac/Brewfile and .config/mise/config.toml.
Guide
Everything that happens under the hood, step by step.
Required by Homebrew for compiler toolchain. The install script checks for CLT and exits with instructions if missing.
The script auto-detects Apple Silicon vs Intel, installs Homebrew if missing, installs Ansible, runs the Ansible playbook, backs up conflicting dotfiles, then stows symlinks.
*.pre-stow, not deleted.The playbook runs brew bundle install --no-upgrade against mac/Brewfile. All 50+ packages install. Critical tools are pinned to prevent accidental brew upgrade breakage.
Stow maps the dotfiles repo into $HOME. Files listed in .stow-local-ignore are skipped (mac/, linux/, windows/, README.*).
On the first shell open, zinit clones three plugins from GitHub (requires internet, one-time, ~5s). Subsequent starts load from cache.
mise manages Node, Python, and Go. Versions are pinned in .config/mise/config.toml. Brew keeps the same runtimes installed as dependencies for other tools — mise shims shadow them on PATH automatically.
brew uninstall node python@3.13 go — they are deps for awscli, cdk8s, yt-dlp. mise shims override them on PATH.Global npm packages declared in .config/mise/config.toml are installed automatically by mise install and reinstalled on node version upgrades — no manual npm install -g needed.