Every time I set up a new Mac — or help a colleague set up theirs — I see the same pattern. Someone Googles “Oh My Zsh best setup,” follows a 2021 tutorial, installs 20 plugins they’ll never use, picks Powerlevel10k because every screenshot looks gorgeous, and ends up with a terminal that takes 3 seconds to start. Then they never touch the config again because “it works.”
I’ve maintained my own .zshrc across dozens of machines over the past decade. The version I run today has exactly 6 plugins and starts in under 200 milliseconds. It didn’t start that way — I went through the “install everything” phase too. What I learned is that your Oh My Zsh setup isn’t a collection of cool plugins. It’s a layered system, and understanding those layers is the difference between a terminal that works for you and one you merely tolerate.
Here’s the setup I actually use for Git-heavy development, and more importantly, why each piece is there.
- Why Most Oh My Zsh Guides Get It Wrong
- Installing Oh My Zsh on macOS (The Clean Way)
- The Git Plugin: What It Actually Does
- Choosing a Prompt Theme in 2026 (The Honest Take)
- The Lean .zshrc (Copy This)
- The Real Productivity Gain: Autosuggestions + Git Aliases
- Installing a Nerd Font (Don’t Skip This)
- What Would Make This Setup Fail
- Putting It All Together: A Fresh Setup in 5 Minutes
- FAQ
Why Most Oh My Zsh Guides Get It Wrong

There are hundreds of “top 20 plugins” articles for Oh My Zsh. They all share the same structure: a long list of plugins with screenshots, a recommendation for Powerlevel10k, and a .zshrc that takes a full page to scroll through.
The problem isn’t that these plugins are bad. They’re fine. The problem is that nobody talks about the cost. Every plugin you add to Oh My Zsh increases your shell startup time. Oh My Zsh loads plugins synchronously — one after another, blocking — so 20 plugins means 20 sequential loads before you see a prompt. On my M-series Mac, the difference between 6 plugins and 20 plugins is roughly 1.5 seconds of startup. That adds up fast when you’re opening new terminal tabs all day.
The other thing these guides miss: your terminal is a five-layer system, and a problem in one layer often gets blamed on another:
- Shell — zsh itself (macOS ships an older version)
- Framework — Oh My Zsh (manages plugins and config)
- Prompt — Your theme or prompt engine (what you see before the cursor)
- Font — Nerd Fonts or Powerline fonts (renders icons and glyphs)
- Terminal emulator — Terminal.app, iTerm2, Warp, etc. (the actual window)
When your prompt shows broken symbols, it’s almost always a font issue (layer 4), not a theme issue (layer 3). When startup is slow, it’s usually too many plugins (layer 2), not a shell problem (layer 1). Thinking in layers saves you hours of debugging.
Installing Oh My Zsh on macOS (The Clean Way)
If you’re on macOS Catalina or later, zsh is already your default shell. Verify:
echo $SHELL # Should output: /bin/zsh
Install Oh My Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
This creates ~/.oh-my-zsh/ and generates a default ~/.zshrc. Before customizing anything, install the three external plugins that aren’t bundled but are genuinely essential:
# 1. Autosuggestions — fish-shell-style history suggestions
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# 2. Syntax highlighting — colors valid/invalid commands as you type
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
# 3. You-should-use — reminds you of aliases you've forgotten
git clone https://github.com/MichaelAquilina/zsh-you-should-use \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/you-should-use
These three external plugins combined are worth more than 15 built-in plugins you’ll never remember to use.
The Git Plugin: What It Actually Does
The git plugin ships with Oh My Zsh and is enabled by default. Most people know it adds aliases, but the full picture is broader.
Completions are the real killer feature. With the git plugin active, you can tab-complete:
- Branch names:
git checkout <TAB>shows all local branches - Remote names:
git push <TAB>lists remotes - Subcommands:
git <TAB>shows all available git commands - File paths in git context:
git add <TAB>shows modified files
Aliases save keystrokes for the commands you run constantly. Here are the ones I actually use daily:
| Alias | Full Command | When I Use It |
|---|---|---|
gst | git status | Dozens of times per day |
gaa | git add --all | Before every commit |
gcmsg | git commit -m | Every commit |
gp | git push | After commits |
gl | git pull | Starting work |
gco | git checkout | Switching branches |
gcb | git checkout -b | Creating feature branches |
glog | git log --oneline --decorate --graph | Reviewing history |
gd | git diff | Before staging |
gsta | git stash push | Quick context switches |
gstp | git stash pop | Restoring stashed work |
⚠️ Watch out: Don’t try to memorize all 100+ aliases at once. Start with gst, gaa, gcmsg, and gp. Add more as you feel the friction of typing full commands. The you-should-use plugin helps here — it’ll gently remind you when you type a full command that has an alias.
Pro tip: To see all available git aliases:
alias | grep git
Choosing a Prompt Theme in 2026 (The Honest Take)

Here’s where I’ll be straight with you: if you’re setting up a new machine in 2026, don’t install Powerlevel10k.
Powerlevel10k was fantastic. For years it was the fastest, most configurable zsh prompt out there. But in mid-2024, its creator romkatv put the project on “life support.” His own words: no new features, no bug fixes except in exceptional circumstances, no responses to help requests. As recently as February 2026, people are still opening issues asking for alternatives — and the issues go unanswered.
Does Powerlevel10k still work? Yes. Will it keep working for a while? Probably — the maintainer himself still uses it. But recommending unmaintained software for a fresh setup feels wrong to me. Software that stops getting updates eventually breaks — maybe not today, but when macOS ships a new zsh version or a terminal emulator changes its rendering.
Here’s what I’d recommend instead:
Path A: Starship (My Recommendation)
Starship is a cross-shell prompt written in Rust. It’s fast (around 20ms render time), actively maintained, and configured through a single TOML file. It works with zsh, bash, fish, and others — so your prompt config travels with you.
# Install via Homebrew brew install starship # Add to the end of ~/.zshrc eval "$(starship init zsh)"
Create a config file:
mkdir -p ~/.config && touch ~/.config/starship.toml
Here’s my Starship config optimized for Git-heavy work:
# ~/.config/starship.toml
format = """
$directory\
$git_branch\
$git_status\
$nodejs\
$python\
$swift\
$cmd_duration\
$line_break\
$character"""
[directory]
truncation_length = 3
truncate_to_repo = true
style = "bold cyan"
[git_branch]
format = "[$symbol$branch(:$remote_branch)]($style) "
symbol = " "
style = "bold purple"
[git_status]
format = '([\[$all_status$ahead_behind\]]($style) )'
style = "bold red"
conflicted = "="
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "?${count}"
stashed = "*${count}"
modified = "!${count}"
staged = "+${count}"
[cmd_duration]
min_time = 3_000
format = "[$duration]($style) "
style = "bold yellow"
[character]
success_symbol = "[❯](bold green)"
error_symbol = "[❯](bold red)"
Path B: Oh My Zsh Built-in Theme (Simple and Reliable)
If you don’t want another dependency, Oh My Zsh’s built-in themes work fine. The default robbyrussell is minimalist but shows git branch and dirty status. For something richer, agnoster is solid (requires a Powerline font).
# In ~/.zshrc ZSH_THEME="agnoster"
Path C: Powerlevel10k (Only If You’re Already On It)
If p10k is already working for you, there’s no urgent reason to migrate. Just know you’re on frozen software. If something breaks after a macOS update, you’ll be on your own.
The Lean .zshrc (Copy This)

Here’s my actual plugin configuration. Six plugins, nothing more:
# ~/.zshrc export ZSH="$HOME/.oh-my-zsh" # Leave empty if using Starship ZSH_THEME="" # Plugins — ORDER MATTERS for syntax-highlighting (must be last) plugins=( git macos sudo zsh-autosuggestions you-should-use zsh-syntax-highlighting ) source $ZSH/oh-my-zsh.sh # Starship prompt eval "$(starship init zsh)" # ---- Custom Git shortcuts ---- alias gs='git status -sb' alias gca='git commit --amend --no-edit' alias gwip='git add -A && git commit -m "WIP"' alias gunwip='git log -1 --format="%s" | grep -q "WIP" && git reset HEAD~1' alias gclean='git branch --merged | grep -v "\*\|main\|master\|develop" | xargs -n 1 git branch -d'
What each plugin does and why it earned its spot:
| Plugin | Type | Why It’s Here |
|---|---|---|
git | Built-in | Completions + 100+ aliases for daily git work |
macos | Built-in | ofd opens Finder in current dir, cdf changes to Finder’s dir |
sudo | Built-in | Press Escape twice to prepend sudo to the previous command |
zsh-autosuggestions | External | Fish-style history suggestions — accept with → arrow key |
you-should-use | External | Reminds you of aliases when you type the full command |
zsh-syntax-highlighting | External | Green = valid command, red = typo. Must be loaded last |
⚠️ Watch out: zsh-syntax-highlighting should be the last plugin in the list. If other plugins load after it, highlighting can break.
The Real Productivity Gain: Autosuggestions + Git Aliases
Here’s what most people miss about this setup. The git plugin gives you aliases like gst for git status. The you-should-use plugin reminds you those aliases exist. But zsh-autosuggestions is the one that actually changes how you work.
As you type, autosuggestions checks your shell history and shows a faded suggestion of the most likely completion. Press the right arrow key to accept it. In practice:
- Type
gc→ seegcmsg "fix: resolve login timeout"(your last commit) → press → to accept, or keep typing - Type
git push→ seegit push origin feature/auth-flow→ accept immediately - Type
ssh→ see your full SSH command to a server → one keystroke
This compounds fast. After a week, you’re typing maybe 30% of the characters you used to. Your most common git workflows become 2-3 keystrokes instead of 20-30.
A typical commit-and-push cycle goes from:
# Before git status git add --all git commit -m "feat: add user preferences screen" git push origin feature/user-preferences
To:
# After — with plugins + autosuggestions gst # status gaa # add all gcmsg "feat: add user preferences screen" # autocompleted from history gp # push — branch autocompleted
Installing a Nerd Font (Don’t Skip This)
If you’re using Starship or any theme with icons, you need a Nerd Font. Without one, you’ll see broken rectangles instead of git symbols and language logos.
brew install --cask font-meslo-lg-nerd-font
Then set the font in your terminal emulator:
- Terminal.app: Settings → Profiles → Font → “MesloLGS Nerd Font”
- iTerm2: Preferences → Profiles → Text → Font → “MesloLGS Nerd Font”
- VS Code terminal:
{
"terminal.integrated.fontFamily": "MesloLGS Nerd Font"
}
Pro tip: MesloLGS Nerd Font has the widest glyph coverage and is the safest default. JetBrains Mono Nerd Font and FiraCode Nerd Font are solid alternatives if you prefer their letterforms.
What Would Make This Setup Fail
I think it’s worth being honest about failure modes:
Plugin creep. You’ll find a cool plugin in a blog post, add it “temporarily,” and forget. Set a reminder every few months to audit your .zshrc. If you haven’t consciously used a plugin in the last month, remove it.
Not reloading after changes. After editing ~/.zshrc, either open a new terminal tab or run source ~/.zshrc. I’ve watched developers edit their config, not reload, and conclude “it doesn’t work.”
Font set in the wrong place. Fonts are configured in the terminal emulator, not in zsh. If your prompt shows broken symbols, check your terminal’s font settings first — not your .zshrc.
Starship config errors. TOML is strict about syntax. If Starship shows an error after editing starship.toml, run starship config to validate, or starship timings to see which module is causing issues.
Putting It All Together: A Fresh Setup in 5 Minutes
Here’s the complete sequence for a clean macOS install:
# Step 1: Install Homebrew (if needed)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Step 2: Install Oh My Zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# Step 3: Install external plugins
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/MichaelAquilina/zsh-you-should-use \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/you-should-use
# Step 4: Install Starship + Nerd Font
brew install starship
brew install --cask font-meslo-lg-nerd-font
# Step 5: Configure (backup first)
cp ~/.zshrc ~/.zshrc.backup
Then edit ~/.zshrc with the lean config from above, create your ~/.config/starship.toml with the Git-optimized config, and set MesloLGS Nerd Font in your terminal. Open a new tab. You’re done.
The whole thing takes under 5 minutes. More importantly, you understand every piece of what you installed — which means you can fix it when something changes.
FAQ
Is Oh My Zsh still worth using in 2026?
Absolutely. Despite lighter alternatives like Zinit and zgenom gaining traction, Oh My Zsh’s plugin ecosystem and community remain unmatched. I’ve tried the alternatives and keep coming back. The key is keeping your plugin count low — the framework overhead itself is minimal.
Should I switch from Powerlevel10k to Starship?
If p10k is working for you, there’s no rush. But for a new machine or a fresh start, I’d go with Starship. It’s actively maintained, works across shells, and uses a simple TOML config rather than a massive zsh script.
How do I check my shell startup time?
Run time zsh -i -c exit in your terminal. Under 200ms is great. Under 500ms is fine. Over 1 second means you should trim some plugins or investigate what’s slowing things down.
What’s the difference between zsh-syntax-highlighting and fast-syntax-highlighting?
fast-syntax-highlighting is a drop-in replacement with slightly better performance and switchable themes. Either works well. I stick with the original because it has a larger user base and more predictable behavior, but fast-syntax-highlighting is a valid choice if startup time is your top priority.



