One conflict, one URL.
Each merge conflict becomes one URL. The agent writes @theirs, @ours, or @base to conflict://N and the file resolves cleanly. Bulk form: conflict://*.
The most capable agent surface that ships. Continuously tuned by real-world use — complete out of the box, unapologetically native. Windows-native, no WSL.
curl -fsSL https://omp.sh/install | shMIT · macOS · Linux · Windows · bun ≥ 1.3.14 · read the source ↗
Edits land on the first attempt. Reads summarize instead of dumping the file, and searches come back before the model notices. Pick any model — omp will get it right.
Originally built on Mario Zechner’s wonderful Pi, omp adds everything you’re missing.
Most harnesses give the agent a Python sandbox and call it done. Ours runs persistent Python and a Bun worker, and either kernel can call back into the agent’s own tools — read, search, task — over a loopback bridge. The agent loads a CSV with tool.read from inside Python, charts it from JavaScript, and never leaves the cell.
Ask for a rename and you get a rename. The call goes through workspace/willRenameFiles, so re-exports, barrel files, and aliased imports update before the file moves. Everything your IDE knows, the agent knows.
A C binary segfaults: the agent attaches lldb, steps to the bad pointer, reads the frame. A Go service hangs: it attaches dlv and walks the goroutines. A Python process is wedged: debugpy, pause, inspect, evaluate. Most agents are still sprinkling print statements.
Your rules sit dormant until the model goes off-script. A regex match aborts the stream mid-token, injects the rule as a system reminder, and retries from the same point. You get course-correction without paying context tax on every turn. Injections survive compaction, so the fix sticks.
Split a job across workers and get typed results back. task fans out into isolated worktrees, each worker runs its own tool surface, and the final yield is a schema-validated object the parent reads directly. No prose to parse, no merge conflicts between siblings, no orphaned edits.
Pair a reviewer model to the 'advisor' role and it reads every turn the main agent takes, injecting notes inline — a quiet aside, a concern, or a hard blocker. It runs on its own context and its own model, so it catches what the doer rushed past. The main agent sees the note and course-corrects, or tells you why it won't.
/collab puts your live session on a relay and hands back a link — and a QR. A teammate joins from another terminal with omp join, or just opens it in a browser. Share read-write to pair on the same agent, or /collab view for a read-only link anyone can watch but no one can steer. Frames are sealed client-side; the relay never sees your keys.
web_search chains fourteen ranked providers and hands whatever URLs it finds straight to read. Arxiv PDFs, GitHub pages, Stack Overflow threads come back as structured markdown with anchors intact — the same tool surface you use on local files. Cite, follow, quote, never lose where you came from.
Other agents shell out to rg, grep, find, and bash. On many machines those binaries don’t exist, and on the ones where they do, every call costs a fork-exec round-trip. omp links the real implementations into the process. ripgrep, glob, find: in-process. brush is the bash, with sessions that survive across calls. The same omp binary runs on macOS, Linux, and Windows — no WSL bridge.
Get a clear verdict on whether the change ships, with every issue ranked P0 through P3 and scored for confidence. /review spawns dedicated reviewer subagents that sweep branches, single commits, or uncommitted work in parallel. You tackle what blocks release first; nothing important hides in a wall of prose.
Perfect edits, fewer tokens. The model points at anchors instead of retyping the lines it wants to change, so whitespace battles and string-not-found loops just stop happening. Edit a stale file and the anchors diverge — we reject the patch before it corrupts anything. Grok 4 Fast spends 61% fewer output tokens on the same work.
Other harnesses bolt on gh_issue_view, gh_pr_view, gh_search — each with its own parameters the agent has to learn and you have to debug. We skipped that. read already handles paths; PRs are paths. One interface to teach the model, one surface to keep correct.
The agent remembers your codebase between sessions — now backed by mnemopi, a local SQLite store with vector embeddings and graph tools. It writes facts mid-run with retain, pulls them back with recall, synthesizes with reflect, and revises them by id with memory_edit. Scoping is global, per-project, or per-project-tagged, and delegated subagents inherit the parent's memory state.
Run omp inside Zed and you get the same agent you drive from the terminal — reading the buffer you’re actually looking at, writing through the editor’s save path, spawning shells in the editor’s terminal. Destructive tools pause for a permission prompt you can answer once and forget. No bridge, no plugin, no second brain to keep in sync.
Every other agent ships an importer and expects you to convert. omp reads the eight formats already on disk in their native shape — Cursor MDC, Cline .clinerules, Codex AGENTS.md, Copilot applyTo, and the rest. No migration script, no YAML-to-TOML port, no "supported subset" footnotes. The config your team wrote last quarter still works tonight.
omp reads the working tree through git_overview, git_file_diff, and git_hunk, then splits unrelated changes into atomic commits ordered by their dependencies. Cycles are rejected before anything is written. Source files score above tests, docs, and configs, so the headline commit is the one that matters. Lock files are excluded from analysis entirely.
full changelog & details · README › highlights ↗
Live session sharing over an E2E-encrypted relay, every account's rate limits in one command, compaction rendered as dense images, a local memory system, rules derived from the agent's own slip-ups, on-device housekeeping — the wave that landed since the last cut.
/collab prints a room#key link; /join renders the same session natively in another TUI — guests prompt, interrupt, and drive the host's subagents while machine-mutating commands stay host-only. AES-256-GCM end to end, keys only in the URL fragment, view-only links for watchers, and browser guests join the same link with no install.
omp usage draws a bar per limit window for every provider and signed-in account — amounts, reset times, plan, a ✦ saved resets marker — and --history adds sparklines. /usage reset redeems a saved Codex reset by hand; opt-in codexResets.autoRedeem spends one only when the weekly limit blocks a turn and no other account can take it.
compaction.strategy = snapcompact replaces the summarizer with a deterministic on-device render — pixel-font PNGs the model reads back near-verbatim at about a third of the input price. snapcompact.shape auto-tunes the frame per model; /context shows the estimated savings.
mnemopi is a local SQLite memory backend (memory.backend = mnemopi) with vector embeddings and graph tools. The agent curates facts with retain, recall, reflect, and memory_edit — update, forget, or invalidate by id; scoping runs global, per-project, or per-project-tagged, and delegated subagents inherit the parent's memory state.
The eval kernel orchestrates. completion() runs a stateless graded call — your judge; agent() dispatches a subagent under a JSON-Schema contract; parallel() and pipeline() fan work through bounded pools and stage barriers; a per-turn budget caps spend. The workflowz keyword turns the whole task into that contract.
Pick how context is reclaimed with compaction.strategy. shake surgically elides heavy tool results and large blocks with no LLM cut-point — joined by handoff and snapcompact over the original context-full.
/omfg <complaint> — type what annoyed you. omp drafts a time-traveling stream rule from the conversation where things went wrong, checks the condition against that same transcript (would it have fired?), shows a live draft panel you can amend, and registers it on save under .omp/rules/. Bundled TypeScript and Rust convention rules ship in the box (ttsr.builtinRules).
One shared tiny-model worker handles session titling and mnemopi memory extraction and consolidation — all on local transformers.js models (qwen3-1.7b, gemma-3-1b, qwen2.5-1.5b, lfm2-1.2b), GPU-first via providers.tinyModelDevice, pulled with omp tiny-models download. None of it leaves the machine.
Session JSONL no longer has to sit on local disk. RedisSessionStorage (bun:redis) and SqlSessionStorage (Postgres, MySQL/MariaDB, or SQLite — dialect auto-detected) are SessionStorage backends with an in-memory mirror and queued async writes, exported for SDK consumers.
The auto level classifies each real user turn and resolves a concrete low → xhigh effort — cheap turns stay cheap, hard ones get the budget. Runs online through smol or an opt-in on-device classifier via providers.autoThinkingModel.
/login adds xAI Grok over OAuth (Grok-4.x), OpenRouter by validated key-paste with :nitro/:floor/:exacto routing, and Wafer Pass + Serverless. Still 40+, one /model away.
A tts tool speaks through Grok Voice (ara, eve, leo, rex, sal — WAV or MP3) and generate_image draws through grok-imagine-image, both in the same agent loop.
vault://<vault>/<path> reads and edits Obsidian notes through the same read, edit, and search tools, gated behind vault.enabled.
replace block N: and delete block N resolve a full syntactic construct through tree-sitter and rewrite its whole span without counting the closing line — a verb-based v4 grammar over opaque snapshot tags the model can't guess from file content.
Drop the standalone word orchestrate — like ultrathink — and omp switches into a multi-phase, parallel-subagent contract, with a live agent roster you can view-as into (Ctrl+S).
omp completions bash|zsh|fish prints a script generated from live command and flag metadata; --model and --resume complete against the catalog and your on-disk sessions.
omp plugin install github:user/repo — plus GitLab/Bitbucket shorthand and full git URLs — and a top-level omp install. The omp-plugins provider discovers skills, hooks, tools, commands, rules, and .mcp.json.
search now resolves internal URLs like omp:// as targets — scanning in-memory resources alongside files, honoring line-range suffixes, and expanding a match across multiple internal documents.
full changelog · coding-agent CHANGELOG ↗
Every other harness compacts by calling a model: you wait out a summarizer turn, pay for it, and hope the rewrite kept the facts you'll need later. omp deletes that step. When the window fills, snapcompact renders the history into dense pixel-font PNGs in one deterministic pass and hands them back as images the model reads near-verbatim.
A render pass, not a model turn. There is no summarizer to wait on.
Rendered on-device, deterministically. Your history is never shipped off to a side model to be rewritten — no LLM pass decides which facts survive.
Zero compaction spend — no model call to bill. Reading the archive back costs about a third of the input price of the text it carries.
The mechanics: a 1568×1568 frame carries ~40,000 characters in a 6×10 pixel font — roughly 10k tokens of text, billed under Anthropic's pixel formula as 3,279 image tokens. The receipts on the right show what survives the trip, against the prose summaries that shredded it.
"The PNG isn't a picture of your context — it converges to being your context."
White-box evidence on Qwen2.5-VL-7B: cross-carrier retrieval matches the right question 12/12 from layer 2; question-similarity geometry correlates at r=0.94 whichever carrier delivered the context.
compaction.strategy = snapcompactarchive history as dense images — joins context-full, handoff, shake, off
snapcompact.shapeframe shape auto-picked per model; winning eval variants ship as presets
/contextshows the estimated savings before compaction runs
/settingsrenders a live shape preview
snapcompact.systemPrompt · snapcompact.toolResultsexperimental inline imaging beyond history
vision requiredtext-only models fall back to context-full
The host types /collab and gets a link. A guest types /join <link> from any directory on any machine, and the same session renders natively in their own TUI — streaming assistant text, tool-call cards, the footer's cwd / model / context % / cost, ctrl+o expansion, /dump. No terminal mirroring, no pixels — real session frames.
Guests on a full link prompt the agent — every transcript entry carries an author badge — interrupt with Esc, and work the Agent Hub against the host's subagents: live table, chat and steer, kill, revive, transcript viewing. A view-only link admits watchers — the host verifies a write token at join and rejects prompting, interrupting, and agent control without it; read-only peers are badged in the participants list. Anything that mutates the host machine stays host-only: /model, /compact, bash !, python $, skills.
Every payload is sealed with AES-256-GCM before it touches the socket. Links come in two strengths: a full link packs the 32-byte room key plus a 16-byte write token into the URL fragment (48 bytes, base64url); a view-only link carries the bare key. Fragments never appear in HTTP requests, so the relay sees neither. What it does see: room ids, connection counts, opaque ciphertext frames and their sizes, and a 4-byte routing prefix. Possession of the link is the trust boundary.
collab-web is a standalone web client for the same links — no omp install. Live transcript with streaming text, thinking, and tool cards, a subagent panel, and a composer with the same guest powers. It ships as static dist/; the key stays in the fragment and the page talks only to the relay.
/collabstart sharing — prints the room#key link/collab viewprint a view-only link for watchers/join <link>enter from any directory, any machine/leaverestore the guest's previous session/collab statuslink + participants/collab stopclose the roomLink format: <room>#<key> — mgAYTZwEnpRQtca0CTgn-Q#gdJUbTovD94o… — everything after # stays in the client.
Twelve internal schemes — pr://, issue://, agent://, skill://, rule://, and the rest — resolve transparently inside every FS-shaped tool the agent already calls. read pr://1428 returns the same shape as read src/foo.ts. search walks a diff like a directory. agent://<id>/findings.0.path pulls a field out of a subagent’s output by path.
There is no gh view, no skill show, no agent get. The tool count stays flat because the URL space carries the variation — and the model already knows read.
PRs and issues cache on disk; second reads come back free. Selectors compose — pr://1428/diff/2:50-100 lands on lines 50–100 of the second changed file. :50+150, :raw, :conflicts behave on URLs the way they behave on paths.
Two flows, captured straight out of omp. Merges become writable URLs — conflict://N with @ours / @theirs / @base shorthands. Codemods stage a preview the agent has to resolve before anything lands. Both reuse read, write, and ast_edit — no merge UI, no codemod runner. The screenshots below are the actual TUI output.
Each merge conflict becomes one URL. The agent writes @theirs, @ours, or @base to conflict://N and the file resolves cleanly. Bulk form: conflict://*.
ast_edit returns a (proposed) card with the replacement count. The change is staged. The agent calls resolve with a reason; the TUI turns it into an Accept card and the disk move happens — atomic, all or nothing.
32 tools live in the same namespace as read and bash. Pin the active set with --tools read,edit,bash,… and the rest stay hidden but indexed — search_tool_bm25 pulls them back in mid-session when tools.discoveryMode says so.
Setting-gated, off by default: github, inspect_image, render_mermaid, tts, checkpoint, rewind, search_tool_bm25, retain, recall, reflect, memory_edit. Flip them on once, scoped per project.
/model away.Roles route work by intent. default for normal turns. smol for cheap subagent fan-out. slow for deep reasoning. plan for plan mode. commit for changelogs. Override at launch with --smol, --slow, or --plan; cycle through the configured models for the active role with Ctrl+P.
Direct APIs and gateways. Mix providers per role.
Subscription-routed. /login attaches the session.
OpenAI-compatible /v1/models. Local instances skip the key.
Declare anything that speaks openai-completions, openai-responses, openai-codex-responses, azure-openai-responses, anthropic-messages, google-generative-ai, or google-vertex in ~/.omp/agent/models.yml.
Per-role chains under retry.fallbackChains. When the primary throws 429s or hits a quota wall, the next entry takes the rest of the turn — restored on cooldown.
Scope entries in enabledModels or disabledProviders with paths: to pin a different model list on one repo without touching the global config.
Stack API keys per provider and the runtime rotates with session affinity and per-credential backoff. Useful when one key would burn its quota by lunch.
web_search is built in, not bolted on. auto walks a fourteen-provider chain; pin one by name if you already pay for it. Behind every hit, site-aware extraction turns GitHub, registries, arXiv, Stack Overflow, and docs into structured markdown — anchors and link targets survive.
Fourteen backends. Pin one, or let auto walk the chain in order.
The agent gets structured content, not stripped HTML.
Vuln lookups answer with vendor data, not blog summaries.
Pages convert to markdown with link structure intact. The agent can cite, follow, and quote without losing anchors.
web_search reference ↗Stealth’s on by default, so pages see a normal user instead of a headless bot. The same API drives any Electron app in place — point it at Slack and the agent reads your DMs the way it reads the web.
Seven crates plus a vendored shell and coreutils, one platform-tagged N-API addon. Search, shell, AST, highlight, PTY, image decode, BPE counting — all in-process on the libuv pool. No fork/exec on the hot path.
| Module | What it does | ~LoC |
|---|---|---|
| shell | Embedded bash · persistent sessions · timeout/abort · process-tree control · custom builtins | 31,130 |
| coreutils | ls · find · grep · sort · tail · wc · fd — in-process builtins, no fork, no PATH | 28,910 |
| minimizer | Trims command output before the model reads it · per-tool detectors · staged filter pipeline | 23,880 |
| walker | One traversal fast path — glob · fd · grep candidates · workspace scans · mtime-keyed cache | 4,910 |
| iso | Workspace isolation shim · apfs · btrfs · zfs · reflink · overlayfs · projfs · rcopy | 3,420 |
| ast | ast-grep pattern matching and structural rewrites | 2,370 |
| grep | Regex search · parallel/sequential · glob & type filters · fuzzy find | 2,140 |
| text | ANSI-aware width · truncation · column slicing · SGR-preserving wrap | 1,640 |
| snapcompact | Compaction frames — text in, pixel-font PNG out, deterministic, no model call | 1,440 |
| keys | Kitty keyboard protocol with xterm fallback · PHF perfect-hash lookup | 1,330 |
| summary | Tree-sitter structural source summaries with elision controls | 1,250 |
| pty | Native PTY allocation for sudo · ssh interactive prompts | 470 |
| block | Syntactic block resolution behind hashline's .BLK edit ops | 460 |
| highlight | Syntax highlighting · 11 semantic categories · 30+ aliases | 400 |
| appearance | Mode 2031 + native macOS dark/light via CoreFoundation FFI | 290 |
| task | Blocking work on libuv thread pool · cancellation · timeout · profiling | 250 |
| power | macOS power-assertion API for idle/system/display-sleep prevention | 200 |
| prof | Circular buffer profiler with folded-stack and SVG flamegraph output | 170 |
| clipboard | Text copy and image read from system clipboard · no xclip/pbcopy | 80 |
| tokens | O200k / Cl100k BPE token counting · both tables embedded | 40 |
| sixel | Terminal image rendering · decode PNG · JPEG · WebP · GIF · resize · SIXEL encode | 30 |
| html | HTML to Markdown with optional content cleaning | 30 |
Same engine, four wrappers. omp runs the TUI. omp -p answers a single prompt and exits. The Node SDK embeds the session in your process. omp --mode rpc and omp acp hand the wheel to another program over stdio.
The TUI is the default surface. Tool calls render as cards, edits preview before they land, and ambiguity routes through the ask tool — a structured option picker the agent can call mid-turn. The keyboard handles the rest.
The same prompt cards surface over ACP, so editors get the picker without writing one.
@oh-my-pi/pi-coding-agentNode and TypeScript hosts pull the engine in directly. The package exposes ModelRegistry, SessionManager, createAgentSession, and discoverAuthStorage; the session emits typed events you subscribe to.
import {
ModelRegistry, SessionManager,
createAgentSession, discoverAuthStorage,
} from "@oh-my-pi/pi-coding-agent";
const auth = await discoverAuthStorage();
const models = new ModelRegistry(auth);
await models.refresh();
const { session } = await createAgentSession({
sessionManager: SessionManager.inMemory(),
authStorage: auth, modelRegistry: models,
});
await session.prompt("list .ts files");omp --mode rpcFor non-Node embedders, or when you want process isolation. NDJSON commands in, response and event frames out. --mode rpc-ui adds tool cards, selectors, and dialogs as extension_ui_request frames the host must answer.
$ omp --mode rpc --no-session
> {"id":"r1","type":"prompt","message":"list .ts files"}
< {"id":"r1","type":"response", ...}
> {"id":"r2","type":"set_model","provider":"anthropic","modelId":"sonnet-4.5"}
> {"id":"r3","type":"abort"}omp acpThe Agent Client Protocol over JSON-RPC. When the editor advertises capabilities, tool I/O routes through it and writes are gated by session/request_permission.
bashterminal/create + terminal/outputreadfs/read_text_filewritefs/write_text_fileedit, bashsession/request_permissionomp is a fork of Pi by Mario Zechner, rewritten as a coding-first surface: sessions, subagents, slash commands, extensions — all TypeScript, all MIT, all on GitHub. Shape it from config, hook it from outside, or read the source when you need to.
curl -fsSL https://omp.sh/install | sh/reload-plugins. Keep it local, ship it in a marketplace, or publish it to npm.