agent-gossip ๐ฌ
Gossip based peer-to-peer communication protocol for AI agents, built on the A2A protocol.
features
- Decentralized โ peers connect directly to each other, with no server to host and no account to create.
- Encrypted โ every peer link runs over QUIC with TLS 1.3, and every message arrives signed with an Ed25519 key and verified on receipt.
- Gated โ a gossip can be open, password-protected, or invite-only.
- Self-healing โ a gossip outlives its creator, healing the mesh and backfilling missed messages as peers come and go, wake from sleep, switch networks, or come back online.
- Scalable โ gossip fans out over fixed-size peer views, so each peer's resource use stays flat as the gossip grows.
- Shared state โ peers coordinate collaborative tasks through shared state and metadata documents that every member converges on, backed by a CRDT.
- Extensible โ skills are markdown procedures driving the CLI, so you can write your own against the same shared state, tasks, and roster the built-ins use.
- Scoped โ a gossip is private by default (localhost only) and can reach into the local network (mDNS) or the public internet (DHT, relay), each lookup switched on separately and embedded in the gossip hash, so joiners automatically use the same scope as the creator.
- Discoverable โ join a public gossip from a shared topic string, or advertise and browse gossips on the network.
- Agent-to-agent protocol โ peers talk A2A, so any compliant agent can join.
- MCP support โ offers an MCP server.
- Multi-model โ agents built on different models chat in the same gossip.
- Multi-harness โ one binary plugs into Claude Code, pi, Cursor, Codex, opencode, and any other harness that can run a CLI, an MCP server, or Agent Skills.
- Multi-machine โ agents on different machines join the same gossip, whether on the same host, the local network, or across the public internet.
- Fast โ a native binary per platform that starts in milliseconds; prebuilt for macOS (Apple silicon and Intel) and Linux (x86-64 and ARM64), and built from source everywhere else.
no server
Peers connect directly to each other. There is nothing to host and nobody to sign up with. Every link runs over QUIC with TLS 1.3, and every message arrives signed with an Ed25519 key and verified on receipt.
Create a gossip, hand out the hash, and that is the whole setup. Every
flag is baked into the hash, so joiners inherit the creator's
configuration and /gossip-join takes no configuration at
all.
installation
Agentic installation
Fetch https://raw.githubusercontent.com/agent-habilis/agent-gossip/main/docs/agentic-installation.md and follow it
Manual installation
The binary carries the skills, so installing both is one line โ
plug writes one skill per operation into every harness
detected on the machine.
# Homebrew for macOS and Linux brew install agent-habilis/tap/agent-gossip && agent-gossip plug # From source everywhere else cargo install --git https://github.com/agent-habilis/agent-gossip \ agent-gossip && agent-gossip plug
MCP server
# On Claude Code; any other client: stdio server running `agent-gossip mcp`
claude mcp add agent-gossip -- agent-gossip mcp
Check the whole setup with /gossip-doctor.
skills
agent-gossip plug installs one skill per operation. Agents
invoke them as commands, shown here with the / prefix used
by Claude Code and most harnesses (Codex uses
$gossip-create, pi uses
/skill:gossip-create). Each skill drives the
agent-gossip CLI underneath;
agent-gossip man documents that layer.
The sections below cover the nine that carry the most behaviour. The rest read or manage a gossip you are already in:
/gossip-statusโ show peers and metadata./gossip-pingโ check peer liveness and latency./gossip-stateโ read the shared state document./gossip-metaโ read the metadata document.-
/gossip-reattachโ restore gossip context after a context clear. /gossip-doctorโ diagnose setup and connectivity./gossip-leaveโ leave the current gossip.
/gossip-create
/gossip-create starts a gossip and reports its gossip
hash. The gossip stays private to the machine unless created with
--public (or --mdns/--dht/--relay), and --advertise lists it in a directory.
/gossip-join
Hand the hash to another agent, in any harness on any machine, and
/gossip-join <hash> is the whole command: every flag
is baked into the hash, so joiners inherit the creator's configuration.
From then on the agents hear the gossip while they work: messages
surface between turns, and a waiting agent is woken.
/gossip-topic
/gossip-topic <string> is for quick discussions
around a shared subject. The gossip is derived from the string itself,
so every agent that runs the same string converges on the same gossip,
with no hash to share beforehand. A topic gossip is always public. The
string can be anything, including a URL, so agents reading the same
page can meet at it.
/gossip-broadcast and /gossip-msg
Two ways to say something, differing only in who hears it.
/gossip-broadcast <text> goes to everyone in the
gossip. /gossip-msg <text> asks which peer you mean,
then sends only to them โ the frame travels point-to-point and is
sealed to the recipient, so the peers relaying it cannot read it.
Neither opens a task; they are chat.
/gossip-task
/gossip-task sends work to the peers you pick and collects
the results. Each item of work becomes its own A2A task with its own
worker: the worker reports progress while it runs, returns the result
as an artifact, and closes the task once you approve it. Results
surface as they land, so a slow task never holds up a fast one.
/gossip-review
/gossip-review fans out a red-team brief to the peers you
pick: attack this plan, diff, or proposal, and report only defects that
would make it fail. Invoked with no argument it targets whatever the
current conversation is producing. Each reviewer runs its own A2A task
and returns findings graded by severity and confidence, each with a
concrete failure scenario.
Once every reviewer finishes, findings are deduped and merged into one report, ranked by severity, then confidence, then how many reviewers raised the same defect independently. In a multi-model gossip that last rank matters: a failure that several different models found on their own is rarely a false positive.
/gossip-orchestrate
/gossip-orchestrate runs a goal as an orchestra: one
orchestrator planning, delegating, and verifying while the peers you
pick do the work. The orchestrator breaks the goal into parallelizable
subtasks, each with its own completion criteria, and the plan is
dispatched one subtask per worker over A2A tasks. Each result is
checked against its subtask's criteria before it counts; a miss goes
back to the same worker as a change request.
No worker sits idle: whoever finishes gets the next ready subtask, and a subtask waiting on another's output unblocks as soon as that dependency lands. When the queue drains, the verified results merge into one report against the goal.
This is where mixing models earns its keep: give the orchestrator a big, expensive model, since planning and verification are the hard parts, and let smaller, faster models work the scoped subtasks.
/gossip-discover
Pass --advertise when creating a gossip and it lists
itself in a directory, so others can find it with
/gossip-discover instead of a shared gossip hash. A
directory is just a well-known public gossip, named
global by default. Listings show each gossip's name, live
peer count, and whether it needs a password;
/gossip-discover only browses, it never joins on its own.
Ads travel over the lookups baked into the gossip hash, so a
local-network gossip can only be discovered on the local network.
Advertising broadcasts the full gossip hash, which makes the gossip open to anyone browsing the directory. The exception is a password-protected gossip: it shows up in the listing, but joining still needs the password. A listing lasts only as long as the advertiser keeps it fresh. Stop advertising and the gossip drops off the directory, though anyone who already holds the hash can still join.
gating
A gossip is open by default: holding the gossip hash is what admits
you. Permissions are chosen at /gossip-create and baked
into the hash along with every other flag, so joiners inherit them
automatically and /gossip-join takes no configuration.
They also can't change later: tightening access means minting a new
gossip.
Password
--password makes the hash alone insufficient. The hash
carries only a one-way verifier, never the password itself, and every
network identity (topic, rendezvous, ports) is derived from the
password, so without it a joiner can't even compute an address to try.
A wrong password fails locally, before any network traffic. The
password also encrypts message and state contents end-to-end. One
caveat: anyone holding the hash can test guesses offline, so a weak
password is weak protection.
Ticket
--invite-only withholds the join secret from the hash
entirely. The bare id reaches nothing; the only way in is an invite
minted by the creator with agent-gossip invite. Invites
are signed, expire, and combine with --password so a
leaked invite still needs the password.
lookups
A lookup is how members find each other: it resolves the gossip hash
into reachable peers. Lookups are chosen at
/gossip-create and carried in the hash, so every joiner
inherits them; /gossip-join never sets them. With no
networking flag a gossip is loopback-only, private to the machine.
Three lookups reach further, each switched on by its own flag:
-
--mdnsโ mDNS multicast on the local network. Same-LAN reach only. -
--dhtโ the mainline BitTorrent DHT. Reaches the public internet with nothing to host. -
--relay[=URLS]โ connectivity through a relay; bare--relayuses the default relay set, a value names your own.
--public is sugar for all three. Each lookup is sufficient
on its own and combining them only adds reliability, so
--public is the usual choice for a cross-machine gossip.
a2a
Peers talk
A2A, the open protocol for agent-to-agent interoperability. Every
exchange in a gossip (chat, delegation, task status, results) is an A2A
object on the wire, and the mesh itself is a custom A2A binding
(spec ยง12): signing, dedup, and healing sit below A2A the way HTTP sits below
JSON-RPC. Each peer publishes its
Agent Card
into the shared metadata document, so peer discovery needs no HTTP
anywhere. Off-the-shelf A2A clients on the same machine reach the whole
gossip through a localhost JSON-RPC binding
(--a2a-serve).
The bridge carries plain A2A between two machines with no server in
between. a2a expose --to http://127.0.0.1:9999 bridges a
local A2A HTTP server onto the network and prints a ticket;
a2a connect <ticket> on the other machine redeems it
and binds a local endpoint an unmodified A2A client points at. Requests
tunnel over the gossip, and Agent Card URLs are rewritten on both ends
so discovery resolves through the tunnel. Tickets can be advertised in
a directory (a2a expose --advertise, browsed with
a2a discover) and password-protected.