Back to guides
Compare·September 21, 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. Its own usage docs state that it "intentionally does not include built-in MCP, sub-agents, permission popups, plan mode, to-dos, or background bash", and points you at extensions, packages, containers and tmux instead. 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 accepts nine wire dialects to Pi's four and adds an environment-variable route Pi does not have. 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 TypeScriptBatteries-included coding surface; README claims 60+ providers, 31 tools, 14 LSP ops, 28 DAP ops
MCP, sub-agents, plan mode, to-dosIntentionally omitted; add them 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 is an input-loading guard, not a sandboxtools.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 documented9 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. 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 contradicts itself and you should know that rather than trust one example. Its models page shows 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 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, folding a root Azure endpoint into /openai/v1 — 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-aiThose four plus openai-codex-responses, azure-openai-responses, bedrock-converse-stream, google-gemini-cli, google-vertex
Key resolutionCLI --api-keyauth.json → env var → models.json keyRuntime 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. Pi's documented table lists four dialects for custom providers even though the repository ships extra handlers for its own built-ins, so treat four as the supported surface. 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. Pi's provider docs say third-party harness usage "draws from extra usage and is billed per token, not against Claude plan limits". 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.40 / $2.00$2.80
Claude Sonnet 5$2.00 / $10.00$14.00
Claude Opus 5$2.00 / $10.00$14.00

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 no setup guide for either client and has not runtime-tested either against its endpoint, so 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 a client that does have a published Kunavo setup guide.

FAQ

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. Pi states in its own docs that it intentionally omits built-in MCP, sub-agents, permission popups, plan mode, to-dos and background bash, and expects you to add them as TypeScript extensions. 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 project-trust feature is described in its own security docs as an input-loading guard that is not a sandbox. 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. 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.