MacBook Setup for AI Engineering: macOS Tools, Python, Docker, and Terminal Workflow
This is my checklist for turning a fresh macOS install into an AI engineering workstation: command-line tools, Homebrew, Python, Docker, terminal defaults, and editor setup.
TL;DR: This is the setup I use on a new MacBook: Homebrew, Python with uv, the bundled Zsh with Oh My Zsh and Powerlevel10k, Docker, my editors, and local AI tools. Keep the commands and dotfiles in version control so the setup is repeatable.
1. Install Xcode Command Line Tools
xcode-select --install
This opens a dialog that walks you through the install.
2. Install Homebrew
Homebrew is the package manager I use for everything else on this list:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
The installer explains what it will change and asks for confirmation. On Apple Silicon, Homebrew uses /opt/homebrew by default. Follow the brew shellenv command printed at the end; Homebrew does not silently make the command available in every shell.
3. Install the core tools
brew install openssl readline sqlite3 xz zlib uv htop gitmoji pandoc ncdu tmux
Roughly grouped by what they’re for:
Python environment
Before adopting uv, I used pyenv as the foundation of my Python environment management. uv now covers that everyday workflow for me, including Python installation and project environments.
- uv installs Python versions and manages project environments, dependencies, commands, and lockfiles.
- pyenv is optional. I use it only when I need a source-built interpreter or custom CPython build options that uv’s prebuilt distributions do not provide.
Install pyenv separately when you need that source-build path:
brew install pyenv
System libraries
- openssl provides SSL/TLS cryptography support.
- readline adds command-line text editing.
- sqlite3 is a lightweight embedded database.
- xz and zlib provide data compression.
Productivity tools
- htop is a visual system and process monitor.
- tmux manages multiple terminal sessions.
- ncdu analyzes disk usage interactively.
- gitmoji adds emojis to commit messages.
- pandoc converts documents between formats.
For more on
uvitself, see my Quick-Guide on managing Python on macOS with uv.
4. Pick a terminal
The default macOS Terminal is fine. I used iTerm2 for years and recently moved to Warp, a Rust-based terminal with built-in AI features. The choice is personal; none of the later setup depends on it.
Optional: iTerm2 setup
If you stick with iTerm2, the two settings I always change:
Enable natural text editing
- Preferences → Profiles → Keys → Key Mappings
- Click the Presets… dropdown
- Select “Natural Text Editing”
Pick a color theme
- Browse themes at iTerm2-Color-Schemes
- Preferences → Profiles → Colors → Color Presets…
- Click Import and select your downloaded theme
5. Set up Zsh
macOS already includes Zsh and uses it as the default login shell. I use the bundled /bin/zsh; install Homebrew’s Zsh only when you need a specific newer upstream version.
Check the installed Zsh and your current login shell:
echo "$SHELL"
command -v zsh
zsh --version
If Zsh is installed but not selected as your login shell, switch to the bundled copy:
chsh -s /bin/zsh
Open a new terminal after changing the login shell.
Oh My Zsh adds the defaults and plugin system I use on top. Its official installer is:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
The project recommends inspecting an unfamiliar installer before running it. It also documents that an existing .zshrc is renamed to .zshrc.pre-oh-my-zsh during installation.
6. Add Zsh plugins
Edit your ~/.zshrc to load these plugins:
plugins=(
aws bgnotify brew docker docker-compose
emoji forklift gcloud git history iterm2
keychain kubectl macos pre-commit
pyenv pylint python screen themes
tmux virtualenv vscode
zsh-autosuggestions zsh-syntax-highlighting
)
Remove pyenv from the plugin list if you skipped the optional pyenv install.
Descriptions for all of these are in the Oh My Zsh plugins wiki.
The last two need a separate install:
- zsh-autosuggestions suggests commands from your history as you type.
- zsh-syntax-highlighting colors commands as you type, which makes typos easier to spot.
Follow the install instructions on each repo.
7. Theme it with Powerlevel10k
Powerlevel10k is the Zsh theme I use. It shows the working directory, git status, and active Python environment in the prompt, and it has an interactive wizard for tweaking the look. Install instructions are on the GitHub page.
Fonts in other editors
If you use VSCode or another editor with an integrated terminal, set the terminal font so the Powerlevel10k icons render:
- Open your editor’s settings
- Search for
terminal.integrated.fontFamily - Set it to
MesloLGS NF(installed alongside Powerlevel10k)
Full font setup is in the Powerlevel10k font guide.
8. Editor and AI assistants
I always end up with one IDE open and an AI tool or two running next to it.
IDEs
- Cursor — a VSCode fork with AI pair programming built in
- VSCode — the one with the huge extension catalog
AI assistants
- OpenAI Codex — OpenAI’s coding agent
- Claude — Anthropic’s assistant; what I reach for on harder tasks
These days that’s Cursor with Codex and Claude Code running in parallel.
9. The rest
A few extras I install on every machine:
- GitHub Desktop — visual Git client when I don’t want to drop into the CLI
- Docker Desktop — the container runtime I use; Podman Desktop is an alternative
- Ollama or LM Studio — run LLMs locally on the Mac
10. That’s the setup
That’s what I install on every new MacBook before doing real work. Adjust to taste.
Key takeaways
- This is a personal setup, not a minimal or universal macOS baseline. Remove anything you do not use.
- The bundled
/bin/zshis sufficient for this setup. Install Homebrew’s Zsh only when you need a specific newer upstream version. - uv now owns Python installation and project environments in my everyday workflow. pyenv remains optional for source-built or custom CPython interpreters.
- Keep install commands, secret-free dotfiles, editor extensions, and model locations documented so the next setup is mechanical.