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.