Skip to main content

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_message for fire-and-forget FYIs, a2a_get_task for 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.