"Bold geometric dot patterns forming clear terminal windows and command prompt shapes, high contrast with bright coral and orange dots on solid black background, clean lines, pop art style, t-shirt design"

Generated with flux-latentpop and seedance-1-pro-fast.

❯ cd ~/code/

Dotfiles: One command to set up any Mac

Overview
How I went from hours of manual setup to a single command that configures a brand new Mac with all my tools, settings, and preferences.
Last Updated
04/03/2026
Tags
dotfiles, automation, tools, zsh
Originally Posted
Mon Mar 04 2024 00:00:00 GMT+0000 (Coordinated Universal Time)

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

  1. Checks prerequisites - Verifies macOS and internet connection

  2. Installs Xcode CLT - The foundation for everything else

  3. Installs Homebrew - Package manager

  4. Installs packages - From a Brewfile with CLI tools and apps

  5. Sets up mise - Manages Node, Bun, pnpm, Python versions

  6. Configures zsh - oh-my-zsh with plugins and theme

  7. Generates SSH keys - Ed25519 keys with commit signing

  8. Symlinks dotfiles - GNU Stow links configs into place

  9. Sets up secrets - API token configuration

  10. Installs editor extensions - VS Code and Cursor

  11. 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 everyone

  • Brewfile.personal - Personal stuff

  • Brewfile.work - Work-specific stuff

CLI tools that make a difference

These tools fundamentally change how I work in the terminal:

  • bat - Syntax-highlighting cat

  • delta - Beautiful git diffs

  • fd - Intuitive find replacement

  • fzf - Fuzzy finder bound to Ctrl+T and Ctrl+R

  • ripgrep - Fast search respecting .gitignore

  • zoxide - Smarter cd that 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
Brewfile

My .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.

Edit on GitHub
Links