Setting up a new Mac used to take me days. I'd install Homebrew, configure my shell, set up Git with SSH keys, install Node, download my editor extensions, and inevitably realize at some point that I'd forgotten to copy over some config file.
I came across Matt Silverlock's dotfiles and realized this could be automated. The idea is simple - version control your configuration so one command reproduces your entire environment on a new machine.
My dotfiles now handle everything from Xcode Command Line Tools to VS Code extensions. What used to take hours now happens while I make a crisp beverage.
What it does
Checks prerequisites - Verifies macOS and internet connection
Installs Xcode CLT - The foundation for everything else
Installs Homebrew - Package manager
Installs packages - From a Brewfile with CLI tools and apps
Sets up mise - Manages Node, Bun, pnpm, Python versions
Configures zsh - oh-my-zsh with plugins and theme
Generates SSH keys - Ed25519 keys with commit signing
Symlinks dotfiles - GNU Stow links configs into place
Sets up secrets - API token configuration
Installs editor extensions - VS Code and Cursor
Imports Raycast settings - Window management and shortcuts
The script is idempotent - safe to run multiple times, skipping what's already installed.
Work mode
The --work flag separates personal from work setups, given I don't need certain tools or apps on a work laptop, but I want a consistent environment for non-sensitive configurations.
Running sh install.sh --work swaps the Brewfile:
Brewfile- Core tools for everyoneBrewfile.personal- Personal stuffBrewfile.work- Work-specific stuff
CLI tools that make a difference
These tools fundamentally change how I work in the terminal:
bat - Syntax-highlighting
catdelta - Beautiful git diffs
fd - Intuitive
findreplacementfzf - Fuzzy finder bound to
Ctrl+TandCtrl+Rripgrep - Fast search respecting
.gitignorezoxide - Smarter
cdthat learns your directories
Managing configuration with Stow
GNU Stow manages the dotfiles by creating symlinks from ~ back to the repo. Edit ~/.zshrc and the change is immediately in version control.
Stow has a .stow-local-ignore file that prevents certain files from being linked. I use it to skip the README, install scripts, and anything else that shouldn't live in ~:
\.git
\.gitignore
README.md
install.sh
BrewfileMy .zshrc configures fzf with custom previews, integrates zoxide, and activates mise. Everything is configured exactly how I like it, on every machine.
Should you do this?
If you set up more than one Mac every couple of years, yes. The investment pays for itself quickly. It's also very comforting.
Start small - fork my repo or Matt's, and edit it to your liking. You could just use Homebrew, your shell, and your editor, and add more as you find repetitive tasks.