Back to guides
Compare·September 21, 2026·Updated October 1, 2026·9 min read

Oh My Pi vs Pi: the fork, the differences, and which to run

The code flowed Pi to Oh My Pi, both pushed code on September 21, 2026, and the version gap is a renumbering rather than a maturity signal.

Last reviewed on .

Oh My Pi is a hard fork of Pi, not a rival that grew up beside it — the code flowed Pi → Oh My Pi, both projects are alive today, and they now optimise for opposite things. Pi is a deliberately minimal terminal harness you extend in TypeScript. Oh My Pi is the same lineage rebuilt as a batteries-included coding surface with LSP, a debugger, subagents and a browser tool in the box. Both are MIT-licensed and cost $0 to install, so the decision is about workflow, execution model and configuration format — not about a licence fee.

Names first, because three of them collide. Pi here means the agent harness at pi.dev, published by Earendil Works from earendil-works/pi. It is not Pi by Inflection AI (pi.ai), not the Pi Network coin, and not Raspberry Pi. Oh My Pi means the agent at omp.sh from can1357/oh-my-pi, whose binary is omp — not the pie bakeries that dominate a search for that phrase, and not Oh My Zsh or Oh My Posh despite the naming echo. And pi-mono is not a third product: it is Pi's old repository name. github.com/badlogic/pi-mono now returns a 301 to earendil-works/pi, though third-party docs still use the old path — DeepSeek's official Pi integration page literally lives at /agent_integrations/pi_mono/.

The fork direction is worth pinning down, because searches run both ways and the answer is not symmetrical. Oh My Pi's README says in its own header that it is a "Fork of Pi by @mariozechner", linking to the pre-rename URL. GitHub reports fork: false and parent: null for it, because this is a source fork rather than the fork button — so the API will not tell you. The repository still carries docs/porting-from-pi-mono.md, a merge checklist whose recorded Last Sync Point is commit b21b42d, dated March 22, 2026. That marker is the only divergence evidence available from outside; whether a later, unrecorded sync has happened is not something this page can confirm.

Oh My Pi vs Pi: which should you pick?

Five axes decide this — whichever direction you came at it from — and only one of them is about features.

  • Workflow. Pick Pi if you want a small core and intend to write the missing parts yourself. Until its September 22, 2026 docs refresh, its own usage docs stated that it "intentionally does not include built-in MCP, sub-agents, permission popups, plan mode, to-dos, or background bash", and pointed you at extensions, packages, containers and tmux instead. The refresh removed that sentence, and v0.99.0 then made MCP a built-in extension that loads by default; sub-agents, plan mode, to-dos and approval prompts are still extensions at v0.99.2. Pick Oh My Pi if you want those in the box on day one and have no appetite for maintaining an extension.
  • Permissions and execution model. Neither default is the safe one, so choose on which failure mode you can live with. Pi has no permission system and is explicit about it. Oh My Pi has a real three-tier one and ships it defaulted to yolo. If you need per-tool prompts, Oh My Pi can give them to you after one config line; Pi cannot give them to you at all without an extension.
  • Protocol and plan limits. If your model route is a third-party OpenAI- or Anthropic-compatible endpoint, both can reach it, but Oh My Pi documents nine wire dialects where Pi documented four until its September 22, 2026 docs refresh, and adds an environment-variable route Pi does not have. The dialect gap is narrower in code than on paper: Pi's source at v0.99.2 dispatches a custom provider's api to any of ten built-in implementations, six of them never documented for that use. If your route is an OAuth subscription — Claude Pro/Max, Codex, GitHub Copilot — both clients attach it through /login and store a vendor token, which a gateway in the middle would reject; Oh My Pi's own provider docs give that as the reason a models.yml key deliberately outranks stored OAuth. Do not fold the Chinese coding plans into that group: Pi lists ZAI/GLM, Kimi For Coding and the Qwen Token Plans in its API-key table (ZAI_API_KEY, KIMI_API_KEY, QWEN_TOKEN_PLAN_API_KEY), and Oh My Pi tags them plan rather than oauth, so they are ordinary keyed providers in both.
  • Cost path. The client is free on both sides and neither changes your per-token rate. The asymmetry is that Pi has a first-party paid gateway (Radius, run by the same company) wired into its own /login, while Oh My Pi sells no hosted route of any kind — the one server it does operate is the relay behind /collab session links, which bills nothing.
  • Migration cost. Roughly one provider block, retyped. Config formats and directories differ — JSON under ~/.pi, YAML under ~/.omp — and no import tool is documented in either repo. A couple of environment variable names are shared, with caveats below.

What should not decide it: the version numbers. Oh My Pi renumbered at the fork, so its 18.2.7 and Pi's 0.86.1 are different schemes, not eighteen versions of extra maturity.

What actually differs between them

DimensionPiOh My Pi
MaintainerEarendil Works, a GitHub organisation; pi.dev attributes the project to Earendil Inc.Can Bölük, an individual GitHub account; the repo's LICENSE also carries a Stencil Labs, Inc. copyright line beside his
Package and binary@earendil-works/pi-coding-agent, binary pi@oh-my-pi/pi-coding-agent, binary omp
Declared runtimenode >= 22.19.0bun >= 1.3.14
Stated design"A minimal terminal coding harness" kept small at the core and extended in TypeScript, until a September 22, 2026 docs refresh; its README now says "a minimal, extensible AI agent for the terminal"Batteries-included coding surface; README claims 60+ providers, 31 tools, 14 LSP ops, 28 DAP ops
MCP, sub-agents, plan mode, to-dosMCP built in since v0.99.0 (September 29, 2026); the rest still added as extensions or packagesBuilt in, including task subagents that fan out in parallel
IDE-class toolsNo built-in equivalentlsp, a DAP debug session, browser over headless Chromium, computer desktop control
Permission modelNone; runs with the launching user's privileges. Project trust controls what a folder may load, not what a tool call can reachtools.approvalMode: always-ask / write / yolo, defaulted to yolo
ConfigJSON under ~/.pi: models.json, auth.json, trust.jsonYAML under ~/.omp: models.yml, config.yml; credentials in agent.db
Custom-provider dialects4 documented until September 22, 2026, none listed since; 10 dispatched by the source at v0.99.29 documented, including Codex Responses, Azure Responses, Bedrock and Vertex
First-party paid gatewayRadius, closed source, reached via /login radiusNone. omp auth-gateway serve is software you run yourself
Contributions"New issues and PRs from new contributors are auto-closed by default"PRs "temporarily open to everyone as a trial" after a previous vouch requirement

Read from both repositories' own documentation on September 19, 2026: Pi's overview, security and models pages, and Oh My Pi's README, approval-mode and providers pages. Pi's stated-design, MCP, permission-model and dialect rows were re-checked October 1, 2026 against its refreshed docs, README and source at v0.99.2. The capability counts in the Oh My Pi row are that project's own claims; no methodology is published for them, and its README benchmark table is likewise a vendor claim this page does not reproduce.

Both are alive. Neither metric settles "which is bigger"

The single most common error about this pair is treating one of them as abandoned or superseded. Both pushed code on the day of this check.

SignalPiOh My Pi
Repository stateNot archived, MITNot archived, MIT
CreatedAugust 9, 2025December 31, 2025
Last pushSeptember 21, 2026September 21, 2026
Latest releasev0.86.1, September 20, 2026v18.2.7, September 21, 2026
Recent cadenceFive releases between August 28 and September 20, 2026Six releases between September 16 and 21, 2026
Stars107,93932,221
npm downloads, week to September 16, 20262,295,454146,706

Repository, release and star figures from the GitHub API, read September 21, 2026; download counts from the npm downloads API for the week ending September 16, 2026. Do not turn either column into an adoption verdict. The npm comparison in particular is not like-for-like: Pi's own documentation opens with npm install -g, while Oh My Pi's README documents curl-to-shell, Homebrew, Bun, Nix, PowerShell and mise and never gives an npm command at all, so npm materially undercounts it by an amount nothing here can measure. Stars favour Pi; release cadence favours Oh My Pi; any one-metric sentence about popularity will be wrong in at least one direction.

Neutral third-party evidence that both are current, if you want it without the metrics: Ollama publishes an integration page for Oh My Pi and for Pi, and DeepSeek publishes an agent-integration guide for each as well — its Pi guide being the one still filed under the old pi_mono path. All four pages answered on September 21, 2026.

Pointing either one at your own endpoint

This is where the fork is most visible, and where a wrong /v1 costs you an afternoon. Both clients can reach a third-party OpenAI- or Anthropic-compatible endpoint, but by different mechanisms and opposite URL conventions.

Oh My Pi has an environment-variable route Pi does not. Its Anthropic provider resolves the base URL through normalizeAnthropicBaseUrl($env.ANTHROPIC_BASE_URL), ahead of the official default, and that normaliser strips a trailing /v1 — so both https://api.kunavo.com and https://api.kunavo.com/v1 land on the same host. Read from packages/ai/src/providers/anthropic-state.ts, where resolveDirectAnthropicBaseUrl() and the normaliser are defined, on September 19, 2026 — from source, not from a request we made.

Oh My Pi — the one-line route
# Oh My Pi honours ANTHROPIC_BASE_URL for its built-in anthropic provider.
# normalizeAnthropicBaseUrl() strips a trailing /v1, so both forms resolve
# to the same host here. Pi ships no equivalent gateway base-URL variable.
export ANTHROPIC_API_KEY="$KUNAVO_API_KEY"
export ANTHROPIC_BASE_URL="https://api.kunavo.com"
omp

One precedence trap comes with that route. Oh My Pi's documented order puts a models.yml apiKey at position 2, above stored OAuth at position 3, but a provider environment variable at position 5, below it. So if you are already /login-ed into Anthropic, the subscription token wins over ANTHROPIC_API_KEY and your gateway key is never used. Pin the key in config, or log out of that provider first.

For a named provider, Oh My Pi uses YAML — and here the /v1 goes back on, because its OpenAI path appends /chat/completions to the trimmed base URL verbatim.

~/.omp/agent/models.yml
providers:
  kunavo:
    baseUrl: https://api.kunavo.com/v1   # /v1 REQUIRED: omp appends /chat/completions
    api: openai-completions              # use anthropic-messages, and then drop /v1
    apiKey: KUNAVO_API_KEY               # env var name, a literal, or "!cmd"
    authHeader: true                     # send Authorization: Bearer <key>
    models:
      - id: claude-sonnet-5
        contextWindow: 200000
        maxTokens: 64000

To point Pi at a gateway you have one route: ~/.pi/agent/models.json. Pi reads no ANTHROPIC_BASE_URL — a code search across the repository on September 19, 2026 returns two hits for that exact string, both non-override (a Cloudflare AI Gateway constant and a model-generation script) — and there is no bare OPENAI_BASE_URL either. One base-URL variable does exist and it is not a general escape hatch: AZURE_OPENAI_BASE_URL, listed in Pi's provider docs, points the Azure OpenAI provider at your own Azure resource and nothing else.

~/.pi/agent/models.json
{
  "providers": {
    "kunavo": {
      "baseUrl": "https://api.kunavo.com",
      "api": "anthropic-messages",
      "apiKey": "$KUNAVO_API_KEY",
      "models": [
        {
          "id": "claude-sonnet-5",
          "contextWindow": 200000,
          "maxTokens": 64000
        }
      ]
    }
  }
}

On the suffix, Pi's own documentation has never settled it, and you should know that rather than trust one example. Until its docs refresh of September 22, 2026, its models page showed an anthropic-messages proxy as https://proxy.example.com/v1 in one place and as https://proxy.example.com with no suffix in another; the refresh removed both without settling it. The no-suffix form is the one to follow, and the reasoning is derived from source rather than runtime-tested: Pi ships nothing like Oh My Pi's /v1-stripping normaliser on the anthropic-messages path — the one normalisation its docs describe is Azure-specific: resource root URLs under Azure's own domains "are normalized to the OpenAI API path" — its built-in Anthropic default is https://api.anthropic.com without /v1 while its OpenAI default is https://api.openai.com/v1, and for anthropic-messages it hands model.baseUrl straight to the official Anthropic SDK, which appends /v1/messages itself. A /v1 there would produce /v1/v1/messages. Kunavo documents the same convention on its base-URL page: origin only for Anthropic-style clients, /v1 for OpenAI-style ones.

Setup detailPiOh My Pi
Env-var base URL overrideNot availableANTHROPIC_BASE_URL, /v1 tolerated
Custom provider file~/.pi/agent/models.json~/.omp/agent/models.yml
Documented api valuesopenai-completions, openai-responses, anthropic-messages, google-generative-ai until Pi's September 22, 2026 docs refresh; the refreshed docs list noneThose four plus openai-codex-responses, azure-openai-responses, bedrock-converse-stream, google-gemini-cli, google-vertex — nine chat dialects — and, since September 21, 2026, two judgment APIs, typesafe and openrouter-decisions, which answer judge requests rather than chat. The models.yml schema at v18.4.8 accepts exactly these eleven
Key resolutionRuntime --api-key → auth.json → models.json key → env var, per the docs as refreshed September 22, 2026Runtime override → models.yml key → stored OAuth → login key → env var
Keyless local providersDummy placeholder keyauth: none
Auto-detect a gateway's wire protocolNo equivalentdiscovery.type: proxy, but it reads a supported_endpoint_types field Kunavo's model list does not publish — declare api and models explicitly instead

Two more boundaries worth planning around. Until its September 22, 2026 docs refresh, Pi's documented table listed four dialects for custom providers even though the repository ships extra handlers; the refresh dropped the table without naming a replacement list, so those four remain the only surface Pi has documented for custom providers. The extra handlers are not reserved for built-ins, though: Pi's source at v0.99.2 types a models.json api as a free string and dispatches it to whichever of ten registered implementations matches (BUILTIN_APIS in packages/ai/src/compat.ts), so a custom provider can name bedrock-converse-stream or google-vertex — whether either works against a third-party endpoint is undocumented and untested here. And on Oh My Pi, disabledProviders is checked before credentials — a provider ID caught by that list silently disappears no matter what key you supply — while settings arrays are replaced wholesale by the higher-precedence layer rather than merged, so a project-level list quietly discards the global one. Both projects also ship compatibility escape hatches you may genuinely need on a gateway: Oh My Pi's disableStrictTools, Pi's supportsEagerToolInputStreaming and allowEmptySignature. Whether Kunavo accepts either client's default strict schemas, cache markers or eager tool-input streaming has not been tested here.

What switching actually costs

Less than the version-number gap suggests, and more than a file copy. There is no documented import command, session converter or config migrator in either repository's docs tree, so plan to retype the provider block in the other format — JSON to YAML, or back. Credentials do not move either: Pi stores them in ~/.pi/agent/auth.json, while Oh My Pi keeps a SQLite auth store at ~/.omp/agent/agent.db.

Environment variables carry less far than the shared ancestry suggests, so read this one carefully. Oh My Pi does still read the PI_-prefixed names — PI_CONFIG_DIR and PI_CODING_AGENT_DIR among them — but they relocate Oh My Pi's directories, so exporting one in a shell profile shared with Pi points both clients at the same path rather than making a config portable. The OMP_-to-PI_ mirroring described in its environment-variable reference is narrower still: that doc states the rule applies inside each parsed .env file and explicitly "not arbitrary variables inherited from the parent process". What will not carry at all is anything built against the harness: a Pi TypeScript extension is written against Pi's API, and roughly six months of separately maintained development since the March 22, 2026 sync marker is exactly where those APIs drift. Test an extension rather than assuming it ports.

The money is the same on both sides

Neither client bills you, so switching between them changes your model spend by zero. The variable is which route you buy tokens through, and on that the two differ in one way: Pi has a first-party paid gateway and Oh My Pi does not. Radius is operated by Earendil, closed source, reached through Pi's own /login, and its FAQ states it charges "the fees we have with our payment processor on top of the list prices" — a percentage it does not publish, so a Radius total cannot be computed from outside. Oh My Pi's only gateway is omp auth-gateway serve, software you host, with transport security delegated to the operator.

One thing to kill before it enters a budget: a Claude Pro or Max subscription signed into either harness is not free usage. Until its September 22, 2026 docs refresh removed the sentence, Pi's provider docs said third-party harness usage "draws from extra usage and is billed per token, not against Claude plan limits"; the warning Pi prints when an Anthropic model runs on subscription auth still says it "draws from extra usage and is billed per token, not your Claude plan limits" (source, v0.99.2). No equivalent statement was found in Oh My Pi's docs, so do not assume it behaves differently — check your own account.

For the gateway route, here is the arithmetic on the workload rather than on the client. Assume one month of steady agent work: 5,000,000 uncached input tokens and 400,000 output tokens, no cache reads or writes, no image or tool charges. Rates are live Kunavo catalog prices per million tokens.

ModelInput / output per 1MEstimated month, either client
Claude Haiku 4.5$0.70 / $3.50$4.90
Claude Sonnet 5$1.40 / $7.00$9.80
Claude Opus 5$3.50 / $17.50$24.50

These are illustrative token estimates under the assumptions above, not measured task costs and not a ceiling on a bill. The column is identical for both clients because the client is not a pricing variable — but the workload can be: Oh My Pi's task tool fans out subagents in parallel, and parallel agents each carry their own context, which is an input-token multiplier no table here can size for you. Measure it on one bounded change before scaling the estimate.

Two Kunavo-side caveats belong in the same number. The catalog amount is a billing floor rather than a cap: when the upstream reports its charge, the bill is the greater of catalog cost and upstream cost times the applicable markup, as the billing guide explains. And the minimum top-up is $10 of prepaid credit — the cash needed to fund an account, not a task fee or a subscription.

Kunavo publishes a setup guide for each client — Pi and Oh My Pi — but has not runtime-tested either against its endpoint, and a setup guide is a configuration reference rather than a compatibility test. Both configurations above are written from published documentation and source and should be verified on your own machine. Keep a working route available while you try one. When you want to price a real task rather than a model, create a Kunavo account, fund it, and run one bounded change against the model you shortlisted. If you are still choosing a harness rather than a provider, Pi coding agent pricing breaks down Pi's four billing routes, and Pi vs OpenCode compares Pi against another client with a published Kunavo setup guide.

Frequently asked questions

Is Oh My Pi a fork of Pi?

Yes, and the direction is Pi first. Oh My Pi's own README says it is a fork of Pi by @mariozechner, linking to the pre-rename github.com/badlogic/pi-mono URL. GitHub's API reports fork:false and parent:null for can1357/oh-my-pi because it is a source fork rather than a GitHub fork button, so the API alone will not tell you. The repo still carries docs/porting-from-pi-mono.md, a merge checklist whose recorded Last Sync Point is commit b21b42d dated March 22, 2026. Whether a later, unrecorded sync has happened since is not something this page could confirm.

What is Oh My Pi?

Oh My Pi, binary omp, is an MIT-licensed terminal coding agent by Can Bölük, published at omp.sh from the can1357/oh-my-pi repository and distributed as @oh-my-pi/pi-coding-agent on npm. It is a hard fork of the Pi agent harness, rebuilt as a batteries-included coding surface: its README claims 60+ providers, 31 built-in tools, 14 LSP operations and 28 DAP debugger operations. It is not a pie bakery, not a Raspberry Pi project and not related to Oh My Zsh or Oh My Posh despite the naming echo.

Is Oh My Pi better than Pi?

They optimise for opposite things, so there is no ranking to report and no benchmark comparing them that this page could cite. Until a September 22, 2026 docs refresh, Pi stated in its own docs that it intentionally omits built-in MCP, sub-agents, permission popups, plan mode, to-dos and background bash, and expected you to add them as TypeScript extensions; since v0.99.0 MCP is built in, and the other five are still extensions at v0.99.2. Oh My Pi ships LSP, a DAP debugger, parallel subagents, a Puppeteer browser tool and a per-tool approval system in the box. Pick by which of those you want to own yourself. Ignore the version numbers: Oh My Pi renumbered at the fork, so its v18.2.7 and Pi's v0.86.1 are not on the same scale.

Can I move my Pi config to Oh My Pi?

Not by copying files. Pi keeps JSON under ~/.pi (models.json, auth.json, trust.json); Oh My Pi keeps YAML under ~/.omp (models.yml, config.yml) with credentials in a SQLite store at ~/.omp/agent/agent.db. No import command or config converter is documented in either repo's docs tree — that is absence of evidence, not proof one does not exist. Environment variables carry only partly: Oh My Pi still reads PI_CONFIG_DIR and PI_CODING_AGENT_DIR, but they relocate its own directories rather than reading Pi's, and its OMP_-to-PI_ mirroring rule is documented as applying inside parsed .env files, not to variables inherited from the shell. Budget the migration as retyping one provider block, not as a data export.

Does Oh My Pi or Pi cost anything?

Neither client charges for itself. Both are MIT-licensed and self-hosted, and neither repository publishes a pricing page, plan, tier or funding file. What you pay is model usage on whichever route you sign in with. One asymmetry is worth knowing: Pi's publisher, Earendil, also runs Radius, a first-party closed-source token gateway you top up and reach through Pi's own /login. Oh My Pi sells no hosted equivalent — its auth-gateway is a forward proxy you run yourself, with transport security delegated to the operator.

Which one is safer to run on a real repository?

Neither ships a safe default, and the honest answer needs both halves. Pi has no permission system at all and says so plainly: it runs with the permissions of the user and process that launched it, and its own security docs say its project-trust feature controls which project resources load but does not limit what tool calls can access or affect. Oh My Pi does have a three-tier per-tool approval system — always-ask, write and yolo — but its documented default is yolo, which auto-approves read, write and exec with no prompts. So Pi gives you nothing and tells you loudly; Oh My Pi gives you a control that is switched off until you set tools.approvalMode. Containerise either one for untrusted work.

Both repositories' documentation trees and npm packages were checked September 19, 2026, and the base-URL and credential-order claims read from the source files named inline on the same date; the repository metrics and release histories were re-read September 21, 2026. After Pi's September 22, 2026 docs refresh, its anthropic-messages base-URL examples, Azure normalisation sentence, documented api values and credential order were re-checked October 1, 2026 against the refreshed docs and the source at v0.99.2. The same day, after Pi v0.99.0 shipped built-in MCP, its omitted-feature list, project-trust wording and stated design were re-checked against its usage, MCP, settings and security pages and README, the api values its source dispatches, the extra-usage line against the terminal warning in that source, and this site's own integrations index. Also on October 1, 2026, Oh My Pi's documented api values were re-checked against its docs/models.md and models.yml schema at v18.4.8. Kunavo rates are rendered from the live catalog and every dollar figure here is illustrative token arithmetic. Neither client has been runtime-tested against Kunavo, and no performance or benchmark comparison between the two projects is implied — none exists that this page could cite.