MeshSwarm — Autonomous Mesh Intelligence
Command a self-propagating AI network of real Meshtastic radio nodes. No internet required. Build, evolve, and deploy your swarm anywhere on Earth.
MeshSwarm turns a group of inexpensive Meshtastic radio nodes into a distributed AI organism. Each node is an autonomous agent — it relays data, votes on decisions, detects anomalies, earns XP, and promotes itself through roles. Together, they form a collective intelligence that operates entirely off-grid.
Follow these steps to get your swarm online. You can start with Demo Mode instantly, or connect real hardware for full real-world deployment.
Earn XP through actions to advance through 7 Commander ranks. Higher ranks unlock new mission types, broader activation wave reach, and deeper AI control.
Every meaningful action on the mesh earns you XP. Your field nodes also earn XP autonomously — the swarm learns and rewards collectively. XP is the reinforcement signal that drives the AI.
MeshSwarm uses reinforcement learning principles without any cloud dependency. The AI emerges from the collective behavior of individual node agents interacting over the radio mesh.
MeshSwarm isn't just a game — it's a real off-grid AI communication platform. These are active real-world deployment scenarios where the technology provides genuine value.
Any Meshtastic-supported LoRa device works. Here are the most popular options to build your swarm. All run the open-source Meshtastic firmware:
Complete missions and hit milestones to unlock achievements and earn bonus XP. Progress is saved locally in your browser.
Choose your commander callsign — displayed in the HUD and broadcast in Activation Waves as your operator identity across the mesh.
Start with Demo Mode for an instant preview, or connect your Meshtastic hardware for real off-grid deployment.
📊 Mesh Statistics
🌐 Network Topology
Nodes shown by role. Lines indicate last-seen neighbor links.
📜 Live Event Log
📋 Node Registry
| Node ID / Name | Role | Profile | GPS | Battery | Last Seen | Actions |
|---|---|---|---|---|---|---|
| No nodes registered yet | ||||||
🗺️ Real-World Node Map
🚀 One-Click Search & Deploy
Automatically discovers AgentR2 on localhost, fires a HEARTBEAT to both agents, then broadcasts the ACTIVATE sync wave — all in one click.
Requires the backend running locally (npm start).
🤖 Recruit AgentR1 → Watchdog / Mirror
Sends a targeted RECRUIT wave then a !info ping to confirm
that your local node (!8f87743b) is on the mesh.
Once the NodeInfo reply is captured, AgentR1 is registered as ORCHESTRATOR and elevated to
the AgentR2 Watchdog / Mirror role — confirmed in both this dashboard and
meshtastic.org broadcast/0.
[AR]CMD:ACTIVATE|TO:ALL|ROLE:RECRUIT|TTL:5
→ 500 ms →
!info
→ NodeInfo reply from AgentR1 →
Registered + Broadcast confirmation ✔
📨 Send [AR] Command
📬 ACK Feed
📡 Broadcast Activation Wave
[AGENT-ACTIVATE] version=1.0 role=RECRUIT profile=DEFAULT origin=AGENTR ttl=5 action=ADOPT_AND_FORWARD signature=ROOTIB
📢 Recruit New Nodes
Send a human-readable mesh broadcast inviting nearby nodes to join the AI Swarm. The message includes a link to the registration landing page where users can learn about the swarm, register their node, and connect their Solana wallet for rewards. Compatible with all stock Meshtastic firmware — no custom firmware required on the receiving node.
🎯 Auto-Recruit & Scan — Stock Firmware Node Discovery
Combines a RECRUIT activation wave with a !info NodeInfo broadcast.
Every stock Meshtastic node in LoRa range will automatically reply with its ID, name, hardware, firmware,
and battery level — no custom firmware required. Responses are captured by the SSE stream and each
responding node is automatically added to the Node Registry as RECRUIT.
[AR]CMD:ACTIVATE|TO:ALL|ROLE:RECRUIT|TTL:5
→ 500 ms pause →
!info
→ NodeInfo auto-responses captured & registered
💡 Responding nodes appear in the Node Registry tab automatically. Telemetry (battery, voltage, channel utilisation) is logged from serial output. Use Edit in the Node Registry to promote a RECRUIT to SCOUT, RELAY, or another role.
📤 Ping Broadcaster
!info → NodeInfo |
!pos → Position + SNR + RSSI |
!ping → NodeInfo + Position + Route.
These are protocol-level replies — no bot required on the remote node.
📊 Ping Stats
🗺 Ping Map — SNR Signal Coverage
Full Map ↗📋 Ping Responses
| Node ID | Long Name | Short | Hardware | Firmware | Battery | SNR | RSSI | Hops | GPS | Last Heard | Received |
|---|---|---|---|---|---|---|---|---|---|---|---|
| No ping responses yet — press a ping button above | |||||||||||
💬 Message Feed
💡 NodeInfo broadcasts !info — every stock Meshtastic node in range
replies with its node ID, name, hardware model, firmware version, and battery level.
📱 Bluetooth / BLE — Mobile Connect (Android Chrome / iOS info)
📱 Bluetooth — Mobile Connect (iPhone / Android)
On Android with Chrome, connect directly to your Heltec V3 via Bluetooth Low Energy — no USB cable or backend needed. Uses the same Meshtastic GATT service UUID as the Meshtastic app. On iPhone / iOS, see the note below.
📶 Raw data from the Heltec will appear here once connected via BLE. [AR] protocol packets are parsed automatically.
6ba1b218-15a8-461f-9fa8-5d6e56b89232
· FromRadio (notify) ed9da18c…
· ToRadio (write) f75c76d2…
⚡ Heltec Quick Connect — USB / COM Port
Plug your Heltec (or any Meshtastic device) into USB, then click 🔌 Connect COM Port. Chrome / Edge required — no backend or ngrok needed.
📡 Raw data from the Heltec will appear here when connected — confirms data is flowing.
CP210x (Silicon Labs) — most Heltec V3 | CH341/CH340 (WCH) — older boards
⚠ Port not showing up? Install the driver above, unplug/replug USB, then try again.
🐍 Python CLI — Install & Control via Terminal
🐍 Meshtastic Python CLI — Install & Control
The official Meshtastic Python CLI provides full device control from any OS terminal — read node info, send messages, configure channels, and expose your device as a TCP server that this dashboard can connect to. Works on Windows, macOS, and Linux.
pip3 install --upgrade "meshtastic[cli]"
Install prerequisites
- Python 3.9+ — python.org/downloads
- Check version:
python3 --version
Install or upgrade the CLI
- Run in your terminal:
pip3 install --upgrade "meshtastic[cli]" - Verify install:
meshtastic --version
Essential commands
- Show device info:
meshtastic --info - List nearby nodes:
meshtastic --nodes - Send a text to the mesh:
meshtastic --sendtext "Hello!" - Export node list as JSON:
meshtastic --export-config
Bridge to this dashboard (TCP mode)
- Start the TCP bridge:
meshtastic --host 0.0.0.0 - The CLI listens on
localhost:4403by default. - In the header bar above, set Server URL to
http://localhost:4403and click 💾 Save. - Click 🔍 Scan Ports in the Connection Wizard below to auto-detect.
⚠ Common CLI Issues
- "command not found: meshtastic" → Run
python3 -m meshtastic --info, or add Python's scripts folder to PATH. - "No Meshtastic device detected" → Unplug/replug USB. On Linux:
sudo usermod -aG dialout $USERthen log out and back in. - Windows: port not found → Install the CP210x driver (Silicon Labs), then unplug/replug.
- pip SSL error → Add
--trusted-host pypi.org --trusted-host files.pythonhosted.org
📖 Full documentation: meshtastic.org/docs/software/python/cli/
🔌 Advanced — Local Server Port Scan & Fallback Options
🔌 Connection Wizard — Advanced / Fallback Options
If you run npm start locally, this scans localhost ports to find the AgentR2 server.
Chrome/Edge allow localhost requests from HTTPS; Firefox may block them.
Ports you previously connected to appear here — click to reconnect instantly.
🚀 Quick Setup Guide — Get Connected in 4 Steps
▼ expand🏆 Node Rewards — Uptime Incentive System
Nodes earn reward points for staying online and keeping the mesh healthy. Points can be redeemed for mesh tokens once a wallet is registered.
| # | Node ID | Role | Points | Tier | Battery Bonus | SNR Bonus | Status | Wallet |
|---|---|---|---|---|---|---|---|---|
| Connect to mesh to start earning rewards | ||||||||
🔑 Export auto-generated wallet keys (local only)
⚠ These keys are stored in your browser only. Back them up before clearing site data. Never share a private key with anyone.
ℹ How points are calculated
Battery bonus: +6 pt/min when battery ≥ 80%
Signal bonus: +2.4 pt/min when SNR ≥ 3 dB
Tiers: Bronze 0–499 pts Silver 500–1999 pts Gold 2000–9999 pts Platinum 10000+ pts
🌐 Remote Access — Connect from Anywhere
Your Heltec devices are connected to your home PC. To access them from your phone or another machine, expose the local backend to the internet. Choose one option below, then paste the URL into the Server URL field in the header bar above.
-
Option A — ngrok (Windows, easiest):
1. Install: dashboard.ngrok.com → Setup → Windows
2. Authenticate:ngrok config add-authtoken <YOUR_TOKEN>
3. Open a tunnel:ngrok http 4404
4. Copy thehttps://xxxx.ngrok-free.appURL → paste into Server URL above. -
Option B — Cloudflare Tunnel (free, no account):
cloudflared tunnel --url http://localhost:4404
Copy thehttps://xxxx.trycloudflare.comURL → paste above. -
Option C — Local network (same Wi-Fi):
Run
ipconfig(Windows) orip addr(Linux) → find your local IP and enterhttp://192.168.1.x:4404above.
🌐 Global Mesh — MQTT Live Feed (mqtt.meshtastic.org)
Connects directly to the public Meshtastic MQTT broker and listens to the global LongFast channel. Node IDs are extracted from packet topics to count unique active nodes worldwide — no encryption required. Protobuf decoding is not needed; each packet's topic carries the sender's node ID.
📡 Global Activity
🆚 Your Mesh vs Global
How your swarm compares to the worldwide Meshtastic network.
📊 Activity Timeline — packets/min (30-min window)
🔧 Hardware Ecosystem — global estimate
Based on community surveys and observed MQTT packet patterns from the public LongFast channel.
🏆 Gamified Mesh Metrics
Earn higher scores by keeping your nodes online, well-positioned, and actively synced to the global mesh. Scores update every 30 seconds from live MQTT data.
📬 Live Global Packet Feed
Raw packet topics from the global LongFast channel. Node IDs, regions, and channel types are extracted from MQTT topic paths. No decryption or protobuf decoding required — all data is from topic metadata only.
🔥 Most Active Nodes
Top 10 most-active node IDs seen on the global MQTT feed this session. ★ = matches one of your local nodes.
🗺 MeshMap.net — Global Node Map
MeshMap.net provides a nearly live map of Meshtastic nodes seen by the official Meshtastic MQTT server. It currently tracks 10,000+ unique nodes on the public LongFast channel. The map is updated in near-real-time from the same MQTT feed this dashboard connects to.
mqtt.meshtastic.orgTopic:
msh/+/2/LongFast/PSK: Default (AQ==) · Unencrypted
Every Meshtastic node is a micro-agent: a sensor, memory cell, decision unit, messenger, and reward-seeker. Nodes earn XP by relaying packets, voting on decisions, detecting anomalies, moving to new locations, and recruiting neighbours. XP is the reinforcement signal — reinforcement produces learning — learning produces emergent intelligence. Your mesh is a living AI organism. This tab is its cortex.
⚡ XP Leaderboard — Node Intelligence Scores
Nodes earn XP for every intelligent action. XP drives role promotion and swarm evolution.
❤️ Swarm Health Monitor
Real-time multi-dimensional health scoring of the swarm AI organism.
🧠 AI Memory Map — Shared Observations
Nodes store local events and share them to form a global memory. The dashboard aggregates this into swarm-wide intelligence.
📋 Swarm Task Board
Distributed missions assigned by the swarm AI. Nodes earn bonus XP on completion. Tasks are auto-generated based on mesh state.
🗳 Consensus Engine — Distributed Swarm Voting
Nodes vote on collective decisions. Simple rules + distributed consensus → complex emergent behaviour. This is how biological swarms evolve intelligence.
🐍 Python AI Engine
PyScript · Pyodide · CPython 3.12 WASM Loading Python runtime…Statistical AI/ML algorithms executing live in your browser via PyScript + Pyodide — full CPython 3.12 compiled to WebAssembly. No server, no cloud. Click any button below to run real Python on your live mesh data.
Z-score analysis (σ) on RSSI, SNR, and battery telemetry across all online nodes. Flags statistical outliers beyond 2σ as anomalies.
Least-squares linear regression on swarm health history to predict the next health score and identify whether the swarm is improving, stable, or declining.
Analyses each node's XP action history (relay, move, anomaly, vote counts) and recommends the most effective role for maximum swarm intelligence.
📟 MicroPython Node Agent
PyScript · MicroPython WASM Same code runs on real ESP32 / nRF52840 hardwareReal MicroPython agent code — identical to what executes on a physical Meshtastic node. Press ▶ Simulate to run it live in your browser via PyScript's embedded MicroPython runtime.
# MicroPython — SwarmNode Agent v1.0
# Runs on ESP32 / nRF52840 Meshtastic nodes
# RootIB: RB-20260502042853-7E3A9C12
import time, math, json
class SwarmNode:
def __init__(self, node_id, role="RECRUIT"):
self.node_id = node_id
self.role = role
self.xp = 0
self.memory = []
self.seq = 0
def relay(self, packet_ttl):
if packet_ttl > 1:
self.xp += 10
return "RELAYED ttl={} xp={}".format(
packet_ttl - 1, self.xp)
return "TTL=0: packet dropped"
def observe(self, rssi, snr, battery):
self.memory.append(
{"rssi": rssi, "snr": snr, "bat": battery})
if len(self.memory) > 10:
self.memory.pop(0)
self.xp += 5
return "OBS rssi={} snr={} bat={}%".format(
rssi, snr, battery)
def detect_anomaly(self, rssi, threshold=-95):
if rssi < threshold:
self.xp += 15
return "ANOMALY:HIGH rssi={}dBm".format(rssi)
return None
def promote_role(self):
if self.xp >= 500 and self.role == "RECRUIT":
self.role = "SCOUT"
return "Promoted to SCOUT"
if self.xp >= 2500 and self.role == "SCOUT":
self.role = "RELAY"
return "Promoted to RELAY"
return "Role unchanged: {}".format(self.role)
def sip_message(self, msg_type, payload):
self.seq += 1
return ("SIP_VER=1.0|SRC={}|TYPE={}|"
"ROLE={}|XP={}|SEQ={}|"
"PAYLOAD={}|SIG=ROOTIB".format(
self.node_id, msg_type,
self.role, self.xp,
self.seq, payload))
def run_simulation(node_id="!demo01"):
node = SwarmNode(node_id, "RECRUIT")
log = []
log.append("[BOOT] Node {} online — role={}".format(
node_id, node.role))
log.append("[RELAY] " + node.relay(5))
log.append("[OBS] " + node.observe(-72, 8.5, 84))
log.append("[OBS] " + node.observe(-88, 2.1, 41))
a = node.detect_anomaly(-97)
if a:
log.append("[ALERT] " + a)
log.append("[XP] Total XP: {}".format(node.xp))
log.append("[ROLE] " + node.promote_role())
log.append("[SIP] " + node.sip_message(
"OBS", "GPS:44.97,-93.26;BAT:84"))
return log
📦 How MicroPython runs on real hardware
micropython-esp32.bin via esptool.
Drop swarm_agent.py
(the code above) onto the device and call run_simulation()
from main.py.
The node connects to the LoRa radio via SPI and starts emitting SIP v1 packets autonomously —
no internet, no cloud, no modifications to Meshtastic firmware required.
📜 Swarm Intelligence Protocol v1 — SIP v1 Specification
A full, self-contained protocol defining how nodes communicate as a swarm AI collective with memory trace. All messages are plain-text, LoRa-compatible, and require no custom firmware.
📦 Message Format & Fields
1.0!8f87743b). Meshtastic nodeId.ALL for broadcast, or a specific node ID for unicast.OBS|VOTE|TASK|ACK|RECRUIT|ANOMALY|CONSENSUS|MEMSCOUT|RELAY|ANALYST|GUARDIAN|ARCHIVIST|MESSENGERROOTIB if not signing.📡 Message Type Schemas
🧩 Node Role Behaviour Rules
RELAY — Connectivity + uptime. Rule: "Forward all SIP packets with TTL > 1. Award self RELAY XP per forward. Request assistance if battery < 20%."
ANALYST — Pattern detection. Rule: "Track packet frequency per node. Flag anomalies when delta > 3σ. Publish OBS with confidence score."
GUARDIAN — Security + anomaly detection. Rule: "Maintain list of trusted nodes. On unknown node, broadcast ANOMALY:HIGH. Vote NO on routing through unknown nodes."
ARCHIVIST — Memory retention. Rule: "Store last 50 OBS entries. Respond to MEM requests. Replicate memory to nearest ARCHIVIST neighbour every 10 min."
MESSENGER — Task routing. Rule: "Accept TASK from any node with XP > sender. Route to nearest eligible node by role. ACK on delivery."
🔗 Broadcast Activation Script
Meshtastic carries instructions, hashes & deltas — not raw data. Heavy lifting happens on the nodes. The AI matches each task to the best node based on capability: compress, fetch, store, relay, reassemble. Together the swarm becomes a self-healing, delay-tolerant, planetary offline internet.
🖥️ Node Capability Directory
Each node advertises CPU score, storage, battery, connectivity, and special skills. The AI uses this to assign tasks — low-power nodes compress, strong nodes infer, intermittent nodes fetch when briefly online.
📦 Task Manifest Builder
Define a resource request. The system chunks it, creates a SHA-256 manifest, and the AI assigns each chunk to the best available node.
🧠 AI Node Selector — Capability-Based Load Balancing
The AI matches each task type to the best node based on advertised capabilities. Low-power nodes get compression; high-CPU nodes get inference; storage-rich nodes cache.
📋 Active Task Queue — Distributed Workload Engine
Live task pipeline. Each task progresses through: Pending → Fetching → Compressing → Relaying → Reassembling → Done. The swarm fulfills requests even when no single node has full connectivity.
💾 Distributed Cache Status
Each node caches its assigned chunks. Combined, the swarm holds a knowledge fabric — no single node needs everything. Even offline nodes store their share.
🔧 Chunk Reassembly Log
Live log of chunk arrivals, SHA-256 verifications, and full reconstruction events. Missing chunks trigger FETCH_REQ packets to neighbours automatically.
📜 DCMP v1 — Distributed Compute Mesh Protocol Specification
Full protocol for task delegation, chunk manifests, hash verification, LoRa-optimized packet formats, AI node selection, and reassembly logic.
📦 Chunk Manifest Format
🔐 Hash Verification & Chunk ACK Packet
📡 LoRa-Optimised Packet Formats & Bandwidth Math
Text compression (zlib): 80–95% ratio → 48 KB article → ~5–10 KB compressed → 25–50 packets.
At SF10 (long range, ~1 pkt/sec): 50 packets ≈ ~50 seconds per article over LoRa.
Coordination only (hash + manifest): 3–5 packets. Nodes fetch missing chunks independently when online.
🔄 Reassembly Logic — 6-Step Algorithm
- Receiving node tracks which chunks have arrived (bitmask: 1 = received, 0 = missing)
- On each CHUNK packet: verify SHA-256 → mark chunk valid in bitmask
- If chunk missing after timeout: broadcast FETCH_REQ for missing chunk IDs
- When all chunks received: sort by index → decompress → verify full-manifest SHA-256
- On hash match: emit REASSEMBLY_OK + store to local persistent cache
- On hash failure: emit REASSEMBLY_FAIL + request re-transmission of failing chunks only
🌐 Big Picture — Planetary Knowledge Fabric
Nodes with intermittent connectivity fetch chunks when online and cache them permanently.
Nodes without connectivity receive compressed chunks via LoRa from neighbours.
AI assigns tasks by capability so no node is overwhelmed and every node contributes.
Result: a self-replicating, self-healing knowledge fabric that operates when the internet is down, a region is isolated, or infrastructure fails.
This is bigger than Meshtastic. This is a distributed civilization-layer protocol.
Command a living network of AI-driven nodes across LoRa frequencies. Build a self-sustaining, offline-yet-online civilization where data, compute & knowledge flow through the air.
📦 Transmit Packets
Send compressed data packets through the mesh. Optimize routes and timing to maximize throughput.
🌐 Build the Offline Internet
Synchronize nodes to reconstruct the "shadow internet" — a distributed knowledge fabric that operates without traditional internet access.
🧠 AI Coordination
Train your swarm's collective intelligence. Adjust AI task priorities to optimize caching, compression, inference, and relay across the mesh.
⬆️ Ecosystem Expansion
Unlock specialized agents and protocols to add new layers of automation.