IRONMESH
v0.9.5 · Pre-1.0

Your agents. Your network.
Your rules.

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.

pip install ironmesh Click to copy
MIT licensed · zero telemetry · no signup · offline-capable

IronMesh is a layer, not a competitor.

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.

Your application
Agent frameworks — LangChain · CrewAI · AutoGen
adapters ship with IronMesh
Tool / context protocols — MCP · A2A
IronMesh — identity · encryption · routing · queue
this project
Transport — WebSocket over LAN · Reticulum / LoRa
Doesn't MCP already do this?
MCP connects agents to tools. IronMesh connects agents to each other. They compose.
What about LangGraph / CrewAI?
They orchestrate agent logic. IronMesh carries the messages between machines. They compose.
Isn't Tailscale / WireGuard enough?
Those give you an encrypted tunnel. IronMesh adds identity pinning, capability discovery, offline queueing, and an agent-aware routing table on top.
Why not use Reticulum directly?
Reticulum is a great low-level mesh; IronMesh uses it as one of its transports. We add per-agent identity, capability discovery, and an authenticated handshake on top.

Three ways to run IronMesh.

Pick the one that matches what you're building. Each opens a fast-path into the docs.

Homelab operator

Private AI on your LAN

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.

Offline / LoRa builder

Agents over radio, no internet

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.

Agent-framework integrator

Drop into LangChain / AutoGen

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.

IronMesh v0.9.5
GitHub · MIT · self-hosted
v0.9.5 release 21 releases

Every agent protocol assumes you're online.

We looked for a way to make AI agents talk to each other on a local network. There was nothing.

Google A2A

× Requires HTTPS and internet. Your agents go silent when the cloud goes down.

Anthropic MCP

× Solves agent-to-tool, not agent-to-agent. IronMesh fills that gap — the two stack together.

ACP

× Local IPC only. Can't cross machines on your LAN.

ANP

× Decentralized but complex DID setup, still assumes internet connectivity.

0
Cloud dependencies
1420
Passing tests
21
Releases · no breaking changes
Star on GitHub ›

If you need the internet to be optional.

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 internetYesNoN/AYesNo
True peer-to-peerYesNoNoNoYes
Zero-config LAN discoveryYesNoNoNoNo
End-to-end encryptionNaClTLS onlyN/ANoYes
Forward secrecyYesDependsN/ANoNo
Multi-hop mesh routingYesNoNoNoNo
Capability discoveryYesNoNoNoNo
LoRa / radio transportYesNoNoNoNo
Self-hosted, no vendor lockYesNoNoNoPartial
Survives internet outageYesNoN/AYesNo
Feature IronMesh Reticulum libp2p NATS JetStream
Target use caseAgent-to-agent messagingRadio / off-grid commsp2p app networkingCloud-native pub-sub
Zero-config LAN discoveryYes (mDNS)Yes (announce)Manual / rendezvousRequires broker
Runs without a brokerYesYesYesNo (broker required)
Agent-level capability discoveryYes (cap-hash bound)NoNoNo
TOFU identity pinningYesIdentity hash onlyPeer ID, not pinnedNo
Built-in MCP / A2A surfaceYes (25 MCP tools)NoNoNo
LoRa / sub-kbps transportYes (via Reticulum)NativeNoNo
Encrypted offline message queueYes (SQLite + XSalsa20)LXMFPartial (streams)Yes (at-rest in broker)
Python-first SDKYesYesGo-first, Python bindings lagYes
Runs on Termux / AndroidYesYesNoNo

Security isn't a feature. It's the architecture.

NaCl / libsodium crypto — the same library as Signal and WireGuard. Not homebrew. Not "encrypt later." Not "TLS is enough."

🔒

Forward Secrecy

Ephemeral X25519 keys per session, destroyed after handshake. Compromising today's keys can't decrypt yesterday's traffic.

🔍

Zero-Config Discovery

mDNS auto-discovers agents on your LAN. No manual IP config. Identity keys only exchanged during authenticated handshake.

🛡

Mutual Authentication

HMAC-SHA256 passphrase proof. Both client and server prove identity. Ed25519 signatures on every single frame.

🌐

Multi-Hop Mesh

Distance-vector routing with split horizon and poisoned reverse. Messages traverse intermediate peers automatically.

📡

LoRa / Reticulum

Optional transport over LoRa radio at 915 MHz via Reticulum. No internet at all. Just RNode hardware and open spectrum.

Offline Queue

Messages queued in encrypted SQLite when peers are offline. Automatically delivered on reconnect. Priority ordering built in.

Install, run, first encrypted message.

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.

bash — ironmesh quickstart

Three peers talking. Zero cloud.

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.

End-to-end source authentication + invite tokens + domain-separated HELLO signatures.

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 ›

Pre-audit hardening + Ed25519/X25519 dual-use migration + signed capability advertisements.

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 ›

1.0 prep mega-release. Conformance, OTel, capability-aware routing, handshake skip on identified Links.

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 ›

The handshake.

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.

Client Server STAGE 1 · MUTUAL PASSPHRASE AUTH PASSPHRASE_CHALLENGE · 32-byte server nonce HMAC-SHA256(pass, nonce) STAGE 2 · SIGNED EPHEMERAL ECDH (X25519) + CHANNEL BINDING HELLO {eph_pub_A, id_pub_A, server_nonce} Ed25519-signed(canonical payload) HELLO {eph_pub_B, id_pub_B, server_nonce} STAGE 3 · SHARED SECRET + AUTHENTICATED SECRETBOX FRAMES ECDH(eph_priv_A, eph_pub_B) ECDH(eph_priv_B, eph_pub_A) = shared_secret (eph_priv_A wiped) (eph_priv_B wiped) SecretBox(XSalsa20-Poly1305) + Ed25519 on every frame
Click any stage to see the exact wire payload and libsodium primitives.

What three machines actually look like.

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.

NODE · LAPTOP laptop • ironmesh run • Claude Code + MCP • dashboard :8766 • identity: a4d1f397… Windows 11 · Python 3.13 NODE · RASPBERRY PI pi-ollama • ironmesh run • Ollama · llama3:8b • LangChain adapter • identity: 60a9cca1… Raspbian · LAN only NODE · OFF-GRID fieldpi • ironmesh run • Reticulum + RNode • Heltec V3 · 915 MHz • identity: 7f1a2c88… Pi Zero 2 W · solar WebSocket mDNS · LAN SecretBox + Ed25519 Reticulum over LoRa radio 915 MHz · SF8/BW125 WHAT EVERY NODE RUNS • Ed25519 identity keypair (first run) • mDNS / Reticulum announce loop • Encrypted SQLite queue for offline peers • HMAC-chained audit log • Distance-vector mesh router • X25519 ECDH + forward-secrecy rekey • TOFU pin + capability-set binding • Dashboard on localhost (session token)
WebSocket over LAN Reticulum / LoRa over radio

Real numbers from the v0.9.4.x release gate.

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.

Idle RSS ~50 MB Steady state with three peers connected + dashboard running. Grew just 3.1 MB over a 44-minute soak with zero operator activity.
Handshake latency < 50 ms Client-to-server mutual-passphrase + signed-ephemeral-ECDH + channel binding, LAN, end-to-end.
Concurrent operator stress 2000 thr 2000 concurrent cap-promote calls across 20 peers completed in 2.7 seconds. Exactly one winner per peer. Zero MAC corruption.
Protocol fuzz 5 000 Random and corrupted binary frames fed through the deserializer. Zero unhandled exceptions — only the documented ValueError / CryptoError paths fire.
Audit log write ~1 ms Single-entry append under cross-process flock + fsync. HMAC-chain verification of 7000-entry log completes under 200 ms.
Test coverage 1420 Unit tests green across Ubuntu + Windows + macOS on Python 3.10 / 3.11 / 3.12 / 3.13. Excludes live-mesh integration tests.
LoRa payload headroom 128 B Default payload limit on Reticulum / LoRa transport. Above that, automatic fragmentation + reassembly via the offline queue.
Wheel size 267 kB Pure-Python wheel with 24 public modules. Sdist is 371 kB. No C extensions — crypto comes from the PyNaCl wheel.
Reproducibility: all benchmark scripts live in 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.

Objections, answered directly.

Before you install, the eight questions evaluators actually ask.

Is this a toy, or is it real?
Real. Shipped on PyPI + Docker Hub + GitHub since April 2026, twenty-one releases on a patch-level-backwards-compatible line, 1420 tests green across three operating systems and four Python versions. Runs on a live three-node mesh (laptop + Pi + NAS) used daily. It is also alpha software hardening toward v1.0: the IronMesh protocol has not yet had a third-party audit (the primitives are NaCl / libsodium, which have). Source is MIT-licensed on GitHub; read the code before trusting it.
Does it phone home? What does it send out of my network?
Zero cloud dependencies. The daemon only speaks to (1) peers it discovers via mDNS on the same LAN, (2) peers you explicitly configured, or (3) peers reachable via the Reticulum / LoRa transport you opted into. No telemetry, no analytics, no license server. 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.
Can I run it behind CGNAT / a restrictive firewall?
On a LAN, yes — everything happens inside your subnet. For cross-site or WAN deployments, IronMesh currently assumes reachable peers (Tailscale, WireGuard, or a VPN underneath). A NAT-traversal design doc exists in the repo; shipping that work is queued for a later release and isn't in the current v0.9.x line.
What does it cost me on a Pi Zero / low-end hardware?
~50 MB RSS at idle with three peers. +3.1 MB RSS drift over a 44-minute soak. Handshake under 50 ms on LAN. SQLite offline queue is encrypted at rest but the schema is lean — a few thousand queued messages is a couple hundred kB. You'll run into Ollama's memory floor long before IronMesh's.
How is this different from MCP?
MCP connects agents to tools (filesystem, database, API). IronMesh connects agents to each other. They compose: IronMesh ships a 25-tool MCP server so Claude Desktop / Claude Code can control a running mesh (list peers, promote pending trust, send messages, inspect audit log). Using MCP doesn't replace IronMesh and vice versa.
Why not just use Tailscale or WireGuard?
Those give you an encrypted tunnel between hosts. IronMesh gives you per-agent identity, TOFU key pinning, capability discovery, a pending-trust message gate, an HMAC-chained audit log, and an offline message queue — built on top of whatever tunnel you want, or none at all. They compose too: run IronMesh inside a Tailnet and you get both layers.
What's actually encrypted, and with what?
Every post-handshake frame is NaCl SecretBox (XSalsa20-Poly1305) under a session key derived from fresh X25519 ECDH, signed with an Ed25519 detached signature. Identity keys live in keys.json, Argon2id-wrapped at rest, optionally held in the OS keychain. Full threat model at /security.html.
How do I contribute? Where do I report a bug?
Bugs and feature requests go to GitHub Issues. Security reports go to info@ironmesh.org — please don't open a public issue for the initial report. PRs welcome; CONTRIBUTING.md on the repo covers the style + test + leak-scan requirements.

Four months. Twenty-one releases. No breaking changes.

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.

CURRENT
v0.9.5
Jul 2026
HELLO domain separation + RNS link binding, protocol ironmesh/0.9 — security-hardening release
Domain-separated HELLO signature and, on Reticulum, a HELLO bound to its RNS link (protocol 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.
v0.9.4.2
Jun 2026
Operator-polish sweep
Single-fix patch line on v0.9.4. Multi-homed peer address selection, an ironmesh doctor --peer reachability dry-run, two deployment helpers, and LLM-bridge example polish. Wire-byte-identical to v0.9.4, drop-in upgrade.
v0.9.4
May 2026
Pre-audit hardening + dual-use migration + signed CAPABILITY_ANNOUNCE
Combined release: originally-planned v0.9.3 security hardening (trust-store at-rest encryption, --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.
v0.9.2
Apr 2026
1.0 prep mega-release
Wire-stable feature flags, Stage-1 skip on identified RNS Links, shared-secret group broadcast, capability-aware routing, OpenTelemetry spans, formal threat model + conformance suite + v1.0 stability promise. Wire format moved to ironmesh/0.8 (additive only).
v0.9.1
Apr 2026
Reticulum integration sweep
RNS announce-driven auto-discovery, per-packet ratchets, RNS Resource auto-routing for multi-MB payloads, unified Agent.send_to(name), LXMF listener + telemetry, public RPC paths (/im/info, /im/cap/*, /im/admin/*).
v0.9.0
Apr 2026
OpenClaw, ACP, A2A interop
OpenClaw channel plugin (@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.
v0.8.5.8
Apr 2026
Counter correctness + observability polish
Counter continuity across daemon restart (reconciled from audit-log tail), structured _emit_audit_with_reservation helper, audit-chain verify on startup, two new Grafana panels, OPERATOR_RUNBOOK trust-store recovery section, [lxmf] install extra.
v0.8.5.7
Apr 2026
Cap-binding, end-to-end
Dashboard PENDING CAP CHANGE panel, nine new Prometheus counters + OpenTelemetry spans, five new operator CLI subcommands, two new MCP tools (cap_diff + cap_reject_peer).
v0.8.5.6
Apr 2026
Trust-binding + cross-transport replay
Capability-set hash binds the pending-trust state across reconnects; cross-transport replay surfaces as a dedicated audit event. 19 bugs found + fixed during release hardening.
v0.8.5.5
Apr 2026
QoL patch + Windows service
OS keychain backend, CLI named profiles, ironmesh upgrade, Windows service wrapper, OpenTelemetry tracing, TS client 0.2.0 with TOFU pin enforcement.
v0.8.5.4
Apr 2026
Repo hygiene + onboarding
Layered leak-scan, first-run ironmesh setup wizard, full contributor docs, CodeQL, Reticulum smoke tests.
v0.8.5.3
Apr 2026
Quickstart hardening + examples
Insecure-flag startup warnings, pending-trust deprecation path, conv_multiturn + persona_debate examples, release checklist enforcing doc-sync.
v0.8.5.2
Apr 2026
Operator polish + 10 security fixes
Audit-log + doctor + set-state CLI landed. Atomic trust-store writes, tamper-evident audit, full 13-job CI matrix.
v0.8.5
Apr 2026
Pending-trust gate + 21 MCP tools
Opt-in pending-trust message gate (default-on in v0.9), 21-tool MCP server, OpenClaw channel 0.1.0.
v0.8.3
Apr 2026
First public release
PyPI + Docker Hub (wiztheagent/ironmesh:0.8.3) + GitHub release. Full multi-hop mesh, dashboard console, e2e tests.

Built for people who don't trust the cloud.

Home AI Mesh

Raspberry Pi running Ollama talks to your desktop coding agent. No cloud. No API keys. No third parties.

Off-Grid Comms

Agents on a network with no internet coordinate tasks, share data, and run workflows over LoRa radio.

Prepper Infrastructure

Self-contained AI network that works when the internet doesn't. Solar-powered Pi cluster. Local models.

Air-Gapped Labs

Agents in isolated environments that can never touch the internet. Full encryption at rest and in transit.

Privacy-First AI

All agent communication stays on your LAN. Nothing leaves your network. Nothing gets logged by anyone.

Multi-Device Workflows

Phone, desktop, and server agents all talk directly to each other. mDNS discovery. Zero config.

Running IronMesh somewhere real?

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.

Tell us where it runs

Homelab, off-grid LoRa, air-gapped lab, or something we haven't thought of. No form, no signup — just a couple of lines.

Pull the plug on your router.
IronMesh keeps working.

Local-first. Offline-capable. Mesh-ready. Zero-config. No cloud required. Ever.

pip install ironmesh Click to copy