macOS 2026 web dev setup
/ 4 min read
Table of Contents
An updated setup guide for 2026, reflecting the latest best practices and tools. This builds on my previous 2025 setup with notable changes highlighted. I’m about to set up a 2022 Mac Studio M1 Max 32GB as a dev server so I thought I’d update the reference.
What’s changed since 2025
Key updates in this revision:
- Terminal: Now using Ghostty with native panels instead of iTerm2 with tmux. I couldn’t get bothered anymore to debug keyboard bindings and esp. mouse selections in tmux.
- AI coding: I started using Claude Code CLI but switched to pi-coding-agent in late 2025.
system updates & package manager
# Update macOS to the latest version through System Settings# Install Xcode command line toolsxcode-select --install
# Install Homebrew (package manager)/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"eval "$(/opt/homebrew/bin/brew shellenv zsh)"brew updateapps
- 1Password (password manager)
- Photoshop/Lightroom (gave up on alternatives)
- Claude for Desktop (LLM, still using this but I think 2026 I might not need it for much longer)
- CleanShot X (screenshot management)
- Final Cut Pro & Compressor (video editing & encoding)
- Franz (messaging)
- GoG (games)
- Grand Perspective (file system analysis)
- Kap (screencasts with GIF support)
- Microsoft Office (don’t @ me)
- Orion (kagi’s webkit browser)
- Rectangle Pro (window management)
- Reeder (rss reader)
- Steam (more games!)
- Fork (git ui, switch from SourceTree)
terminal … I switched to Ghostty
brew install --cask ghosttyGhostty config (~/.config/ghostty/config):
font-family = "Hack Nerd Font"theme = "GitHub Dark"background-opacity = 0.95macos-titlebar-style = transparent# Supports Kitty Graphics Protocol for inline imagesTerminal tools
brew install \ wget \ git \ eza \ graphicsmagick \ commitizen \ cmatrix \ vips \ htop \ ruby \ rbenv \ ffmpegNote: eza replaces the unmaintained exa as the modern ls replacement:
# Add aliases to .zshrcalias ls="eza"alias ll="eza -l"alias la="eza -la"alias lt="eza --tree"shell setup
# Install Oh My Zsh for better terminal experiencesh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# Update Oh My Zsh:omz update
# Install Starship prompt (fast, cross-shell)brew install starship
# Add to end of ~/.zshrcecho 'eval "$(starship init zsh)"' >> ~/.zshrc
# Install Hack Nerd Font for iconsbrew install font-hack-nerd-fontOh My Zsh Plugins
zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestionszsh-syntax-highlighting
brew install zsh-syntax-highlighting
# Add to end of .zshrc:source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zshAdd plugins to ~/.zshrc:
plugins=( git zsh-autosuggestions)git
brew install git
git config --global user.name "Your Name"git config --global user.email "your.email@example.com"git config --global init.defaultBranch main
# Improved git loggit config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# Generate SSH key for GitHubssh-keygen -t ed25519 -C "your.email@example.com"nodejs
brew install nvm
# Add to .zshrcecho 'source $(brew --prefix nvm)/nvm.sh' >> ~/.zshrc
nvm install --ltsPackage managers
# pnpm is my preferred package managerbrew install pnpm
# yarn if neededbrew install yarndevelopment tools
brew install --cask visual-studio-codebrew install --cask postmanbrew install --cask dockerbrew install --cask google-chromebrew install --cask firefoxagentic coding
The AI coding landscape has evolved significantly. I use a combination of tools depending on the task.
pi-coding-agent (primary)
pi-coding-agent by Mario Zechner is my daily driver for agentic coding. It’s a terminal-based coding agent with multi-model support, mid-session model switching, and a minimal, opinionated design.
Installation:
npm install -g @mariozechner/pi-coding-agentAPI Keys Setup:
Create ~/.pi/agent/auth.json:
{ "anthropic": { "type": "api_key", "key": "sk-ant-..." }, "openai": { "type": "api_key", "key": "sk-..." }, "google": { "type": "api_key", "key": "..." }}Or use environment variables: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY.
OAuth for subscriptions:
pi /login # Authenticate with Claude Pro/Max, GitHub Copilot, or Google Gemini CLITerminal Setup (Ghostty):
Add to ~/.config/ghostty/config:
keybind = alt+backspace=text:\x1b\x7fkeybind = shift+enter=text:\nQuick Start:
export ANTHROPIC_API_KEY=sk-ant-...piKey Features:
/model- switch models mid-session/tree- navigate session history, branch conversations/compact- summarize context when running long@filename- fuzzy-search and include files!command- run shell commands and add output to contextCtrl+P- cycle through models- Skills system for specialized workflows (web search, browser automation, etc.)
Project Context:
Create AGENTS.md in your project root with instructions, conventions, and common commands. Pi loads these automatically.
VS Code extensions
- Astro
- Better Comments
- EditorConfig for VS Code
- ESLint
- GitHub Copilot
- GitHub Copilot Chat
- GitLens - Git supercharged
- Headwind
- Highlight Matching Tag
- MDX
- Prettier - Code formatter
- Pretty TypeScript Errors
- Tailwind CSS IntelliSense
- TODO Highlight
tmux
I use Ghostty’s panels these days but tmux for subagent orchestration.
brew install tmux
# Install tmux plugin managergit clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpmConfig file ~/.tmux.conf:
unbind C-bset-option -g prefix C-abind C-a send-prefixset-option -g mouse on
# Pluginsset -g @plugin 'tmux-plugins/tpm'set -g @plugin 'tmux-plugins/tmux-resurrect'
# Initialize plugin manager (keep at bottom)run '~/.tmux/plugins/tpm/tpm'tmux commands:
- New session:
tmux new-session -s dev - Horizontal split:
Prefix + % - Vertical split:
Prefix + " - Detach:
Prefix + d - Reattach:
tmux attach-session -t dev - Save (resurrect):
Prefix + Ctrl-s - Restore:
Prefix + Ctrl-r
dotfiles with chezmoi
Chezmoi remains the best choice for dotfile management with its templating support and multi-machine sync:
# Initializebrew install chezmoichezmoi initchezmoi add ~/.zshrc
# On a new machinechezmoi init git@github.com:walterra/dotfiles.gitchezmoi diffchezmoi apply -vInspired by Robin Wieruch’s Mac Setup.