The first things I install on a new macOS setup

A repeatable checklist for a fresh Mac: Homebrew, a modern terminal, shell quality-of-life, editors, CLI essentials and version management.

A fresh Mac is a blank slate, and the first hour sets the tone for everything that follows. I have rebuilt my setup often enough that the order matters: start with the package manager, then the terminal, then the shell, and only then the tools that sit on top.

This is the checklist I follow, grouped by concern. It is deliberately boring. Each choice is here because it removes a recurring annoyance or replaces something the system ships that is too old to trust.

This also reflects my experience preparing developer setup guides for both Linux and macOS over the last 7-8 years. I like it boring, predictable.

The foundation

Everything else stands on Homebrew, so this goes first.

Homebrew

Homebrew is the package manager for macOS. It installs both command line tools and GUI applications (as casks), and it does the job Apple never gave us: a single, scriptable place to install and update software.

It also pulls in the Xcode Command Line Tools as part of its own installation, which means you get compilers and system headers without a separate trip to the App Store.

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

Git

The Git that ships with macOS is bundled for Apple’s convenience, not yours, and it lags behind upstream. Installing it through Homebrew keeps it current and makes it part of the same update flow as everything else.

brew install git

Bash

Same story: macOS pins an old Bash (3.2, frozen for licensing reasons). Homebrew gives you a current release. I still write shell code that works everywhere, but having a modern Bash available locally removes a class of surprises.

brew install bash

A better terminal

Ghostty

So long iTerm2. After 7-8 I’m moving away from iTerm2 - too man options but mostly too slow and resource demanding.

Ghostty is a GPU-accelerated terminal emulator that is fast, native and sensible by default. After years on iTerm2, this is the deliberate switch: fewer settings, better rendering, and no plugin ecosystem to maintain.

It is available as a cask, so Homebrew handles the install and updates.

brew install --cask ghostty

JetBrains Mono Nerd Font

A Nerd Font patches icon glyphs into a programming font, which is what makes prompts, bat, eza and editor status lines render their symbols instead of tofu boxes. JetBrains Mono is readable and has generous spacing, which matters once icons start appearing next to text.

brew install --cask font-jetbrains-mono-nerd-font

Vim

brew install vim gives you a modern build with the features (and patches) the system version lacks. Worth having even if your main editor is something else, because you will end up in a terminal editor eventually.

brew install vim

Shell quality-of-life

The default zsh is fine. What it lacks is feedback while you type and colour while you read. These two plugins fix exactly that.

zsh-autosuggestions

Shows a faint suggestion of a previous command as you type, based on your history. Accept it with the right arrow key. Once you use it for a day, typing commands in full feels like a chore.

brew install zsh-autosuggestions zsh-syntax-highlighting

Add the following to the end of your .zshrc:

source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh

zsh-syntax-highlighting

Colours commands as you type: valid commands in one colour, mistakes in another, quoted strings in a third. It turns the prompt into a live linter and catches a lot of typos before you press Enter.

Add this to the end of your .zshrc too:

source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

If you see a “highlighters directory not found” error, add the following to your .zshenv:

export ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR=/opt/homebrew/share/zsh-syntax-highlighting/highlighters

Restart the terminal for both plugins to take effect.

Oh My Zsh

Oh My Zsh bundles themes, plugins and sane defaults for zsh so you are not hand-rolling configuration forever. The one-line installer is the whole setup.

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Starship with Catppuccin

Starship is a prompt for any shell. It reads your project context (language, Git branch, versions) and renders a prompt accordingly, with one config file shared across shells.

The theme here is a personal choice. This is just a baseline and many options available.

Paired with the Catppuccin theme, this is the look most people are reaching for when they search for a “pretty terminal”. Rather than reproduce every step, follow the walkthrough in Setting up the pretty Mac terminal in 2026, which keeps Ghostty, Starship and Catppuccin in sync.

Window management

Rectangle

Rectangle snaps windows with keyboard shortcuts: halves, quarters, thirds, screen moves. It is the free, open-source equivalent of Magnet, and it is one of those utilities that becomes invisible because you stop noticing windows are ever in the wrong place.

brew install --cask rectangle

Editors

VSCodium

VSCodium is VS Code built from source without Microsoft’s branding, telemetry and licence restrictions. You get the same editor and extension ecosystem, minus the parts that made the official build uncomfortable.

There is a well-known quirk: the marketplace is not configured out of the box. The community gist covering the product.json change shows how to point it at the standard marketplace. I also added a shell alias so I can launch it from the terminal.

brew install --cask vscodium
Shell alias   Just add it to your `~/.zshrc`:
alias code="codium"

Nerd Fonts in the integrated terminal

VS Code’s integrated terminal uses its own font setting, so the Nerd Font you installed above will not appear automatically and your prompts will show broken glyphs. Set the editor’s terminal font to JetBrainsMonoNL NFP and the icons line up. The how-to on Nerd Fonts in VS Code walks through the setting.

Everyday CLI

bat

bat is cat with syntax highlighting, line numbers, Git diff markers in the margin and automatic paging. It is a drop-in replacement (alias cat=bat if you like), and it makes reading config and source files in the terminal genuinely pleasant.

brew install bat
Shell alias   Just add it to your `~/.zshrc`:
alias cat="bat --theme auto:system"

tree

tree prints a directory as an indented tree, which is the fastest way to understand an unfamiliar project’s shape. macOS does not include it, so Homebrew provides the canonical version.

brew install tree

GitHub CLI

The gh CLI handles pull requests, issues, releases and authentication from the terminal, without juggling SSH keys and tokens by hand. Once authenticated, cloning and creating PRs become single commands.

brew install gh

Version management

asdf

asdf is a single version manager for many runtimes. Instead of juggling nvm, rbenv, pyenv and their friends, you install one tool and add a plugin per language. A .tool-versions file in a repo pins the exact versions, so every checkout behaves the same.

brew install asdf

Then add the runtimes you actually use: Node.js, Ruby, Python and .NET. The asdf set -u <plugin> <version> command writes the chosen version to your user-level ~/.tool-versions, so it becomes the default everywhere. Drop the -u to pin the version for a single project instead.

Node.js

Node.js is the runtime most tooling already depends on, so it goes first. Install the plugin, pull both the LTS release (the safe daily driver) and the latest version, then pin LTS as the user default.

asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf install nodejs lts
asdf install nodejs latest
asdf set -u nodejs lts

Ruby

Ruby needs libyaml, and its build has to be told where to find it:

asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git
brew install libyaml
RUBY_CONFIGURE_OPTS="--with-libyaml-dir=$(brew --prefix libyaml)" asdf install ruby 4.0.7
asdf set -u ruby 4.0.7

Python

Python’s build wants xz, and a previously installed version should be removed before rebuilding so the new one links cleanly:

asdf plugin add python https://github.com/asdf-community/asdf-python.git
brew install xz
asdf install python 3.14.7
asdf set -u python 3.14.7

If an existing Python version fails to link, remove it with asdf uninstall python 3.14.7 and install it again.

.NET

The asdf .NET plugin repo has been archived and is no longer maintained, so the plugin route is a dead end. Install the SDK manually following the multi-version .NET on macOS guide.

Wrapping up

The through-line is simple: let Homebrew own installation and updates, build the terminal and shell to give you fast feedback, and use one version manager instead of four. None of it is exotic, and all of it pays back within the first week of a new machine.

The best thing about a written checklist is that the next rebuild is a set of commands instead of a set of decisions. That is worth the half hour it takes to write down.

Related

Comments

Comments are powered by GitHub Discussions. Sign in with a GitHub account to join the conversation.