Sseekdeploy

Oh My Posh

A prompt theme engine for any shell, with 125 bundled themes and deep PowerShell support.

Open source · MITFree#shell#prompt#go#customization

What is Oh My Posh?

Oh My Posh is a prompt engine written in Go. Your shell's init script runs the oh-my-posh binary each time it needs a prompt; it reads a JSON, YAML or TOML config made of blocks and segments (path, git, language versions, cloud context and dozens more), runs what each segment's template needs, and prints the styled prompt. It supports bash, zsh, fish, PowerShell, Nushell and cmd (through Clink), and can draw the Claude Code status line.

Jan De Dobbeleer created it, first as a PowerShell module, and maintains it under the MIT licence, funded by GitHub Sponsors, a corporate sponsor and merchandise. There is no paid edition. It ships 125 themes and a built-in default prompt; the docs recommend a Nerd Font for the icons.

The current release is 32.1.0 (15 November 2026), the third major since July: 31.0.0 removed the fetch_* options, so a segment's template now decides what it runs. A beta streaming mode keeps one background process per shell. Its closest alternative is Starship.

Our review

4.0

The most theme-rich prompt engine, and the natural choice if PowerShell or Windows Terminal is home: pick a theme and it looks finished. Render time was close to Starship's in our runs (16 vs 18 ms in a small repo, 149 vs 128 ms in the Linux kernel). The cost is churn: three majors since July 2026 and a run of config regressions after upgrades.

Pros

  • + 125 bundled themes, a live browser editor and a drag-and-drop Configurator
  • + One config across bash, zsh, fish, PowerShell, Nushell and cmd, with transient prompt and streaming support in PowerShell
  • + Render time in line with Starship and faster than git's __git_ps1 in our runs

Cons

  • − Frequent breaking releases (30, 31 and 32 in four months) and regressions after upgrades
  • − The default prompt needs a Nerd Font, and the default mode starts a process per prompt; the fix, streaming, is beta and not in bash

Reviewed by SeekDeploy Editorial · updated 2026-11-15. Reviews are independent — we don’t accept payment for coverage or ratings.

Should you use Oh My Posh?

A good fit if you're…

  • PowerShell and Windows Terminal users: it began as a PowerShell module, and features such as the transient prompt and streaming mode are built for it
  • People who want a finished look without designing one: 125 bundled themes, a browser-based Studio editor and a drag-and-drop Configurator
  • Anyone who wants one prompt config across bash, zsh, fish, PowerShell and cmd

Probably not for you if you're…

  • Terminals where you can't install a Nerd Font; the default prompt and most themes rely on its glyphs
  • People who want to set it and forget it: majors 30, 31 and 32 shipped between July and November 2026, and upgrades have broken working configs

Pick something else if…

  • you live in bash, zsh or fish and want one TOML file with good defaults; it was a little faster than Oh My Posh in the Linux kernel in our run (128 vs 149 ms) and about level in a small repo (18 vs 16 ms) → Starship
  • you only want the branch and dirty state, with no extra binary: git's own prompt script ships with git, and it was slightly slower than Oh My Posh in our runs (21 vs 16 ms small repo, 172 vs 149 ms kernel) → __git_ps1

Gotchas to know before you commit

  • By default every prompt starts a new oh-my-posh process plus its git commands; the docs call process start the largest cost on Windows. Streaming mode avoids it, but it is beta and not available in bash
  • Install the Nerd Font on the host, not inside WSL or a container: the font is a terminal setting, as the docs point out
  • 31.0.0 (30 August 2026) dropped fetch_status and the other fetch_* options. Old configs still load, but a segment now fetches whatever its template references
  • Upgrades have regressed working configs: 31.2.0 stopped expanding templates kept in environment variables (#7858, closed), and the language segment ignored its tools option only in YAML configs (#7868, closed)
  • Homebrew has two formulae: homebrew/core's `oh-my-posh` and the maintainer's tap (`jandedobbeleer/oh-my-posh/oh-my-posh`), which is the one the docs install

Oh My Posh pricing

Checked Nov 15, 2026 against the official pricing page

Oh My Posh is free open-source software with no paid edition, hosted service or support plan from its maintainers. It never gets expensive; the only cost is your time configuring it.

Open source
$0
Everyone, including commercial use
  • The oh-my-posh binary and every segment
  • 125 bundled themes, the Studio editor and the Configurator

What it costs in practice

Solo developer
$0
No licence fee, account or subscription.
Team of 50
$0
Same licence for every seat: MIT.

Estimates in USD from list prices. Your bill depends on usage, region, and discounts.

Health & activity

Updated Nov 15, 2026 · last 90 days
Actively developedFrequent commits or releases in the last 90 days.
GitHub stars
24k
2.8k forks
Commits
185
at least 13 committers
Merged pull requests
109
Issues opened / closed
35 / 35
median 2.1 days to close
Last push
Nov 15, 2026
Open issues & PRs
17

From JanDeDobbeleer/oh-my-posh. Counts cover the last 90 days unless noted.

Downloads

Benchmarks

Our runs include the scripts in the repo, so you can reproduce them

Prompt render, small repo

We ran this

Wall-clock time to render one prompt in a clean checkout of the Helix source (tag 25.07.1, 1,348 files) · ms, lower is better

  • Oh My Posh 32.1.016 ms
  • Starship 1.27.017.6 ms
  • __git_ps1 (git 2.43.0)20.7 ms
How this was measured

benchmarks/starship/run.sh. Commands: starship prompt (no config file, STARSHIP_SHELL=bash); oh-my-posh print primary --shell=bash --save-cache --terminal-width=120 (no --config, so the built-in default prompt; the same call its bash init makes, with a throwaway XDG_CACHE_HOME); and bash -c 'source /usr/lib/git-core/git-sh-prompt; __git_ps1' with GIT_PS1_SHOWDIRTYSTATE=1 and GIT_PS1_SHOWUNTRACKEDFILES=1. The __git_ps1 figure includes starting bash, which a real shell doesn't pay. All three check working-tree status (Oh My Posh's default git segment runs git status). The index is refreshed once (git update-index --refresh) before timing: in a fresh clone, read-only status checks re-examine 'racily clean' files on every run, which made Oh My Posh and __git_ps1 about 3x slower in both repos in a first attempt, an artefact no working repo has. The prompts show different things: Starship's default ran its rust, package and git modules; Oh My Posh's default showed path, git and status plus a right-hand block. Interleaved: 6 rounds of hyperfine (1 warmup + 2 timed runs per command per round, command order reversed every other round), pooled to n=12 per command; mean reported (stddev: Starship 1.0, Oh My Posh 0.9, __git_ps1 1.9 ms). Script refuses to start unless 1-minute load < 1.5. This run replaces the 14 Nov figures, which were on a different host (2.10 GHz Xeon) and did not refresh the index.

Environment: 4 vCPU Intel Xeon @ 2.30GHz (x86_64), 15 GB RAM, Ubuntu 24.04.5 container on Linux 6.18.44, shared host. Run 23:12 UTC. 1-minute load 0.84-0.94 for the whole run; nothing else above 2% CPU.

Versions: starship 1.27.0, Oh My Posh 32.1.0 (Homebrew bottle), git 2.43.0, bash 5.2.21, hyperfine 2.0.0

Run Nov 15, 2026

Prompt render, Linux kernel

We ran this

Wall-clock time to render one prompt in a clean checkout of a shallow Linux kernel clone (97,371 files) · ms, lower is better

  • Starship 1.27.0127.5 ms
  • Oh My Posh 32.1.0148.6 ms
  • __git_ps1 (git 2.43.0)171.7 ms
How this was measured

benchmarks/starship/run.sh. Commands: starship prompt (no config file, STARSHIP_SHELL=bash); oh-my-posh print primary --shell=bash --save-cache --terminal-width=120 (no --config, so the built-in default prompt; the same call its bash init makes, with a throwaway XDG_CACHE_HOME); and bash -c 'source /usr/lib/git-core/git-sh-prompt; __git_ps1' with GIT_PS1_SHOWDIRTYSTATE=1 and GIT_PS1_SHOWUNTRACKEDFILES=1. The __git_ps1 figure includes starting bash, which a real shell doesn't pay. All three check working-tree status (Oh My Posh's default git segment runs git status). The index is refreshed once (git update-index --refresh) before timing: in a fresh clone, read-only status checks re-examine 'racily clean' files on every run, which made Oh My Posh and __git_ps1 about 3x slower in both repos in a first attempt, an artefact no working repo has. Most of this time is git status over 97k files; every prompt still showed its git status, so none hit a timeout. Interleaved: 6 rounds of hyperfine (1 warmup + 2 timed runs per command per round, command order reversed every other round), pooled to n=12 per command; mean reported (stddev: Starship 10.5, Oh My Posh 7.2, __git_ps1 10.1 ms). Script refuses to start unless 1-minute load < 1.5. This run replaces the 14 Nov figures, which were on a different host (2.10 GHz Xeon) and did not refresh the index.

Environment: 4 vCPU Intel Xeon @ 2.30GHz (x86_64), 15 GB RAM, Ubuntu 24.04.5 container on Linux 6.18.44, shared host. Run 23:12 UTC. 1-minute load 0.84-0.94 for the whole run; nothing else above 2% CPU.

Versions: starship 1.27.0, Oh My Posh 32.1.0 (Homebrew bottle), git 2.43.0, bash 5.2.21, hyperfine 2.0.0

Run Nov 15, 2026

What the community says

Hacker News & GitHub issues · Aug 17, 2026 – Nov 15, 2026

Almost all of the recent discussion is in Oh My Posh's GitHub issues, and most of it comes from Windows and PowerShell users: streaming-mode errors, a per-prompt popup after the 30.8.0 upgrade, and right-aligned prompt layout. Nearly every report in the window was closed within days; Hacker News mentioned it once, in passing.

What people like

Nothing consistent enough to report.

What people complain about

  • PowerShell streaming mode races · 3 sources

    Users who turned on `streaming` report PSReadLine OnIdle errors ('a pipeline is already running') inside editor-hosted PowerShell terminals, and that `POSH_DISABLE_STREAMING` did not stop the `oh-my-posh serve` process. The reports span 30.8 and were closed after follow-up fixes.

  • Windows starts a process on every prompt · 2 sources

    Without streaming, the PowerShell init launches a fresh oh-my-posh.exe for each prompt. One user traced an application-error popup at every Windows shutdown to that; another saw the App Installer window open on every keystroke after upgrading to 30.8.0 via winget, fixed by downgrading.

  • Upgrades break working configs · 3 sources

    31.2.0 stopped expanding templates kept in environment variables, and the generic `language` segment ignored its `tools` option only when the config was YAML (the same config worked as JSON or TOML). An `extends` config left one user with no prompt at all.

  • Right-aligned and multi-line layout glitches · 3 sources

    Reports of right-aligned blocks overflowing when a Conda environment is active, a diamond block stretching across the terminal without a trailing diamond, and the PowerShell transient prompt leaving lines of a multi-line prompt on screen.

Written by Wren Halloran on Nov 15, 2026 after reading 19 relevant Hacker News comments, threads and GitHub issues from Aug 17, 2026 to Nov 15, 2026. Each point links to the discussions behind it, and the count shows how many sources raised it. This is a reading of public discussion, not a survey.

Most-reacted new GitHub issues · 35 opened in the window

Alternatives to Oh My Posh

Spotted something wrong or out of date? Flag a correction on GitHub. Health and community data refresh on the 1st and 15th of every month.