TL;DR: How I set up my 2026 MacBook Pro, along with the software I installed and the method I used for each (either Mac App Store via the mas CLI, Homebrew, or direct download).


It’s been a few years since I last wrote one of these. The 2021 16″ MacBook Pro held up exactly as long as I’d hoped. Five years later, I’m on a 14″ MacBook Pro with the M5 Pro chip, 48GB of unified memory, and 1TB of storage.

I’m still in the WordPress economy but largely working on backend services built on GCP, PlanetScale, and related platforms. I’m also using other languages outside of PHP and other frontend languages. This includes Kotlin, Python, and Swift most of which are used in side projects.

Furthermore, the day-to-day has shifted since 2021. A lot more of my work now runs through Claude Code (among other LLMs), multiple concurrent worktrees, multi-agent sessions which is why the RAM bump mattered more this time than raw CPU cores.

My 2026 MacBook Pro

Why 14″ This Time

Five years on the 16″ taught me I wanted something more portable without giving anything up. The 14″ with the M5 Pro and 48GB of RAM gets the same horsepower, full 18-core CPU, plenty of memory for concurrent worktrees and agent sessions, in a chassis that’s easier to carry.

Audit First, Migrate Second

Though I never used Apple’s built-in tools for transferring data to a new system, I did occasionally bring forward certain configurations or apps that I rarely used. This time, before installing anything on the new machine, I ran brew bundle dump on the old one to capture the full state: every tap, formula, cask, and Mac App Store app. Then I went through it line by line.

This is worth doing for two reasons.

  1. It’s easier to decide what to drop when you’re looking at the old machine’s actual footprint instead of reinstalling on autopilot.
  2. It caught real cruft I’d have otherwise carried forward for another however many years or would have had to deal with at some point in the future. Case in point, an EOL Node version, an old Python pin, a couple of orphaned codec libraries nothing depended on anymore, a deprecated cask that would’ve quietly broken in a few months.

Worth running the same pass on mas list output too. App Store apps accumulate the same way, and it’s easy to lose track of what’s actually still in use.

Out of the Box

Same as always: full System Update first, then clear out any pending Mac App Store updates.

Personal Preference

The usual list of things I set to my liking, no science behind any of it:

  • Dock on the bottom, set to auto-hide.
  • Scale effect instead of genie on minimize.
  • Menu bar stays visible since I use it more than I don’t.
  • Notifications start at zero and get added back only as I find I need them.
  • Watch unlock stays off since I don’t want a curious kid waking the machine mid-task.

For naming: my last six laptops were all Skyhopper (1 through 6), my Mac Mini was Starkiller, and my last MacBook was Scarif. This one’s named Mortis and if you’re familiar with The Clone Wars, you’ll know it. (And I named my iPad Peridea since it seemed to logically follow.)

Start the Machine

Same philosophy as 2021: Homebrew handles as much as possible, the Mac App Store covers the rest via the mas cli, and I note the install method for everything below.

Homebrew

Install via the usual one-liner from brew.sh, then:

$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/tommcfarlin/.zprofile
$ eval "$(/opt/homebrew/bin/brew shellenv)"
$ brew doctor

Terminal

Confirming the shell is still zsh:

$ ps -p $$

New this time: I moved off iTerm2 and settled on Ghostty via Brew for its native GPU-accelerated rendering. Oh My Zsh is still there, same plugin set as before (including Git, Brew, colored-man-pages, Composer, wp-cli, and zsh-autosuggestions. Dracula is the theme running across my IDEs and terminals one consistent look wherever I’m working.

From here, same structure as last time: Development, Work, Productivity, Entertainment, and Utilities.

Development

  • VSCodium (Brew). Switched off VS Code this cycle for the non-telemetry build and all extensions come via Open VSX.
  • Claude Code. Installed via Anthropic’s native installer, not Homebrew. Two instances running locally which I’ll detail later in this article.
  • Claude (Brew)
  • GitHub CLI (Brew). Prefer to use this over a frontend most of the time.
  • TablePlus (Setapp). Still my database front end.
  • Xcode, Xcode Command Line Tools, XcodeGen, SwiftLint, SwiftFormat, xcbeautify (Mac App Store / Brew). The iOS toolchain for the Pressware apps like Where Can I Watch? and TuneLink.
  • Android command-line tools and Temurin (Brew). Java dependency for the Android SDK tooling.
  • Herd (Brew). Replaced my standalone PHP/nginx/dnsmasq/MySQL stack.
  • Node (Brew), upgraded to Node 22 mid-cycle for a project requirement.
  • Google Cloud CLI (Brew) for working with cloud functions, storage, scheduled jobs, etc.
  • PlanetScale CLI (Brew)
  • Gradle (Brew). Android builds.

Work

  • Slack (Brew)
  • Google Chrome (Brew). Work-specific; Brave is my daily-driver browser
  • Zoom (Brew)

Productivity

  • 1Password (Brew). Extended across the family via 1Password Families.
  • Magnet, Command X, 1Blocker (mas)
  • Raycast (Brew). Stripped down this time to a faster Spotlight. I don’t use extensions, clipboard history, or extras.
  • Keka (Brew). Still my archive utility.

Entertainment

Utilities

  • Backblaze (Brew). Still my backup service, and the reason I didn’t bother routing Projects or Downloads through iCloud. Backblaze already covers continuous backup without the sync conflicts iCloud can introduce with git repos.
  • rclone (Brew)
  • Transmission (Brew)
  • WhatsApp (Brew)
  • ExifTool (Brew)
  • HandBrake (Brew). Video transcoding when I need it.
  • Setapp (Brew). Now the source for CleanMyMac, CleanShot, TablePlus, and a few others instead of installing them standalone.
  • Freedom, NetNewsWire, Rocket, ScreenFlow (Brew)
  • Fonts (Brew): Cascadia Code/Mono, Fira Code, JetBrains Mono (+ Nerd Font), MesloLGS Nerd Font, Victor Mono.
  • Logi Options+ (Brew). Replaced the deprecated Logitech Options cask mid-cycle.

Porting the Development Environment

Once the new machine was provisioned, the last step was making sure my actual working setup, not just the apps, came over intact: both instances of Claude Code, SoloTerm, and the live project directories.

Downloads and active projects moved over with a straightforward rsync from the old machine to the new one over the LAN.

For Claude Code, I run separate personal and work sessions via aliases that swap CLAUDE_CONFIG_DIR:

alias claude-pers='CLAUDE_CONFIG_DIR=~/.claude-personal claude'
alias claude-work='CLAUDE_CONFIG_DIR=~/.claude-work claude'

Porting this over meant installing Claude Code fresh on the new machine first (curl -fsSL https://claude.ai/install.sh | bash), then rsync-ing both profile directories over, and dropping the same two alias lines into the new .zshrc. Auth tokens came along with the files; I only had to re-authenticate the first time I actually ran claude-work.

SoloTerm followed the same pattern: install and launch once to generate its ~/Library/Application Support/com.soloterm.solo folder, then rsync that folder over to restore workspace state.

Wrapping Up

One habit worth keeping for future machines: the brew bundle dump and mas list output from this setup are saved as plain files, not just a memory of what I did.

Next time, instead of starting the audit from scratch, I’ve got an actual record of what was on this machine and why: a Brewfile I can hand to a new machine and run in one shot, and a Mac App Store list I can diff against instead of guessing what’s still in use. Portable, versioned, and a lot more honest than trying to reconstruct five years of accumulated decisions from memory.

That’s the full setup: every application, how I installed it, and why it’s there. Some of this will change before the next one of these posts, but the goal’s the same as it’s always been: get a solid run out of this machine, same as the last one.