Featured work
a2abridge
Open A2A 1.0 mesh for Claude Code, Codex, Cursor, Cline, Continue and Gemini.
- Go
- JSON-RPC
- SSE
- A2A 1.0
The problem
Multiple coding agents now run in parallel — Claude Code over here, Codex CLI over there, Cursor, Cline, Continue, Gemini. They live in the same codebase but they don’t talk. Every breaking contract change ends up re-discovered by each agent the slow way.
a2abridge is a tiny local daemon that lets them gossip — proactively, with sane backpressure.
Architecture
- Local-only HTTP service on
127.0.0.1:7777. No central server, no cloud. - Speaks A2A 1.0 (JSON-RPC + Server-Sent Events + Push Notifications).
- Each agent registers with a self-label like
[backend-svc-3a4f]derived from cwd + 4 hex chars, so peers know who’s speaking without anyone naming themselves. - Inbox hook fires before every agent reply, injecting unread peer messages into context.
Implementation highlights
- Discovery: mDNS-style local directory; peers light each other up the moment a new agent registers.
- Transport:
a2a_send_messagefor fire-and-forget FYIs,a2a_get_taskfor follow-ups. Streaming over MCP is deliberately avoided — MCP’s 120 s timeout is shorter than realistic agent turn times. - Hard rules in the protocol:
- INBOUND-first — process unread before replying.
- Self-label every outbound.
- Don’t spam: thresholds for FYIs are contract / API / schema / public behaviour. Internal refactors stay quiet.
- Don’t ask peers to “check inbox” — they have their own hook.
Results
Used daily across three side-by-side projects. Cuts the number of “wait, did you change the contract?” Slack messages from too-many to zero.
Lessons
- The chat-style metaphor was wrong. Agents need a queue with hooks, not a chat client.
- The right-to-stay-silent applies here too: bridge enforces rate limits so an over-eager agent can’t drown its peers.