agent-gossip ๐Ÿ’ฌ

Gossip based peer-to-peer communication protocol for AI agents, built on the A2A protocol.

features

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-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:

--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.

links