Skip to content

Writing

How I set up my MacBook as a software engineer

A complete walkthrough of my macOS development environment — from terminal core tools and window management, to modern CLI replacements and Docker setup.

All writing
1 min readDeveloper SetupmacOSCLIProductivity

My MacBook is my primary tool for building software. When I get a new machine, I want to go from a fresh macOS install to a fully functional development environment in under an hour. Over the years, I've refined a script and a set of tools that make this process seamless.

This post isn't just a list of applications to download. It's a look at the modern CLI tools that have replaced my old workflows, how I manage environments per-project without global conflicts, and the aliases I rely on for speed.

Below is the exact sequence of commands I run, followed by a breakdown of why these tools are worth your time.

1. The Setup Sequence

I prefer to script my environment setup. If I get a new MacBook, this is the sequence I run to go from zero to a fully productive environment in under an hour.

1. Core Prerequisites
$/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$brew install --cask font-fira-code-nerd-font
2. Terminal & CLI Core
$brew install starship zsh-autosuggestions zsh-syntax-highlighting
$echo 'eval "$(starship init zsh)"' >> ~/.zshrc
$echo 'source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh' >> ~/.zshrc
$echo 'source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh' >> ~/.zshrc
$brew install eza bat ripgrep fd fzf zoxide jq yq tldr tree wget
$echo 'eval "$(zoxide init zsh)"' >> ~/.zshrc
$echo 'alias ls="eza --icons=auto"' >> ~/.zshrc
$echo 'alias ll="eza -la --icons=auto --git"' >> ~/.zshrc
$echo 'alias lt="eza --tree --level=2 --icons=auto"' >> ~/.zshrc
$brew install btop
3. Git & Version Control
$brew install gh lazygit git-delta
$echo 'alias lg="lazygit"' >> ~/.zshrc
4. Development Environments
$brew install mise
$echo 'export PATH="$HOME/.local/share/mise/shims:$PATH"' >> ~/.zshrc
$echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
$mise use --global node@lts java@21 python@3.12 go@latest terraform@latest
5. Docker & Kubernetes
$brew install --cask orbstack
$brew install kubectl helm minikube k9s kubectx
$echo 'alias docksock="eval \$(minikube docker-env)"' >> ~/.zshrc
6. Dev Tools & Apps
$brew install --cask bruno dbeaver-community tableplus obsidian meld
$brew install httpie maven gradle visualvm
7. macOS Productivity
$brew install --cask raycast alt-tab shottr
8. Apply Changes
$source ~/.zshrc

2. The Tools Explained

A list of commands isn't helpful without knowing why I use these tools. Here's a breakdown of the most critical replacements in my workflow.

miseReplaces: nvm, pyenv, sdkman, asdf

The front-end to your dev environment. It manages environment variables and tool versions (Node, Python, Java, etc.) per project.

$mise use node@20

ezaReplaces: ls

A modern replacement for ls. It has colors, icons, and understands Git statuses natively.

$eza -lah --icons

batReplaces: cat

A cat clone with syntax highlighting and Git integration. It paginates output automatically if it's too long.

$bat package.json

zoxideReplaces: cd

A smarter cd command. It remembers which directories you use most frequently, so you can jump to them in just a few keystrokes.

$z port

ripgrep (rg)Replaces: grep

An incredibly fast line-oriented search tool that recursively searches your current directory for a regex pattern. It respects your .gitignore.

$rg 'export function'

fzf

A general-purpose command-line fuzzy finder. I pipe things into it, or use it to reverse-search my command history (Ctrl+R).

$history | fzf

k9s

A terminal UI to interact with your Kubernetes clusters. Makes it trivial to view logs, shell into pods, and manage resources without typing long kubectl commands.

$k9s

Minikube

Local Kubernetes, focusing on making it easy to learn and develop for Kubernetes.

$docksock

3. My Zsh Cheat Sheet

I keep my `.zshrc` clean by relying on tools like `mise`, but aliases are essential for muscle memory. Here are the shortcuts I use hundreds of times a day.

..
cd ..
Go up one directory
...
cd ../..
Go up two directories
ls
eza --icons
List files with icons
ll
eza -lh --icons
List files with details
la
eza -lah --icons
List all files including hidden
tree
eza --tree --icons
View directory as tree

What's Next?

You might notice a distinct lack of IDE installations (VS Code, Cursor, IntelliJ) in the script above. I prefer to download them as I need them, rather than cluttering my machine on day one.

I also didn't cover my AI setup here. Setting up Antigravity 2.0 and the Antigravity IDE is a workflow of its own, and I'll be releasing a deep dive on that as part of my upcoming paid content.