Mac maintenance
Setting Up a Mac for Web and Mobile Developers in 2026
A working developer's Mac setup for 2026. Xcode, Homebrew, Node, Docker, VS Code, and the storage and shell choices that pay back daily.
It’s a fresh M4 Pro MacBook, you cloned the company monorepo, ran npm install, and watched the SSD lose 4 GB to a single node_modules folder. Then you installed Xcode (35 GB), pulled three Docker images (8 GB), and started a local Postgres (1 GB). Day one: 50 GB used. Day thirty: 200 GB used. Day three hundred: SSD is screaming.
Developer Macs accumulate more cruft than any other workflow. The trick is a setup that channels the cruft into knowable, clearable places, with a shell and a toolchain that don’t fight you. Here’s a 2026 version that holds up.
Spec the machine for what you actually build
For backend, web, and most mobile development:
- M3 or M4 MacBook Pro, 24–36 GB RAM, 1 TB SSD. The 14” Pro is the sweet spot. Air works for hobbyists; Pro pulls ahead the moment you run Docker or Xcode.
- 16 GB RAM is workable but tight. The first time you
docker compose upan eight-service stack, you’ll wish you had 24 GB. - 512 GB fills up by month four. 1 TB is the realistic minimum for working developers.
For iOS/macOS development specifically: Xcode wants 35 GB just to install, plus simulators (5–15 GB each) and DerivedData (often 50+ GB). 1 TB is mandatory; 2 TB is comfortable.
For data engineering, ML, and game development: M4 Max with 36–64 GB RAM. The unified memory matters when you’re loading large models or working with multi-GB datasets.
Shell and terminal: the ten-minute investment
Terminal.app works. Most developers use a third-party terminal anyway because it’s faster and nicer.
- iTerm2 — battle-tested, free, infinitely configurable.
- Ghostty — newer, GPU-accelerated, beautifully fast. The 2026 favorite.
- Warp — opinionated, modern, AI-assisted; loved by some, hated by others.
- Alacritty or WezTerm — minimal, fast, scriptable.
Pick one and move on. The shell matters more than the terminal:
- Zsh is the default. Add Oh My Zsh or Starship for a usable prompt with git status.
- Fish is friendlier out of the box but breaks compatibility with bash scripts you’ll inevitably copy from Stack Overflow.
- Nushell if you like structured pipelines. Niche but rewarding.
Whatever you choose, set up:
- A prompt that shows current git branch and dirty state
- Aliases for
gst,gco,gp,gpl(or whatever git muscle memory you have) zorzoxidefor jumping between directoriesfzffor fuzzy file and history search- A
.zshrc(or equivalent) committed to dotfiles in a personal git repo
A two-hour shell setup pays off every working day for years.
Homebrew: the package manager for everything else
Install Homebrew on day one. It manages CLI tools, fonts, and applications.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
The essential first install pass:
brew install git node python@3.12 pyenv nvm rbenv go rust
brew install --cask visual-studio-code docker rectangle raycast
brew install jq ripgrep fd bat eza httpie
A Brewfile in your dotfiles repo lets you reinstall the whole environment on a new Mac with brew bundle install. Critical when you switch machines.
Language version managers
Install language version managers, never the language directly.
- Node.js — use
nvm,fnm, or Volta. Volta is the fastest of the three and switches versions transparently per-project viapackage.json. - Python — use
pyenvpluspipxfor global tools. For data science, uv is replacing pip and conda for many workflows. - Ruby —
rbenvormise. - Java —
sdkman!ormise. - Rust —
rustupis canonical. - Go — version with
gvmormise, or just install via Homebrew if you only need one version.
mise (formerly rtx) is the unified replacement for nvm/pyenv/rbenv if you want one tool managing all languages.
The reason: a project from 18 months ago will demand Node 18 and a current project wants Node 22. Without a version manager, you’ll spend an afternoon a quarter fighting this.
VS Code, Cursor, or JetBrains
The 2026 editor landscape:
- VS Code — still the default for most web and Python work. Free, huge extension ecosystem.
- Cursor — VS Code fork with built-in AI. The default for many developers in 2025–26.
- Zed — fast, native, multiplayer collaborative editor. Maturing fast.
- JetBrains IDEs (WebStorm, PyCharm, IntelliJ) — heavier but more capable for large projects in their respective ecosystems. Worth the subscription if you live in one language.
- Neovim — if you’ve already been a vim user. Don’t switch to Neovim because of YouTube videos; switch because the editor model fits your brain.
Settings sync via account or via a dotfiles repo. JetBrains settings sync is via account; VS Code settings sync is built in. Keep extensions minimal — every extension you install is a startup-time tax and an attack surface.
Docker, but with thought
Docker Desktop on Mac is a VM. It uses real disk and real RAM. Watch both.
- Default disk allocation is often 64 GB. Bump it via Docker Desktop → Settings → Resources → Advanced if you work with multiple images.
- Default memory is 8 GB. Increase to 16+ on a 24+ GB machine if you run stacks.
- Run
docker system prune -afmonthly. Old images, dangling volumes, and stopped containers easily eat 30+ GB. - Consider OrbStack as a Docker Desktop replacement — faster, lighter, free for personal use, paid for commercial. Many developers swap over and never look back.
- For lightweight one-service workloads, colima is the open-source alternative.
If you don’t actively use Docker, don’t install it. The background daemon is a real cost.
Database and tooling
A working developer’s Mac has at least one database running locally.
- Postgres — install via Homebrew or Postgres.app for a click-to-launch GUI version.
- MySQL/MariaDB — Homebrew works fine. Or run in Docker for project isolation.
- Redis, Elasticsearch, MongoDB — Docker for these. They’re heavy.
- TablePlus or DBeaver as the GUI client. TablePlus is paid but excellent; DBeaver is free.
Don’t run every database all the time. Brew services for on-demand starts: brew services start postgresql@16, brew services stop postgresql@16.
Xcode and iOS-specific setup
If you’re doing any Apple-platform development:
- Install Xcode from the App Store, not via downloads from Apple’s developer portal (the App Store handles updates correctly).
- Install Xcodes.app if you need multiple Xcode versions installed side by side. Common on teams testing across iOS major versions.
- Run
sudo xcodebuild -license acceptafter install. - DerivedData lives at
~/Library/Developer/Xcode/DerivedData/. Clear it monthly — it grows without bound. A 50–80 GB DerivedData folder is normal on an active iOS dev’s Mac. - iOS Simulators live at
~/Library/Developer/CoreSimulator/Devices/. Old simulators from removed Xcode versions don’t get cleaned up automatically.xcrun simctl delete unavailableclears them. - Archives live at
~/Library/Developer/Xcode/Archives/. Old build archives accumulate. Clear after submission unless you need them for debugging release builds.
Git, GitHub, and SSH
- Install Git via Homebrew (the macOS Command Line Tools git is older).
- Generate an Ed25519 SSH key, not RSA:
ssh-keygen -t ed25519 -C "your_email@example.com". - Add to GitHub via
gh auth login(the GitHub CLI handles this cleanly). - Use 1Password’s SSH agent or macOS Keychain to manage SSH key passphrases. Don’t store unencrypted private keys.
- Install GitHub CLI, gh dash, and lazygit if you live in the terminal. GitHub Desktop or Tower if you prefer a GUI.
Cleanup that actually matters
Developer Macs collect specific kinds of junk. The high-value targets:
- node_modules in old projects —
find ~/Code -name "node_modules" -type d -prunethen delete the ones in projects you haven’t touched in months. - DerivedData for Xcode users — clear monthly.
- Docker images and volumes —
docker system prune -af --volumesquarterly. - Homebrew cache —
brew cleanup -smonthly. - pip, npm, yarn, pnpm caches — each tool has its own.
pnpm store prune,npm cache clean --force, etc. - iOS Simulators —
xcrun simctl delete unavailableandxcrun simctl erase allfor stale data. - Browser caches if you do web work — Chrome and Safari each cache aggressively for development sites.
A monthly cleanup recovers 50–150 GB on an active developer’s Mac. Skip it for a year and the SSD is full.
Privacy, secrets, and security hygiene
Developers handle sensitive credentials. Don’t be sloppy.
- Use 1Password CLI or Doppler for secrets in scripts, never
.envcommitted to git. - Add
.env,*.pem,*_rsa, and similar to a global gitignore:git config --global core.excludesfile ~/.gitignore_global. - Enable FileVault. Free on Apple Silicon and protects your code if the laptop is stolen.
- Touch ID for sudo —
sudo nano /etc/pam.d/sudo, addauth sufficient pam_tid.soat the top. Now sudo accepts your fingerprint. Massive quality-of-life win.
Set this up once. The Mac stays fast, the workflow stays tight, and the cruft stays where you can clear it.