Le-Space

under evaluation

LoRa Mesh

We set out with an idea: local-first peer-to-peer PWAs that keep running over a LoRa® mesh when the internet or the power grid fails — and in places that have neither. The measurements decided otherwise. The radio carries enough for handshakes and single signed events, not for the data of everyday applications, and not as an outage fallback. What survives the arithmetic is narrow, but real.

Findings

  • Throughput: replicating even a todo list of three short entries is noticeably sluggish — and the radio is only half the explanation. The test setup used OrbitDB with network sync switched off: the courier carries the content-addressed blocks itself and side-loads them straight into the local blockstore, past the IPFS network entirely. First contact is the heavy part — manifest, access controller, identity and entries cross as a block bootstrap of a few kilobytes, roughly halved by gzip — and even afterwards, signatures and identity references keep every entry hundreds of bytes. On top sits the duty-cycle limit (EU 868: ~6 minutes of airtime per hour). The courier itself works — built and tested in funkpost, and on 4 September 2026 it first ran over a real LoRa mesh between two independent nodes, a desktop browser either side — but standard office applications are ruled out. The setup can be tried live: the demo replicates a todo list across the mesh — or, with ?mesh=bc, across two browser tabs, no radio required.
  • As a fallback for internet or power outages it is unsuitable in principle: every participant would need radio hardware, and the data rate does not carry normal application traffic.
  • Platform: Web Bluetooth runs only in Chromium on Android and desktop — no iOS browser; iOS would need a native app. Device variance is real — but most of what looked like it was ours. The browser's Bluetooth layer reports a failed radio write as a lost connection, and funkpost answered by closing a link that was in fact still open, again and again until it gave up; Android Chrome provokes those writes readily, a GrapheneOS phone rarely, which is why the phones looked so different. It now checks before it acts and repairs the data path over the connection that never dropped. What genuinely remains device-specific is narrower: a Samsung Fold that will not always list the node at all.
  • Adoption: hardly anyone carries a radio node today. That is less a verdict than the actual design problem: commercial applications need ideas that do two things at once — spread the nodes and offer a benefit that justifies carrying one. A use case with a clear USP distributes its own hardware.

What remains

A courier for small, rare, valuable payloads. The signalling handshake from design issue #161 fits in two frames; a single signed event — a booking, a handover confirmation — in a few. Where minutes of latency are acceptable and infrastructure is absent, the model still holds — and metadata that is never generated cannot leak.

Sequence diagram: Bob’s phone signs a WebRTC offer, sends it over Bluetooth to his node, the LoRa mesh relays it to the node at the counter, the unattended tablet verifies the signature and answers over the same path; WebRTC then connects only where an IP path exists. Sequence diagram: Bob’s phone signs a WebRTC offer, sends it over Bluetooth to his node, the LoRa mesh relays it to the node at the counter, the unattended tablet verifies the signature and answers over the same path; WebRTC then connects only where an IP path exists.

The second data plane for this already exists: a Yjs provider in funkpost whose updates measure tens of bytes rather than kilobytes — no access-control lists, no IPFS blocks. Next comes a scheduling example built on it, positioned not as a fallback for internet outages but as an alternative path: a way to synchronise appointments into existing scheduling tools that generates no metadata in the first place.

The cut of the data decides what radios at all. The salon never sends a schedule: it sends the rules plus a busy mask — one bit per slot, three weeks in about 112 bytes, one frame, however full the calendar is. Free slots are computed locally, so browsing costs no airtime. Yjs carries exactly one thing, and it is not the appointments: it carries the shop's rules, written by a handful of stable devices where merging genuinely helps. The bookings sit beside it in a log of signed, immutable records, because a Yjs document greets its peers with a summary that grows with every author who has ever written — about six kilobytes, thirty frames, after a thousand customers, and it never shrinks. The log's greeting is one small fingerprint per day, the same size at any scale, and it forgets last month instead of remembering it for ever. What stays off the air altogether is just as deliberate — the cancellation token (it lives in the .ics link; only the derived public key enters the document), the .ics file itself, and the verdict on a contested slot, which every device computes identically on read. Convergence is not agreement, so agreement is calculated, not transmitted.

Sequence diagram: joining exchanges a state vector for the missing diff; the salon sends rules and a busy-mask bitmap in one frame; free slots are computed locally; a booking travels as one update carrying slot, service and public key; the decision returns as one update; contested slots are decided by local computation, and the capability token, the .ics file and names never cross the mesh. Sequence diagram: joining exchanges a state vector for the missing diff; the salon sends rules and a busy-mask bitmap in one frame; free slots are computed locally; a booking travels as one update carrying slot, service and public key; the decision returns as one update; contested slots are decided by local computation, and the capability token, the .ics file and names never cross the mesh.

Technical foundations

  • funkpost — the byte courier itself: framing, ARQ and duty-cycle pacing over Meshtastic® radios — two data planes built (OrbitDB and Yjs), signalling plane designed; live demos.
  • webrtc-qr — the library: two devices connect by scanning a code — no signalling server.
  • qr01 — the tutorial chapter for this: a todo list moves from phone to phone by scanning a code — over a Wi-Fi hotspot, with no internet involved.
  • the demonstrators — both live in the browser: a todo list replicating across the mesh (OrbitDB), and an appointment book for a shop around the corner (Yjs). With ?mesh=bc two browser tabs stand in for the radios; a Meshtastic® node over Web Bluetooth makes it real.

Exchange

We share measurements and the test setup. Anyone working in the same niche — Meshtastic practitioners, researchers, local-first developers — is welcome to get in touch.

Get in touch — contact@le-space.de Telegram · @lfp2p X · @le_space_beta

On the mesh, we can be reached at le-space.de e45c, YSGs0MrcH9QOcAlIxvYkJWaV64AvKgx/tXS27SiCzXM=

The public key is what identifies us; node names are assigned by whoever operates the node. It radios in the EU-868 region and is mobile — reachable wherever it currently has a mesh in range.

Meshtastic Powered

LoRa® is a trademark of Semtech Corporation. Meshtastic® is a registered trademark of Meshtastic LLC. Meshtastic software components are released under various licenses, see GitHub for details. No warranty is provided - use at your own risk. This site is not affiliated with or endorsed by Semtech or the Meshtastic project.