Issue #1023
The default Terminal.app works, but it lacks the speed and features that modern development demands. A well-configured terminal setup makes navigation faster, Git operations visual, and file searching instant. This guide walks through setting up Ghostty, Zsh with Prezto, and the CLI tools that experienced developers rely on daily.
Install Homebrew First
Everything here installs through Homebrew. If you don’t have it yet, open Terminal and run:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Follow the post-install instructions to add Homebrew to your PATH.
Terminal Emulator: Ghostty
Ghostty is a GPU-accelerated terminal built in Zig by Mitchell Hashimoto (HashiCorp co-founder). It has 2ms input latency, native macOS rendering, and built-in split panes. Unlike Warp, it requires no account and collects no data.
brew install --cask ghostty
Create a config file at ~/.config/ghostty/config:
theme = Catppuccin Mocha
font-family = MesloLGS Nerd Font Mono
font-size = 14
window-padding-x = 16
window-padding-y = 16
macos-titlebar-style = tabs
Install the font with brew install --cask font-meslo-lg-nerd-font. Browse themes with ghostty +list-themes and reload config with Cmd+Shift+Comma.
Shell: Zsh with Prezto
macOS ships with Zsh, but it needs configuration. Prezto is faster and leaner than Oh-My-Zsh. Where Oh-My-Zsh can add over a second to shell startup, Prezto keeps things snappy.
Clone Prezto and set up the config files:
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
Load prezto configuration in ~/.zshrc file
source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
Set the prompt theme in the same file:
zstyle ':prezto:module:prompt' theme 'pure'
Restart your terminal. Autosuggestions appear as you type, syntax highlighting colors valid commands green, and history-substring-search lets you press up arrow to find previous commands matching what you’ve typed.
Essential CLI Tools
These replace slow built-in commands with faster, smarter alternatives.
ripgrep
Searches file contents recursively and respects .gitignore. Ten to fifty times faster than grep.
brew install ripgrep
rg "useState" # Search in current directory
rg -t js "import" # Search only JavaScript files
rg -i "error" # Case-insensitive search
rg -l "TODO" # Show only filenames
rg -C 3 "function" # Show 3 lines context
fd
A faster, friendlier find command. Ignores hidden files and .gitignore by default.
brew install fd
fd config # Find files with "config" in name
fd -e json # Find by extension
fd -t d node_modules # Find directories only
fd -H ".env" # Include hidden files
fd --changed-within 24h # Files modified recently
zoxide
Replaces cd with a smarter alternative that learns your habits. Jump to frequently-used directories with just a few characters.
brew install zoxide
Add to ~/.zshrc: eval "$(zoxide init zsh)"
z project # Jump to frequently-used directory
z src # Jump to most recent match
zi # Interactive selection with fzf
tmux
Terminal multiplexer for managing sessions, splits, and keeping processes alive when you disconnect.
brew install tmux
tmux # Start new session
tmux new -s project # Start named session
tmux attach -t project # Attach to session
tmux ls # List sessions
lazygit
Visual Git interface in the terminal. Stage files, commit, push, resolve conflicts, interactive rebase—all without memorizing commands.
brew install lazygit
lazygit # Launch in current repo
Press ? for help. Use Space to stage, c to commit, P to push.
Additional Tools Worth Installing
fzf
Fuzzy finder that works with files, command history, and anything else you pipe to it.
brew install fzf
$(brew --prefix)/opt/fzf/install
# Ctrl+R # Fuzzy search command history
vim $(fzf) # Find and open file
fzf --preview 'bat {}' # Preview files while searching
bat
A cat replacement with syntax highlighting, line numbers, and Git integration.
brew install bat
bat script.js # View with syntax highlighting
bat -n file.py # Show line numbers
bat --line-range 10:20 file.ts # Show specific lines
eza
Modern ls replacement with Git status, icons, and color-coded output.
brew install eza
eza -la # List all with details
eza --tree --level=2 # Tree view
eza -la --git --icons # With git status and icons
atuin
Replaces shell history with a searchable SQLite database. Optional encrypted sync across machines.
brew install atuin
Add to ~/.zshrc: eval "$(atuin init zsh)"
# Ctrl+R # Full-screen history search
atuin search "git" # Search history
atuin stats # Show history stats
tldr
Community-maintained examples for common commands. Shows practical usage instead of dense man pages.
brew install tldr
tldr tar # Get examples for tar
tldr git stash # Get examples for git stash
delta
Makes git diff output readable with syntax highlighting and side-by-side view.
brew install git-delta
Add to ~/.gitconfig:
[core]
pager = delta
[delta]
side-by-side = true
line-numbers = true
btop
System monitor with CPU, memory, disk, and network graphs. Better looking and more informative than htop.
brew install btop
btop # Launch monitor
jq
Command-line JSON processor. Filter, transform, and format JSON data.
brew install jq
cat data.json | jq . # Pretty-print JSON
cat data.json | jq '.name' # Extract a field
cat data.json | jq '.[].id' # Get all IDs from array
curl -s api.com/data | jq . # Format API response
Power User Tools
mole
All-in-one Mac cleaner that combines CleanMyMac, AppCleaner, and DaisyDisk functionality.
curl -fsSL https://raw.githubusercontent.com/tw93/mole/main/install.sh | bash
mo clean --dry-run # Preview cleanup
mo clean # Clean system junk
mo uninstall # Uninstall app completely
mo analyze # Analyze disk usage
mo purge # Clean node_modules, build folders
yazi
Blazing-fast file manager with image previews, vim keybindings, and async I/O.
brew install yazi
yazi # Launch file manager
Navigate with h/j/k/l, press ? for help.
zellij
Modern tmux alternative with built-in layouts, floating panes, and real-time shortcut hints.
brew install zellij
zellij # Start zellij
zellij -s project # Start named session
zellij attach project # Attach to session
Shortcuts are shown in the toolbar.
dust
Visual disk usage analyzer. Shows what’s eating your disk space in a tree view.
brew install dust
dust # Analyze current directory
dust ~/Library # Analyze specific directory
dust -n 20 # Show top 20 entries
sd
Simple find-and-replace. Easier syntax than sed.
brew install sd
sd 'old' 'new' file.txt # Replace in file
sd -p 'old' 'new' file.txt # Preview changes
sd 'func' 'fn' src/*.js # Replace across files
glow
Render markdown beautifully in the terminal.
brew install glow
glow README.md # View markdown file
glow # Browse markdown files
hyperfine
Benchmark CLI commands with statistical analysis.
brew install hyperfine
hyperfine 'fd' 'find .' # Compare two commands
hyperfine --warmup 3 'cmd' # Benchmark with warmup
Node.js Version Management
Different projects often require different Node.js versions. Rather than manually installing and switching between versions, Volta handles this automatically.
Volta is a JavaScript toolchain manager written in Rust. It installs Node.js, npm, and yarn, then seamlessly switches between versions based on your project. The Rust foundation makes it noticeably faster than alternatives like nvm.
Install Volta with a single command:
curl https://get.volta.sh | bash
After installation, restart your terminal or source your shell config. Then install Node:
volta install node
This grabs the latest LTS version and sets it as your default. For a specific version:
volta install node
Managing Dotfiles
Once you’ve configured all these tools, you’ll want to backup and sync your dotfiles across machines. The most popular tool for this is chezmoi.
chezmoi
Manage your dotfiles across multiple machines securely. Supports templates for machine-specific configs and encryption for secrets.
brew install chezmoi
chezmoi init # Initialize in ~/.local/share/chezmoi
chezmoi add ~/.zshrc # Add a dotfile to manage
chezmoi add ~/.config/ghostty # Add entire directory
chezmoi edit ~/.zshrc # Edit managed file
chezmoi diff # See pending changes
chezmoi apply # Apply changes to home directory
chezmoi cd # Go to source directory
Push to GitHub:
chezmoi cd
git add .
git commit -m "Add dotfiles"
git remote add origin git@github.com:username/dotfiles.git
git push -u origin main
On a new machine:
chezmoi init --apply https://github.com/username/dotfiles.git
Alternatives: yadm (Git wrapper, simpler), GNU Stow (symlink manager, minimal)
Shell Aliases
Add these to ~/.zshrc for common shortcuts:
# Better defaults
alias ls="eza --icons"
alias ll="eza -la --icons --git"
alias cat="bat"
alias grep="rg"
alias find="fd"
alias top="btop"
# Git shortcuts
alias g="git"
alias gs="git status"
alias gp="git push"
alias lg="lazygit"
# Navigation
alias ..="cd .."
alias ...="cd ../.."
Restart your shell or run source ~/.zshrc to apply changes.
Start the conversation