oh-my-pi

can1357MIT活跃维护 有专家点评

把 IDE 直接接进终端的编码智能体,支持 Claude、OpenAI 等多模型和 MCP,让命令行里也能完成读写代码、调用工具的完整开发流程。

⌥ Coding agent with the IDE wired in. Built by Stencil Labs.

v18.18.7发布于 2026-11-10 20:23 UTC38,596star +492 / 7 天4,394fork同步于 2026-11-11 05:19 UTC

专家点评

上手难度:进阶更新于 2026-11-11

把 LSP 和真实调试器接进终端编码 agent,让模型改代码前先拿到类型和运行时信息

适用场景

  • 大型 TypeScript/Python 仓库里做跨文件重命名或签名改动:写入时走 LSP 的 workspace/willRenameFiles,比纯 grep+sed 的 agent 少一轮「改完编译报错再回滚」的循环
  • 排查需要断点的问题(段错误、异步竞态、Python 异常栈):能驱动 lldb/dlv/debugpy,不用人肉把调试输出贴回对话里
  • 上下文预算紧的长会话:read 返回摘要而非整文件,同样的窗口能多塞几个文件,代价是你得接受摘要可能漏掉细节
  • 多模型切换的日常编码:60+ provider 且按模型调提示词,换模型不用重写 system prompt;单模型深度绑定的场景这个优势用不上

踩坑

  • 从源码构建或改 Rust 部分时:需先 bun setup 构建本地 Rust/N-API 插件,改完 Rust 要重跑 build:native,跳过这步会拿到和源码不一致的二进制
  • Alpine/musl 环境:预编译二进制直接跑不起来,得先 apk add libstdc++ libgcc,容器镜像里最容易撞上
  • issue 里反复出现的是 TUI 交互形态类需求(全屏固定底栏、alternate-screen 滚动时保持输入可见、subagent 活动实时预览),说明终端 UI 的滚动/多任务可见性目前不是它做得好的一块;重度依赖多 agent 并行观察的工作流要提前确认
  • 系统提示词体积对本地小模型偏重,issue 里有专门要求精简版提示词的条目;本地跑小参数模型时上下文会被系统提示吃掉一块

同类对比

同类是 Claude Code、Aider、Cline 这类终端/编辑器内编码 agent;如果你的核心诉求是 IDE 图形界面而不是终端,或者只需要单文件小改动,这套 LSP+调试器接入的复杂度换不来收益,用更轻的 agent 更划算。

怎么上手

由 README 提炼,执行前请确认
curl -fsSL https://omp.sh/install | sh
bun install -g @oh-my-pi/pi-coding-agent
硬件要求按 README 说明

README 未说明显存或 GPU 要求;支持 macOS、Linux、Windows,需 bun ≥ 1.4.4,Alpine/musl 需先装 libstdc++ 与 libgcc

支持 Apple Silicon
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

把 IDE 能力接进终端的编码 agent,让模型改代码一次到位

把 IDE 直接接进终端的编码智能体,支持 Claude、OpenAI 等多模型和 MCP,让命令行里也能完成读写代码、调用工具的完整开发流程。

核心能力

  • 内置 31 个工具,read 返回摘要而非整文件
  • LSP 接入每次写入,重命名走 workspace/willRenameFiles
  • 可驱动 lldb、dlv、debugpy 真实调试器
  • Python 与 Bun 内核可回调 agent 自身工具
  • 支持 60+ 模型提供商并针对各模型调优提示词

容易踩的坑

Alpine 等 musl 系统需先 apk add libstdc++ libgcc,否则预编译二进制无法运行;从源码跑需先执行 bun setup 构建本地 Rust/N-API 插件,改 Rust 后要重跑 bun run build:native;Nix 下 Wayland 录屏默认关闭,需 omp.override { withWaylandScreencast = true; } 开启

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v18.18.7
  1. v18.18.7最新正式版2026-11-10 · 2026-11-10 20:23 UTC

    @oh-my-pi/pi-ai

    Added

    • LiteLLM usage adapter (@oh-my-pi/pi-ai/usage/litellm) reporting a gateway's key and user USD budgets (#17873 by @maykonmichel)
    • UsageApi.replaceConfiguredProviders registers configuration-sourced usage providers between runtime overrides and the built-in resolver, and UsageProvider.usesRequestKey makes aggregate usage probe only the key inference would send (#17873 by @maykonmichel)

    Changed

    • Providers with a login-warning auth rule show their account risk before a new login and start it only after the user answers yes; any other answer or a cancel stores nothing, and their login-list entry is marked "(at your own risk)" (#18499)

    Fixed

    • Claude Fable launch resets now report the Fable weekly limit they clear instead of an unknown window (#18661 by @TheAifam5)

    @oh-my-pi/pi-catalog

    Added

    • Added Muse Ember (muse-ember-1.0) on Meta Model API and Muse Code with the minimal–max reasoning effort ladder and its >200K long-context pricing
    • Added the login-warning "<text>" auth rule, which makes a new login accept the stated account risk first (#18499)

    Changed

    • Resumed Google Antigravity behind a login warning instead of pausing it (#18499)

    Fixed

    • Morph (api.morphllm.com) requests now send x-session-id, keeping a conversation on the worker that holds its prompt cache (#18704 by @wolfiesch)

    @oh-my-pi/pi-coding-agent

    Added

    • /usage and omp usage show LiteLLM key and user budgets for the built-in litellm provider and every models.yml provider with discovery.type: litellm, unless listed in disabledProviders (#17873 by @maykonmichel)
    • Extensions can ask the operator before an interactive quit, or cancel it, with session_before_shutdown; a further /exit or Ctrl+D skips the pending prompts and closes (#18424 by @aw1cks)

    Changed

    • Saved-reset auto-redeem is set per window: codexResets.autoRedeem5h/autoRedeemWeekly and claudeResets.autoRedeem5h/autoRedeemWeekly/autoRedeemFable replace each provider's autoRedeem, whose value migrates into the 5h and weekly keys; a Claude Fable launch reset is governed by autoRedeemFable alone and spent only for a block that includes the Fable weekly cap, or before expiry when Fable usage is above zero (#18661 by @TheAifam5)
    • Sessions without a prompt UI (such as omp -p) no longer spend saved resets while auto-redeem is unset, even ones about to expire (#18661)
    • Google Antigravity is back in /login and omp login, marked "(at your own risk)": a new login first explains that Google may suspend accounts that sign in from third-party tools and continues only after you type yes; saved Antigravity logins work again (#18499)
    • On Windows, the bash tool's description tells the model it runs in an emulated bash environment, not cmd or PowerShell, so it writes bash instead of dir, %VAR% and other cmd syntax

    Fixed

    • Extension prompts shown from session_before_* handlers no longer time out after 30 seconds while the operator is still answering (#18424 by @aw1cks)
    • A
  2. v18.18.62026-11-09 · 2026-11-09 23:30 UTC
    查看更新说明

    @oh-my-pi/pi-catalog

    Fixed

    • LiteLLM lists only the models the configured key can call (its authenticated /v1/models), keeping the proxy's metadata for them; a proxy whose /v1/models fails now lists no models instead of every model it serves (#18601)

    @oh-my-pi/pi-coding-agent

    Added

    • In Tern, a turn's long-press menu on a phone can edit and resend a prompt, retry the turn, open the rewind page on it, or fork the session from it into a new session
    • A rewind from the transcript says how many turns it dropped and offers Undo on its toast in Tern, which puts the turns and your draft back

    Changed

    • Browser role/ selectors in Chrome tabs now match the role and name Chrome's accessibility tree reports, so they reach open shadow roots and skip hidden elements; in Tern every name observe() reports selects its element again (#18632 by @will-bogusz)

    Fixed

    • A late usage-limit error from a previous provider no longer blocks or cools down the selected provider; when the old provider has spent its retry budget, a replay-safe turn still tries the selected model without the old quota delay (#17098, #17571 by @Bensonluo)
    • Multi-question ask forms in Tern show Submit on the last question tab, not only on the Review tab
    • MCP headers and stdio env values that use !command now run again on a 401/403 (the request is retried once), on /mcp reconnect and other reconnects, and on /mcp reload, so servers whose command mints short-lived tokens keep working past expiry instead of staying 401 until restart (#18631)
    • Pausing an unapproved plan no longer tells the agent that the draft was approved or to continue executing it, and pausing with /plan closes an open plan review so it can no longer save and execute the plan (#18610).
    • Turning off lsp.enabled now also stops write and edit from starting language servers for diagnostics or formatting; previously only the lsp tool was disabled (#18205, #18490 by @yuzu-octopus)
    • Fixed background tabs omp borrows (relay app.target, app.cdp_url) ignoring omp's clicks and keys or timing out on hover and drag; the page reads as visible while omp drives it and hidden again once released (#17831 by @will-bogusz)
    • Fixed the transcript jumping at the screen's top edge while scrolled back during a streamed reply, and the screen dropping two rows when a reply finished (#12307, #16117 by @galtamam-cmyk)
    • Focusing a subagent or returning to the main session no longer loses or freezes the next assistant reply when a fast tool turn finishes before the previous reply's links finish resolving, and messages and tool runs that arrive during the switch show exactly once, in order (#18564 by @eggpeat)
    • omp gc --strip now keeps every response of the latest replay turn (including earlier tool-call steps joined by their tool results), reference-only images, and the transcript's file permissions (#18636 by @eggpeat)
    • Session files whose entries were written without ids are re-indexed when loaded, and migrating old sessions no longer gives two entries the same id ([#18636](https://github.com
  3. v18.18.52026-11-09 · 2026-11-09 19:35 UTC
    查看更新说明

    @oh-my-pi/pi-catalog

    Added

    • Added Claude Fable 5.2 and Claude Mythos 5.2 ($8/$40 per MTok, $0.20 cache reads, 1M context)

    Fixed

    • Fixed newly discovered Anthropic Fable/Mythos models showing as text-only, non-reasoning, and mispriced before models.dev catalogs them
    • Fixed Claude Mythos 5.1 not using thinking prefix-binding controls, which it needs on every account

    Full Changelog: https://github.com/can1357/oh-my-pi/compare/v18.18.4...v18.18.5

  4. v18.18.42026-11-09 · 2026-11-09 18:57 UTC
    查看更新说明

    @oh-my-pi/pi-ai

    Added

    • Added the base64SkipThoughtSignature compat flag so Gemini gateways that decode thoughtSignature as base64 (such as the Hyperspace AI LLM proxy) can receive the unsigned-tool-call bypass sentinel without rejecting the request with a 400 (#18586 by @tuandinh0801).

    Changed

    • Providers paused by a disabled auth rule (currently Google Antigravity) are left out of the built-in login list, refuse login, token refresh and usage probes, resolve no key from any source, and refuse requests and image generation with the pause reason; stored logins are kept and work again once the rule is removed, and an extension that registers its own login under the paused id takes it back (#18622 by @H4vC)

    Fixed

    • Exclusive tools (edit, write, eval, …) called as Cursor MCP tools now keep their place in the tool batch, so a shell or read sent with an edit no longer runs against the old file or starts before an earlier call finishes (#18502 by @eggpeat)

    @oh-my-pi/pi-catalog

    Added

    • Added Otari gateway provider: /login otari with OTARI_API_KEY, models discovered live per workspace (#17841 by @tbille)
    • Added the base64SkipThoughtSignature Google compat flag, which sends the Gemini unsigned-tool-call bypass sentinel base64-encoded for gateways that decode thoughtSignature as bytes (#18586 by @tuandinh0801).
    • Added a disabled "<reason>" auth rule that pauses a provider: no login offers it and nothing calls it, while its code and users' stored logins stay in place (#18622 by @H4vC)

    Changed

    • Paused Google Antigravity, since Google may restrict accounts that use it outside its own apps (#18622 by @H4vC)

    @oh-my-pi/pi-coding-agent

    Added

    • SDK: PromptOptions.followUps queues prompts to run after the prompt, in order; if the prompt never reaches the agent they come back with it in DroppedPrompt.followUps

    Changed

    • The task tool no longer advertises a per-call model field unless task.perCallModel is on or the bundled seance is spawnable; a model sent anyway is still refused before dispatch (#18554 by @xiangnan0811)

    Fixed

    • /usage, session statistics, and omp stats now include session title spend from both the default fork title and the tiny title model, and tiny-model titles count toward --max-cost (#18177, #18491 by @yuzu-octopus)
    • Retries after --model pi/<role> (or @<role>, <role>) now walk that role's retry.fallbackChains entry instead of the default chain, including on --continue (#18389, #18534 by @harshaygadekar)
    • Fixed a -> / => list sent to an idle session running its second item before its first; if the first item can't start (Esc, a refused or failed setup), the whole list goes back to the editor (#10802)
    • Fixed auto-compaction repeating every turn when the system prompt and tool schemas alone exceed the compaction budget; it now warns once instead (#18589).
    • Fixed a blank per-call model ("" or white
  5. v18.18.32026-11-09 · 2026-11-09 03:59 UTC
    查看更新说明

    @oh-my-pi/pi-catalog

    Changed

    • Added a balanced delegation bias between eager and restrained; models without a delegation-bias rule now resolve to it instead of eager

    @oh-my-pi/pi-coding-agent

    Breaking Changes

    • The ask tool takes one HTML form ({ html }) instead of questions[]: the model writes a <form> of radios, checkboxes, selects, text inputs and textareas with its recommendation preselected, and receives the submitted form data as JSON. AskToolDetails is now { answers: { name, question, answer }[]; timedOut? }; QuestionResult, the "Other", "Chat about this", answer-note and answer-image paths of the tool are removed, and /tree re-answer reopens the original form (NavigateTreeResult.reopenAsk carries html).

    Added

    • In Tern, right-clicking an ask answer offers Note, which annotates that answer without picking it (#18551 by @H4vC)
    • task.eager (preferred/always) now shapes only the main agent's system prompt; subagents fall back to their model's own delegation policy instead of being pushed to spawn further subagents
    • ask forms can show pictures: <img src> from an http(s) URL, a data: URI or a local file (relative to the session's working directory), and inline <svg> diagrams, drawn in the terminal form and natively in Tern
    • ask forms give every radio and checkbox group a free-text "Other" answer: its text is the radio's value or is appended to the checkbox group's array (field-by-field fallback, collab guests and ACP elicitation included)
    • Extension UI gains optional ui.formDialog(html, options), which renders an HTML <form> and resolves to { data, timedOut? } (undefined when cancelled). The interactive TUI renders it as a form dialog, ACP clients with form elicitation get one elicitation with a property per field, and hosts without it (RPC) answer the ask tool field by field through select/input/editor.
    • Eval cells can run shell commands with sh: sh("git status") in Python, await sh`ls ${dir}` or await sh("make", { cwd }) in JavaScript. Commands run on the embedded bash engine to completion (never auto-backgrounded), return their output, and raise ShellError with the exit code on failure.
    • omp zsh on Windows runs omp's builtin utilities (ls, cat, head, jq, …) for commands PATH does not have, unless a command_not_found_handler handles them (#18532 by @H4vC).

    Changed

    • Clarified tool and internal-URL descriptions for history:// concise transcripts, proc:// job retention and parked-agent lookups, and read JSON query text output (#18553 by @xiangnan0811)
    • Models without a delegation rule (Claude, Gemini, …) no longer get pushed to delegate: the "map unknown code via task" rule and the "Task + scout" nudges in search tool descriptions are replaced by a light suggestion to explore unfamiliar subsystems with a scout
    • In Tern, clicking an ask answer and then Note now annotates the answer highlighted on the question shown instead of the one just clicked (#18551 by @H4vC)

    Fixed

    • Fixed ask notes added with n right after picking an answer landing on the previous question instead of the one shown; a Tern click then Note still notes the answer just clicked, and the Note button names it (#18317 by @DonMikone)
    • Fixed /export failing on Windows when saving in the current directory, including relative paths such as sub/../session.html; the export message now shows the full path of the written file (#18369, [#18525](https://github.com/can1357/oh-my-p

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    The most capable agent surface that ships. Continuously tuned by real-world use — complete out of the box, open all the way down.

    60+ providers · 31 built-in tools · 14 lsp ops · 28 dap ops · ~80k lines of Rust core.

    [!NOTE] Pull requests are temporarily open to everyone as a trial. We previously required a vouch before accepting PRs; that requirement is lifted for now while we evaluate how open contributions go. Depending on the results, the vouch system may return.

    Install

    macOS · Linux

    curl -fsSL https://omp.sh/install | sh
    

    Without a usable bun (or with --binary), the install scripts fetch the prebuilt binary from build.stencil.so and check its SHA-256 before installing it. Pin a release with curl -fsSL https://omp.sh/install | sh -s -- --binary --ref v<version> (PowerShell: -Binary -Ref v<version>).

    Alpine / musl: the prebuilt musl binary links libstdc++/libgcc dynamically, which stock Alpine does not ship. Install them first: apk add libstdc++ libgcc.

    Homebrew

    brew install can1357/tap/omp
    

    Bun (recommended)

    bun install -g @oh-my-pi/pi-coding-agent
    

    Nix

    # Run without installing
    nix run github:can1357/oh-my-pi
    
    # Or install into the active profile (Nix < 2.30: `nix profile install`)
    nix profile add github:can1357/oh-my-pi
    

    Flake consumers can use packages.<system>.omp, overlays.default, nixosModules.default, or homeManagerModules.default. A Home Manager configuration can install OMP and own its settings declaratively:

    {
      inputs.omp.url = "github:can1357/oh-my-pi";
    
      # In your Home Manager module:
      imports = [ inputs.omp.homeManagerModules.default ];
      programs.omp = {
        enable = true;
        settings.startup.quiet = true;
      };
    }
    

    Windows (PowerShell)

    irm https://omp.sh/install.ps1 | iex
    

    Pinned versions (mise)

    mise use -g github:can1357/oh-my-pi
    

    macOS · Linux · Windows · bun ≥ 1.4.4

    Shell completions

    omp generates its own completion scripts for bash, zsh, and fish from the live command/flag metadata, so they never drift from the actual CLI. Subcommands, flags, and enum values complete statically; model names (--model, --smol, --slow, --plan) resolve against the bundled model catalog and --resume against your on-disk sessions.

    # zsh — add to ~/.zshrc (or write the output into a file on your $fpath)
    eval "$(omp completions zsh)"
    
    # bash — add to ~/.bashrc
    eval "$(omp completions bash)"
    
    # fish
    omp completions fish > ~/.config/fish/completions/omp.fish
    

    Every tool, benchmaxxed.

    Edits that land on the first attempt. Reads that summarize files instead of dumping their content. Searches that return instantly. Pick any model — omp will get it right.

    modelmetricwhat
    Grok Code Fast 16.7% → 68.3%Tenfold lift the moment the edit format stops eating the model alive.
    Gemini 3 Flash+5 ppOver str_replace — beats Google's own best attempt at the format.
    Grok 4 Fast−61% tokensOutput collapses once the retry loop on bad diffs disappears.
    MiniMax2.1×Pass rate more than doubles. Same weights, same prompt.
    • read : summarized snippets · ideal defaults · selector hit rate
    • grep : fastest in the west
    • lsp : everything your IDE knows, the agent knows
    • prompts : adjusted relentlessly for each model

    Read the full post ↗

    The Pi you love, with batteries included.

    Originally built on Mario Zechner's wonderful Pi, omp adds everything you're missing.

    01 · Code execution w/ tool-calling

    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.

    omp TUI running Python code and rendering a chart.

    02 · LSP wired into every write

    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.

    omp TUI with TypeScript and Biome language servers active.

    Read the LSP config docs

    03 · Drives a real debugger

    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.

    omp TUI: a live lldb-dap session against a native binary at /tmp/omp-native/demo. Adapter=lldb-dap, Status=stopped, Frame=xorshift32, Instruction pointer 0x10000055C, Location demo.c:6:10. Debug scopes and Debug variables cards show locals (x = 57351) and the agent confirms the math: x went from 7 → 57351 (= 7 ^ (7<<13)).

    Watch the capture ↗

    04 · Time-traveling stream rules

    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.

    omp TUI: agent reading src.rs and about to write Box::leak when the request aborts (red Error: Request was aborted), an amber ⚠ Injecting rule: box-leak card injects the rule body Don't reach for Box::leak in production code paths, and the agent then course-corrects by proposing Arc<str> and asking the user to confirm.

    Watch the capture ↗

    05 · First-class subagents

    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.

    omp TUI showing task spawning two subagents ComponentsExports and RoutesExports, the constraints block requiring an IRC DM between peers, the per-subagent status cards with cost and duration, and a final Findings section listing both exports plus an honest 'IRC coordination note' about a one-sided handshake.

    Watch the capture ↗

    Watch the fan-out while it runs: Alt+A opens Agent Hub, where the roster shows current activity and usage for every subagent. Open one to read its live transcript, type a steering message, revive a parked worker, or kill a stuck one without aborting the parent session.

    06 · A second model, watching every turn.

    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.

    omp TUI: /advisor status shows the advisor running on openai-codex/gpt-5.5; after the main agent scopes a catch to ENOENT instead of swallowing every error, an amber 'Advisor 1 note (concern)' card warns the fix no longer matches the user's literal acceptance criterion.

    Watch the capture ↗

    07 · Hand someone the link, they're in.

    /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.

    omp TUI: /collab view prints 'Collab session started!' with an omp join command, a my.omp.sh browser link, the note 'Anyone with this link can watch the session but cannot prompt the agent', and a large scannable QR code.

    Watch the capture ↗

    08 · Read a pdf on arxiv, why not?

    web_search chains twenty-four 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.

    omp TUI: web_search returns 10 ranked Perplexity sources for inference-time compute scaling, the agent picks an arxiv paper, calls read https://arxiv.org/pdf/2604.10739v1, and summarizes the paper's headline result with real numbers.

    Watch the capture ↗

    09 · Unapologetically native. Even on Windows.

    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. The bash is our own bash 5.3 engine — with sessions that survive across calls, and 58 command-line utilities (ls, sed, sort, xargs, even jq) ported into the builtins crate and run in-process, zero fork/exec. The same omp binary runs on macOS, Linux, and Windows — no WSL bridge.

    10 · Code review with priorities and a verdict

    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.

    Want to steer the review yourself? /annotate code-review opens the diff so you can pin notes to lines before the reviewers run. /annotate also takes the latest reply, a session message, a file, or quoted text and pastes your notes into the prompt. See /annotate.

    11 · Hashline: edit by content hash

    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.

    12 · GitHub is just another filesystem

    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.

    13 · Memory the agent curates

    The agent remembers your codebase between sessions. It writes facts mid-run with retain, captures reusable lessons with learn, pulls them back with recall, and compresses each session into a mental model that loads on the first turn of the next one. Pick the engine with memory.backend — local, Hindsight, or Mnemopi. Project-scoped by default, so what it learns about this repo stays with this repo.

    14 · ACP: editor-drivable agent

    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.

    15 · Inherits what your other tools already wrote

    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.

    16 · omp commit: atomic splits, validated messages

    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.

    17 · Read PRs. Walk skills. Pull JSON out of subagents.

    Sixteen internal schemes — pr://, issue://, agent://, skill://, ssh://, 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. grep walks a diff like a directory. agent://<id>/findings.0.path pulls a field out of a subagent's output by path.

    18 · Conflict resolution, made easy.

    Each merge conflict becomes one URL. The agent writes @theirs, @ours, or @base to conflict://N and the file resolves cleanly. Bulk form: conflict://*.

    omp TUI: ✓ Read src/session.ts (⚠ 1 conflict), then ✓ Write conflict://1 · 1 line with content @theirs, then a confirmation 'Resolved.'

    Watch the capture ↗

    19 · Preview, then accept.

    ast_edit returns a (proposed) card with the replacement count. The change is staged. The agent writes a one-line reason to xd://resolve; the TUI turns it into an Accept card and the disk move happens — atomic, all or nothing.

    omp TUI: ✓ AST Edit: console.log($X) (proposed) 3 replacements · 1 file, then ✓ Accept: 3 replacements in 1 file (AST Edit), followed by 'Applied 3 replacements in src/auth.ts.'

    Watch the capture ↗

    20 · Drives a real browser. Or your Slack?

    Eval's browser.open(...) returns a tab handle with direct navigation, inspection, interaction, and element helpers; tab.run(...) handles custom JavaScript. It drives Chromium or Electron in an isolated tab runtime. Stealth is on by default, while the browser relay can adopt Chrome tabs you already have open without stealing focus.

    21 · Hands on the desktop itself

    Eval's computer helpers — computer.window(...), win.screenshot(), win.ax(), el.press(), plus computer.run(fnOrCode, options) for multi-step scripts — control the real host: enumerate windows and displays, capture screenshots, send native input, walk the OS accessibility tree, and use the clipboard. It exposes no browser DOM.

    Whatever the task needs, it's already in the box.

    Core tools live in the same namespace as read and bash. Pin the active set with --tools read,edit,bash,…; rarely used discoverable tools stay behind xd:// devices. read xd:// lists them, and write xd://<tool> runs one when tools.xdev is enabled.

    Files & search

    • read — files, dirs, archives, SQLite, PDFs, notebooks, URLs, remote ssh:// paths, and internal :// schemes through one path.
    • write — create or overwrite a file, archive entry, or SQLite row.
    • edit — hashline patches with content-hash anchors and stale-anchor recovery.
    • ast_edit — structural rewrites previewed before apply, via ast-grep.
    • ast_grep — structural code queries over 50+ tree-sitter grammars.
    • grep — regex over files, globs, and internal URLs.
    • glob — glob-based path lookup; reach for grep when you need content matches.

    Runtime

    • bash — workspace shell with 46 in-process coreutils, optional PTY, and background-job dispatch.
    • eval — persistent Python and JavaScript cells with shared prelude and tool re-entry.

    Code intelligence

    • lsp — diagnostics, navigation, symbols, renames, code actions, raw requests.
    • debug — drive a DAP session — breakpoints, stepping, threads, stack, variables.
    • security_scan — plan and run native security reviews; drives Codex Security cloud scans.

    Coordination

    • task — fan out subagents in parallel, optionally workspace-isolated.
    • wait — block until the next background result, peer message, or steering interrupt; message peers and control jobs via agent:// and proc://.
    • todo — ordered mutations over the session todo list with phase tracking.
    • ask — structured follow-up questions for interactive runs.

    Desktop & web

    • browser — Puppeteer tabs over headless Chromium, CDP-attached apps, or your own Chrome via the relay.
    • computer — persistent JS against the host desktop: windows, screenshots, native input, AX tree, clipboard.
    • web_search — one query across configured providers, returning answer plus citations.
    • github — GitHub CLI ops — repo, PR, issues, code search, Actions run-watch.
    • generate_image — generate or edit raster images via Gemini, GPT, or xAI Grok image models.
    • tts — text-to-speech via xAI Grok Voice — five built-in voices, WAV or MP3.

    Memory & skills

    • checkpoint — mark conversation state for a later collapse-and-report.
    • rewind — prune exploratory context, keep a concise report.
    • retain — queue durable facts into the active memory bank.
    • recall — search the memory bank for raw memories.
    • reflect — synthesize an answer over the bank.
    • memory_edit — update, forget, or invalidate stored memories by id.
    • learn — capture a reusable lesson; optionally promote it into a managed skill.
    • manage_skill — create, update, or delete an isolated managed skill.

    Setting-gated, off by default: github, security_scan, generate_image, tts, checkpoint, rewind, and the memory tools (retain/recall/reflect/memory_edit, per memory.backend).

    Full reference →

    Prompt controls

    Standalone, lowercase words opt a turn into specialized agent behavior:

    • ultrathink — request careful multi-step reasoning and the highest supported automatic thinking effort.
    • chillax — request brief reasoning; on models with per-message effort, drop thinking to the lowest effort, even mid-turn.
    • orchestrate — run substantial independent work through parallel subagents and verify each phase.
    • workflowz — build a deterministic multi-subagent workflow with the active task tool.

    They trigger only in prose, not inside code spans, fenced code blocks, XML/HTML sections, identifiers, or paths. See Magic keywords for exact matching rules and configuration.

    Session controls

    Slash commands shift how a whole session runs:

    • /vibe — enter Vibe mode: act as a director driving persistent fast/good worker sessions with a read-only toolset.
    • /fresh — reset the provider stream state (stale prompt cache, wedged stream) without changing the local transcript. See Session operations.

    Sixty-plus providers, a thousand models, one /model away.

    Nine 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. Plus vision, task, advisor, and tiny for their namesakes. Override at launch with --smol, --slow, or --plan; cycle through the configured models for the active role with Ctrl+P. Swap the active model mid-session with the /model slash command.

    Auth tags below: oauth signs in with your provider account, plan routes through a coding-plan subscription, local runs against a local server with the key optional.

    Frontier APIs

    Direct APIs and gateways. Mix providers per role.

    Anthropic oauth · OpenAI · OpenAI Codex oauth · Google Gemini · Google Vertex · Google Antigravity oauth · xAI · SuperGrok oauth · DeepSeek · Mistral · Groq · Cerebras · SambaNova · Fireworks · Together · Modular · Baseten · DeepInfra · Hugging Face · NVIDIA · Meta · Inception · Amazon Bedrock · Azure OpenAI · SiliconFlow · GMI Cloud · CoreWeave · Sakana AI · Command Code · Charm Hyper · StepFun · Helmcode · OpenRouter · Synthetic · Vercel AI Gateway · Cloudflare AI Gateway · Wafer Serverless · Scaleway

    Coding plans

    Subscription-routed. /login attaches the session.

    Cursor oauth · GitHub Copilot oauth · GitLab Duo · Devin oauth · Kimi Code plan · Moonshot · MiniMax Coding Plan plan · MiniMax Coding Plan CN plan · Alibaba Coding Plan plan · Qwen Portal oauth · Z.AI / GLM Coding Plan plan · Zhipu Coding Plan plan · Xiaomi MiMo · Qianfan · Umans plan · NanoGPT · Novita · Venice · Kilo · ZenMux · OpenCode Go · OpenCode Zen

    Run it yourself

    OpenAI-compatible /v1/models. Local instances skip the key.

    Ollama local · Ollama Cloud · LM Studio local · llama.cpp local · vLLM local · LiteLLM

    Custom OpenAI-compatible providers

    Define custom providers in ~/.omp/agent/models.yml:

    providers:
       spark:
          baseUrl: http://192.168.10.223:8000/v1
          api: openai-completions
          apiKey: dummy
          models:
             - id: minimax-m3
               name: MiniMax M3
               contextWindow: 100000
               maxTokens: 32000
    

    Run omp models spark to verify discovery. Then run omp setup and choose the model in the default-model step, or open /model in a session and assign it to the default role.

    To preconfigure the default without the picker, add the selector to ~/.omp/agent/config.yml:

    modelRoles:
       default: spark/minimax-m3
    

    Four knobs that make routing useful

    • Custom providers — Declare anything that speaks openai-completions, openai-responses, openai-codex-responses, azure-openai-responses, anthropic-messages, bedrock-converse-stream, google-generative-ai, google-gemini-cli, google-vertex, typesafe, openrouter-decisions, openai-decisions, or workers-ai-systemone (the judge APIs) in ~/.omp/agent/models.yml.
    • Fallback chains — Per-role or per-model 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.
    • Path-scoped models — Scope enabledModels and disabledProviders entries to a path: prefix to pin a different model set on one repo without touching the global config. Scoped entries cover the path and everything under it.
    • Round-robin credentials — 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.

    Full provider & routing reference at omp.sh/docs/providers.

    Twenty-four backends. One tool the agent already knows.

    web_search is built in, not bolted on. auto walks a twenty-four-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.

    Search providers

    Twenty-four backends. Pin one, or let auto walk the chain in order.

    providerauth
    autochain
    perplexityPERPLEXITY_API_KEY (anonymous fallback)
    geminioauth
    anthropicoauth
    codexoauth
    xaioauth or XAI_API_KEY
    zaiZAI_API_KEY
    exaEXA_API_KEY (or mcp)
    tinyfishTINYFISH_API_KEY
    keenableKEENABLE_API_KEY (keyless fallback)
    jinaJINA_API_KEY
    kagiKAGI_API_KEY
    tavilyTAVILY_API_KEY
    firecrawlFIRECRAWL_API_KEY (keyless fallback)
    braveBRAVE_API_KEY
    kimi/login kimi-code or search key
    parallelPARALLEL_API_KEY
    syntheticSYNTHETIC_API_KEY
    searxngself-hosted
    duckduckgono key
    startpageno key
    googleno key (browser)
    ecosiano key (browser)
    mojeekno key (browser)
    publicno key (all of the above, consolidated)

    Exa also accepts a stored API key through /login exa; explicit keyless selection uses the public MCP fallback.

    Specialised handlers

    The agent gets structured content, not stripped HTML.

    • Code hosts — github, gitlab
    • Package registries — npm, PyPI, crates.io, Hex, Hackage, NuGet, Maven, RubyGems, Packagist, pub.dev, Go packages
    • Research sources — arxiv, semantic scholar
    • Forums — stack overflow, reddit, hn
    • Docs — mdn, readthedocs, docs.rs

    Pages convert to markdown with link structure intact. The agent can cite, follow, and quote without losing anchors.

    Security databases

    Vuln lookups answer with vendor data, not blog summaries.

    • NVD — national vulnerability database
    • OSV — open source vuln feed
    • CISA KEV — known exploited vulns

    web_search reference ↗

    Roughly ~80,000 lines of Rust, doing the work other harnesses shell out for.

    Six crates, one platform-tagged N-API addon. Search, shell, AST, highlight, PTY, desktop control, image decode, BPE counting — all in-process on the libuv pool. No fork/exec on the hot path. The shell is our own bash 5.3 engine, and 58 command-line utilities — coreutils, findutils, sed, jq, ripgrep-backed grep, fd, diff, moreutils — are ported into the builtins crate and compiled straight into the shell.

    • Crates: pi-natives, pi-shell, pi-ast, pi-iso, pi-voice, pi-walker
    • Platforms: linux-x64, linux-arm64, darwin-x64, darwin-arm64, win32-x64, win32-arm64 — x64 ships dual AVX2 and baseline binaries

    Per crate, code lines only:

    CrateWhat it does~LoC
    pi-shellEmbedded bash engine · persistent sessions · in-process coreutils dispatch · minimizer38,000
    pi-nativesThe N-API surface — every module in the table below25,000
    pi-walkerParallel walker · listing cache · glob · regex search for natives and shell rg/grep/fd11,400
    pi-isoWorkspace isolation · apfs · btrfs · zfs · reflink · overlayfs · projfs · rcopy3,300
    pi-asttree-sitter + ast-grep matching, block resolution, structural summaries2,900
    pi-voiceAudio capture/playback · Opus · live WebRTC1,000

    Inside pi-natives, the per-module breakdown (glue and tests omitted):

    ModuleWhat it doesPowered by~LoC
    desktopWindow/display enumeration · screenshot · native input · AX tree for computerxcap · enigo · OS AX FFI10,600
    grepRegex search · parallel/sequential · glob & type filters · fuzzy findgrep-regex · grep-searcher3,280
    textANSI-aware width · truncation · column slicing · SGR-preserving wrapunicode-width · segmentation2,070
    snapcompactBitmap-frame rasterization + PNG encode for context compressionimage · png1,760
    keysKitty keyboard protocol with xterm fallback · PHF perfect-hash lookupphf1,740
    astast-grep pattern matching and structural rewritesast-grep-core1,510
    diffStructured file diffing for tools and previewsin-tree1,030
    ptyNative PTY allocation for sudo · ssh interactive promptsportable-pty630
    crash_handlerNative crash capture and reportingin-tree610
    highlightSyntax highlighting · 11 semantic categories · 30+ aliasessyntect550
    appearanceMode 2031 + native macOS dark/light via CoreFoundation FFIcore-foundation450
    taskBlocking work on libuv thread pool · cancellation · timeout · profilingtokio · napi440
    globDiscovery with glob · type filters · mtime sort · gitignore respectignore · globset430
    fdFilesystem walker for find-tool replacementignore385
    clipboardText copy and image read from system clipboard · no xclip/pbcopyarboard370
    workspaceWorkspace walker with gitignore + AGENTS.md discovery in one passignore275
    powermacOS power-assertion API for idle/system/display-sleep preventionIOKit FFI270
    profCircular buffer profiler with folded-stack and SVG flamegraph outputinferno240
    file_lockCross-process advisory file lockingin-tree210
    psCross-platform process-tree kill and descendant listinglibc · libproc · CreateToolhelp32Snapshot195
    tokensO200k / Cl100k BPE token counting · both tables embeddedtiktoken-rs70
    htmlHTML to Markdown with optional content cleaninghtml-to-markdown-rs60
    sixelTerminal image rendering · decode PNG · JPEG · WebP · GIF · resize · SIXEL encodeicy_sixel · image55

    Four entry points: interactive, one-shot, RPC, and ACP.

    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.

    Interactive — when in doubt, the agent asks

    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.

    omp TUI showing a multi-select question from the ask tool.

    SDK — embed in Node

    @oh-my-pi/pi-coding-agent

    Node 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");
    

    RPC — drive over stdio

    omp --mode rpc

    For non-Node embedders, or when you want process isolation. NDJSON commands in, response and event frames out; each prompt ends with its own prompt_result. --mode rpc-ui adds tool cards, selectors, and dialogs as extension_ui_request frames the host must answer; --no-ui keeps even extension dialogs off the wire for hosts with no UI.

    $ 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"}
    

    ACP — speak to editors

    omp acp

    The 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.

    omp toolACP route
    bashterminal/create + terminal/output
    readfs/read_text_file
    writefs/write_text_file
    edit, bashsession/request_permission

    Full reference: omp.sh/docs/sdk.

    A harness worth keeping is one you don't outgrow.

    Pick it up at omp.sh.

    omp 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.

    Primitives

    An extension is a TypeScript module. Same tool API, same slash-command registry, same hotkey table, same TUI primitives the built-ins use. Nothing is reserved.

    Discovery

    On first run omp inherits whatever is already on disk: rules, skills, and MCP servers from .claude, .cursor, .windsurf, .gemini, .codex, .cline, .github/copilot, and .vscode. No migration script.

    Extensibility

    Ask omp to write the piece you're missing, then /reload-plugins. Keep it local, ship it in a marketplace, or publish it to npm.

    Philosophy

    omp is a fork of pi-mono by Mario Zechner, extended with a batteries-included coding workflow.

    Key ideas:

    • Keep interactive terminal-first UX for real coding work
    • Include practical built-ins (tools, sessions, branching, subagents, extensibility)
    • Make advanced behavior configurable rather than hidden

    Project inputs and trust

    Opening a repository loads its project inputs by design: settings, extensions, hooks, tools, commands, skills, rules, and project MCP configuration. To exclude project .mcp.json for one invocation, pass --config <file> pointing at a YAML overlay with nested keys (a flat mcp.enableProjectConfig: false line is ignored):

    mcp:
       enableProjectConfig: false
    

    Use --no-extensions to skip ambient extension discovery; or use --trusted-extension /absolute/path/to/file.ts for an exact extension allowlist. --no-tools disables built-in tools, but project tool modules remain a separate discovery surface. These flags narrow inputs without changing the repository-trust model.


    Development

    Getting started from source

    Fresh clones need both workspace dependencies and the local Rust/N-API addon before the source CLI can start.

    bun setup
    bun dev
    

    bun setup installs Bun workspaces and builds @oh-my-pi/pi-natives. Re-run bun run build:native after changing Rust crates or packages/natives.

    Nix users get the pinned Bun and Rust toolchains plus all native build dependencies:

    nix develop
    bun setup
    bun dev
    

    Build and smoke-test the distributable Nix package with nix build .#omp. Wayland screencast support is off by default (linking libpipewire adds ~750 MB of runtime closure); enable it with omp.override { withWaylandScreencast = true; }. Release builds link pi-natives with fat LTO; omp.override { withFatLto = false; } uses thin LTO for much faster local rebuilds. Rust dependencies and the native addon build in separate derivations, so Rust edits reuse compiled dependencies and TypeScript edits reuse the addon. nix/bun.nix is generated only when bun.lock changes; releases regenerate it automatically. For dependency changes, run:

    bun run gen:nix
    

    The command uses bun2nix from nix develop when available, otherwise enters the development shell through Nix, then falls back to the pinned bunx [email protected]. Do not edit nix/bun.nix manually.

    For a non-interactive smoke check:

    bun dev -- --version
    

    Debug Command

    /debug opens tools for debugging, reporting, and profiling.

    For architecture and contribution guidelines, see packages/coding-agent/DEVELOPMENT.md.


    Monorepo Packages

    PackageDescription
    @oh-my-pi/collab-webBrowser guest client, mock host, and local relay for collab live sessions
    @oh-my-pi/pi-aiMulti-provider LLM client with streaming and model/provider integration
    @oh-my-pi/pi-catalogModel catalog: bundled model database, provider descriptors, and identity
    @oh-my-pi/pi-agent-coreAgent runtime with tool calling and state management
    @oh-my-pi/pi-coding-agentInteractive coding agent CLI and SDK
    @oh-my-pi/pi-tuiTerminal UI library with differential rendering
    @oh-my-pi/pi-nativesN-API bindings for grep, shell, image, text, syntax highlighting, and more
    @oh-my-pi/omp-statsLocal observability dashboard for AI usage statistics
    @oh-my-pi/omptypeArkType-compatible schema validation with lazy JIT compilation
    @oh-my-pi/pi-utilsShared utilities (logging, streams, dirs/env/process helpers)
    @oh-my-pi/pi-wireShared collab live-session protocol types and relay constants
    @oh-my-pi/pi-mnemopiLocal SQLite memory engine for omp agents
    @oh-my-pi/snapcompactBitmap-frame context compression package and SQuAD eval suite
    @oh-my-pi/browser-relayChrome extension that lets the Eval browser API drive your existing tabs
    @oh-my-pi/pi-metaharnessUnified benchmark runners, Harbor run storage, REST/SSE API, live dashboard
    @oh-my-pi/typescript-edit-benchmarkEdit benchmark suite built on TypeScript source mutations

    Rust Crates

    CrateDescription
    pi-nativesCore Rust native addon (N-API cdylib) used by @oh-my-pi/pi-natives; aggregates the crates below
    pi-shellEmbedded bash 5.3 engine (parser, VM, process spawning, sessions), PTY, and process management
    pi-asttree-sitter-based code summarizer and AST utilities (50+ language grammars)
    pi-isoTask isolation backend resolver: APFS clones, btrfs/zfs reflinks, overlayfs, projfs, rcopy
    pi-voiceAudio capture/playback, Opus codecs, and live WebRTC streaming primitives
    pi-walkerParallel ignore-aware walker, directory-listing cache, glob, and content search for natives + shell
    pi-editEdit engine behind the edit tool: line-anchored patch/hashline modes, streaming previews, atomic apply
    pi-builtins67 in-process command-line utilities plus process builtins (ps, top, pgrep, pkill, …)

    Contributing

    Issues and pull requests are open to everyone. Open PRs are currently a trial — the previous vouch requirement is lifted while we evaluate how it goes, and it may return. See CONTRIBUTING.md for guidelines on contributing.


    License

    OMP is licensed under the MIT License.

    Third-party and vendored code, including the third-party portions identified in crates/pi-builtins/LICENSE, remains under its respective upstream license. Each shipped component carries its own THIRD-PARTY-NOTICES.txt: the CLI (packages/coding-agent), the native addon (packages/natives), and robomp (python/robomp). omp --license prints the CLI's and the addon's.

    © 2025 Mario Zechner
    © 2025-2026 Can Bölük
    © 2026 Stencil Labs, Inc.

    made for terminals that stay open