← Blog

Oh My Diff: change how Codex CLI works with TypeScript mods

Most of what I wanted to change about Codex CLI was in the terminal. Long tool runs pushed the plan off screen, and shell calls printed dozens of lines I scrolled past. I wanted my rate limits and git branch beside the prompt. Codex 0.166.0 has skills, plugins and hooks. A hook can block or rewrite a tool call, but it can't hold state or draw on screen. Changing the terminal meant editing Codex's Rust code and maintaining a fork.

Oh My Diff (OMD) is Codex CLI with one patch that adds a host for TypeScript mods. I keep the patch current so that your change can be a mod instead of a fork. You still run codex with your settings, sign-in and sessions in ~/.codex, and can go back to plain Codex with nothing to migrate. Every feature OMD adds is a TypeScript mod; the host provides the APIs those mods use. OMD is in beta and runs only on Apple Silicon Macs. This post describes OMD 1.4.0, on Codex 0.166.0.

Update, 2026-11-04 (OMD 1.4.2): OMD+ now installs only the mods that have been fully tested. omd_plan_panel, omd_lsp_sync and omd_idle_compact are experimental: install one with omd install ID, then omd mods enable ID. The changelog has the details.

Update, 2026-11-08 (OMD 1.5.0): OMD now runs on Codex 0.167.x, so the install below needs Codex 0.167.x. Mod choices in /mods can apply to one terminal only. The changelog has the details.

A failing test, with the plan and tool output in view

A task I give Codex often is "this test fails, find the regression and fix it." In OMD+, the full install, three mods change how that session looks: two that are on by default and one you turn on.

omd_plan_panel, off until you turn it on in /mods, pins Codex's own plan above the prompt, so you can see it while tools run:

● Plan (2/5)
├─ ✓ Read the failing test
├─ ✓ Find the regression
├─ ◐ Fix the parser
├─ ○ Run the suite
└─ ○ Summarize

omd_tool_lines shows each tool call as one line with its result. A click or F4 opens the full output:

• Shell cargo test -p codex-omd · ok · 214 lines · 41.3s
• Edit tui/src/transcript_view/layout.rs · +9 −3
✗ Shell pnpm lint · exit 1 · 18 lines · 2.4s

Both blocks are README examples. omd_statusline puts model, context, limits, cost and git state next to the prompt, and /statusline edits it.

Another opt-in mod changes what the agent sees:

omd-package mod enable omd_lsp_sync

With a language server such as rust-analyzer on your PATH, each tool call that writes files returns the errors that edit introduced and the ones it fixed, up to 8 of each per file (supported servers and limits).

The plan panel reimplements juicesharp's rpiv-todo, and omd_lsp_sync is based on Apostolos Mantzaris's pi-lens.

Install

You need Codex 0.166.x and Python 3.12 or newer. This installs OMD+:

curl --proto '=https' --tlsv1.2 -fsSL https://github.com/dzkchen/oh-my-diff/releases/latest/download/install.sh | sh -s -- --profile full

The installer checks the release signature and checksum. For the host alone, use --profile platform to get OMD Core: /mods, update notices and the OMD mark, with Codex otherwise unchanged. The install guide covers updating, switching and removing it.

Writing your own mod

A mod can add a command or a model tool, add context to a request, draw a panel or react to tool calls. This scaffolds one with a /hello command and tests it offline, with no model call:

omd-mod-author create ./my_mod my_mod
cd my_mod
pnpm test

Writing a mod needs Node 24.18 or a later 24.x, and a few included mods use Node (versions).

Forks, plugins and plain Codex

Your own fork can change any line of Codex, and you rebase it for every upstream release. OMD's pin went through nine Codex versions in 32 days, from 0.159.1 on 2026-09-29 to 0.166.0 on 2026-10-31, and in OMD 1.4.0 the patch edits 481 upstream files. I do those rebases so mod authors don't. Mods can only use the mod API. A change outside it still needs a fork, or a mod API request.

Skills, plugins, MCP servers and hooks need no rebuild. A skill fits a procedure, a plugin or MCP server fits tools, and a hook fits a reaction to an event. A wrapper script can only set flags and environment before codex starts.

Plain Codex is the right choice if its defaults suit you, and it updates as soon as a release ships. In OMD you keep Codex on one version line, 0.166.x in OMD 1.4.0, until omd update supports the next.

Plain Codex also uses less memory, because every active mod package runs in its own process. On one Apple M5 Mac with a scripted model, release builds of OMD+ on Codex 0.165 and 0.166 used about 100 MB as installed, with each omd-runner at 7 to 10 MB (macOS memory footprint 10 s after start, October 2026). Codex alone and OMD+ were both ready to type in about 0.3 s. An earlier OMD+ build on Codex 0.164.0 was ready to type in 39.3 ms in Kitty and 44.3 ms in Orca, against 43.7 and 46.1 ms for stock Codex (p50 of 10 interleaved launches on an M5 Mac, 2026-10-27/28, ±2 ms between runs).

Defaults and permissions

Installing a mod doesn't turn it on, and turning one on shows its permissions and asks first. Mods run in sandboxed processes, and omd mods disable ID works from any shell, even when codex won't start. Mod API 1.0.0 is stable, and surfaces marked experimental can change. OMD isn't affiliated with OpenAI.

Two default-on OMD+ mods change behavior. omd_idle_compact compacts an idle conversation of 100,000 tokens or more near the estimated prompt-cache deadline. By default it skips OpenAI subscription sessions. Compaction loses detail and cancels a pending approval or question. omd_auto_continue declines an approval that nobody answers within two minutes and tells the agent to continue past an unanswered question. It never approves anything. Turn either off in /mods, or start from OMD Core.

Install OMD+ and open /mods

Install OMD+, then open /mods in codex to review the included mods and turn on the ones you want.

The list of included mods says what each one does. The mod tutorial builds /hello and installs it. The rest is on ohmydiff.me.