Skip to main content
BUNDL

A minimal Mac setup for developers

Published

Maya Rodriguez

developersmac-setuphomebrewminimal

Most “developer Mac setup” guides are not setups. They are inventories. Fifty apps, three package managers, a paragraph of philosophy, and a Brewfile that will be out of date by the time you finish reading.

This post is the opposite. Minimal means few decisions, clear jobs for each tool, and a machine you can rebuild without a weekend project. If you already know Homebrew, you can skim to the final command. If not, start with how to use Homebrew, then come back.

The minimal philosophy

A minimal setup is not aesthetic sparsity. It is a constraint: every installed app must remove friction from daily work, not merely look useful on a setup screenshot.

We use four rules:

  1. One tool per job unless the second tool does a different job.
  2. Prefer tools you can install and update with Homebrew.
  3. Prefer tools that work offline for core editing and terminal work.
  4. Delay “nice to have” installs until a real task demands them.

That last rule is the hard one. The internet will always have another launcher extension, another menubar meter, another AI sidebar. Install those when a workflow fails without them—not when a blog post ranks them.

What “done” looks like on day one

After this setup, you should be able to:

  • Open a fast terminal, clone a repo, and run your language toolchain.
  • Edit code with a capable editor and extensions.
  • Run containers for local services when the project needs them.
  • Move windows, switch context, and type without fighting macOS defaults.
  • Reinstall the same base on a new machine from one command.

You will not have every SaaS desktop client. Slack, Zoom, and design tools can wait until Monday morning’s first meeting. The base layer should not depend on them.

Layer 1: terminal

The terminal is where a minimal setup either feels sharp or feels apologetic. Stock Terminal.app is acceptable. It is not ideal if you spend hours in panes, SSH, and noisy build output.

We recommend Ghostty as the default modern choice: fast, simple configuration, good defaults. If your team already standardizes on iTerm2, use that instead. Consistency with your teammates beats novelty.

brew install --cask ghostty

Pair the app with whatever shell you already know. Do not rewrite your shell config on a new machine before you can compile anything. Get online, get git working, then port dotfiles.

Layer 2: editor

Minimal does not mean “only Neovim in a cave.” It means one primary editor you can open any repo with.

Visual Studio Code remains the safest primary for most developers: broad language support, remote workflows, and the fewest “wait, you don’t have X?” moments on a team. If you already live in Zed or Cursor, install that as primary and keep VS Code as backup—or skip the backup until you need it.

brew install --cask visual-studio-code

Resist installing three AI-first editors on day one. Pick the one you will open by default. Add a second only when a project or employer requires it.

Layer 3: containers and local services

Not every developer needs Docker on day one. Many do. Frontend apps talk to local APIs. Backend work needs Postgres and Redis. Coursework and open source projects assume a container runtime.

OrbStack is our preferred default on Mac when we want Docker-compatible workflows with less overhead than a full desktop stack. Docker Desktop is the known quantity if your company already documents it.

brew install --cask orbstack

If your work is pure native apps or remote-only development, skip containers entirely until a README requires them. Minimal means empty space is allowed.

Layer 4: keyboard and window control

macOS defaults waste motion. A minimal setup fixes the highest-frequency motions only.

  • Raycast for launching apps, clipboard history, and simple commands.
  • Rectangle for window halves and corners from the keyboard.
  • Karabiner-Elements only if you remap keys (caps lock to control or escape is the common case).
brew install --cask raycast rectangle
# optional, if you remap keys
brew install --cask karabiner-elements

Skip the elaborate Hyper-key layer and multi-app macros until your base shortcuts are automatic. Complexity is easy to add and hard to remember on a second machine.

Layer 5: small utilities that prevent pain

These are still minimal because each one prevents a recurring tax:

  • AppCleaner so trial apps do not leave residue.
  • Stats so CPU and memory spikes are visible without Activity Monitor archaeology.
  • Keka so archives from the outside world open without a scavenger hunt.
brew install --cask appcleaner stats keka

That is the entire utility tier. No “Mac cleaner,” no duplicate screenshot stacks, no second clipboard manager unless Raycast’s is insufficient for you.

Language toolchains: Homebrew formulas, not random installers

Casks cover GUI apps. Language runtimes usually belong in formulas or version managers. A minimal pattern that scales:

  • Install Xcode CLT when prompted (required for many builds).
  • Use Homebrew for git and baseline libs.
  • Use a version manager (asdf, mise, nvm, pyenv, rustup) for languages you actively juggle.

Exact language setup is project-specific, so it stays out of the shared minimal cask list. The principle is the same: install what the next commit needs, not what a generic roadmap might need next year.

What we intentionally omit

A short list of common additions we leave out of the minimal base:

  • Multiple browsers on day one. Install your primary; add a second for testing when you test.
  • Full communication suites before the first calendar event.
  • Design tools unless you design.
  • Database GUIs until you are tired of the CLI for that database.
  • Note-taking apps beyond what you already use. Your notes system is personal; do not let a setup guide reset it.

Omission is a feature. A minimal Mac stays fast to rebuild and easy to reason about.

Dotfiles after packages

Install apps first, then bring configuration. Cloning a 2,000-line dotfiles repo before the terminal and editor exist produces a morning of broken assumptions. Order that works:

  1. Install the cask base below.
  2. Sign in to whatever you need for git hosting and package registries.
  3. Clone dotfiles and apply shell + editor config.
  4. Install language toolchains required by your main repo.
  5. Only then add specialty apps from Bundl’s builder if you want a repeatable extras list.

The single combined install

Here is the lean stack as one Homebrew command. It is enough for serious work and small enough to understand line by line.

brew install --cask \
  ghostty \
  visual-studio-code \
  orbstack \
  raycast \
  rectangle \
  appcleaner \
  stats \
  keka

Optional additions when you know you need them:

brew install --cask karabiner-elements iterm2 docker firefox

If you prefer generating that list from a UI and exporting it later, assemble the same set on Bundl and keep the command next to your dotfiles repo.

Maintaining minimal over time

Minimal decays. A year later, your menubar is crowded and your Applications folder has three PDF readers. Schedule a light review when you get new hardware or when the machine starts to feel slow:

  • Uninstall anything you have not opened in 90 days.
  • Prefer one app per category again.
  • Keep the base command updated in version control so the next Mac is not archaeology.

The point of a minimal developer setup is not purity. It is recovery time. When the laptop dies, when you join a new company, when you wipe a machine after a messy experiment, you should be productive the same day—not after a week of re-discovering which random DMG you used in 2024.

Start narrow. Expand on purpose. Let Homebrew and a short cask list do the boring work so you can get back to the repo.