Every fresh Mac starts the same way for me: a little excitement, then a strong desire to make it feel like my machine again as fast as possible.
The setup I want on a new Mac is simple:
- more declarative installs
- less hidden shell state
- fewer overlapping Python tools
- safer handling of SSH keys and secrets
This is the setup I would use today on a new Mac.
1. Do the boring security basics first
Before I install developer tools, I do the unglamorous things:
- update macOS
- install Xcode Command Line Tools
- turn on FileVault
- sign into the accounts I actually use
- make sure backups are real, not theoretical
Apple notes that Macs with Apple silicon already encrypt data automatically, but FileVault adds an extra layer by requiring your login password before someone can decrypt or access the disk. That is still worth turning on.
xcode-select --install
2. Use Homebrew, but make it declarative
I still start with Homebrew, but the biggest upgrade in my 2026 setup is using a Brewfile instead of reinstalling things from memory.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew update
Homebrew’s brew bundle is the feature I care about most now. Instead of remembering fifty install commands, I keep a Brewfile and let the machine restore itself.
Example:
brew "git"
brew "gh"
brew "mise"
brew "uv"
brew "direnv"
brew "jq"
brew "ripgrep"
brew "fd"
brew "fzf"
brew "bat"
cask "1password"
cask "raycast"
cask "rectangle"
cask "maccy"
cask "shottr"
cask "orbstack"
cask "google-chrome"
cask "slack"
cask "zoom"
Then install everything with:
brew bundle --file /path/to/Brewfile
If you already have a Mac configured the way you like, one underrated trick is to snapshot it:
brew bundle dump --global --force
That is one of the best “future me” gifts you can create.
3. Replace scattered version managers with mise
I prefer mise because it manages multiple runtimes and tools from one place.
For example:
mise use --global node@26
mise use --global python@3.13
mise use --global go@1.24
You can also commit a mise.toml to a project so the expected toolchain lives with the repo:
[tools]
node = "26"
python = "3.13"
go = "1.24"
This is much nicer than keeping separate mental notes for nvm, pyenv, asdf, and whatever else happens to be installed on one laptop but not another.
4. Use uv for Python instead of stitching together five tools
This is the biggest Python change in my setup.
uv has become my default because it covers Python versions, project dependencies, virtual environments, and Python CLI tools in one fast workflow.
uv python install 3.13
uv tool install ruff
uv tool install basedpyright
For a new project:
uv init my-project
cd my-project
uv add ruff pytest
uv run pytest
If a team already standardized on Poetry, Conda, or something else, I follow the team. But for greenfield Python work, uv is now my default.
5. Stop auto-sourcing a global .env
I would not source a giant global ~/.env from ~/.zshrc.
It feels convenient until it becomes confusing, leaky, or risky.
In 2026 I prefer:
- direnv for per-project environment loading
- a password manager for actual secrets
- project-level
.env.examplefiles instead of one global secret bucket
Hook direnv into zsh once:
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
Then let each repo decide what it needs. That keeps the shell cleaner and avoids injecting unrelated environment variables into every terminal session.
6. Make Git and SSH sane on day one
I now install GitHub CLI immediately. The browser-based login flow is easy, and on macOS it stores credentials in the system credential store when available.
gh auth login
gh auth setup-git
For SSH keys, I like using 1Password’s SSH agent instead of scattering private keys across machines.
My rough setup is:
- generate or import an SSH key in 1Password
- turn on
Use the SSH Agentin1Password > Settings > Developer - point
~/.ssh/configat the 1Password agent socket
Host *
IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
This gives me a more explicit approval flow for Git and SSH operations without copying private keys between laptops.
7. Use a better container runtime if you live in Docker all day
Docker Desktop still works, but one recommendation I kept hearing from other developers and eventually adopted is OrbStack.
brew install --cask orbstack
If your company standardizes on Docker Desktop, use that. But on a personal Mac, OrbStack is one of the few “everybody keeps recommending this” tools that I think genuinely earns the hype.
8. Install the small apps that compound every day
These are the apps that keep showing up in good Mac setup recommendations for a reason:
- Raycast for launcher, snippets, quick links, and automation
- Rectangle for window management
- Maccy for clipboard history
- Shottr for fast screenshots and annotations
brew install --cask raycast rectangle maccy shottr
This category of software does not sound dramatic, but it saves time hundreds of times per week.
9. Keep one code root and one bootstrap path
I still like a simple workspace layout:
mkdir -p ~/code
cd ~/code
From there, I clone the repos I use most and keep one bootstrap or dotfiles repo that contains:
- my
Brewfile - shell config
- Git config
- editor settings
- a small
script/bootstrap
The goal is not to make setup clever. The goal is to make it repeatable.
10. Small defaults I still set manually
A few things still deserve five minutes of intentional setup:
- a global Git ignore for
.DS_Storeand editor junk - browser sign-in and extension sync
- keyboard shortcuts I actually use
- Finder preferences and Dock cleanup
- backup verification
None of these are glamorous, but all of them reduce friction.
Conclusion
A good Mac setup in 2026 is less about collecting tools and more about reducing hidden state.
I want a machine I can rebuild quickly, understand a month later, and trust with real work.
If I had to compress the whole setup into one sentence, it would be this:
Use Homebrew to declare software, mise to manage runtimes, uv to keep Python sane, direnv to localize environment variables, and a few great macOS apps to remove daily friction.