---
title: omp
description: omp agent config, keybindings, MCP servers, cyberdream theme, custom commands, and the scheduled research loops under ~/.omp.
---

omp (oh-my-pi) is a terminal coding agent. The repo manages its agent directory (`~/.omp/agent`) and a set of prompt loops in `~/.omp/loops`. chezmoi does not install the `omp` binary; install it yourself. [topgrade](/tools/topgrade) keeps it current with the custom command `"Omp Update" = "omp update"`.

## Files

| Source in repo | Target | Notes |
| --- | --- | --- |
| `dot_omp/private_agent/` | `~/.omp/agent/` | Directory mode `0700` |
| `dot_omp/private_agent/private_config.yml` | `~/.omp/agent/config.yml` | Mode `0600` |
| `dot_omp/private_agent/keybindings.yml` | `~/.omp/agent/keybindings.yml` | |
| `dot_omp/private_agent/private_mcp.json` | `~/.omp/agent/mcp.json` | Mode `0600` |
| `dot_omp/private_agent/themes/cyberdream.json` | `~/.omp/agent/themes/cyberdream.json` | Custom theme |
| `dot_omp/private_agent/commands/*.md` | `~/.omp/agent/commands/*.md` | Slash commands |
| `dot_omp/loops/bin/executable_run-loop.sh` | `~/.omp/loops/bin/run-loop.sh` | Loop runner |
| `dot_omp/loops/<name>/private_loop.md` | `~/.omp/loops/<name>/loop.md` | One prompt per loop, mode `0600` |
| `dot_omp/loops/goals/private_templates.md` | `~/.omp/loops/goals/templates.md` | Unscheduled `/goal` templates |

No omp file is role-gated. In chezmoi's symlink mode, `private_` and `executable_` entries are written as regular files, not symlinks.

## config.yml

```yaml ~/.omp/agent/config.yml
theme:
  dark: titanium
  light: light
symbolPreset: nerd
setupVersion: 2
hideThinkingBlock: false
modelRoles:
  plan: anthropic/claude-fable-5
composer:
  shape: rule
```

| Key | Value | Effect |
| --- | --- | --- |
| `theme.dark` | `titanium` | Theme on a dark terminal background (omp's default, pinned explicitly) |
| `theme.light` | `light` | Theme on a light terminal background (omp's default) |
| `symbolPreset` | `nerd` | Nerd Font glyphs instead of the default `unicode` set; the repo's font is Victor Mono Nerd Font |
| `hideThinkingBlock` | `false` | Thinking blocks stay visible |
| `modelRoles.plan` | `anthropic/claude-fable-5` | Model for the `plan` role; other roles use omp defaults |
| `composer.shape` | `rule` | Built-in `rule` composer style instead of the default `box` |
| `setupVersion` | `2` | Internal settings version marker |

No API keys are stored in `config.yml`.

## Keybindings

```yaml ~/.omp/agent/keybindings.yml
app.editor.external: Ctrl+E
app.exit: Ctrl+Q
```

| Key | Action |
| --- | --- |
| <kbd>Ctrl</kbd> <kbd>E</kbd> | Open the current prompt in the external editor (`app.editor.external`) |
| <kbd>Ctrl</kbd> <kbd>Q</kbd> | Quit omp (`app.exit`) |

All other bindings are omp defaults.

## MCP servers

`mcp.json` declares three remote MCP servers over HTTP. No credential values are stored in the file.

| Server | Transport | Endpoint | Auth |
| --- | --- | --- | --- |
| `exa` | `http` | `https://mcp.exa.ai/mcp` | none |
| `cloudflare-api` | `http` | `https://mcp.cloudflare.com/mcp` | OAuth; omp stores the token in its own credential store under a profile credential id |
| `github` | `http` | `https://api.githubcopilot.com/mcp/` | `Authorization` header built at request time by a `!` shell command that reads the token from `gh auth token` |

The GitHub server therefore needs the [GitHub CLI](/tools/github-cli) to be logged in. The `$schema` key points at omp's `mcp-schema.json` for editor validation.

## Theme

`themes/cyberdream.json` ports the cyberdream palette to omp's theme schema. It installs the theme, but `config.yml` currently selects `titanium` for dark mode. To use cyberdream, set `theme.dark: cyberdream`.

| Var | Hex | Used for |
| --- | --- | --- |
| `bg` | `#16181a` | base background |
| `bgAlt` | `#1e2124` | user/custom message, tool, and status-line backgrounds |
| `bgHighlight` | `#3c4048` | selection |
| `fg` | `#ffffff` | message and tool output text |
| `grey` | `#7b8496` | muted, dim, thinking text, comments, quotes, borders |
| `blue` | `#5ea1ff` | accent, borders, links, functions, status-line path |
| `cyan` | `#5ef1ff` | accent borders, tool titles, inline code, types, context meter |
| `green` | `#5eff6c` | success, diff additions, strings, clean git |
| `red` | `#ff6e5e` | errors, diff removals, untracked files |
| `yellow` | `#f1ff5e` | warnings, variables, bash mode, dirty git |
| `magenta` | `#ff5ef1` | keywords, subagent count |
| `pink` | `#ff5ea0` | operators, spend |
| `orange` | `#ffbd5e` | Markdown headings, cost |
| `purple` | `#bd5eff` | numbers, python mode, model name |

The thinking-level indicator runs `grey` (off) → `blue` → `cyan` → `green` → `yellow` → `orange` → `red` (max).

## Commands

| Command | Invocation | Purpose |
| --- | --- | --- |
| `/leetcode-docs` | `/leetcode-docs <file> [extra instructions]` | Converts a LeetCode solution file into a Fumadocs MDX page at `content/docs/leetcode/<difficulty>/<category>/<number>-<slug>.mdx`. The page has a difficulty callout, problem, examples, constraints, a derived intuition paragraph, the solution copied verbatim (multiple approaches become tabs), and a complexity callout. Prints only the output path. |
| `/leetcode-eli5` | `/leetcode-eli5 <file> [extra instructions]` | Adds beginner-level line-by-line comments and a `// ====` banner to a LeetCode solution. Leaves the header, JSDoc, and code byte-for-byte unchanged. Prints the path and the number of comment lines added. |

Both expect the on-disk format of the LeetCode solutions repo: a `/* ... */` problem header, a JSDoc block, then the solution function(s).

## Loops

`~/.omp/loops` holds scheduled, read-only research prompts. Each loop is a directory with a `loop.md` prompt. `run-loop.sh` creates `state.md` and `runs.log` beside it at runtime; chezmoi does not manage those.

### run-loop.sh

```sh
~/.omp/loops/bin/run-loop.sh <loop-name>
```

Runs one round of a loop:

1. **Prepare state**

    Exits if `~/.omp/loops/<name>/loop.md` is missing. Seeds `state.md` with `## queue`, `## done`, and `## blocked` headings if it does not exist.

2. **Cheap round**

    Runs `omp -p --no-session --max-time 600 --model kimi-for-coding` with the prompt plus the loop directory, state-file path, and round timestamp appended. Output goes to `runs.log`.

3. **Escalate once**

    If any output line starts with `ESCALATE`, re-runs the round once on omp's default model (Fable) with a 1200 s cap. It logs `<loop> escalated` to `~/.omp/loops/escalations.log`.

At most one round and one escalation per call. Failures from `omp` are logged and do not abort the script.

### Loop catalogue

Every loop follows the same contract: read `state.md` first, do one pass, make exactly one change (usually a brief or proposal appended under `## queue`), and log repeated tool failures under `## blocked`. Loops draft only; they never file issues or change repos. The subject is WalletBase, an embedded-wallet project.

| Loop | Cadence | Inputs | Output per round | Escalates on |
| --- | --- | --- | --- | --- |
| `intel-refresh` (#19) | Mon 06:00 | Exa search over five beats: ERC-4337/AA, EIP-7702, embedded-wallet competitors, agent-payment protocols, Base chain | Up to 5 bullets per beat for the week; proposes swapping a beat that has been quiet for 3 weeks | A development that breaks a core assumption |
| `share-of-model` (#3) | Mon 07:00 | Exa answer mode, fixed set of six buyer questions | Table of vendors named per answer and whether WalletBase appears; biggest rank shift | never |
| `regulatory-digest` (#20) | Tue 07:00 | FinCEN, OFAC, SEC/CFTC, EU MiCA/CASP, Ethereum governance | Only material changes; "no material changes" counts as success; a proposed risk-position edit when an item breaks a standing assumption | MSB scope or OFAC action touching similar infra |
| `brand-radar` (#10) | Wed 07:00 | HN Algolia API (no key), Exa | Mentions grouped into feature asks, pricing pain, security, and integration friction; one drafted `bd create` issue or positioning note | Security discussion of a dependency |
| `answer-gap` (#1) | Thu 07:00 | Exa, rotating developer questions plus ones harvested in earlier rounds | One content brief; up to 3 new questions queued | never |
| `competitor-watch` (#4) | Fri 07:00 | Exa over six competitor blogs | Logs new posts; one content brief for the biggest gap | Competitor launches an agent-economy product |
| `repeat-offender` (#24) | Sun 18:00 | `bd list` across the project's repos, loop `runs.log`, `## blocked` sections, and `escalations.log` | Failure patterns grouped by root cause; one drafted `bd create` systemic fix | Data loss or security-boundary pattern |

Five prompts cap page fetches or API calls per round (15 to 30); `share-of-model` and `repeat-offender` are bounded by their fixed question set and sources.

:::note[Scheduling]
Cadences are declared in each prompt header; the repo contains no timer for them. `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` names `omp-loop` among the personal automation units that are enabled by hand on each machine and never automatically. See [scripts](/chezmoi/scripts).
:::

### Goal templates

`goals/templates.md` is not scheduled. It holds two `/goal` prompts to paste into an interactive omp session when facing a decision:

| Template | Purpose | Cap |
| --- | --- | --- |
| kill-criteria (#22) | One measurable disqualifying condition per option, cited evidence, verdict ALIVE / KILLED / NEEDS-DATA | 40 tool calls |
| pre-mortem (#23) | Writes the post-mortem of a failed decision 12 months out: 3–5 causal chains, each tied to a present-day assumption, with an early warning sign and the cheapest mitigation | 30 tool calls |

Both count as done only when the full artifact is pasted in the chat.

## Shell integration

| Entry point | Source | What it does |
| --- | --- | --- |
| fish completions | `dot_config/fish/completions/omp.fish` | `omp completions fish \| source` generates completions at load time |
| <kbd>Ctrl</kbd> <kbd>A</kbd> | fish `fish_user_key_bindings`, zsh `keybinds.zsh` | Launches `omp` from the prompt |
| `launch_omp_livediff_overlay` | `dot_local/bin/executable_launch_omp_livediff_overlay`, fish function of the same name | Opens omp as a kitty overlay on the current window with a `livediff` vsplit beside it, focus kept on omp. Needs `KITTY_LISTEN_ON` (kitty remote control). |
| `lc-elir [root]` | `dot_local/bin/executable_lc-elir`, fish function | fzf multi-picks numbered LeetCode files (`1365.slug.js`/`.ts`) with a bat preview and runs `omp -p "/leetcode-eli5 <file>"` on each |

See [scripts](/shell/scripts) and [fish](/shell/fish). The [kitty](/terminal/kitty) tab bar shows a microchip glyph for tabs running `omp`.
