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.
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:
- Install omp with
curl -fsSL https://omp.sh/install | sh. - Run
ompand log in with your Claude subscription. - If you want omp to ask before it edits files or runs commands, add
tools.approvalMode: always-askto ~/.omp/agent/config.yml (more in Permissions). - 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:
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:
# macOS and Linux
curl -fsSL https://omp.sh/install | sh
# Windows (PowerShell)
irm https://omp.sh/install.ps1 | iexRun 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.
tools:
approvalMode: always-askYou 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:
tools:
approval:
eval: prompt
bash:
patterns:
- match: "rm -rf *"
approval: deny
- match: "git push*"
approval: promptA 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:
omp plugin install guard@casonadams-pluginsWhat 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:
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:
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:
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:
composer:
shape: claude
symbolPreset: nerdMost 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:
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.
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/startpageThe 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:
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@claudein 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.