Skip to content
Bridger Tower

Design Generalist

Mac for Web Development (2026)

A curated, opinionated checklist for spinning up a fresh macOS machine in 2026. This is the actual setup I run on my current Mac, built from the commands I ran on it, not a theoretical list.

Goal: Be productive (coding, agents, comms) in ~30 minutes with repeatable commands and sensible defaults.

What changed since last year: the terminal is now the primary interface for AI, not the editor. Half of this guide is about coding agents that didn't exist eighteen months ago. I also started from a clean machine this time, so the list is shorter. If I haven't needed an app yet, it isn't here. New this year: herdr and tmux for running several agents at once, OrbStack in place of Docker Desktop, and Cloudflare and Vercel tooling for deploys.

Want the shortcut? One script does everything below. It's plain text you can read first, and it skips anything already installed:

curl -fsSL https://bridger.to/mac.sh | bash

Add -s -- --always-on for the always-on Mac section, or -s -- --dry-run to see what it would do without changing anything.


System & UX Setup

1. Update macOS

Ensures the latest security patches, Xcode SDKs, and firmware.

  1. Open System Settings → General → Software Update.
  2. Install any pending updates, then reboot before continuing.

2. Install Homebrew

The package manager for everything that isn't on the Mac App Store.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
eval "$(/opt/homebrew/bin/brew shellenv)" # add to ~/.zprofile

3. System Apps

brew install --cask ghostty raycast google-chrome cleanshot 1password logi-options+
  • Ghostty — minimal GPU-accelerated terminal with fast text rendering
  • Raycast — Spotlight replacement with extensions, clipboard history, and window management
  • CleanShot X — screenshots and screen recording with instant markup, scrolling capture, and pinned overlays
  • 1Password — passwords, passkeys, and SSH keys in one place
  • Logi Options+ — button and gesture mapping for Logitech mice and keyboards
  • Chrome — default dev target, DevTools, Lighthouse. Safari is already installed, and you must test in it

Ghostty config lives at ~/Library/Application Support/com.mitchellh.ghostty/config.ghostty (or ~/.config/ghostty/config). It's a plain key/value file, not TOML:

font-family=Menlo
theme=Flexoki Dark
font-size=14
window-padding-balance=true
window-padding-x=8
window-padding-y=8
keybind = cmd+left=goto_split:left
keybind = cmd+down=goto_split:down
keybind = cmd+up=goto_split:up
keybind = cmd+right=goto_split:right
keybind = cmd+k=unbind
keybind = global:cmd+grave_accent=toggle_quick_terminal
quick-terminal-position = right

The cmd+grave_accent quick terminal is the best keybinding here — a global drop-down terminal from anywhere in the OS. cmd+k is unbound so it passes through to whatever agent is running in the terminal.

I also load shell integration from ~/.zshrc myself, because auto-injection wasn't reporting the working directory. That's two lines in ~/.config/ghostty/config:

shell-integration = none
shell-integration-features = cursor,title,path

And the matching snippet at the bottom of ~/.zshrc:

if [[ -n $GHOSTTY_RESOURCES_DIR && -f $GHOSTTY_RESOURCES_DIR/shell-integration/zsh/ghostty-integration ]]; then
source "$GHOSTTY_RESOURCES_DIR/shell-integration/zsh/ghostty-integration"
fi

Development Environment

4. Developer Tooling

xcode-select --install
brew install gh ripgrep fzf zoxide btop tmux herdr ffmpeg neovim
brew install stripe/stripe-cli/stripe
brew install --cask miniconda orbstack tableplus
gh auth login
  • gh — GitHub CLI for PRs, issues, and git credential auth
  • ripgrep — the search tool every coding agent shells out to; install it even if you never type rg
  • fzf — fuzzy finder for shell history and file pickers
  • zoxide — cd that learns your habits. The init line is in the .zshrc snippet below
  • btop — resource monitor, useful when a build or a local model eats the machine
  • tmux — persistent sessions, essential once you run long agent jobs
  • herdr — an agent multiplexer that lives in your terminal, for running several agents side by side
  • ffmpeg — convert, trim, and compress video and audio from the command line
  • Stripe CLI — forward webhooks to localhost and trigger test events
  • neovim — for quick edits over SSH and in the terminal
  • OrbStack — Docker and Linux VMs, much faster and lighter than Docker Desktop
  • TablePlus — database GUI for Postgres, MySQL, and SQLite
  • Miniconda — minimal conda installer for Python environments, mostly for ML and data tooling

Note that git comes from the Xcode Command Line Tools, so you don't need the Homebrew formula. If you install the full Xcode from the App Store, point the tools at it:

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

5. Node, pnpm, Bun

brew install node nvm # nvm for per-project version pinning
curl -fsSL https://get.pnpm.io/install.sh | sh -
curl -fsSL https://bun.sh/install | bash

This machine is on Node 26, pnpm 12, and Bun 1.4. If you use nvm, add this to ~/.zshrc and run mkdir ~/.nvm:

export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"
  • Bun — my default for this site and most projects: install, dev, build, and updates
  • pnpm — for projects that are already pnpm-first

6. Editors

brew install --cask cursor zed
  • Cursor — primary editor, the AI features are still the most complete
  • Zed — fastest editor on the machine. What I open for a single file

My Zed config (~/.config/zed/settings.json):

{
"buffer_font_family": "Menlo",
"buffer_font_size": 13,
"autosave": "on_focus_change",
"format_on_save": "on",
"soft_wrap": "editor_width",
"tab_size": 2,
"theme": "Flexoki Dark",
"auto_install_extensions": { "flexoki": true },
"terminal": { "font_family": "Menlo" },
"telemetry": { "diagnostics": false, "metrics": false },
"git": { "inline_blame": { "enabled": false } },
"minimap": { "show": "never" },
"agent": { "dock": "right", "default_profile": "write" },
"project_panel": { "dock": "left" }
}

7. Oh My Zsh (+ Plugins)

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

.zshrc snippet:

ZSH_THEME="robbyrussell"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
eval "$(zoxide init zsh)"

One warning for 2026: every agent installer wants to append a PATH line to your .zshrc. Mine already has Claude Code, Grok, OpenCode, pnpm, and Bun in there. Read what you paste, keep secrets in a .env or the keychain rather than exported inline, and audit the file every few months.

8. Handy Aliases

# pnpm
alias p='pnpm'
alias pb='pnpm build'
alias pd='pnpm dev'
# Bun
alias b='bun'
alias bi='bun install'
alias bd='bun dev'
alias bu='bun update'
alias bb='bun run build'
# Git
alias gs='git send'
alias gp='git push'
# Claude Code, no interruptions
alias lfg='claude --dangerously-skip-permissions'

That last one is a loaded gun. It skips every permission prompt, so only point it at a repo you can throw away or a worktree you're willing to lose.

9. Global Git Config

[alias]
send = "!f() { git add . && git commit -m \"${1:-wip}\"; }; f"
[user]
name = Bridger Tower
email = bridgertower@gmail.com
[init]
defaultBranch = main
[core]
excludesfile = ~/.gitignore_global
[credential "https://github.com"]
helper =
helper = !/opt/homebrew/bin/gh auth git-credential

git send stages everything and commits with the message you pass (or wip). It doesn't push. I push by hand with gp, the Oh My Zsh alias for git push. I dropped the push after one too many agent-authored commits landed on a remote before I'd read them.

10. Neovim

git clone https://github.com/nvim-lua/kickstart.nvim.git \
"${XDG_CONFIG_HOME:-$HOME/.config}"/nvim

AI Coding Agents

This is the section that didn't exist in the 2025 guide, and it's now the part I'd set up first. The terminal agents matter more than the editor.

11. Terminal Agents

# Claude Code — my default
curl -fsSL https://claude.ai/install.sh | bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
# OpenAI Codex
curl -fsSL https://chatgpt.com/codex/install.sh | sh
# OpenCode — open source, model agnostic
curl -fsSL https://opencode.ai/v2/install | bash
# Grok CLI
curl -fsSL https://x.ai/cli/install.sh | bash
# Pi
curl -fsSL https://pi.dev/install.sh | sh
# Muse — Meta's coding agent
curl https://dev.meta.ai/install.sh | bash
  • Claude Code — the one I live in. Skills, subagents, MCP servers, and hooks make it the most configurable
  • Codex — strong second opinion, especially on long refactors
  • OpenCode — model agnostic, good when you want to point an agent at a local or cheap model
  • Muse — Meta's terminal agent, run with muse
  • Grok CLI and Pi — installed to try, not part of my daily loop

My Claude Code settings (~/.claude/settings.json):

{
"model": "sonnet",
"tui": "fullscreen",
"theme": "dark",
"agentPushNotifEnabled": true
}

Connectors like Notion, Figma, Gmail, and Google Calendar come from your Claude account, so signing in is all the setup they need.

Running two agents against the same repo in separate git worktrees is the single biggest workflow change of the last year.

12. Desktop AI Apps

brew install --cask claude chatgpt grok-bot
  • Claude and ChatGPT — desktop apps for the non-coding half of the work
  • Grok Bot — xAI's AI teammates that work across your apps and tools

Productivity & Collaboration

13. Messaging

brew install --cask slack discord microsoft-teams zoom
  • Slack and Discord — team chat and communities
  • Microsoft Teams and Zoom — for clients who send those links

14. Productivity Apps

brew install --cask notion notion-calendar figma
  • Notion — team wiki and project tracking
  • Notion Calendar — the best calendar client on macOS, and it's free
  • Figma — where the design work happens

Deploy & Hosting

npm i -g vercel wrangler
brew install cloudflared
brew install --cask cloudflare-warp
vercel login
wrangler login
  • Vercel — the CLI for deploying, pulling env vars, and managing projects
  • Wrangler — the CLI for Workers, Pages, R2, D1, and Queues. Deploys and local dev for anything on Cloudflare
  • cloudflared — runs Cloudflare Tunnels, so you can expose a local server without opening ports
  • WARP — Cloudflare's free VPN-style client for a safer connection on untrusted networks

Always-On Mac (Optional)

I use this Mac as a machine I can reach from anywhere, so it never sleeps and I can get into it remotely.

brew install --cask tailscale-app
echo 'alias tailscale="/Applications/Tailscale.app/Contents/MacOS/Tailscale"' >> ~/.zshrc
# Never sleep, restart after power loss, wake on network access
sudo pmset -a sleep 0 disksleep 0 autorestart 1 womp 1
# Firewall on, signed apps allowed
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp on
# SSH and screen sharing
sudo systemsetup -setremotelogin on
tailscale set --ssh
sudo launchctl enable system/com.apple.screensharing
sudo launchctl bootstrap system /System/Library/LaunchDaemons/com.apple.screensharing.plist
  • Firewall — turn it on and allow signed apps, since this machine now accepts remote connections
  • Tailscale — private network across your machines. With tailscale set --ssh you get SSH without opening any ports
  • FileVault — I turned it off on this machine so it can reboot unattended after a power cut. That trades disk encryption for convenience, and I wouldn't do it on a laptop

Backups

A fresh setup guide is only useful if you never need it, so turn on a backup before anything else matters.

  1. Plug in an external drive, then open System Settings → General → Time Machine.
  2. Add the drive as a backup disk and let the first backup run.
  3. Keep code in GitHub and secrets in 1Password, so the machine itself holds nothing you can't recreate.

macOS Customization

Automated macOS Defaults Script

Use the following script to set macOS defaults for a cleaner and more developer-friendly experience.

Run each command individually, or save them in a shell script (e.g., macos-defaults.sh) and execute it with bash macos-defaults.sh.

# Show all filename extensions in Finder
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# Set Finder view to Column by default
defaults write com.apple.finder FXPreferredViewStyle -string "clmv"
# Show Path Bar in Finder
defaults write com.apple.finder ShowPathbar -bool true
# Set fast key repeat rate
defaults write NSGlobalDomain KeyRepeat -int 1
defaults write NSGlobalDomain InitialKeyRepeat -int 10
# Disable auto-correct
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
# Always expand save and print panels by default
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true
# Prevent Photos from opening automatically when devices are plugged in
defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool true
# Set screenshot location to ~/Desktop/Screenshots
mkdir -p ~/Desktop/Screenshots
defaults write com.apple.screencapture location ~/Desktop/Screenshots
# Save screenshots in PNG format
defaults write com.apple.screencapture type -string "png"
# Copy screenshots to the clipboard as well as saving them
defaults write com.apple.screencapture target -string "clipboard"
# Dock: auto-hide, medium icons, on the left, no recent apps
defaults write com.apple.dock autohide -bool true
defaults write com.apple.dock tilesize -int 49
defaults write com.apple.dock orientation -string "left"
defaults write com.apple.dock show-recents -bool false
# Restart Finder and Dock to apply changes
killall Finder
killall Dock

These defaults help streamline Finder, boost typing responsiveness, and reduce distractions. The KeyRepeat -int 1 setting is the one you'll notice most — it's faster than the System Settings slider allows.

Enter your email address to subscribe.

Work with me