I spend most of my workday in a terminal. Over the years I've tried dozens of tools, themes, and configurations. Most of them were unnecessary complexity. What I've settled on is lean, fast, and focused on the things I actually do every day.

The Shell: zsh with oh-my-zsh

I switched from bash to zsh about three years ago and haven't looked back. macOS made this easier by defaulting to zsh, so the transition was smooth. I use oh-my-zsh for plugin management because it's the path of least resistance. I know some people prefer manual configuration or alternatives like zinit, but oh-my-zsh works reliably and I don't want to spend time optimizing my shell framework.

My oh-my-zsh plugins: git, z, docker, npm, and colored-man-pages. That's it. I used to have 15+ plugins enabled and my shell startup time was over two seconds. I trimmed it down to what I actually use and now it starts in under 200ms. If you have slow shell startup, check your plugin count first.

For the theme, I use a minimal custom prompt that shows the current directory, git branch, and whether there are uncommitted changes. No fancy powerline fonts, no weather, no battery indicator. Just the information I need to not accidentally commit to the wrong branch.

The Terminal Emulator

I've gone back and forth but I'm currently on iTerm2. It's fast enough, has good split pane support, and the search functionality is solid. I know Alacritty and Kitty are technically faster, but iTerm2's integration with macOS (native tabs, hotkey window) keeps me coming back.

My one non-negotiable feature is a hotkey dropdown terminal. I have iTerm2 bound to a system-wide hotkey. One keypress and my terminal drops down from the top of the screen. Another press and it hides. This is faster than switching windows and means my terminal is always one keypress away.

fzf: The Tool That Changed Everything

If I had to pick one terminal tool that's made the biggest difference in my productivity, it's fzf. It's a fuzzy finder that can be piped into almost anything.

Ctrl+R for fuzzy searching command history is the obvious use case and it's great. But the real power is combining it with other commands:

# Find and open a file
vim $(fzf)

# Find and checkout a git branch
git checkout $(git branch | fzf)

# Kill a process interactively
kill $(ps aux | fzf | awk '{print $2}')

I have aliases for all of these. The file finder with preview (fzf --preview 'cat {}') replaced my need for a graphical file browser entirely. I navigate my projects faster in the terminal than I ever did in Finder.

ripgrep Over grep

I replaced grep with ripgrep (rg) and the speed difference is absurd. Searching a large codebase that took grep 8 seconds takes ripgrep under a second. It respects .gitignore by default, so you're not getting results from node_modules. The output is cleaner, with file names, line numbers, and color highlighting.

My most common usage: rg "function_name" --type py to find where something is defined or used in Python files. Combined with fzf, it becomes a powerful code navigation tool: rg "pattern" | fzf gives me fuzzy search over search results.

Aliases That Save Real Time

These are the aliases I use multiple times every day:

# Git shortcuts
alias gs="git status"
alias gc="git commit"
alias gp="git push"
alias gl="git log --oneline -20"
alias gd="git diff"
alias gco="git checkout"

# Navigation
alias ..="cd .."
alias ...="cd ../.."
alias ll="ls -la"

# Docker
alias dc="docker compose"
alias dcu="docker compose up -d"
alias dcd="docker compose down"

# Quick edit
alias zshrc="vim ~/.zshrc"
alias reload="source ~/.zshrc"

Nothing revolutionary. But gs instead of git status probably saves me a few minutes every day, and those minutes compound over months.

Other Tools Worth Mentioning

bat as a replacement for cat. Syntax highlighting and line numbers by default. Makes reading code files in the terminal much more pleasant.

htop for process monitoring. Better than top in every way. I use it when something is eating CPU or memory and I need to find the culprit quickly.

jq for JSON processing. When you're working with APIs, being able to pipe curl output through jq for pretty-printing and filtering is invaluable. curl api.example.com/users | jq '.data[] | .name' is cleaner than any alternative.

tmux for session management on remote servers. I don't use it locally (iTerm2's tabs are fine), but on servers, being able to detach and reattach sessions is essential. Long-running processes survive SSH disconnections.

The Philosophy

My setup philosophy is simple: every tool earns its place by being used daily. If I install something and don't reach for it within a week, it gets removed. A lean setup that I know well is faster than a feature-rich setup that I'm constantly learning. The best tool is the one you've internalized so deeply that using it requires zero thought.