All posts

Starship vs Powerlevel10k vs Pure (2026)

·Terminal Candy ·6 min read

zshpromptstarshippowerlevel10kcomparison

Your prompt is the piece of terminal UI you look at most and configure least. Most people set one up in 2019, got a nice git branch indicator, and never touched it again.

Worth revisiting, for one specific reason: the most popular option on Mac is no longer actively developed, and if you are choosing today that changes the answer.

The state of play in 2026

Powerlevel10k is in maintenance mode. Its author has been direct about it — the project gets no new features, most issues will not be fixed, and support requests generally go unanswered. He has also been clear that it will not break: it is not the kind of software that needs active maintenance to keep working, and if it works for you today it will keep working.

Both halves of that are true and both matter. This is not an abandoned project rotting in place. It is a finished one. But if you are picking a prompt in 2026 and you expect to want anything that does not exist yet, you are picking a frozen target.

Starship is the active default. Rust, cross-shell, one TOML file, very large module library, shipping regularly.

Pure is the minimalist that never moved and never needed to. Two lines, async git, almost no config surface.

Those are the three worth comparing. Everything else is either a framework (oh-my-zsh is not a prompt, it is a plugin manager that ships prompts) or a niche.

Speed, which is the only reason anyone changed prompts

The reason p10k became dominant was not looks. It was that it was the first prompt that stayed instant with a big git repo, at a time when everything else added 200–400ms per keystroke-return in a monorepo.

That gap has narrowed but not closed.

Powerlevel10k is still the fastest, and its instant prompt feature — drawing the prompt before your shell finishes initializing — is still not properly matched. On a cold shell it looks instantaneous because it literally paints before the work is done.

Starship is fast, and fast enough that on a normal repo you will not perceive the difference. On very large repositories you can, and the fix is to know which module is doing it. git_status is almost always the culprit:

# ~/.config/starship.toml
[git_status]
disabled = false
ignore_submodules = true

[git_metrics]
disabled = true

If a repo is still slow, measure rather than guess:

starship timings

That prints per-module durations. In my experience one module accounts for nearly all of it, and it is almost never the one you suspected. git_metrics — the +/- line counts — is off by default for good reason; turning it on in a big repo is the single most expensive thing you can do.

Pure is fast because it does very little, and what it does do is async.

What each one is actually like to live with

Starship

The pitch is that it is one config file, works in zsh, bash, fish, nushell, and PowerShell, and has a module for essentially every language and cloud tool.

brew install starship
echo 'eval "$(starship init zsh)"' >> ~/.zshrc

Config lives at ~/.config/starship.toml. A sane starting point that is not the default kitchen sink:

add_newline = true
format = """$directory$git_branch$git_status$nodejs$python$rust$cmd_duration
$character"""

[directory]
truncation_length = 3
truncate_to_repo = true

[cmd_duration]
min_time = 2000
format = "took [$duration](bold yellow) "

[character]
success_symbol = "[❯](bold green)"
error_symbol = "[❯](bold red)"

The two settings there that earn their place: cmd_duration tells you how long anything over two seconds took, without you having to think to time it — which is genuinely useful when an agent runs a build. And an error-colored prompt character means you see a non-zero exit status without reading anything.

The honest downside is the module system's default enthusiasm. Out of the box Starship will show you your Node version, your Python venv, your AWS profile, your Kubernetes context, and your package version, all at once. That is a lot of pixels for information you needed twice this month. Write an explicit format string, as above, and the problem disappears.

Powerlevel10k

The configuration wizard is still the best onboarding of any prompt, full stop.

brew install powerlevel10k
echo 'source $(brew --prefix)/share/powerlevel10k/powerlevel10k.zsh-theme' >> ~/.zshrc
p10k configure

It asks a dozen questions with live previews and writes a heavily commented ~/.p10k.zsh. Nothing else comes close for getting to a good result in three minutes.

It is zsh-only, and the config file is a large annotated shell script rather than a small declarative one. If you like tuning by reading, that is a feature. If you want to diff your prompt config across machines, it is not.

Choose it if you want the fastest possible prompt, you are zsh-only, and you are comfortable with the maintenance situation above.

Pure

brew install pure

Then in .zshrc:

fpath+=($(brew --prefix)/share/zsh/site-functions)
autoload -U promptinit; promptinit
prompt pure

That is the whole setup. Two lines, path on one, prompt character on the next, git state async so it never blocks.

Pure is the right answer more often than people admit, and it is especially good if you spend a lot of time reading agent output. A busy prompt repeated forty times down a transcript is forty lines of noise between you and what actually happened.

The agent-specific consideration

This is the part that has actually changed since the last time you picked a prompt.

When an agent is doing the work, your prompt appears far more often in transcripts than in interactive use. It shows up in every screenshot you paste into an issue, every recording, and every scroll back through what the agent did.

Two consequences:

A two-line prompt is now expensive. With add_newline = true plus a full status line, every command costs three lines of vertical space. Over a long session that is a meaningful fraction of your scrollback.

Powerline separators need a Nerd Font, everywhere. The moment you paste output into a GitHub issue or someone views a recording without your font, the prompt turns to boxes. If you use those glyphs, install a Nerd Font properly and know that anything leaving your machine may not render them.

There is a strong case for a minimal prompt in agent-heavy work and putting the context somewhere that does not repeat — a status line at the edge of the window rather than inline on every command. That is a different mechanism entirely, and I went through it in the Claude Code status line guide.

The short version

Starship Powerlevel10k Pure
Speed Fast Fastest Fast
Shells Everything zsh only zsh only
Config One TOML file Annotated zsh script Almost none
Development Active Maintenance mode Stable, minimal
Best for Most people Speed on zsh Readable transcripts

Pick Starship unless you have a specific reason not to. Active, portable, one file you can put in a dotfiles repo.

Pick Powerlevel10k if instant prompt is the feature you care about and zsh-only is fine. It works, it will keep working, and the wizard is unbeaten.

Pick Pure if you read a lot of agent output and want your own prompt to get out of the way.

The one thing not worth doing is what most people are doing, which is running whatever oh-my-zsh set up years ago and assuming it is fine. Run starship timings or p10k configure once and you will either confirm you are set or find the 300ms you have been paying on every command since 2019.

For the rest of the Mac terminal stack — fonts, themes, agent alerts — start with the best terminal for Claude Code on Mac.

Terminal Candy is a native macOS terminal you can skin into anything, with agent alerts built in. Apple Silicon, no Electron, $10 once, 14 day trial. Try it.

Keep reading