Mac development setup

What to install on a fresh Mac for development, organized by the job each tool does. Skip whichever layer you don’t need; nothing here is mandatory.

Mac Usage

Mac Usage

Awesome Mac

Shell

Zsh Usage

Starship

The minimal, blazing-fast, and infinitely customizable prompt for any shell.

1
brew install starship

Add to ~/.zshrc:

1
eval "$(starship init zsh)"

Package Manager

Homebrew

Installation

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Commands

1
2
3
4
5
6
7
8
9
10
11
12
13
brew install <formula>      # Install formula.
brew install --cask <cask> # Install cask.
brew update # Fetch the newest version of Homebrew and all formulae from GitHub.
brew upgrade # Upgrade outdated casks and outdated, unpinned formulae.
brew leaves # List installed formulae that are not dependencies of another installed formula.
brew tap # Tap a formula repository.
brew doctor # Check your system for potential problems.
brew cleanup # Remove stale lock files and outdated downloads for all formulae and casks, and remove old versions of installed formulae.

# List installed leaf packages by size
brew leaves | while read pkg; do
du -sh "$(brew --cellar)/$pkg" 2>/dev/null | sed "s|$(brew --cellar)/||"
done | sort -hr

Brewfile

Snapshot every cask and formula on the current machine into a Brewfile, then reinstall everything on a fresh Mac with one command:

1
2
brew bundle dump --file=~/Brewfile     # snapshot the current install
brew bundle --file=~/Brewfile # restore on a new machine

npm

Installation

1
brew install node

Yarn

Installation

1
brew install yarn

CocoaPods

Installation

1
sudo gem install cocoapods

Terminal

For a detailed comparison of all major terminal emulators (Ghostty, iTerm2, Kitty, Alacritty, WezTerm, and more), see Choosing a terminal emulator in 2026: Ghostty, iTerm2, Kitty, Alacritty, WezTerm.

iTerm2

Installation

1
brew install --cask iterm2

iTerm Color Schemes

Version Control

Git

Git Solutions Collection: common commands and solutions

SSH

Generating a new SSH key and adding it to the ssh-agent

Git GUI

SourceTree

1
brew install --cask sourcetree

Languages

mise (multi-language version manager)

mise (the asdf successor) handles per-project versions of Node, Python, Ruby, Go, Java, and ~100 other tools from a single config. Replaces nvm/n, pyenv, chruby/rbenv, and similar with one binary. Trade-off: opinionated install paths; not always wanted in CI environments.

1
2
3
4
5
brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

mise use --global node@22 python@3.13 ruby@3.4 # set global versions
mise use node@20 # pin per-project (writes .mise.toml)

If you’d rather use per-language tools, the sections below cover the standalone options.

Python3

Installation

1
brew install python3

JavaScript

Node.js in 2026: pick your stack

Java

Installation

Eclipse Temurin (Adoptium) is the standard open JDK distribution since Oracle’s 2019 licensing change. Brew:

1
2
3
4
brew install --cask temurin       # latest LTS
brew install --cask temurin@21 # specific LTS line (e.g. JDK 21)
brew install --cask temurin@17 # JDK 17 (still LTS for legacy projects)
brew install --cask temurin@8 # JDK 8 (only for projects that genuinely need it)

Apple’s Oracle JDK download is still around if you specifically need Oracle’s commercial distribution.

Swift

Package Manager

SPM
Organize, manage, and edit Swift packages.

Mint
A package manager that installs and runs Swift command line tool packages.

Ruby

Version Manager

chruby and ruby-install

1
brew install chruby ruby-install

Installation

1
2
ruby-install ruby   # Install the current stable version of Ruby
chruby 3.2.0 # Change the current Ruby.

Package Manager

RubyGems

Dependency Manager

Bundler

1
gem install bundler

Scheme

Installation

1
brew install --cask racket

SML

Installation

1
brew install smlnj

AI Tools

Cursor

Claude Code

Text Editors

VSCode

Vim

Installation

1
brew install vim

IDE

JetBrains

Toolbox

Xcode

Developer Tools

Insomnia

The open-source, cross-platform API client for GraphQL, REST, and gRPC.

OrbStack

Fast, lightweight Docker Desktop and Linux VM replacement for macOS. Free for personal use.

1
brew install --cask orbstack

Works as a drop-in for the docker CLI, with much lower memory and battery cost than Docker Desktop. Also runs lightweight Linux VMs.

Tools

Finder Tools

quick-look-plugins

List of useful Quick Look plugins for developers

1
brew install apparency betterzip provisionql qlcolorcode qlmarkdown qlstephen qlvideo quicklookase quicklook-json quicklook-pat suspicious-package webpquicklook

Restart the QuickLook manager

1
qlmanage -r

OpenInTerminal

Finder Toolbar app for macOS to open the current directory in Terminal, iTerm, Hyper or Alacritty.

1
brew install --cask openinterminal

Configurations

Itsycal

Itsycal is a tiny menu bar calendar.

1
brew install --cask itsycal

A powerful menu bar browser

Dozer

Hide status bar icons on macOS.

1
brew install --cask dozer

xbar

Put the output from any script or program into your macOS Menu Bar (the BitBar reboot)

1
brew install --cask xbar

Screen Saver

AppCleaner

AppCleaner is a small application which allows you to thoroughly uninstall unwanted apps.

Maccy

Lightweight clipboard manager for macOS

Installation

1
brew install --cask maccy

OpenEmu

Retro video game emulation for macOS

Command Line Tools

bat

A cat(1) clone with syntax highlighting and Git integration.

1
bat <file>

btop

Resource monitor that shows usage and stats for processor, memory, disks, network and processes.

diff-so-fancy

Good-lookin’ diffs with diff-highlight and more.

eza

A modern alternative to ls

fd

A simple, fast and user-friendly alternative to find

1
fd <pattern>

ffmpeg

A complete, cross-platform solution to record, convert and stream audio and video.

fzf

A command-line fuzzy finder

1
fzf

gh

Work seamlessly with GitHub from the command line.

1
gh release create [<tag>] [<filename>... | <pattern>...]

graphicsmagick

Image processing tools collection.

htop

A cross-platform interactive process viewer.

httrack

Website copier/offline browser.

1
httrack <URLs>

mtr

mtr combines the functionality of the traceroute and ping programs in a single network diagnostic tool.

An interactive cheatsheet tool for the command-line

ncdu

NCurses Disk Usage.

1
ncdu <dir>

pandoc

General markup converter.

pngquant

Lossy PNG compressor

1
pngquant --ext .png --force 256 *.png */*.png

jpegoptim

JPEG optimizer: lossless or lossy compression with quality control

1
jpegoptim --max=95 *.jpg *.jpeg

prettyping

prettyping is a wrapper around the standard ping tool, making the output prettier, more colorful, more compact, and easier to read.

1
prettyping

rlwrap

rlwrap is a ‘readline wrapper’, a small utility that uses the GNU Readline library to allow the editing of keyboard input for any command.

1
rlwrap <command>

ripgrep (rg)

Recursively search for a regex pattern. Faster than grep, ag, and ack. Respects .gitignore by default.

1
2
3
rg <pattern>
rg -t swift "TODO" # restrict to Swift files
rg -g '!*.test.ts' bug # exclude a glob

the_silver_searcher

A code searching tool similar to ack, with a focus on speed.

tig

Tig is an ncurses-based text-mode interface for git.

tldr

Simplified and community-driven man pages

1
tldr <command>

tree

List contents of directories in a tree-like format.

1
tree -L <num> -a

unrar

Command-line unarchiving tools supporting multiple formats

xxh

Bring your favorite shell wherever you go through the ssh.

zoxide

Smarter cd that learns from your history. Modern, faster successor to z and autojump.

1
2
3
4
5
brew install zoxide
echo 'eval "$(zoxide init zsh)"' >> ~/.zshrc

z foo # jump to a recent directory matching "foo"
zi # interactive picker (requires fzf)

autojump vs z vs zoxide

autojump z (rupa/z) zoxide
First release 2008 2009 2020
Language Python Bash/Zsh script Rust (single binary)
Install footprint Python runtime + module One shell script One static binary (~5 MB)
Default command j foo z foo z foo, plus zi for fzf-picker mode
Ranking model Frecency (frequency + recency) Frecency Frecency, refined
Database Plain text Plain text (~/.z) Binary, written atomically
Shells bash, zsh, fish (via plugin) bash, zsh bash, zsh, fish, PowerShell, nushell, xonsh, elvish
Speed Slow (Python startup per call) Fast Faster: 10-20x autojump
Interactive picker No No Yes, zi with fzf
Maintenance Effectively stale (last release 2022) Slow Active
cd replacement Separate j command Separate z command Optional cd=z alias covers everything

Verdict: zoxide. Faster, single binary, works on every shell, and the zi interactive picker is a real productivity win the other two don’t have. Keep z if you want zero binary dependencies; keep autojump only if you already have a long-standing setup. zoxide imports either database in one shot:

1
2
zoxide import --from autojump ~/.local/share/autojump/autojump.txt
zoxide import --from z ~/.z

Virtual Machines

Multipass

Get an instant Ubuntu VM with a single command. Multipass can launch and run virtual machines and configure them with cloud-init like a public cloud.

Font

1
brew tap homebrew/cask-fonts

Fira Code

1
brew install --cask font-fira-code

Nerd Fonts

Fira Code Nerd Font

1
brew install --cask font-fira-code-nerd-font

Font Awesome

1
brew install --cask font-fontawesome

Configuration

Git Config

diff-so-fancy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git config --global core.pager "diff-so-fancy | less --tabs=4 -RFX"
git config --global interactive.diffFilter "diff-so-fancy --patch"

git config --global color.ui true

git config --global color.diff-highlight.oldNormal "red bold"
git config --global color.diff-highlight.oldHighlight "red bold 52"
git config --global color.diff-highlight.newNormal "green bold"
git config --global color.diff-highlight.newHighlight "green bold 22"

git config --global color.diff.meta "11"
git config --global color.diff.frag "magenta bold"
git config --global color.diff.func "146 bold"
git config --global color.diff.commit "yellow bold"
git config --global color.diff.old "red bold"
git config --global color.diff.new "green bold"
git config --global color.diff.whitespace "red reverse"