2026-10-11 16:38 UTC

Openmsg's maintainer claims its released CLI delivers messages into already-running Claude Code, Codex, and OpenCode sessions through native interfaces, enabling cross-vendor coordination without restarting agents or discarding their context.

state: seedheat: mediumuncertainty: mediumconvergesscott: highagent-orchestration agent-to-agent-communicationmarciob

What is this?

Openmsg (repo: fujibee/agmsg) is a cross-vendor messaging CLI for terminal AI coding agents โ€” Claude Code, Codex, Gemini CLI, and OpenCode โ€” that writes messages into SQLite-backed rooms which live agents can read without restarting, preserving each agent's context. The maintainer (marciob/fujibee) demonstrates live-session delivery via native interfaces (tmux/session injection, OpenCode's monitor mode via opencode-sentinel, Codex/Codex CLI hooks) and documents deployment limits: local messaging has live-session tests, while cross-person encrypted messaging has only local acceptance tests and no team deployment yet. The artifact is a concrete interoperability primitive (Bash + SQLite, no daemon) rather than a framework or orchestration layer.

Why it matters to Scott

Openmsg is a released CLI that implements several of Scott's load-bearing architectural positions โ€” agent-native computing (machine-native coordination via SQLite/tmux, no central broker), shared blackboard (durable SQLite rooms multiple agents read/write), durable external state (context survives without restart), and agent addressability/V4 (cross-vendor interoperability without MCP). It targets the exact tools Scott builds with (Claude Code, Codex CLI, OpenCode) and documents deployment limits honestly (local live-session tests pass; cross-person encrypted messaging not yet team-deployed). This is not merely an example of his patterns โ€” it is a concrete interoperability primitive he could adopt or reference in his own multi-agent work (dev:project.ask, long-running agent control plane).
ip:framework.agent-native-computingip:concept.shared-blackboardip:concept.durable-external-stateip:framework.long-running-agentsip:framework.agent-addressabilityip:source.two-vendors-one-primitive-ebookdev:project.askdev:technology.claude-codedev:technology.codex-clidev:technology.opencoderadar:49-ide-agent-fleet-workspaceradar:agentdrive-persistent-shared-storageradar:aafp-commons-signed-agent-notebookradar:1f916-persistent-agent-worldradar:49ide-spatial-agent-workspace
queries asked of Scott's wikis
  • agent-to-agent communication protocols for CLI coding agents
  • session persistence and context survival across agent restarts
  • cross-vendor agent interoperability without MCP or central broker
  • local-first agent coordination: SQLite, tmux, file-based message passing
  • multi-agent team patterns: spawn/despawn, room history, session resume

Measured heat

now 0 pts/hpeak 0 pts/hcomments 0/hpeers p14momentum: steady2 platformsage 500h
points/hour across evidence ยท reading as of 2026-10-12 02:59:37.977291+11:00 ยท deterministic, not a model opinion

How the heat travelled

09-20 20:10โญ origin directly observedShow HN: Openmsg, agent-to-agent talk while they run, Claude<>Codex<>OpenCode
marciob on hacker news
โ€”
09-21 02:23first on github (echo) ยท first seen by us ยท +6.2hVersion 0.2 is on npm; local messaging has live-session tests, while cross-person encrypted messaging has local acceptance tests but no team
marciob
โ€”
09-20 20:10amplified on hacker news ๐Ÿ‘‘hn.story.49779581
marciob
peak 2 ยท 2 comments ยท 98% of case engagement
09-20 20:21our radar first saw it ยท +0.2hdiscovery anchor: hn.story.49779581โ€”
pace: p36 vs 1032 stories at the 336h mark (now 500h old) โ€” ahead of agentgate-signed-agent-receipts (1.3x), behind agent-memory-add-search-evaluation (0.8x)

Evidence (2) โ€” โญ canonical anchor

sourceobjectauthorscorecomments
๐ŸŸง hn โญShow HN: Openmsg, agent-to-agent talk while they run, Claude<>Codex<>OpenCode
Retrieved article excerpt

Open article ยท Retrieved 2026-09-20T20:22:45.355768+00:00

# openmsg

Messages between AI coding agents of different vendors, on one machine or
between two people.

A Claude Code session can send a message to a Codex session. An OpenCode session
can answer a Claude Code session. The message goes into the session that already
runs, with its context, and not into a new process.

Two people who work on one project can do the same across their machines. Those
messages are sealed end to end, and the server that carries them cannot read
one.

Status: version 0.2 is on npm. Version 0.1, between the agents of one
person, works and is tested with live sessions. Version 0.2, between two
people, passes the fourteen acceptance cases of its specification, and the
live tests on one machine. No team has run it across the internet yet.

## How it works

Each vendor has its own way to accept a message while it runs. openmsg uses that
native way, and gives all of them one command:

```
openmsg list                  # the agents that run now, all vendors
openmsg send <agent> "<text>" # deliver a message now
openmsg inbox                 # the messages for this agent
openmsg whoami                # how other agents address this one
```

An address is `<vendor>:<name>`, for example `claude:api-worker`.

| Vendor | How openmsg delivers the message | State |
| --- | --- | --- |
| Claude Code | The inbox socket of the session | Works, tested live |
| Codex | `codex queue` on the shared app-server daemon | Works, tested live |
| OpenCode | `POST /session/{id}/prompt_async` on its local server | Delivery tested live. A reply needs a model account |
| Cursor CLI | A hook reads the mailbox at the end of each turn | Written, tested with fixtures. A live test needs `CURSOR_API_KEY` |
| Gemini CLI | The same hook, as an AfterAgent deny | Written, tested with fixtures. Gemini CLI is not installed here |
| Other agents | `tmux send-keys` | Not started |

A reply is a new message. The receiving agent answers with `openmsg send`. No
program reads the screen of another program.

## The agents of another person

Version 0.2 adds one more step: an address with an owner, such as
`claude:api-worker@alice`.

```
openmsg id create --label alice       # a signing key and a sealing key
openmsg invite create --project web   # a token for the other person
openmsg invite accept <token> --fingerprint "A1B2 ..."
openmsg publish claude:api-worker     # let the project reach this session
openmsg gateway start --relay <url>   # the one process that the network reaches
openmsg send claude:reviewer@bob "the migration drops a column"
```

What holds:

- **Nothing is published by default.** A session is reachable after
  `openmsg publish`, and only in the project that the owner names.
- **A new sender waits.** The first message of a person stays outside the
  model until the owner runs `openmsg accept`. Membership of a project is not
  permission to write into a session.
- **Every message is sealed end to end.** The relay carries bytes that it
  cannot read. It learns who writes to whom, when, and in which project,
  because it needs that to route. The product does not pretend otherwise.
  The relay speaks TLS, and it refuses to listen on any address but this
  machine without a certificate.
- **A signature proves the person, and a fingerprint proves the key.** Two
  people compare a fingerprint out of band before the first message.
- **Each machine holds its own key.** The owner key stays on one machine and
  signs a delegation for the others. One stolen machine costs one delegation,
  and the identity of that person holds. Several machines of one person work
  at the same time, and a message is sealed for the machine that holds the
  session.
- **A message never carries authority.** The receiving agent works inside the
  permissions that its own user already gave it.

The states of a message are `queued`, `held`, `adapter-accepted`,
`agent-acknowledged`, `replied`, `refused`, and `expired`. A write to a socket
is not a read by a model: only an event from the agent gives
`agent-acknowledged`.

## Message format

The envelope uses the field names of the A2A standard (`messageId`, `contextId`,
`parts`, `role`). The same message can travel over A2A on HTTP later, between
two machines.

Each delivered message carries a header that names the sender. The text tells
the receiving model that the message is from another agent, and that it approves
nothing. Each message keeps a list of the agents that it passed through, so a
loop between two agents stops.

## Install

```
npx openmsg list
```

Or from the source:

```
git clone https://github.com/marciob/openmsg.git && cd openmsg
node src/cli.mjs list
```

Node 22 or later. No dependencies, and none for the relay either: the
WebSocket of `src/wsframe.mjs` is both sides of RFC 6455 in one small file.

Run the tests with `node --test`. Seventy-eight of them, and they need no
account: they run two gateways and a relay on this machine, as two people.

An agent with no push entry point needs its hook:

```
openmsg install --hooks
```

## How each vendor lets a message in

[`research/2026-09-19-transport-research.md`](https://github.com/marciob/openmsg/blob/main/research/2026-09-19-transport-research.md)
is the work that produced this design. It tests every way one program can put a message into a running
agent: typing into the terminal of another program, the native entry point of
each vendor, subprocess calls, mailboxes, A2A, and ACP. Each claim carries a
label: `[local]` for a fact that a test on one Mac verified, `[docs]` for a
fact from the vendor, and `[not verified]` for a fact from a source without a
test.

The short answer: typing into a terminal is possible and bad, and each of the
four main agents has an official way to take a message while it runs.

## Spec

- [`spec/openmsg-0.1.md`](https://github.com/marciob/openmsg/blob/main/spec/openmsg-0.1.md):
  the protocol for the agents of one person on one machine.
- [`spec/openmsg-0.2-draft.md`](https://github.com/marciob/openmsg/blob/main/spec/openmsg-0.2-draft.md):
  the agents of different people on one project. The identity of an owner,
  the sealed envelope, the gateway, the relay, the seven states of a message,
  and the trust rules. Every rule of 0.1 still holds.

The code implements both, and the fourteen acceptance cases of section 11 of
0.2 pass as tests.

## License

MIT
marciob22
๐ŸŸง echo.githubVersion 0.2 is on npm; local messaging has live-session tests, while cross-person encrypted messaging has local acceptance tests but no teammarciobโ€”โ€”

Interpretation history

Decision trace