ungovernable.tech

[ DEEP DIVE ][ OFF-GRID AND MESH NETWORKS ]

Meshtastic

Also Meshtastic LoRa.

Open-source LoRa mesh firmware that turns commodity ESP32 / RAK / nRF52 boards into a self-organizing, kilometers-range, encrypted text and telemetry mesh. No cell network, no internet, no subscription.

Usable updated 2026-04-27 5 min read
Contents

What it is

Meshtastic is firmware (and an ecosystem of clients) for LoRa radios on the unlicensed sub-GHz ISM bands (868 MHz EU, 915 MHz US, 433 MHz Asia). Each node has a 32-bit node number and, in current firmware, can advertise a public key for direct-message PKI. Nodes flood-route packets across a many-hop mesh; each hop re-broadcasts unless the packet has already been seen.

Use cases:

  • Hiking, sailing, off-grid groups out of cell range.
  • Neighborhood resilience networks.
  • Festival and event comms.
  • Disaster fallback (Hurricane Helene 2024 saw substantial Meshtastic deployment).
  • Emergency-services ad-hoc coordination.

What it explicitly is not: a private mesh. The default channel is broadcast and observable by anyone in radio range with the channel key.

Hardware

The reference platforms are inexpensive (€20-€60) integrated boards:

Board MCU LoRa Notes
LILYGO T-Beam ESP32 SX1276/1262 GPS, OLED, 18650 battery, most common starter
Heltec V3 ESP32-S3 SX1262 Compact, OLED, USB-C
RAK WisBlock 4631 nRF52840 SX1262 Modular, low power, BLE
LILYGO T-Echo nRF52840 SX1262 E-paper, GPS, ultra-low power
Station G2 / G1 ESP32 SX1262 Solar-friendly, no battery in box

Antennas matter more than the radio chip. A $5 stock antenna will give 1 km; a tuned 5 dBi at 5-10 m elevation reaches 30+ km line-of-sight.

Protocol mechanics

Packet structure

Every packet is a small Protobuf-encoded MeshPacket:

from        : node_id (32-bit)
to          : node_id (32-bit, broadcast = 0xFFFFFFFF)
channel     : 0-7 (selects channel key)
hop_limit   : starts at 3-7, decremented per relay
want_ack    : optional reliability flag
payload     : encrypted PortNum + bytes

LoRa airtime limits push payload sizes to ~230 bytes for the most common settings. The protocol frames messages, sensor telemetry, position reports, and routing control packets identically.

Routing: managed flood

Default mode is managed flood routing: each node retransmits packets it hasn't seen, with a randomized contention window to avoid collisions, and a strict hop limit. Routing is stateless; there is no neighbor discovery beyond passive observation.

Newer features:

  • Next-hop routing (v2.5+): opportunistic learning of best-next-hop from received packets.
  • MQTT bridge: a single node with internet uplink can bridge a regional mesh to a global MQTT broker for cross-mesh and integration with home automation.

Encryption

Per-channel symmetric AES-256-CTR with a pre-shared key. The default channel uses a well-known key (AQ==) that is broadcast-readable by intent so newcomers can join. Private channels use a user-generated 256-bit key shared out-of-band.

v2.5+ direct messages add public-key encryption: each node advertises a public key in NodeInfo, and DMs are encrypted to the recipient's key. Forward secrecy is not provided; keys are long-term. Public keys can be manually verified, and the protocol reports unrecognized, duplicate, low-entropy, or unauthorized keys as routing errors.

Channel hash and utilization

Each channel computes a 1-byte hash to deduplicate cross-channel traffic. The protocol intentionally rate-limits each node; one chatty node can saturate the entire mesh's airtime, so firmware enforces per-port caps.

Modes / presets

Trade-offs between range, throughput, and airtime. Current presets (US 915 MHz; rates checked against Meshtastic radio-setting docs and current protobuf presets):

Preset SF BW Approx. bitrate Range (typ.)
Short Turbo 7 500 kHz ~21.9 kbps <1 km
Short Fast 7 250 kHz ~10.9 kbps 1-3 km
Short Slow 8 250 kHz ~6.25 kbps 2-5 km
Medium Fast 9 250 kHz ~3.52 kbps 4-8 km
Medium Slow 10 250 kHz ~1.95 kbps 5-12 km
Long Moderate 11 125 kHz ~0.34 kbps 8-25 km
Long Fast (default) 11 250 kHz ~1.07 kbps 10-25 km
Long Slow (deprecated) 12 125 kHz ~0.18 kbps 20-60 km

Mismatched presets produce silent meshes, a common mistake. All nodes in a mesh must agree on preset and frequency. The older "Very Long Slow" preset has been removed.

Clients

Client Platform Notes
Meshtastic Android / iOS Mobile Reference apps; BLE pairing
Web Client Browser WebSerial pairing; Tailscale-friendly
Meshtastic Python CLI Desktop Scripting and automation
NodeRed integrations Server Home automation bridges

A node is typically operated headless (battery + radio) and paired to a phone via BLE for messaging UX.

Privacy properties

Property Status
Content confidentiality (with channel key) Yes (AES-256-CTR)
Sender authentication v2.5+ (Curve25519 signatures on packets)
Forward secrecy No; channel keys static, DM keys long-term
Metadata privacy No; packet headers carry node IDs in plaintext
Direction-finding resistance No; active radios are triangulable
Sybil resistance None inherent

For threat models that include radio surveillance, layer Meshtastic with Off-Grid Messaging patterns: short bursts, low duty cycle, mobile transmitters, mission-keys-only on participants' devices.

Operational patterns

Default channel + private channel

Run two channels: default for joining new participants and emergencies, a private channel for the actual group comms with a key shared in person.

Solar / battery node

A LILYGO T-Beam or Station G2 with a 5 W solar panel and 18650 cells is autonomous indefinitely. Place high (rooftop, hilltop) for range; low duty cycle minimizes draw.

MQTT bridge to internet

One node with a Wi-Fi or cell uplink and the MQTT bridge enabled connects the local mesh to the global Meshtastic MQTT topic. Useful for cross-region monitoring; breaks the off-grid model if compromised.

Position privacy

The want_position flag is on by default. Disable it for adversarial environments. A beacon transmitting position every minute is a homing signal.

Trade-offs

Strengths

  • Very cheap; full kit under €60.
  • Easy to deploy; flash firmware, pair phone, send.
  • Self-organizing; no infrastructure, no admin.
  • Multi-day battery and solar friendly.
  • Open firmware, large community.

Limitations

  • Tiny bandwidth; text, not media.
  • Public protocol; no protocol-level metadata privacy.
  • No forward secrecy.
  • Channel key compromise reveals all past channel traffic.
  • Direction-finding; emitting nodes are locatable.
  • Channel utilization is fragile; one chatty bot can saturate a region.

Attack surface

Attack Mitigation
Channel-key compromise Rotate; segment via multiple channels
Sybil flooding Per-node airtime cap; trusted-node lists
DF / triangulation Low duty cycle, mobile transmitters, mission-keys-only
MQTT bridge compromise Don't enable in adversarial deployments
Firmware supply-chain Flash from official releases; verify signatures
Endpoint compromise Phone E2EE / disk encryption

Recent developments (2024-2026)

  • PKI / DM encryption (v2.5+): Curve25519 keys per node for direct messages.
  • Next-hop routing beyond pure flood.
  • Range expansion with new firmware optimizations.
  • Hurricane Helene 2024: substantial real-world deployment for relief coordination.
  • Position obfuscation options expanded for safety in adversarial regions.

Primary sources

Sibling project: MeshCore. MeshCore runs on the same LoRa boards but relays only through dedicated repeaters and learns direct routes instead of flooding. It is lighter on airtime, but its cryptography is thinner (AES-128-ECB with a 2-byte MAC, no audit) and its main phone apps are closed source. The MeshCore entry has a side-by-side comparison, and Building a Mesh helps you choose between them. For phone-only mesh chat with no radio hardware, see Bitchat.

Page history

Updated
2026-04-27
Origin
Compiled from the ungovernable.tech research notes.
Improve this page
Suggest an edit — issues and pull requests are welcome.