MacOS

Command Line Interface

Tools I recommend you install on MacOS

Summary

ToolPurposeExample
Powerlevel 10kZsh theme for speed and flexibilityp10k configure
nvmNode Version Managernvm install stable
nodeJavaScript runtimenode --version
npmNode package managernpm install -g pnpm
pnpmDisk space efficient package managerpnpm --version
bunFast all-in-one JavaScript runtimebun --version
rustupRust toolchain installerrustup default stable && rustupupdate
cargoRust package managercargo install just
justCommand runnerjust
ezaModern replacement for lseza
fdSimple, fast alternative to findfd pattern
ripgrepFast alternative to greprg pattern
ast-grepStructural search and replaceast-grep
batcat clone with syntax highlightingbat file.txt
zoxideSmarter cd commandz directory
git-deltaSyntax-highlighting pager for gitdelta
uvFast Python package manageruv tool install httpie
pre-commitGit hook management frameworkpre-commit install
httpieModern command-line HTTP clienthttp GET example.com
yt-dlpA feature-rich command-line audio/video downloaderyt-dlp "example.com"
lazygitTerminal UI for gitlazygit
fzfCommand-line fuzzy finderfzf
jqCommand-line JSON processorjq .

Powerlevel 10k

Powerlevel10k is a theme for Zsh. It emphasizes speed, flexibility and out-of-the-box experience.
Terminal
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
Fonts can be downloaded and installed via this tip's link.

Manual font installation

  1. Download these four ttf files:
  2. Double-click on each file and click "Install". This will make MesloLGS NF font available to all applications on your system.
  3. Configure your terminal to use this font:
    • iTerm2: Type p10k configure and answer Yes when asked whether to install Meslo Nerd Font. Alternatively, open iTerm2 → Preferences → Profiles → Text and set Font to MesloLGS NF.
    • Apple Terminal: Open Terminal → Preferences → Profiles → Text, click Change under Font and select MesloLGS NF family.
    • Hyper: Open Hyper → Edit → Preferences and change the value of fontFamily under module.exports.config to MesloLGS NF.
    • Visual Studio Code: Open File → Preferences → Settings (PC) or Code → Preferences → Settings (Mac), enter terminal.integrated.fontFamily in the search box at the top of Settings tab and set the value below to MesloLGS NF. Consult this screenshot to see how it should look like or see this issue for extra information.
    • Ghostty: Open Menu → Open Configuration (Linux) or Ghostty → Settings... (Mac) and add the following line:
      font-family = "MesloLGS NF"
      

Node Version Manager: Node, NPM, and Bun

Learn how to install the npm with nvm!
Terminal
nvm on
nvm install stable
nvm use stable
node --version
npm --version
npm               # to see if there is a version to upgrade to
npm install -g bun
# npm install -g bun@1.2.4  # (to upgrade or use a specific version of `bun`)
npm install -g pnpm
# npm install -g pnpm@9.0.0  # (to upgrade or use a specific version of `npm`)
bun --version
pnpm --version

Rust

Learn how to install the rustup utility and the cargo package manager!
Terminal
rustup default stable
rustup update

Rust Tools

Terminal
cargo install just --locked
cargo install eza --locked
cargo install fd-find --locked
cargo install ripgrep --locked
cargo install ast-grep --locked
cargo install bat --locked
cargo install zoxide --locked
cargo install git-delta --locked
cargo install typst-cli --locked

Python

My recommendation for new Python projects is to use uv package manager, which is an extremely fast Python package and project manager, written in Rust..
Learn how to install the uv package manager!

Python tools

Terminal
uv tool install --python 3.14 pre-commit --with pre-commit-uv
uv tool install --python 3.14 httpie
uv tool install --python 3.14 "yt-dlp[default]"
The documentation for httpie calls to install with pip, but on MacOS, there is a openssl issue, so we install with uv tool, which uses a python installation it manages, not the system python.
Terminal
/Users/iancleary/.local/share/uv/tools/httpie/lib/python3.9/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
Again, when using uv tool, this issue goes away, since we are not using the system python installation.

Go tools

Learn how to install go!
Terminal
go install github.com/jesseduffield/lazygit@latest
Use p to pull Use Shift + P to push to the current branch

MacPorts

Terminal
sudo port install fzf
sudo port install jq

fzf

fzf is a general-purpose command-line fuzzy finder.

Basic Usage

Terminal
# Find files interactively
fzf

# Preview files with bat
fzf --preview 'bat --color=always {}'

# Use fd as the default source (respects .gitignore)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'

Integration with Other Tools

Terminal
# Search file contents with ripgrep, then open in editor
rg --line-number . | fzf --delimiter ':' --preview 'bat --color=always --highlight-line {2} {1}'

# Find directories with fd
fd --type d | fzf

Useful Shell Functions

Add these to your ~/.zshrc:

~/.zshrc
# Fuzzy cd into a directory
fcd() {
  local dir
  dir=$(fd --type d | fzf --preview 'eza --tree --level=1 {}') && cd "$dir"
}

# Fuzzy search command history
fhist() {
  local cmd
  cmd=$(history -1 0 | fzf --tac | sed 's/^ *[0-9]* *//')
  print -z "$cmd"
}

# Fuzzy checkout git branch
fbr() {
  local branch
  branch=$(git branch --all | grep -v HEAD | fzf --preview 'git log --oneline --graph -10 {}' | sed 's/.* //' | sed 's|remotes/origin/||')
  git checkout "$branch"
}
See the fzf wiki for many more examples and integrations.

AI Tools

OpenAI Codex CLI

Terminal
npm i -g @openai/codex
Learn how to install OpenAI's CLI, codex!

Claude Code CLI

Terminal
curl -fsSL https://claude.ai/install.sh | bash
Learn how to install Claude Code's CLI, claude!

Claude Browser Dev

Claude Code can use a local browser for development preview, allowing it to visually verify changes and interact with your running application.

Terminal
claude --browser

This launches Claude Code with browser capabilities, enabling it to open local dev servers, take screenshots, and verify UI changes as part of the development workflow.

Claude Skills

Claude Skills let you teach Claude Code reusable capabilities. Create a .claude/skills/ directory in your project with SKILL.md files that describe how to perform specific tasks.

Learn more about Claude Skills in the official documentation.
Terminal
mkdir -p .claude/skills
touch .claude/skills/SKILL.md

Each SKILL.md file teaches Claude Code a specific capability — like how to deploy your app, run tests, or follow your coding conventions. Claude Code automatically reads these when working in your project.

Dotfiles

I manage my shell configuration with a dotfiles repo that syncs across machines. On macOS, this covers zsh configs, Powerlevel10k, shared aliases, and AI agent configuration.

Terminal
git clone git@github.com:iancleary/dotfiles.git ~/dotfiles
cd ~/dotfiles
./sync-dotfiles.sh push   # Install configs from repo
./sync-dotfiles.sh pull   # Backup current configs to repo
./sync-dotfiles.sh status # Check for differences

The sync utility detects the OS and installs the appropriate files — zsh configs on macOS/Linux, bash configs on Windows. Shared utilities are installed on all platforms.

What Gets Synced (macOS)

  • .zshrc, .zshenv, .zprofile — Zsh configuration with Powerlevel10k
  • .p10k.zsh — Powerlevel10k theme configuration
  • .common/aliases.sh — Shell aliases (eza, git, docker, cargo, just)
  • .common/agents-git-trees.sh — Git worktree helpers (ga/gd)
  • .claude/ — Claude Code settings, skills, principles
  • .codex/ — Codex CLI rules and MCP servers

Ghostty

Ghostty is a fast, feature-rich, and cross-platform terminal emulator.

Add window padding to your Ghostty config file (~/.config/ghostty/config):

~/.config/ghostty/config
window-padding-x = 8
window-padding-y = 0,4

The window-padding-y = 0,4 sets 0 padding on top and 4 on the bottom, giving a clean look with minimal wasted space.