Skip to main content
Five commands on every agent, and a sixth that only OpenCode needs. You run them from inside an agent session on the computer you want to affect — a / command in Claude Code and OpenCode, a $ skill in Codex.
In Claude Code everything is namespaced: typing /nomo-cc: lists them all. OpenCode command names are flat and global, so there Nomo’s carry no prefix at all.
None of them can fail loudly. Every one exits cleanly even when there’s nothing to do — Not paired is a success, not an error. The empty cells on the last row aren’t an omission: Claude Code and Codex update through their own hosts, so Nomo adds no command there. What each of them needs — which for Codex is usually nothing — is in Installation.

pair

With no argument it opens a themed page in your browser with a QR code. Scan it in the app and the page flips to Paired ✓ on its own. The code argument skips the browser entirely and prints a typeable one-time code, for a headless box or an SSH session. It’s the second-choice path on purpose: that code lands in your terminal, and therefore in the agent’s transcript. Pairings expire after 10 minutes unused. One pairing covers the machine, not the agent — Claude Code, Codex and OpenCode on the same Mac share it. Full walkthrough in Pairing.

status

The one to run first when anything looks wrong. A healthy machine is a handful of calm lines — there are no checkmarks, because everything being fine is the absence of anything to say:
The rows above the gap describe the computer, and read the same whichever agent you asked from. Below them comes the agent you’re actually in, marked — you are here.
Whether this computer is paired at all, plus the worker it talks to and the pairing it holds. NOT PAIRED means nothing from here reaches the app, and the arrow underneath prints the pair command for the agent you’re standing in.
When an event last actually left this computer, and whether the watchdog is up. A watchdog that isn’t running is fine on its own — it starts itself on the next session. never sent, with a session genuinely running, is not fine.
The direct local network link: the port and id this computer listens on, when your phone last reached it, and when the Mac last advertised its address. The middle line is the one that matters — it’s the only proof the direct leg has ever worked. Advertised long ago and never reached means your phone can’t get here; advertised seconds ago and not yet reached is simply too early to tell. A refused request prints its reason rather than leaving silence. The row is absent entirely on a computer that has never listened — the switch is on your phone and off by default.
on means permission prompts are held here and sent to your phone. PAUSED means they aren’t — they go to the terminal instead, and stay that way until someone resumes them, however many months later. If your phone has stopped asking you anything, this row is the entire explanation: see Pausing it.
Whether your agent is feeding Nomo, and how long ago it last did. OpenCode has no hooks, so there the row is called Plugin instead. Nothing firing? Restart Claude Code so its hooks load; in Codex run /hooks; in OpenCode restart it so the plugin loads.
Counted per agent now: 1 of 4 tracked here means this computer is tracking four sessions and one of them is yours. Rows that should have died are what reset is for.
Problems carry two marks and nothing else: ! is the problem, → is what to do about it, written in the command dialect of the agent you asked from. Every other agent on the computer gets one condensed line under Also on this computer — and when one of those is broken, it says so here rather than waiting for you to go and look:
Rows with nothing to say are left out — an unpaired computer has no delivery, LAN or approvals to report. Another agent’s problem is spelled out here in full, then pointed at that agent’s own status command for the rest of the detail. And the first line carries the plugin version: quote it if you file a bug.

approvals

Pauses remote approvals for this computer, so permission prompts go straight to the terminal instead of waiting on your phone. The escape hatch for a phone that’s dead or out of reach.
One switch per computer, shared by every agent — pausing it in Codex pauses it for Claude Code and OpenCode on that machine too. It doesn’t unpair anything and doesn’t touch your phone’s settings. There’s a separate, phone-wide switch: Answer on iPhone in Settings.

reset

Stops the watchdog and clears dead or phantom session rows, then tells your phone to drop them.
The safe thing to reach for when rows look stale or duplicated, because it says what it left alone. An OpenCode row belongs to the OpenCode server, so quit OpenCode first if one won’t clear — see Using OpenCode.

unpair

Revokes the pairing and erases the key on that computer. Forgetting a computer from the phone is not the same thing: that stops it appearing in your app, but the Mac keeps its local state until you run this there.

update

OpenCode
OpenCode only — and it checks before it changes anything. Already current is a stop, not a no-op with a pull attached:
When there’s something to get, it says what before it takes it:
Then it pulls, re-runs the installer — which is what picks up any new /nomo-* command the release added — and tells you to restart OpenCode. Plugins are imported once when its server starts, so until you do, the old copy is still the one running. It refuses rather than acting when it can’t be sure, and each refusal says what to do instead: a checkout pinned by an earlier --ref install, a working tree with uncommitted changes, a checkout that’s been moved or deleted, or nothing installed here at all.
It updates the checkout the stub points at — the copy OpenCode actually imports — which isn’t necessarily the one whose command file you typed. If you keep more than one clone, that’s the distinction that matters.
Claude Code and Codex have no counterpart, because their hosts own updates — and Codex usually has nothing to run at all: Installation covers both.

Where state lives

Everything the plugin keeps sits in ~/.config/cc-status/ — the pairing, the encryption key (mode 0600), one file per tracked session, and a local trace log. Nothing in that folder is sent anywhere.

Read the source

These commands are the plugin, and the plugin is open source. If you want to know exactly what runs on your machine and what leaves it, the answer is in one repository — marketplace installs are a plain clone of it.

KarrixLee/nomo

The full plugin source, MIT licensed. Issues and bug reports live here too.