The “boring” Mac development setup: just Homebrew + tmux + Neovim + iTerm2 + ssh, and why it ages well

Every year a new IDE arrives and developers spend a weekend learning it. New JetBrains release, new VS Code competitor, new AI-powered editor whose pricing model will pivot in 18 months. There’s an alternative: pick a stack of well-aged Unix tools, configure them once, and don’t touch the toolchain again for five years. Boring is a feature.

This is the “all the tools were already mature in 2014, and they still work the same way in 2026” Mac development setup. Homebrew, tmux, Neovim, iTerm2, ssh. Five tools, ~30 minutes of setup, no subscriptions, no cloud sync, no telemetry, no “upgrade your editor” nag screens.

The five pillars

  • Homebrew — the package manager that handles everything else. Without it, every other tool needs custom install paths.
  • tmux — terminal multiplexer. Multiple shells in one terminal window, with persistent sessions that survive ssh disconnects.
  • Neovim — a Vim fork with a more sensible config story. Edits text faster than any GUI editor once you’re fluent.
  • iTerm2 — the terminal emulator. Better than Apple’s Terminal.app in every measurable dimension.
  • ssh — the connection layer. Built-in to macOS; almost everything else here works the same on a remote server as on local.

Step 1 — install Homebrew, then everything else

# From a fresh Mac, in Terminal.app:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Once Homebrew exists, the rest is one line:
brew install tmux neovim git
brew install --cask iterm2

# Sane defaults that cost nothing:
brew install fzf ripgrep bat eza  # better find/grep/cat/ls drop-ins

Total time: ~5 minutes on decent broadband. Two cups of coffee less than installing JetBrains plus its plugins.

Step 2 — iTerm2 the small handful of settings worth changing

  • Settings → Profiles → Window → Style: Maximized. Full-screen terminal, no title bar.
  • Profiles → Text → Font: JetBrains Mono at 14pt. Or Berkeley Mono if you’ve paid for it. Or PT Mono for a free option that’s also pretty.
  • Profiles → Keys → Left Option key: Esc+. Without this, Option+arrow won’t word-skip in shells/Vim. The most common iTerm2 misery.
  • Profiles → Terminal → Scrollback lines: 10000. Default is 1000, too short for log inspection.
  • Profiles → Colors → Color Presets… → Tango Dark. Or whatever; Tango is fine and has been fine for ten years.

That’s it. Don’t tweak more iTerm2 settings until you’ve actually used it for a month. The rest are noise.

Step 3 — tmux, the bare minimum config

# ~/.tmux.conf
set -g prefix C-a              # rebind from C-b to C-a (more reachable)
unbind C-b
bind C-a send-prefix
set -g mouse on                # mouse-select panes, scroll
set -g history-limit 50000
set -g base-index 1            # window numbering starts at 1
setw -g pane-base-index 1
set -g default-terminal "tmux-256color"
set -g status-style "bg=#1e1e2e,fg=#a6adc8"
bind | split-window -h -c "#{pane_current_path}"  # | for vsplit
bind - split-window -v -c "#{pane_current_path}"  # - for hsplit
bind r source-file ~/.tmux.conf \; display "reloaded"

Run tmux. Press Ctrl+A then | for vertical split, - for horizontal. Ctrl+A then arrow keys to move between panes. Ctrl+A then d to detach (the session keeps running). tmux a to re-attach.

If your laptop sleeps mid-session, the session survives. If your network drops while you’re SSHed into a remote box and running tmux there, the session survives. This is what tmux is for.

Step 4 — Neovim with a starter that doesn’t require ten plugins

Neovim’s plugin scene is overwhelming. The boring choice: install kickstart.nvim — a 600-line single-file Lua config maintained by the Neovim project that gets you LSP, autocomplete, fuzzy file finder, syntax highlighting, treesitter, gitsigns. No further customization needed for ~80% of work.

git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
nvim
# On first launch, the plugin manager auto-installs everything.
# Wait ~30 seconds, restart nvim. Done.

Then for any language you work with, install the language server (brew install gopls / pyright / typescript-language-server / rust-analyzer) and Neovim auto-detects it. Hover docs, jump-to-definition, rename-symbol all just work.

Step 5 — ssh, with the keys done right

macOS ships with ssh. The thing to set up correctly:

# Generate one ed25519 key for your laptop (smaller, faster, more secure than RSA)
ssh-keygen -t ed25519 -C "rehmat@laptop"
# defaults are fine; add a passphrase

# Add to macOS Keychain so the passphrase is unlocked at login:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# ~/.ssh/config — tell ssh to use the keychain:
Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_ed25519

# Per-host shortcuts for the boxes you actually use:
Host server
    HostName 192.0.2.10
    User rehmat
    Port 22

Now ssh server works from any new shell, no passphrase prompt, no fiddling.

Why this stack ages well

  • Same on local Mac and remote Linux server. tmux + Neovim + ssh on the Mac talking to tmux + Neovim + ssh on a server is one workflow. No “sync settings to my IDE on the remote machine” problem.
  • Plain text config files. Versionable in git, diffable, copy-pasteable. Compare to GUI IDE settings stored in plist or JSON-with-secrets-mixed-in.
  • Doesn’t get rewritten under you. Vim’s keybindings are 30 years old. tmux’s are 16. They don’t change.
  • Free, no account. No subscription expiring, no “sign in to continue,” no “your team needs to upgrade.”
  • Composable with everything. Need to use Cursor for AI coding sessions? Use it for those, fall back to this stack for everything else. None of these tools fight each other.

This isn’t an argument that JetBrains or VS Code is wrong — both are great. It’s an argument that having a boring, stable, low-churn fallback stack means a fresh laptop is half a day instead of a weekend, and your toolchain isn’t going to surprise you with a 2027 redesign.

Photo: Laptop displaying CSS code by negativespace on Pexels.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.