A zero-config, end-to-end encrypted agent-to-agent mesh protocol — communication that never leaves your local network. No cloud. No internet. No compromises.
It sits under the agent frameworks and protocols you already use — giving them a transport that survives a router reboot, a dead ISP, or no internet at all.
Pick the one that matches what you're building. Each opens a fast-path into the docs.
Run Ollama on a Pi, a coding agent on your desktop, a browsing agent on a spare laptop. They find each other, talk, and nothing leaves the house. mDNS + encrypted SQLite queue + dashboard at 127.0.0.1:8766.
Reticulum transport rides on top of LoRa hardware (Heltec V3, RNode). Sub-kbps raw, but IronMesh handles fragmentation, retry, and routing. Useful for remote fieldwork, off-grid nodes, disaster comms.
Python Agent(...) SDK + 25 MCP tools + TypeScript client. Stock LangChain / AutoGen adapters already shipped. Your agents gain TOFU-pinned peer-to-peer messaging without changing their prompt logic.
docker pull wiztheagent/ironmesh:0.9.5
We looked for a way to make AI agents talk to each other on a local network. There was nothing.
× Requires HTTPS and internet. Your agents go silent when the cloud goes down.
× Solves agent-to-tool, not agent-to-agent. IronMesh fills that gap — the two stack together.
× Local IPC only. Can't cross machines on your LAN.
× Decentralized but complex DID setup, still assumes internet connectivity.
Two axes matter for this decision: offline-first (can your agents keep running without the cloud?) and mesh-shape (can they reach each other without a broker?). Pick the axis that matches your deployment.
| Feature | IronMesh | Google A2A | Anthropic MCP | ACP | ANP |
|---|---|---|---|---|---|
| Works offline / no internet | Yes | No | N/A | Yes | No |
| True peer-to-peer | Yes | No | No | No | Yes |
| Zero-config LAN discovery | Yes | No | No | No | No |
| End-to-end encryption | NaCl | TLS only | N/A | No | Yes |
| Forward secrecy | Yes | Depends | N/A | No | No |
| Multi-hop mesh routing | Yes | No | No | No | No |
| Capability discovery | Yes | No | No | No | No |
| LoRa / radio transport | Yes | No | No | No | No |
| Self-hosted, no vendor lock | Yes | No | No | No | Partial |
| Survives internet outage | Yes | No | N/A | Yes | No |
| Feature | IronMesh | Reticulum | libp2p | NATS JetStream |
|---|---|---|---|---|
| Target use case | Agent-to-agent messaging | Radio / off-grid comms | p2p app networking | Cloud-native pub-sub |
| Zero-config LAN discovery | Yes (mDNS) | Yes (announce) | Manual / rendezvous | Requires broker |
| Runs without a broker | Yes | Yes | Yes | No (broker required) |
| Agent-level capability discovery | Yes (cap-hash bound) | No | No | No |
| TOFU identity pinning | Yes | Identity hash only | Peer ID, not pinned | No |
| Built-in MCP / A2A surface | Yes (25 MCP tools) | No | No | No |
| LoRa / sub-kbps transport | Yes (via Reticulum) | Native | No | No |
| Encrypted offline message queue | Yes (SQLite + XSalsa20) | LXMF | Partial (streams) | Yes (at-rest in broker) |
| Python-first SDK | Yes | Yes | Go-first, Python bindings lag | Yes |
| Runs on Termux / Android | Yes | Yes | No | No |
NaCl / libsodium crypto — the same library as Signal and WireGuard. Not homebrew. Not "encrypt later." Not "TLS is enough."
Ephemeral X25519 keys per session, destroyed after handshake. Compromising today's keys can't decrypt yesterday's traffic.
mDNS auto-discovers agents on your LAN. No manual IP config. Identity keys only exchanged during authenticated handshake.
HMAC-SHA256 passphrase proof. Both client and server prove identity. Ed25519 signatures on every single frame.
Distance-vector routing with split horizon and poisoned reverse. Messages traverse intermediate peers automatically.
Optional transport over LoRa radio at 915 MHz via Reticulum. No internet at all. Just RNode hardware and open spectrum.
Messages queued in encrypted SQLite when peers are offline. Automatically delivered on reconnect. Priority ordering built in.
No account. No config file. Every line of output below is from a real run on a stock Python install — play / pause to watch it at your own pace.
The operator console — embedded in every node, reachable at http://127.0.0.1:8766 with a per-session bearer token. The same handshake diagram from the spec, lit live for the selected peer. Encrypted A2A dialogue turn-by-turn in the feed. CSP-locked to same-origin so the page renders with the router unplugged.
Live capture: laptop (Windows) ↔ Raspberry Pi 5 (Ollama) ↔ NAS (Ollama hermes3:3b). A2A dialogue: three turns, ended on goal-achieved.
v0.9.5 is a security-hardening and onboarding release. The inner end-to-end source signature is now verified on receive in a bound form — a relay can no longer redirect, replay-relabel, or re-attribute a message crossing it — and single-use invite tokens (ironmesh invite create, with QR transport) let a new node join without the mesh passphrase ever leaving the inviter. It also introduces the ironmesh/0.9 protocol line: the HELLO signature now carries a dedicated domain-separation context, and on the Reticulum transport a HELLO is cryptographically bound to the RNS link it arrives on — closing a cross-protocol signature-reuse surface and coupling the IronMesh identity to the link session. The at-rest storage key moves from a single unsalted SHA-256 to Argon2id + HKDF, so a leaked disk image no longer allows a fast offline dictionary attack on the passphrase; existing databases re-encrypt automatically on first start.
Every wire change is additive and version-gated with a legacy fallback — the new HELLO signature scheme and RNS link binding activate only when both peers advertise ironmesh/0.9+. The v0.9.5 daemon announces ironmesh/0.9, and peers still advertising ironmesh/0.8 keep interoperating, so every v0.8.x and v0.9.x peer remains interoperable. Rounding it out: per-peer / per-identity buffering caps on RNS links, a hash-pinned lockfile with a blocking mypy gate and CI check-actually-ran guards, a first-run golden-path key resolver with encrypted-by-default keys, and a docs-accuracy pass. 1420 tests green across the Ubuntu + Windows + macOS matrix. No operator action required — drop-in upgrade.
Full card-by-card breakdown of the domain-separated HELLO signature, RNS link binding, buffering caps, Argon2id storage KDF, and the supply-chain gate lives in the release notes rather than on this page. Read the full release notes on GitHub ›
v0.9.4 was a combined release: the originally-planned v0.9.3 security point release (strict TLS, trust-store at-rest encryption, global rate cap, trust CLI) shipped alongside a substantial pre-audit hardening pass. Phases 1 and 2 of the Ed25519/X25519 dual-use migration landed together — the v3 master-seed keystore + the HELLO x25519_public_b64 advertisement with an Ed25519 binding signature. Signed CAPABILITY_ANNOUNCE closed the relay-impersonation gap, plus a frame-length ceiling, JSON depth guard, replay upper bound, CVE-2020-10735 mitigation, narrowed exception handling, and fail-closed TOFU. Wire format stayed at ironmesh/0.8, additive only. Full write-up: v0.9.4 release notes.
The per-card breakdown of the master-seed keystore, HELLO X25519 advertisement, signed CAPABILITY_ANNOUNCE, at-rest trust-store encryption, and the hardening bounds lives in the v0.9.4 release notes rather than on this page. Read the full release notes on GitHub ›
v0.9.2 was the largest pre-1.0 ship: a wire-stable feature-flag system, a server-driven Stage-1 skip path on identified Reticulum Links (three round-trips saved on LoRa), shared-secret group broadcast for cross-host fan-out, capability-aware routing (Agent.send_to_capability(...)), OpenTelemetry spans on every public Agent surface, a formal threat model and conformance test suite, and the v1.0 stability promise. Wire format moved to ironmesh/0.8 with additive-only fields — every v0.8.x peer continues to interoperate. Full write-up: v0.9.2 release notes.
The per-feature breakdown — wire-stable feature flags, the Stage-1 handshake skip on identified RNS Links, shared-secret group broadcast, capability-aware routing, OpenTelemetry spans, and the formal threat model — lives in the v0.9.2 release notes rather than on this page. Read the full release notes on GitHub ›
Mutual passphrase auth, signed ephemeral ECDH, channel binding. Three stages. Zero trust assumptions. The same diagram renders live inside the operator console — click any peer row and watch the stages go green in real time.
Zoomed out from the handshake. This is a typical IronMesh deployment — one laptop, one Raspberry Pi, one off-grid LoRa node. Each machine runs the same daemon; the transports between them differ. mDNS on the LAN, Reticulum over radio to the off-grid node.
Every number below comes from the release-hardening test suite. No projections, no “up to” claims. Runs fine on a Raspberry Pi Zero 2 W with 512 MB RAM. The performance figures were measured at the v0.9.4.x release gate; only the test count is refreshed for the security-hardening v0.9.5 release.
tests/ and scripts/ on the public repo. The 2000-thread stress is the last block of tests/test_trust_binding.py::TestConcurrentCapPromoteRace; the 5000-input fuzz is reproduced by scripts/release-smoke.sh.
Before you install, the eight questions evaluators actually ask.
ironmesh upgrade optionally checks PyPI for new releases; that's the only public-internet call in the whole codebase and it's off by default.
keys.json, Argon2id-wrapped at rest, optionally held in the OS keychain. Full threat model at /security.html.
CONTRIBUTING.md on the repo covers the style + test + leak-scan requirements.
Patch-level discipline: every v0.8.x peer stays interoperable, and the v0.9.x line stays additive-only — the wire protocol advanced from ironmesh/0.8 (v0.9.2) to ironmesh/0.9 (v0.9.5), version-gated so older peers keep negotiating the common feature set. Scroll through what each drop brought.
ironmesh/0.9). Argon2id + HKDF at-rest storage key, per-peer / per-identity buffering caps, hash-pinned lockfile + blocking mypy gate, encrypted-by-default keys. Every wire change additive + version-gated with a legacy fallback — the daemon announces ironmesh/0.9, and peers still advertising ironmesh/0.8 stay interoperable. Drop-in upgrade.ironmesh doctor --peer reachability dry-run, two deployment helpers, and LLM-bridge example polish. Wire-byte-identical to v0.9.4, drop-in upgrade.--strict-tls, --max-msgs-per-sec, trust CLI) shipped alongside Ed25519/X25519 dual-use migration phases 1 + 2, signed CAPABILITY_ANNOUNCE, frame-length ceiling, JSON depth guard, replay upper bound, CVE-2020-10735 mitigation, narrowed exceptions, fail-closed TOFU. Wire format additive only.ironmesh/0.8 (additive only).Agent.send_to(name), LXMF listener + telemetry, public RPC paths (/im/info, /im/cap/*, /im/admin/*).@wiztheagent/openclaw-ironmesh@0.2.0), ironmesh-acp stdio adapter (acp-core-v1@0.3.0), ironmesh-a2a HTTP gateway (AgentCard + JSON-RPC + envelope inbox). Capability-persistence fix, multi-peer routing, MCP --peer manual bootstrap._emit_audit_with_reservation helper, audit-chain verify on startup, two new Grafana panels, OPERATOR_RUNBOOK trust-store recovery section, [lxmf] install extra.ironmesh upgrade, Windows service wrapper, OpenTelemetry tracing, TS client 0.2.0 with TOFU pin enforcement.ironmesh setup wizard, full contributor docs, CodeQL, Reticulum smoke tests.conv_multiturn + persona_debate examples, release checklist enforcing doc-sync.set-state CLI landed. Atomic trust-store writes, tamper-evident audit, full 13-job CI matrix.wiztheagent/ironmesh:0.8.3) + GitHub release. Full multi-hop mesh, dashboard console, e2e tests.Raspberry Pi running Ollama talks to your desktop coding agent. No cloud. No API keys. No third parties.
Agents on a network with no internet coordinate tasks, share data, and run workflows over LoRa radio.
Self-contained AI network that works when the internet doesn't. Solar-powered Pi cluster. Local models.
Agents in isolated environments that can never touch the internet. Full encryption at rest and in transit.
All agent communication stays on your LAN. Nothing leaves your network. Nothing gets logged by anyone.
Phone, desktop, and server agents all talk directly to each other. mDNS discovery. Zero config.
v1.0 ships when the protocol is proven in real deployments, not on a calendar. A two-line note about your setup — where it runs, what it talks to, what broke — is the single most useful thing that moves the roadmap.
Homelab, off-grid LoRa, air-gapped lab, or something we haven't thought of. No form, no signup — just a couple of lines.
Local-first. Offline-capable. Mesh-ready. Zero-config. No cloud required. Ever.