Powerlevel10k is a theme for Zsh. It draws the command-line prompt you see every time you open a terminal, and it does so with three goals in mind: speed, flexibility, and a great out-of-the-box experience. It shows you contextual information — the current directory, Git status, the active Python or Node version, exit codes, background jobs, and dozens of other things — without ever making your prompt feel sluggish.
This guide walks you through installing Powerlevel10k, running its configuration wizard, customizing your prompt, and solving the problems people most commonly hit. Everything here is drawn directly from the project source, so the commands, parameters, and symbols described are exactly the ones the theme actually uses.
Note
Powerlevel10k changes only your prompt. It sets the
PS1andRPS1shell parameters and prompt-related options, and it installs a single command,p10k. It does not touch your aliases, key bindings,lscolors, tab completion, or the behavior ofgit.
Important
The upstream project is in maintenance mode: no new features are planned, most bugs will go unfixed, and help requests are generally not answered. Powerlevel10k remains fully functional and is committed to backward compatibility indefinitely — but don't expect new releases.
Table of Contents
- Quick Start
- Requirements
- Installation
- Fonts
- The Configuration Wizard
- The
p10kCommand - Everyday Usage
- Prompt Segments
- Reading Git Status
- Signature Features
- Common Customizations
- Writing Your Own Segment
- Updating and Uninstalling
- Troubleshooting
- FAQ
- How It Works
- Quick Reference
1. Quick Start
Four steps get you from nothing to a configured prompt.
- Install the recommended font (optional but highly recommended — see Fonts).
- Install Powerlevel10k itself (see Installation).
- Restart Zsh so the theme loads:
exec zsh - Run the configuration wizard if it doesn't start on its own:
p10k configure
The fastest possible manual install:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
exec zsh
[gitstatus] fetching gitstatusd .. [ok]
On the first run, the wizard asks you a few questions about your terminal and your
preferences, then writes a configuration file to ~/.p10k.zsh. That file is heavily
commented, so it doubles as your customization reference.
Tip
Install the recommended font before running
p10k configure. The wizard probes your terminal's font capabilities and hides prompt styles whose glyphs won't render — so a good font unlocks all the styles.
2. Requirements
| Requirement | Detail |
|---|---|
| Zsh | Version 5.3 or newer. Fast startup (instant prompt) requires Zsh ≥ 5.4. The configuration wizard's Pure + Snazzy color scheme needs Zsh ≥ 5.7.1. |
| A UTF-8 locale | Needed for Unicode prompt styles. Verify with locale -a. An ASCII fallback is available for every style except Pure. |
| A 256-color (or truecolor) terminal | All prompt styles except Lean → 8 colors need at least 256 colors. Verify with print $terminfo[colors]. |
| A patched font (optional) | Required only for the full range of icons and powerline symbols. See Fonts. |
| Git (optional) | Only needed if you want Git status in your prompt. Powerlevel10k ships a fast Git backend (gitstatusd) that it manages for you. |
Note
Powerlevel10k does not require custom fonts and works with default system fonts, but the full choice of style options is only available when using a Nerd Font.
3. Installation
Powerlevel10k works with a plain manual install or with every popular Zsh framework and plugin manager. If you are uncertain, choose the manual method — it works even alongside a plugin manager, as long as you disable any other active theme.
Manual
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
Tip
Users in China can clone from the official gitee.com mirror for faster downloads:
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/powerlevel10k.
Oh My Zsh
- Clone into the custom themes directory:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" - Open
~/.zshrc, find the line that setsZSH_THEME, and change it to:ZSH_THEME="powerlevel10k/powerlevel10k"
Other frameworks and plugin managers
Prezto
Add to ~/.zpreztorc:
zstyle :prezto:module:prompt theme powerlevel10k
Zim
Add zmodule romkatv/powerlevel10k --use degit to ~/.zimrc, then run zimfw install.
Antidote
Add romkatv/powerlevel10k to ~/.zsh_plugins.txt.
Antigen
Add to ~/.zshrc (ensure antigen apply runs after it):
antigen theme romkatv/powerlevel10k
Zinit
Add to ~/.zshrc:
zinit ice depth=1; zinit light romkatv/powerlevel10k
The full matrix of supported managers and the exact line to add:
| Manager | Line to add |
|---|---|
| Antibody | antibody bundle romkatv/powerlevel10k |
| Zplug | zplug romkatv/powerlevel10k, as:theme, depth:1 |
| Zgen | zgen load romkatv/powerlevel10k powerlevel10k |
| Zplugin | zplugin ice depth=1; zplugin light romkatv/powerlevel10k |
| Zi | zi ice depth=1; zi light romkatv/powerlevel10k |
| Zap | plug "romkatv/powerlevel10k" |
Note
For Zinit, Zplugin, and Zi the
depth=1ice is optional. Other ice types are neither recommended nor officially supported.
System packages
Homebrew (macOS/Linux)
brew install powerlevel10k
echo "source $(brew --prefix)/share/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc
Arch Linux
yay -S --noconfirm zsh-theme-powerlevel10k-git
echo 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
Alpine Linux
apk add zsh zsh-theme-powerlevel10k
mkdir -p ~/.local/share/zsh/plugins
ln -s /usr/share/zsh/plugins/powerlevel10k ~/.local/share/zsh/plugins/
After installing by any method, restart Zsh with exec zsh and run p10k configure if
the wizard doesn't start automatically.
Warning
If you install via a plugin manager, make sure no other theme is active. A second theme will fight with Powerlevel10k for control of the prompt. See Troubleshooting → plugin manager.
Installing on a machine without Internet access
Powerlevel10k downloads a small compiled Git backend (gitstatusd) on first use. On an
air-gapped machine you must pre-stage that binary.
- On the offline machine, find its platform:
uname -sm | tr '[A-Z]' '[a-z]'linux x86_64 - On an Internet-connected machine, fetch the matching binary into the clone:
target_uname="linux x86_64" # replace with output from step 1 git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k GITSTATUS_CACHE_DIR="$HOME"/powerlevel10k/gitstatus/usrbin ~/powerlevel10k/gitstatus/install -f -s "${target_uname% *}" -m "${target_uname#* }" - Copy
~/powerlevel10kto the offline machine. - Add the source line to
~/.zshrcon the offline machine:echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc - If
~/.zshrcsetsZSH_THEME, remove that line:sed -i.bak '/^ZSH_THEME=/d' ~/.zshrc
4. Fonts
Powerlevel10k looks best with a font that contains all the icons and powerline symbols it can draw. The project ships and recommends one:
👇 MesloLGS NF — Meslo Nerd Font, patched for Powerlevel10k. Contains every glyph the theme may need and is battle-tested across terminals and operating systems. 👇
Automatic installation
If you use iTerm2 or Termux, the wizard can install the font for you — just
answer Yes when p10k configure asks whether to install Meslo Nerd Font.
Manual installation
- Download these four files:
- Install each file (double-click → Install, or use your OS font manager).
- Set your terminal to use the
MesloLGS NFfont family. - Run
p10k configureto generate a fresh config that matches the new font.
A few common terminals (the project documents many more):
| Terminal | Where to set the font |
|---|---|
| iTerm2 | Preferences → Profiles → Text → Font → MesloLGS NF (or let p10k configure do it) |
| Apple Terminal | Preferences → Profiles → Text → Change → MesloLGS NF |
| GNOME Terminal | Preferences → (profile) → Text Appearance → Custom font → MesloLGS NF Regular |
| Konsole | Settings → Edit Current Profile → Appearance → Select Font → MesloLGS NF Regular |
| Windows Terminal | Settings → (profile/Defaults) → Appearance → Font face → MesloLGS NF |
| VS Code | Set terminal.integrated.fontFamily to MesloLGS NF |
Config-file terminals:
Alacritty (alacritty.toml)
[font.normal]
family = "MesloLGS NF"
kitty (kitty.conf)
font_family MesloLGS NF
WezTerm (wezterm.lua)
local wezterm = require 'wezterm';
return {
font = wezterm.font("MesloLGS NF"),
}
foot (foot.ini)
font=MesloLGS NF:size=12
Caution
Software installed via Snap cannot use system fonts. If you installed VS Code via Snap, remove it (
sudo snap remove code) and install the official.debbuild to useMesloLGS NF.
5. The Configuration Wizard
The wizard is the primary way to configure your prompt. Run it any time:
p10k configure
It asks a short series of questions — does this glyph render? do you prefer icons on the
left or right? one line or two? — and from your answers it writes ~/.p10k.zsh. You can
re-run it as often as you like to try a different look; it overwrites the config file
each time.
Prompt styles
All styles except Pure are functionally equivalent: they show the same information and differ only in presentation.
| Style | Character |
|---|---|
| Lean | Lightweight, no segment backgrounds. Saves two characters per segment versus Classic/Rainbow. Always includes the prompt_char symbol. Recommended starting point. |
| Classic | Segments on a subtle background with powerline separators. |
| Rainbow | Segments on vivid colored backgrounds. Confines colors to the terminal palette when you want theme-matched colors. |
| Pure | Exact replication of the Pure theme, for migrating Pure users. |
Tip
If you use Vi keymap, pick a style that includes
prompt_char(shown as a green❯in the wizard). It changes shape with the mode —❯insert,❮command,Vvisual,▶replace — and turns red when a command fails. Lean always has it; Rainbow and Classic have it only in the two-line, no-left-frame layout.
Wizard-driven options
The wizard also lets you choose, among other things:
- Charset — Unicode (pretty) or ASCII (renders everywhere). Available for all styles except Pure.
- Prompt height — one line or two. Two-line pairs beautifully with transient prompt.
- Prompt spacing — compact or sparse (empty line before each prompt).
- Icon density — few icons (informative only) or many icons (decorative too).
- Instant prompt mode — see Signature Features.
- Transient prompt — see Signature Features.
Note
The wizard hides any style whose glyphs your terminal can't render. If styles are missing, that's usually a font, locale, or color-depth issue — see Troubleshooting → missing styles.
6. The p10k Command
Installing the theme adds exactly one command to your shell: p10k. Run it with no
arguments (or p10k help) to see usage.
p10k help
Usage: p10k command [options]
Commands:
configure run interactive configuration wizard
reload reload configuration
segment print a user-defined prompt segment
display show, hide or toggle prompt parts
help print this help message
| Command | What it does |
|---|---|
p10k configure |
Launch the interactive configuration wizard. |
p10k reload |
Re-read configuration after you change POWERLEVEL9K_* parameters in a live shell. |
p10k segment ... |
Emit a user-defined prompt segment. Valid only while the prompt is rendering. |
p10k display ... |
Show, hide, or toggle prompt parts (lines, sides, frames, individual segments). |
p10k help [command] |
Print general help, or help for a specific command. |
p10k finalize |
Run the final initialization stage. Must be the very last line of ~/.zshrc (used by the instant prompt flow). |
Tip
Get detailed help for any subcommand, including worked examples, with
p10k help segmentorp10k help display.
p10k display — show, hide, or toggle prompt parts
p10k display takes one or more part-pattern=state-list arguments. The pattern selects
prompt parts; the state list rotates through states on each call.
Selectable parts include:
| Pattern | Selects |
|---|---|
empty_line |
the empty line between prompts |
ruler |
the ruler line |
N |
prompt line number N (1-based from the top, negative counts from the bottom) |
N/left, N/right |
the left / right prompt on line N |
N/left_frame, N/right_frame |
the frame on line N |
N/gap |
the gap between left and right prompts on line N |
N/left/S, N/right/S |
segment S (e.g. dir, time) on line N |
*/kubecontext |
every kubecontext segment, wherever it is |
States are show, hide, and print. A comma-separated state list rotates: the first
call applies the first state, the next call the second, and so on.
Example — bind Ctrl+P to toggle the right prompt:
function toggle-right-prompt() { p10k display '*/right'=hide,show; }
zle -N toggle-right-prompt
bindkey '^P' toggle-right-prompt
7. Everyday Usage
Editing your prompt
Almost all customization happens in ~/.p10k.zsh. It's a Zsh script full of
POWERLEVEL9K_* parameters with extensive inline comments. The two most important
parameters live near the top:
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir vcs prompt_char)
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time time)
These arrays decide which segments appear and in what order. Add a segment by listing its name; remove one by deleting it from the array.
Applying your changes
After editing ~/.p10k.zsh, apply it to the current shell:
source ~/.p10k.zsh
If instead you changed POWERLEVEL9K_* parameters directly in an interactive shell
(not in the file), run:
p10k reload
Warning
Do not run
source ~/.zshrcto apply changes. It can cause random errors and progressive Zsh slowdown. To fully reload your shell, typeexitand open a new one, or useexec zsh. See Troubleshooting.
Note
By default, edits made by setting
POWERLEVEL9K_*directly in a running shell need ap10k reloadto take effect. SettingPOWERLEVEL9K_DISABLE_HOT_RELOAD=falseremoves that need at the cost of a marginally slower prompt.
8. Prompt Segments
A segment is one unit of information in the prompt — the directory, Git status, the
clock, and so on. Powerlevel10k ships dozens. Enable a segment by adding its name to
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. Enabling
extra segments does not slow down your prompt or Zsh startup.
Core segments
| Segment | Shows |
|---|---|
dir |
current working directory (smartly truncated — see Signature Features) |
vcs |
Git repository status (see Reading Git Status) |
prompt_char |
the prompt symbol; changes with Vi mode and turns red on error |
status |
exit code of the last command |
command_execution_time |
wall-clock duration of the last command |
time |
current time |
context |
user@hostname |
background_jobs |
presence of background jobs |
os_icon |
your OS logo |
vi_mode |
current Vi editing mode (unnecessary if you use prompt_char) |
Language and version-manager segments
| Segment(s) | Source |
|---|---|
node_version, nvm, nodenv, nodeenv |
Node.js version / environment managers |
pyenv, virtualenv, anaconda |
Python version / virtual environments |
go_version, goenv |
Go |
rust_version |
Rust (rustc) |
rbenv, rvm |
Ruby environment managers |
php_version, phpenv |
PHP |
java_version, jenv |
Java |
dotnet_version |
.NET |
laravel_version, package |
Laravel / package.json name@version |
perlbrew, plenv |
Perl |
luaenv, scalaenv, haskell_stack |
Lua / Scala / Haskell |
asdf, fvm |
asdf multi-tool / Flutter (fvm) |
Cloud, infra, and tooling segments
| Segment(s) | Source |
|---|---|
aws, aws_eb_env, azure, gcloud, google_app_cred |
Cloud provider profiles / credentials |
kubecontext |
current Kubernetes context |
terraform, terraform_version |
Terraform workspace / version |
nordvpn, vpn_ip, public_ip, ip, proxy, wifi |
Network state |
direnv, nix_shell, toolbox, chezmoi_shell |
Environment / shell context |
taskwarrior, timewarrior, todo |
Task and time tracking |
disk_usage, load, ram, swap, battery, cpu_arch |
System resources |
midnight_commander, nnn, lf, ranger, yazi, xplr, vim_shell |
File-manager / editor sub-shells |
per_directory_history |
per-directory history local/global indicator |
Tip
This is the full set of built-in segment categories, but not every segment is enabled by default. Open
~/.p10k.zsh, search for the segment you want, and uncomment it (or add its name to a prompt-elements array).
9. Reading Git Status
When you're inside a Git repository and using the Lean, Classic, or Rainbow style, the
vcs segment can look like this:
feature:master wip ⇣42⇡42 ⇠42⇢42 *42 merge ~42 +42 !42 ?42
Each piece has a precise meaning, computed by the bundled Git backend:
| Symbol | Meaning |
|---|---|
feature |
current branch; replaced with #tag or @commit if not on a branch |
master |
remote tracking branch; shown only if different from the local branch |
wip |
the latest commit's summary contains "wip" or "WIP" |
= |
up to date with the remote (neither ahead nor behind) |
⇣42 |
42 commits behind the remote |
⇡42 |
42 commits ahead of the remote |
⇠42 |
42 commits behind the push remote |
⇢42 |
42 commits ahead of the push remote |
*42 |
42 stashes |
merge |
repository state (e.g. a merge or rebase in progress) |
~42 |
42 merge conflicts |
+42 |
42 staged changes |
!42 |
42 unstaged changes |
?42 |
42 untracked files |
─ |
the count of staged/unstaged/untracked files is unknown (large repo — see below) |
Note
The
?for untracked files is a normal question mark, not a missing glyph. If you'd rather not see untracked files, search foruntracked filesin~/.p10k.zsh.
To change the format of Git status, open ~/.p10k.zsh, search for my_git_formatter,
and edit that function's source — it builds the string you see above.
Tip
If Git status appears grey and then gets colored a moment later, that's expected. Grey means Powerlevel10k is computing fresh status in the background; the prompt refreshes automatically (in color) when it finishes. The grace period before going async is
POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS.
Note
By default Powerlevel10k's
vcssegment ignores the Git repository at$HOME/.git(controlled byPOWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~'). Remove that parameter to show status for your home-directory repo.
10. Signature Features
Uncompromising performance
When you press ENTER, the next prompt appears instantly — no lag, regardless of how many segments you enable or how large the Git repository is. Other prompts capable of showing the same information either lag or show stale data and refresh later; Powerlevel10k gives you a fast prompt and up-to-date information.
Instant prompt
If your ~/.zshrc loads slow plugins (such as nvm or pyenv), Zsh can take a while to
start. Instant prompt prints your prompt immediately on startup so you can begin
typing while plugins finish loading in the background — it can remove startup lag even
when the theme isn't what's causing it.
Enable it through p10k configure, or manually by adding this block near the top of
~/.zshrc:
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
Important
Copy the lines verbatim. While instant prompt is active, standard input is redirected to
/dev/nulland output is buffered to a temporary file. Any startup code that needs to read from the console (a keyring password, a[y/n]prompt) must be placed above the instant-prompt block, or it will break.
Tune the warning behavior with POWERLEVEL9K_INSTANT_PROMPT:
| Value | Behavior |
|---|---|
verbose (default) |
warn when console output is detected during init |
quiet |
allow console output, suppress the warning |
off |
disable instant prompt entirely |
Note
Instant prompt requires Zsh ≥ 5.4. It's safe to enable on older Zsh — it simply does nothing.
Transient prompt
When enabled (via p10k configure), transient prompt trims every past prompt down to a
minimal form once you accept a command line. This makes it much easier to copy a series
of commands out of your scrollback.
Tip
Transient prompt pairs especially well with a two-line prompt: you get the extra typing space of two lines without the usual scrollback-density penalty.
Show on command
Some segments are only relevant to certain commands. Show on command makes a segment
appear only while you're typing a command that uses it. For example, show the Kubernetes
context only when typing kubectl, helm, or kubens:
typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens'
To make such a segment always visible, remove its SHOW_ON_COMMAND parameter. To make
it always hidden until needed, keep it. You can also script a toggle (see the
kube-toggle recipe in Common Customizations).
Current directory that just works
The dir segment highlights the important parts of your path and, when space is tight,
truncates the least useful parts first — shortening each leading segment to its shortest
unique prefix. Important segments (the first, the last, Git repository roots) are kept
bright and never truncated.
Tip
Copy a truncated directory from your prompt and press TAB — it completes back to the full original path.
Powerlevel9k and Pure compatibility
Powerlevel10k understands every POWERLEVEL9K_* parameter from
Powerlevel9k, so migrating is as simple
as pointing your config at the new theme — your prompt looks the same but runs much
faster. It can also exactly replicate the Pure
theme (choose Pure in the wizard) while still letting you use Powerlevel10k features
like instant and transient prompt.
11. Common Customizations
Add username and hostname to the prompt
By default context (user@hostname) appears only when you're root or on SSH. To always
show it, open ~/.p10k.zsh, find the context section, and remove this line:
# Don't show context unless running with privileges or in SSH.
# Tip: Remove the next line to always show context.
typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION=
You can also move context between POWERLEVEL9K_LEFT_PROMPT_ELEMENTS and
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS.
Change a segment's color
Colors are numbers from 0–255 (colors 0–15 vary by terminal palette; 16–255 are fixed).
Truecolor terminals also accept #RRGGBB.
typeset -g POWERLEVEL9K_TIME_FOREGROUND=160 # bright red, numbered color
typeset -g POWERLEVEL9K_TIME_FOREGROUND='#FF0000' # bright red, truecolor
Apply with source ~/.p10k.zsh. To preview all 256 numbered colors in your terminal:
for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done
Tip
To make low-numbered colors track your terminal's color scheme, use Rainbow, Lean → 8 colors, or Pure → Original. Other styles use fixed high-numbered colors and look the same in every palette.
Toggle a segment with a keypress
This kube-toggle function flips the kubecontext segment between always shown and
show on command, then refreshes the prompt:
function kube-toggle() {
if (( ${+POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND} )); then
unset POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND
else
POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens'
fi
p10k reload
if zle; then
zle push-input
zle accept-line
fi
}
zle -N kube-toggle
bindkey '^]' kube-toggle # ctrl-] to toggle kubecontext
Make it look like the robbyrussell Oh My Zsh theme
Use the bundled config: download
config/p10k-robbyrussell.zsh,
save it as ~/.p10k.zsh, and source ~/.p10k.zsh from ~/.zshrc.
12. Writing Your Own Segment
If no built-in segment does what you need, you can define one with the same speed and
flexibility as the built-ins. A custom segment is a Zsh function named
prompt_<name> that calls p10k segment to emit its content.
Example — a core segment that reports whether a file named core exists in the
current directory, with its size and a deletability state:
zmodload -F zsh/stat b:zstat
function prompt_core() {
local size=()
if ! zstat -A size +size core 2>/dev/null; then
# No 'core' file in the current directory.
return
fi
if [[ -w . ]]; then
local state=DELETABLE
else
local state=PROTECTED
fi
p10k segment -s $state -i '⭐' -f blue -t ${size[1]}b
}
Enable it by adding core to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. Then style it like any built-in segment:
POWERLEVEL9K_CORE_FOREGROUND=red # default foreground
POWERLEVEL9K_CORE_DELETABLE_BACKGROUND=green # background when DELETABLE
POWERLEVEL9K_CORE_PROTECTED_VISUAL_IDENTIFIER_EXPANSION='❎' # icon when PROTECTED
POWERLEVEL9K_CORE_PROTECTED_CONTENT_EXPANSION='' # hide size when PROTECTED
p10k segment accepts these options:
| Option | Meaning |
|---|---|
-t text |
the segment's main content (undergoes prompt expansion) |
-i icon |
the segment's icon |
-r / +r |
icon is a symbolic reference to resolve (e.g. LOCK_ICON) / icon is literal (default) |
-b bg |
background color (blue, 4, or #0000ff; empty = transparent) |
-f fg |
foreground color (empty = default foreground) |
-s state |
a state name used to select styling overrides |
-c cond |
condition; if it expands to empty, the segment is hidden (advanced) |
-e / +e |
content should / should not undergo parameter expansion and process substitution (advanced) |
-h |
print help |
Tip
Prefix your own segment names with
my_(e.g.my_weather) to avoid clashing with future built-in segments.
Note
p10k segmentcan only be called while the prompt is rendering — i.e. from inside aprompt_<name>function. Calling it elsewhere is an error.
Lifecycle hooks
You can also define optional functions that Powerlevel10k calls at specific points:
p10k-on-init, p10k-on-pre-prompt, p10k-on-post-prompt, and p10k-on-post-widget.
These let advanced configs run code as the prompt initializes and around each render.
13. Updating and Uninstalling
Updating
The update command depends on how you installed. Always restart Zsh after updating
(exec zsh) — do not source ~/.zshrc.
| Installation | Update command |
|---|---|
| Manual | git -C ~/powerlevel10k pull |
| Oh My Zsh | git -C "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" pull |
| Prezto | zprezto-update |
| Zim | zimfw update |
| Antigen | antigen update |
| Antidote | antidote update |
| Zinit | zinit update |
| Homebrew | brew update && brew upgrade |
| Arch Linux | yay -S --noconfirm zsh-theme-powerlevel10k-git |
| Alpine Linux | apk update && apk upgrade |
Uninstalling
- Remove the instant-prompt block (top of
~/.zshrc) and the config-sourcing line ([[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh, near the bottom). - Remove every reference to
powerlevel10kfrom~/.zshrc,~/.zpreztorc, and~/.zimrc. - Verify nothing remains:
grep -E 'p10k|powerlevel10k' ~/.zshrc ~/.zpreztorc ~/.zimrc 2>/dev/null - Delete your config file:
rm -f ~/.p10k.zsh - Delete the source files (manual install shown; use the uninstall command for your
manager otherwise):
rm -rf ~/powerlevel10k - Restart Zsh (
exec zsh). - Delete cache files:
rm -rf -- "${XDG_CACHE_HOME:-$HOME/.cache}"/p10k-*(N) "${XDG_CACHE_HOME:-$HOME/.cache}"/gitstatus
14. Troubleshooting
Error: [oh-my-zsh] theme 'powerlevel10k/powerlevel10k' not found
Cause: Oh My Zsh can't find the theme directory, or the theme is being loaded twice.
Solution: First check whether the theme actually loaded:
typeset -p P9K_VERSION
- If it prints a version (e.g.
typeset P9K_VERSION=1.19.14), the theme is already loaded by another mechanism — removeZSH_THEME="powerlevel10k/powerlevel10k"from~/.zshrc. - If it errors with
no such variable: P9K_VERSION, the directory is missing — clone it:git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
Then exec zsh.
Question mark in prompt
Cause: A plain ? means you have untracked files (?2 = 2 untracked). A weird
question mark means a missing font glyph.
Solution: For the plain ?, that's normal — run git status to see the files, or
search for untracked files in ~/.p10k.zsh to change the symbol. For a broken-looking
glyph, see the next entry.
Icons, glyphs, or powerline symbols don't render
Cause: Your terminal isn't using a font that contains the required glyphs.
Solution: Restart your terminal, install the recommended font, and run
p10k configure.
Error: character not in range
Cause: Your locale doesn't support UTF-8.
Solution: Test with echo '❯'. If it errors, fix your locale — set a UTF-8
locale for your OS. Over SSH, ensure your client forwards a UTF-8 locale.
Cursor is in the wrong place / prompt wraps weirdly
Cause: Usually a locale issue, a font issue, or a terminal that mis-measures glyph width.
Solution:
- Run
echo '❯'; if it errors, fix your locale (above). - If
❯prints but the cursor is misplaced, install the recommended font and runp10k configure. - If it still happens, add
unset ZLE_RPROMPT_INDENTto the bottom of~/.zshrc.
Prevention: Use a true monospace font and a UTF-8 locale. Konsole, Hyper, and the VS Code terminal can mis-render "wide" Unicode glyphs — use a different terminal or remove wide glyphs from your prompt.
Configuration wizard runs automatically every time Zsh starts
Cause: Your ~/.zshrc aborts (usually a syntax error) before reaching the line that
sources ~/.p10k.zsh, so Powerlevel10k sees no config and re-runs the wizard.
Solution: Start Zsh without the wizard to see the hidden errors, then fix ~/.zshrc:
POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true zsh
Some prompt styles are missing from the configuration wizard
Cause: Your terminal lacks a capability that those styles need.
Solution: Check each capability:
- Truecolor (for Pure + Snazzy): need Zsh ≥ 5.7.1 and
COLORTERM=24bit/truecolor. Verify:print -P '%F{#ff0000}red%f'. - 256 colors (for all but Lean 8-color): verify
print $terminfo[colors]. - UTF-8 locale (for Unicode styles): verify
locale -a. - MULTIBYTE option enabled: verify
print -r -- ${options[MULTIBYTE]}. - Font glyphs: restart terminal, install the recommended font, re-run the wizard.
Extra or missing spaces compared to Powerlevel9k
Cause: Powerlevel10k respects ZLE_RPROMPT_INDENT and uses consistent icon spacing,
both of which differ from Powerlevel9k.
Solution: For Powerlevel9k-identical spacing, add to ~/.zshrc:
ZLE_RPROMPT_INDENT=0 # removes trailing space on the right prompt
POWERLEVEL9K_LEGACY_ICON_SPACING=true # Powerlevel9k icon spacing
Caution
Don't set
POWERLEVEL9K_LEGACY_ICON_SPACINGwhen using a config generated byp10k configure. Some Zsh versions also have bugs triggered byZLE_RPROMPT_INDENT=0; remove it if you see visual artifacts.
Weird things happen after typing source ~/.zshrc
Cause: Re-sourcing ~/.zshrc is unsafe — it can produce random errors and
progressively slow down Zsh, whether or not you use Powerlevel10k.
Solution: Don't source ~/.zshrc. To apply changes, restart the shell: type exit
and open a new one, or run exec zsh. (This also explains transient prompt "stopping"
after a source ~/.zshrc.)
Horrific mess when resizing the terminal window
Cause: When a terminal reflows text on resize, the vertical distance between the prompt start and the cursor can change, and Zsh redraws the prompt in the wrong place. This affects all themes, not just Powerlevel10k.
Solution (mitigations):
- Use kitty ≥ 0.24.0 and set
POWERLEVEL9K_TERM_SHELL_INTEGRATION=true. - Disable text reflow on resize in your terminal settings (or use a terminal that doesn't reflow).
- Reduce long lines between prompt start and cursor:
POWERLEVEL9K_SHOW_RULER=false POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=()
Icons cut off in Konsole
Cause: Konsole cuts off glyphs wider than one column when using a non-monospace font.
Solution: Use a monospace font or a different terminal. As a targeted workaround, add a trailing space to the affected icon, e.g.:
typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT} ' # extra space
Incorrect Git status in prompt
Cause: The Git backend uses libgit2, which has
gaps — notably it does not support skipHash (which may be enabled implicitly by Git's
manyFiles feature).
Solution: Run git config -l and check for skipHash. If it's enabled, consider
disabling it. Also see the grey-then-colored note — a brief grey
status is normal, not a bug.
15. FAQ
Q: Which parts of my shell does Powerlevel10k change?
Only the prompt. It sets prompt-related Zsh options and the PS1/RPS1 parameters, and
adds the p10k command. It does not affect ls colors, git behavior, tab completion,
key bindings, aliases, the terminal title, or any other prompt parameters.
Q: Is it really fast? Yes — measurably. The project points to zsh-bench for benchmarks. No configuration makes Powerlevel10k slow; if you ever see prompt lag, that's considered a bug worth reporting.
Q: Is Powerlevel10k fast to load (not just to render)? Yes, and with instant prompt enabled it can make your shell feel instant even when other plugins are slow to load.
Q: What's the minimum Zsh version? Zsh 5.3 or newer works. Fast startup (instant prompt) needs ≥ 5.4; the wizard's Pure + Snazzy scheme needs ≥ 5.7.1.
Q: Why does Powerlevel10k spawn extra processes?
The vcs segment uses gitstatus as its backend,
which runs gitstatusd and a helper zsh. Powerlevel10k may also spawn a zsh to do
work off the prompt's critical path. These background processes aren't shared between
shells and terminate when the parent zsh exits.
Q: Why do some segments appear and disappear as I type?
That's the show on command feature — a segment configured to show
only when the command you're typing uses the relevant tool. Search for SHOW_ON_COMMAND
in ~/.p10k.zsh to change it.
Q: I'm using Powerlevel9k with Oh My Zsh — how do I migrate?
Clone Powerlevel10k into the custom themes dir, then point ZSH_THEME at it:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
sed -i.bak 's/powerlevel9k/powerlevel10k/g' ~/.zshrc
exec zsh
Your existing POWERLEVEL9K_* parameters keep working.
Q: Will my prompt look exactly the same as it did in Powerlevel9k?
Almost. Differences: only the git VCS backend is enabled by default (add svn/hg to
POWERLEVEL9K_VCS_BACKENDS if needed, but they're slow); POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY=true
isn't supported; and some Powerlevel9k bugs (inconsistent spacing, ignored options) were
fixed. See the spacing troubleshooting
for exact-match flags.
Q: What's the relationship between Powerlevel9k and Powerlevel10k? Powerlevel10k was forked from Powerlevel9k in March 2019 to iterate faster on performance and features. They're independent projects with no shared committers; virtually all Powerlevel10k code has since been rewritten. Use one or the other, not both.
Q: Can a completed command's prompt show that command's exit code? No. When you press ENTER, the command's exit status isn't known yet, and once it finishes the prompt for it can no longer be redrawn. So each command's error status shows up in the next prompt.
Q: What's the best prompt style in the wizard? It's personal preference, but: prefer Lean over Pure unless you're migrating from Pure; use Rainbow, Lean → 8 colors, or Pure → Original if you want colors to follow your terminal palette; enable transient prompt and use a two-line prompt for the best copy-paste experience.
Q: How do I export GPG_TTY when using instant prompt?
Anywhere in ~/.zshrc, use export GPG_TTY=$TTY — it's faster than $(tty) and works
with or without instant prompt.
Q: How do I initialize direnv with instant prompt?
Put the direnv export line above the instant-prompt block and the direnv hook line
below it:
(( ${+commands[direnv]} )) && emulate zsh -c "$(direnv export zsh)"
# ... instant prompt block ...
(( ${+commands[direnv]} )) && emulate zsh -c "$(direnv hook zsh)"
Q: Where do I get help or report bugs? Open an issue (best), or use Gitter. Note the project's limited-support status described at the top of this guide.
16. How It Works
You don't need this section to use Powerlevel10k, but it explains why the prompt is both fast and accurate. (Full architecture and internals are in the Admin Guide.)
Powerlevel10k has two cooperating layers:
- A Zsh frontend — the theme itself (
powerlevel10k.zsh-themeplus the engine ininternal/p10k.zsh). It defines your prompt, draws segments, and manages the configuration wizard. - A compiled Git backend —
gitstatusd, from the bundled gitstatus project. It computes Git status far faster thangit statusby talking to libgit2 directly, running as a background daemon that the theme queries.
The key to the "fast and up to date" behavior is that Git status is computed
asynchronously. After each command, Powerlevel10k asks gitstatusd for status. If
the answer comes back within a few milliseconds, it's shown immediately; if not, the
last known status is shown in grey and the prompt is refreshed in color the moment the
fresh status arrives. Large repositories never block your prompt.
The first time the vcs segment runs, Powerlevel10k downloads (or uses a vendored copy
of) the gitstatusd binary for your platform — which is the [gitstatus] fetching gitstatusd .. message you may see on first launch.
17. Quick Reference
Essential commands
| Command | Purpose |
|---|---|
p10k configure |
run the configuration wizard |
p10k reload |
reload config after live POWERLEVEL9K_* changes |
p10k display PART=STATE |
show/hide/toggle a prompt part |
p10k help [command] |
print help |
exec zsh |
restart Zsh (apply changes safely) |
source ~/.p10k.zsh |
apply config-file edits to the current shell |
Key files
| Path | Role |
|---|---|
~/.p10k.zsh |
your prompt configuration (created by the wizard) |
~/.zshrc |
sources the theme and your config; holds the instant-prompt block |
powerlevel10k.zsh-theme |
the theme entry point you source |
${XDG_CACHE_HOME:-$HOME/.cache}/p10k-* |
cache files (safe to delete) |
${XDG_CACHE_HOME:-$HOME/.cache}/gitstatus |
downloaded gitstatusd binary |
Key parameters
| Parameter | Effect |
|---|---|
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS |
segments shown on the left |
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS |
segments shown on the right |
POWERLEVEL9K_MODE |
icon set (nerdfont-v3, ascii, compatible, …) |
POWERLEVEL9K_INSTANT_PROMPT |
verbose / quiet / off |
POWERLEVEL9K_<SEGMENT>_SHOW_ON_COMMAND |
show a segment only for matching commands |
POWERLEVEL9K_<SEGMENT>_FOREGROUND / _BACKGROUND |
segment colors |
POWERLEVEL9K_DISABLE_HOT_RELOAD |
set false to apply live edits without p10k reload |
POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN |
suppress vcs in matching directories |
ZLE_RPROMPT_INDENT=0 |
flush the right prompt to the screen edge |
Git status symbols
⇣ behind remote · ⇡ ahead of remote · ⇠ behind push remote · ⇢ ahead of push
remote · * stashes · ~ conflicts · + staged · ! unstaged · ? untracked ·
#tag / @commit when not on a branch · ─ count unknown (large repo)