Opinionated macOS dev-machine bootstrap — one command, everything installed.
Polyglot setup for Go + gRPC, Rust, Elixir, Node/Bun, Python work on top of Docker + Kubernetes (kind + Tilt). Runs every item in the catalog by default; flags available if you want a subset.
git clone git@github.com:igorvieira/dotfiles.git ~/dotfiles
cd ~/dotfiles
./setup.shor one-liner:
git clone https://github.com/igorvieira/dotfiles.git ~/dotfiles && ~/dotfiles/setup.shThat's it — it installs Homebrew (if missing), every tool in the catalog, and symlinks the shell / git / ghostty configs. Takes a while on a fresh machine because of the cask apps; walk away and come back.
| Flag | Behavior |
|---|---|
| (none) | Install everything |
--minimal |
Only shell + fonts |
--only k1,k2,… |
Install exactly the listed catalog keys |
--interactive |
Opt into per-group / per-item picker (advanced) |
--dry-run |
Print what would happen; no side effects |
All of the below are installed by default. Use --only to cherry-pick.
- Shell & Prompt — zsh, Oh My Zsh, Powerlevel10k, autosuggestions, syntax highlighting
- Fonts — FiraCode / JetBrains Mono / Hack Nerd Fonts
- Terminals — Ghostty, Rio, iTerm2
- Editors — Neovim (+ clones igorvieira/nvim into
~/.config/nvim), VS Code, Cursor - Languages — Go, Rust, Node, Bun, pnpm, Elixir, Python+uv, rbenv, Deno
- Go / gRPC — protobuf, protoc-gen-go, protoc-gen-go-grpc, grpcurl, golang-migrate, buf
- Cloud & DevOps — Docker Desktop, kubectl, kind, Tilt, ctlptl, Helm, k9s, AWS CLI, Doppler, Terraform
- CLI Essentials — git, gh, ripgrep, fzf, bat, eza, jq, yq, lazygit, tmux, htop, wget, gnupg, tree
- AI tooling — Claude Code CLI (loads
maverick+ other skills from~/.claude/) - Apps — Brave, Chrome, Raycast, Obsidian, Loom, Slack, Discord, Zoom, Beekeeper Studio, DBeaver, Spotify, NordVPN, VirtualBox
Full, authoritative list: lib/catalog.sh.
Not bundled here — lives at igorvieira/nvim.
setup.sh clones it to ~/.config/nvim; on later runs it does git pull --ff-only.
setup.sh symlinks these into place (backing up any non-symlink originals):
~/.zshrc,~/.bashrc,~/.p10k.zsh~/.config/ghostty/config~/.gitconfig,~/.gitignore_global~/.vim
Editing the files in the repo updates your live config immediately.
setup.sh writes a receipt to ~/.dotfiles-installed.
test-installation.sh reads it and only checks what was actually installed.
./test-installation.sh # check items in the receipt
./test-installation.sh --defaults # check every default-on catalog item
./test-installation.sh --all # check every catalog itemConfig symlinks are always verified.
Open lib/catalog.sh, find the right GROUP_N_ITEMS
array, and append a line:
"key|Display name|brew|formula|1|cmd:<bin>" # brew formula
"key|Display name|cask|cask-name|0|app:/Applications/Foo.app"
"key|Display name|custom|install_fn|1|fn:check_foo"
Schema and conventions are fully documented in CLAUDE.md.
macOS-only workflow in .github/workflows/test.yml:
lint—bash -n+shellcheck -S warningdry-run—setup.shexercised in--all/--minimal/--onlymodesinstall-minimal— real install of a cheap brew-only slice + verify
MIT.