Personal macOS dotfiles repository that automates development environment setup using Ansible, Homebrew, and Mise (polyglot version manager).
# Full machine setup (first-time or re-provision)
./bootstrap.sh
# Re-run Ansible only (after initial setup)
cd provision && ansible-playbook local.yml -i hosts -Kbootstrap.sh handles: Xcode CLI tools → Homebrew → Ansible → Ansible playbook → cask updates → cleanup.
provision/
├── local.yml # Main Ansible playbook
├── hosts # Inventory (localhost)
└── roles/
├── packages/ # Software installation
│ ├── vars/main.yml # All package lists (brew, cask, MAS, language packages)
│ ├── tasks/packages/macos/ # brew.yml, cask.yml, mas.yml
│ ├── tasks/packages/custom/ # Per-language: nodejs, python, ruby, elixir, go, kubernetes, zsh
│ └── handlers/main.yml # Single `update shims` handler runs `mise reshim`
└── local/ # Dotfile symlinks & editor setup
├── vars/main.yml # Symlink definitions
└── tasks/ # dotfiles.yml, vim.yml, tmux.yml
Two roles:
packages— installs everything via Homebrew, Cask, Mac App Store, and language-specific tools (managed via Mise)local— creates symlinks from~/to files in this repo, sets up Neovim and Tmux plugins
All package lists live in provision/roles/packages/vars/main.yml:
brew_packages— CLI toolscask_packages— GUI appsmas_packages— Mac App Store apps (need app ID)- Language packages:
yarn_packages,pip_packages,gem_packages
Language versions are defined in both provision/roles/packages/vars/main.yml and mise.toml — keep them in sync.
- Add the file to the repo root
- Add a symlink entry to
provision/roles/local/vars/main.yml - The
local/tasks/dotfiles.ymltask will create the symlink on next provision
Mise manages Node.js, Python, Ruby, Erlang, and Elixir versions. After installing a new language version via Ansible, the single update shims handler runs mise reshim to update all shims.