All writing

AI · Tutorial

How to Migrate from Claude Code to oh-my-pi (omp)

Everything you need to know to move from running Claude Code inside a terminal to using omp, including what you gain, what you lose, and how to set up permissions.

By Wes Copeland · · 13 min · 2,674 words

I've settled on oh-my-pi (omp) as my daily coding harness. It's the best terminal coding agent I've used, and anyone doing serious engineering work should give it a try.

If you haven't heard of it, omp is an open-source coding harness for the terminal, made by Stencil. It works with basically every AI provider and subscription, including your Claude Max and Codex subs.

This article was written against omp 18.10.3 and Claude Code 2.1. Both of these harnesses ship updates often, so some details may have changed by the time you're reading this.

Tip

tl;dr - here's the whole migration in four steps:

  1. Install omp with curl -fsSL https://omp.sh/install | sh.
  2. Run omp and log in with your Claude subscription.
  3. If you want omp to ask before it edits files or runs commands, add tools.approvalMode: always-ask to ~/.omp/agent/config.yml (more in Permissions).
  4. Add enabledProviders: [claude] to the same file to bring over your skills, slash commands, MCP servers, and plugins.

If you'd like a guided migration, paste this into a fresh Claude Code session:

text
I'm switching from Claude Code to omp (oh-my-pi), an open-source coding agent for the terminal. Its docs are at https://github.com/can1357/oh-my-pi/tree/main/docs. Help me migrate. Don't change any files until I say so.

1. Look at my Claude Code setup: ~/.claude/ (CLAUDE.md, settings.json, skills, commands, agents, plugins), the MCP servers in ~/.claude.json, and any CLAUDE.md, CLAUDE.local.md or .claude/ folder in this project.
2. Skim my recent sessions in ~/.claude/projects/ to learn how I work: the models I pick, the commands and skills I use most, and the things I keep repeating.
3. Read omp's docs. Work out what carries over as-is, what needs converting (settings.json hooks, permission rules, .claude/agents/*.md, auto memory), and which omp features I'd get the most out of.
4. Give me a checklist. Put the next action first. Number the steps, one action per step. Mark the optional ones. End with the single next thing I should do.
5. Walk me through it one step at a time. Wait for me to finish each step before giving me the next one.

Why I switched#

I'm a coding agent power user. For months, I bounced between Claude Code, Codex, Cursor CLI, Devin CLI, OpenCode, and Antigravity - whichever one was appropriate for the task at hand. That got old fast, so I went looking for a harness that could do everything I needed all under one roof.

omp does that. It runs all my subscriptions and models from a single terminal, and it's genuinely hackable in ways most others aren't.

It also has a few things the other harnesses either don't have or don't do well: detailed analytics across every provider and model, novel compaction techniques, cache warming that keeps your prompt cache alive through short breaks, load balancing across multiple subscriptions to the same provider, and deep customizability to match your given working preferences.

Install and log in#

Install omp with one command:

bash
# macOS and Linux
curl -fsSL https://omp.sh/install | sh

# Windows (PowerShell)
irm https://omp.sh/install.ps1 | iex

Run omp once it's installed. It drops you straight into an onboarding wizard where you can log in with your Claude Max subscription.

omp opens a claude.ai login page in your browser. Approve it and you're all set. If omp asks for an authorization code, copy it from the browser and paste it into the terminal.

Warning

Anthropic's terms say that Claude subscription logins are meant for Claude Code and Anthropic's own apps, and omp identifies itself as Claude Code when you log in this way. However, on October 7, 2026, Anthropic provided a significant update stating "you can still use ... third-party apps with your subscription limits." If you're not comfortable with that, log in with an Anthropic API key instead.

You'll also pick a default model, a glyph mode, a composer shape, and a theme.

For your glyph mode, I strongly recommend a Nerd Font. If you don't have one, FiraCode Nerd Font is a good pick, and it makes omp's UI much easier to read.

Any composer shape will work fine, but the Claude Code shape will look most familiar.

The last step is picking a theme. I use Titanium, which is the default for dark terminals.

Permissions#

You should know before you use omp for real: its default operating mode is YOLO mode (AKA: --dangerously-skip-permissions). Claude Code's auto mode has more safeguards. In YOLO mode, nothing checks a bash command before omp runs it. omp does know about a handful of catastrophic commands, like rm -rf / and fork bombs, but YOLO mode skips that check too.

omp has three approval modes:

Mode Runs without asking Asks first
always-ask Reads Edits and commands
write Reads and edits Commands
yolo (default) Everything Nothing

If you want Claude Code's legacy behavior, where it asked before every edit and command, pick always-ask. If you'd rather let omp edit files freely but still check with you before running commands (similar to Claude Code's accept-edits mode), go with write.

~/.omp/agent/config.ymlyaml
tools:
  approvalMode: always-ask

You can also set the mode for a single session by starting omp with omp --approval-mode always-ask.

No matter which mode you choose, you can block specific commands you never want omp to run. omp checks your bash.patterns rules in order and uses the first one that matches, and you can use * as a wildcard:

~/.omp/agent/config.ymlyaml
tools:
  approval:
    eval: prompt
bash:
  patterns:
    - match: "rm -rf *"
      approval: deny
    - match: "git push*"
      approval: prompt

A deny rule applies in every mode, including YOLO mode, and it'll catch a command even when you chain it with &&, ; or |.

Take note of the eval: prompt line. omp's eval tool runs Python and JavaScript, and those scripts can start their own shell without going through your bash.patterns rules. eval: prompt makes omp ask before it runs one.

Important caveat worth mentioning: subagents always run in YOLO mode. Your deny rules still apply to them, but a prompt rule is refused, since a subagent isn't able to stop midstream and ask you for permission to do something.

If you want something closer to Claude Code's auto mode, there's a community plugin called guard that has a model review each command before it runs:

bash
omp plugin install guard@casonadams-plugins

What seamlessly transitions over#

omp reads any CLAUDE.md and AGENTS.md file in your project, including the ones in parent folders up to your repo root. It skips CLAUDE.local.md and AGENTS.override.md by default, but you can add them to your config:

~/.omp/agent/config.ymlyaml
contextFiles:
  extra: [CLAUDE.local.md, AGENTS.override.md]

If you've been using Claude Code for a while, you've probably accumulated a lot of stuff in your ~/.claude directory. omp ignores it by default, but you can opt in with enabledProviders:

~/.omp/agent/config.ymlyaml
enabledProviders: [claude]

This keeps your user-level CLAUDE.md, skills, slash commands, MCP servers, and Claude plugins working. omp picks up project-level .claude directories either way. If you also have an ~/.omp/agent/AGENTS.md file, omp uses it instead of your ~/.claude/CLAUDE.md.

Trying out omp won't hurt anything with your existing Claude Code setup. omp only reads your ~/.claude directory. When you import a Claude Code session, omp makes a copy of that session and leaves the original alone. You can go back to using Claude Code whenever you'd like.

Something that won't carry over is Claude Code's auto-memory. Claude Code stores memory in ~/.claude/projects/<project>/memory. If you have anything in there worth keeping, move it into your CLAUDE.md (or just ask omp to do it).

omp has its own memory, although it's disabled by default. To enable it, choose what backend you'll use for memory:

~/.omp/agent/config.ymlyaml
memory:
  backend: local
Backend How it works
local Once a session has gone idle, omp reads it and pulls out decisions, constraints, and fixes. It then writes a summary for the project and adds it to every new session. It can also turn workflows you repeat into skills.
mnemopi Stores memories in a local SQLite database. omp recalls the relevant ones at the start of a session and saves new ones as you work, and the agent can search, add, and edit memories itself.
hindsight Works like mnemopi, but the memories live on a Hindsight server you run.
sharpshooter Keeps a set of decision files for each project, covering architecture, product, and style, and updates them in the background.

local is the simplest place to start, and is probably the most Claude Code-like, even though it's a bit more async than how Claude Code's memory works. Keep in mind that it uses your default model to read past sessions and your smol model to write summaries, so this does cost some tokens from the background spend. Run /memory view to see what omp will add to your next session, or /memory clear to start over.

If you have any long-running sessions in Claude Code, you can resume them in omp. Run omp --from-claude and it will open a menu letting you import the Claude Code session into omp (it's similar to claude --resume). You can also do this if you're already in an omp session by running /resume @claude.

A few things won't work 1:1:

  • .claude/agents: omp loads subagents from .omp/agents or ~/.omp/agent/agents and the frontmatter is slightly different.
  • Hooks from settings.json: instead of shell commands, omp uses TS/JS files that go in ~/.omp/agent/hooks/pre or ~/.omp/agent/hooks/post.
  • Permission rules: omp has its own system for granular permissions (covered above).

That said, you can ask omp to port all this stuff for you. omp understands how omp itself works, and you can prompt omp to customize itself however you'd like.

Make it feel like Claude Code#

Most of this is covered in the onboarding wizard, but if you need to do it manually:

~/.omp/agent/config.ymlyaml
composer:
  shape: claude
symbolPreset: nerd

Most keyboard shortcuts should work how you expect, except for these two:

Key Claude Code omp
Shift+Tab Cycle permission modes Cycle thinking level
Alt+Shift+P Part of the Shift+Tab cycle Toggle plan mode

You can find all the keyboard shortcuts, as well as instructions for changing them, in the omp keybindings docs.

Claude Code to omp equivalents#

Most slash commands have the same name (/resume, /clear, /compact, /btw, /review, /export, and so on), but a few are different:

Claude Code omp
/cd /move
/cost, /usage omp stats, omp usage
/plugin /marketplace, /plugins
--worktree /wt, omp worktree
Remote Control /collab
Messaging your other sessions agent-bus

Model roles#

Claude Code doesn't offer nearly as much model flexibility as omp. With omp, you can assign different models to different prescribed roles. You set the model for each role once, and that's the model that will be used for that role going forward.

Here's what my modelRoles config looks like at the time of this writing:

~/.omp/agent/config.ymlyaml
modelRoles:
  default: anthropic/claude-sonnet-5-5:high
  plan: anthropic/claude-opus-5-5:high
  task: anthropic/claude-opus-5-5:medium
  slow: anthropic/claude-opus-5-5:high
  advisor: anthropic/claude-opus-5-5:medium
  smol: anthropic/claude-haiku-5-5:medium
  tiny: anthropic/claude-haiku-5-5:low
  commit: anthropic/claude-haiku-5-5:low
  web: openai-codex/gpt-5.6-luna
  judge: typesafe/jev-latest:auto
  PROSE: opencode-go/deepseek-v4.1-flash
Role What it's for What I use
default Your main conversation Sonnet 5.5
plan Plan mode Opus 5.5
task Subagents Opus 5.5
slow Deep reasoning Opus 5.5
advisor Reviews each turn in the background Opus 5.5
smol Quick, cheap tasks Haiku 5.5
tiny Session titles Haiku 5.5
commit Commit messages Haiku 5.5
web Web search GPT-5.6 Luna
judge Quick classification calls that save tokens in the long run, like ranking results for omp's find search tool TypeSafe's jev
PROSE My own custom role for anything a human will read DeepSeek V4.1 Flash

The :high, :medium, or :low suffix sets the effort level for that model. You can change it any time from the model picker (Alt+M).

Notice how I'm not limited to just one provider. I use GPT for web searches (since I have a ChatGPT subscription) and TypeSafe's model for the judge role as a classifier.

You're also not limited to omp's built-in role archetypes. For example, I added a custom PROSE role because I think Opus's writing is cringe. I have omp hand all text that has any possibility of being read by a human to DeepSeek V4.1 Flash to write instead. Setting up custom roles is easy - just add a line for it under modelRoles, and then point a custom agent at it with model: "@PROSE". Role names don't have to be all-caps, but they are case-sensitive, so @prose won't find a role named PROSE.

You can also configure fallback models per role, so that if one provider errors or has an outage, omp will fall back to whatever you've specified.

~/.omp/agent/config.ymlyaml
retry:
  fallbackChains:
    default:
      - opencode-go/muse-spark-1.3-contributor:low
    plan:
      - opencode-go/muse-spark-1.3-contributor:medium
    slow:
      - opencode-go/muse-spark-1.3-contributor:medium
    web:
      - anthropic/claude-opus-5-5
      - web/duckduckgo
      - web/startpage

The muse-spark models in my example come from my OpenCode Go subscription, so swap in whatever models you have access to.

What you can do in omp that you can't in Claude Code#

Prewalk: let an expensive model work until it begins editing files, then immediately hand off to your smol model to follow the pattern. Stencil found this retains 92-97% of the frontier model's pass rate at roughly half the cost. Enable it with --prewalk, or run /prewalk mid-session.

Snapcompact: instead of summarizing the conversation when the context fills up, omp renders it as images in a pixel font. Models with vision (eg: Claude) can read these almost verbatim, often at 1/3 the token cost. Since it's done locally, you don't even need to make a model call for compaction. By default, omp will try to compact with the provider first. If you want to prefer snapcompact, add the following to your config file:

~/.omp/agent/config.ymlyaml
compaction:
  methodOrder: [snapcompact, remote, handoff, shake, soft]

Cache warming: right before your prompt cache expires, omp will resend your last request with a one-token output limit. This keeps your cache alive through short breaks so your next message doesn't pay the full token price to rebuild it. omp is smart enough to only do this when the savings of this feature outweighs the cost of the cachebust and refresh, and it stops keeping the cache warm after thirty minutes of inactivity. This functionality is enabled by default.

/omfg: did the agent just do something you never want to see again? Run /omfg and omp will create a rule based on the conversation that will interrupt and re-attempt the next time the agent tries the same thing.

omp stats: a local dashboard to view usage, cost, and analytics across all providers and models.

Use multiple accounts for a given provider. Log in with two or more Claude Max (or other) accounts, and omp will automatically load balance usage between them.

What you can do in Claude Code that you can't (yet) in omp#

Most of what's missing is proprietary cloud functionality that runs on Anthropic's servers:

  • Cloud session management, routines, Projects, the Claude mobile app. You can open a session in your browser with /collab, but you won't get push notifications.
  • The code review GitHub app, /ultrareview, and @claude in GitHub/GitLab/Slack. omp has /review, which runs locally.

Some local features Claude Code has that omp doesn't yet:

  • /rewind: in omp, this will only rewind the conversation, not the files. You should probably commit often if you frequently use this feature.
  • Sandboxing for bash commands: in omp you can set approval rules to control what it's allowed to run, but it will have full access to your machine for anything it's allowed to run.
  • Artifacts, scheduling. There are community projects like open-artifacts. If your editor supports ACP, you can use omp acp. There are also community plugins for VS Code and JetBrains.

If there's a feature you need that omp doesn't have, one power move to try is to just ask omp itself to build a plugin for it. I've had pretty decent success with this, and from my experience, Sonnet and Opus can often one-shot your desired customizations to omp.

Should you use omp instead of Claude Code?#

I don't have a benchmark or an eval. I just really enjoy using it.

If you're a terminal user with subscriptions to multiple AI providers, or if you like tinkering with your tooling, I think you'll enjoy omp. If you're heavily relying on Claude Code's cloud features, or you're uncomfortable with how omp logs in to your Claude subscription, then you might want to hold off.

Either way, it's quick to try. Paste the prompt at the top of this post into Claude Code and see what it says.

Wes Copeland

Full-stack engineer in Cambridge, MA. I run RetroAchievements' web platform, once held the Donkey Kong arcade world record, and write here about AI and software.