TL;DR:

  • Use mise for all runtime version management (Node, Python, Go) instead of juggling separate nvm/pyenv/goenv tools
  • Use Ghostty as your terminal — sub-100ms startup, no account required, GPU-accelerated
  • Store your dotfiles in a bare git repo — no symlinks, no dotfile manager, just git

This dev environment setup guide for 2026 is opinionated and complete — every command, every config file, and the reasoning behind each choice. Designed for macOS on Apple Silicon. Linux users: swap Homebrew for your distro’s package manager. Windows users: install WSL2 with Ubuntu 24.04 LTS, then follow the Linux path.

Philosophy

Two rules govern every choice here. Prefer tools with large communities and long track records. Homebrew, zsh, and git aren’t exciting — they’ve been default infrastructure for most of a decade. When something breaks, the answer is on Stack Overflow. And avoid tools that fight the OS. This setup works with macOS defaults rather than replacing them wholesale.

Step 1: macOS Prerequisites

Install the Xcode Command Line Tools first — this gives you git, make, clang, and the Unix toolchain everything else depends on:

xcode-select --install

On Apple Silicon, install Rosetta 2 if you occasionally need x86_64 binaries:

softwareupdate --install-rosetta --agree-to-license

You don’t need the full Xcode app unless you’re doing iOS/macOS development.

Step 2: Homebrew

Homebrew is the macOS package manager. There is no serious competitor. Install it, add it to your PATH, and immediately disable analytics:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
brew analytics off
brew doctor

Address any warnings from brew doctor before continuing.

Step 3: Terminal — Ghostty

brew install --cask ghostty
brew install --cask font-jetbrains-mono

Why Ghostty over iTerm2 or Terminal.app? Cold start speed (launches in under 100ms on Apple Silicon; iTerm2 takes 400–800ms), native GPU rendering via Metal, and sensible defaults out of the box. It just works.

Ghostty config lives at ~/.config/ghostty/config:

font-family = "JetBrains Mono"
font-size = 13
theme = "catppuccin-mocha"
window-padding-x = 12
window-padding-y = 8
shell-integration = zsh

Step 4: Shell — zsh + Oh My Zsh + Starship

zsh has been the macOS default since Catalina — you’re already running it. Add Oh My Zsh for the plugin ecosystem:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

Update ~/.zshrc plugins line: plugins=(git zsh-autosuggestions zsh-syntax-highlighting)

Install Starship for a prompt that shows git branch, active runtime versions, and execution time for slow commands:

brew install starship
# Add to bottom of ~/.zshrc:
eval "$(starship init zsh)"

Step 5: Runtime Version Management — mise

mise is a polyglot runtime version manager — one tool for Node, Python, Ruby, Go, and dozens more. It replaces nvm, pyenv, rbenv, and goenv with a single config format. Once you’ve used it you won’t understand why you ever had four separate version managers running at once.

brew install mise
# Add to ~/.zshrc:
eval "$(mise activate zsh)"

mise use --global node@lts
mise use --global python@3.12
mise use --global go@latest

For per-project version pinning, add a .mise.toml to your project root and commit it. When you cd into that directory, mise activates those exact versions automatically:

[tools]
node = "22.3.0"
python = "3.11.9"

Editor, Database, and HTTP Client

Cursor is a VS Code fork with deep AI integration — install it via brew install --cask cursor. See our full review for details.

Essential extensions to install immediately:

cursor --install-extension dbaeumer.vscode-eslint
cursor --install-extension esbenp.prettier-vscode
cursor --install-extension eamodio.gitlens
cursor --install-extension usernamehw.errorlens

TablePlus (brew install --cask tableplus) is a native macOS GUI for Postgres, MySQL, SQLite, and Redis. $69 one-time for a full licence; the free tier allows two open tabs.

Bruno (brew install --cask bruno) stores API requests as text files in your repository — no cloud account, no paid team plan to share collections. Collections live in a bruno/ folder, checked into git with your code.

Step 6: Git and Dotfiles

Configure git with delta for readable syntax-highlighted diffs:

git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git config --global alias.lg "log --oneline --decorate --graph --all"
brew install git-delta
git config --global core.pager delta
git config --global delta.side-by-side true

The bare git repo approach versions your dotfiles without symlinks or a dedicated dotfile manager:

git init --bare $HOME/.dotfiles
echo "alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.zshrc
source $HOME/.zshrc
dotfiles config --local status.showUntrackedFiles no
dotfiles add .zshrc .gitconfig .config/starship.toml .config/ghostty/config
dotfiles commit -m "Initial dotfiles"

Push to a private GitHub repo for backup. To restore on a new machine: clone the bare repo, set the alias, run dotfiles checkout.

What We Deliberately Left Out

Better alternatives exist for these common choices:

  • Docker Desktop → use OrbStack (brew install --cask orbstack): 2–3 second cold start vs. 15–30 seconds, native Apple Silicon support
  • Spotlight → use Raycast (brew install --cask raycast): calculator, clipboard history, window management, extensible plugins
  • Postman → replaced by Bruno (no cloud account required)
  • iTerm2 → replaced by Ghostty (faster, no account)

macOS Settings That Matter

Four system settings with measurable developer productivity impact:

  • Key repeat rate: System Settings → Keyboard → set Key Repeat Rate to fastest and Delay Until Repeat to shortest
  • Disable autocorrect: System Settings → Keyboard → Input Sources → Edit → uncheck all automatic text corrections
  • Dock auto-hide: System Settings → Desktop & Dock → enable “Automatically hide and show the Dock”
  • Three-finger drag: System Settings → Accessibility → Pointer Control → Trackpad Options → enable

The Bottom Line

This entire setup takes about 45 minutes on a fresh machine. Run brew bundle dump > Brewfile to export your package list to your dotfiles repo, then brew bundle install to restore it anywhere. Once your dotfiles are committed, provisioning a new machine drops to under 10 minutes. That’s worth doing once properly.