funkpost
Post über Funk
A byte courier for local-first applications over LoRa mesh radios. Two demos run here — one per data plane, sharing the same courier underneath and nothing else — and two instruments that exist for a bench rather than for browsing.
Ein Byte-Kurier für Local-first-Anwendungen über LoRa-Mesh-Funk. Hier laufen zwei Demos — eine je Datenebene, darunter derselbe Kurier und sonst nichts Gemeinsames — und zwei Instrumente, die für den Messplatz gebaut sind, nicht zum Stöbern.
⚠ Demonstrators, not products⚠ Demonstratoren, keine Produkte
A research project, not audited and not for production use. Its purpose is to measure what a LoRa mesh can carry and how two devices reconcile data over it.
Ein Forschungsprojekt, nicht auditiert und nicht für den Produktiveinsatz. Es misst, was ein LoRa-Mesh tragen kann und wie zwei Geräte darüber ihre Daten abgleichen.
Authorisation has not been designed — a known gap, not an undiscovered one. The todo list is opened for anyone to write to; a booking request carries no signature, so a neighbour on the same channel can fill an entire three-week calendar and supersede the real bookings in it. The only boundary is the channel key, and on a public Meshtastic® channel that is no boundary at all.
Autorisierung ist noch nicht entworfen — eine bekannte Lücke, keine unentdeckte. In die Todo-Liste darf jeder schreiben; eine Buchungsanfrage trägt keine Signatur, sodass ein Nachbar auf demselben Kanal einen ganzen Drei-Wochen-Kalender füllen und die echten Buchungen darin verdrängen kann. Die einzige Grenze ist der Kanalschlüssel, und auf einem öffentlichen Meshtastic®-Kanal ist das keine Grenze.
The two instruments below go further than reading: one creates a passkey on the security key that taps it, the other publishes a backup of whatever it holds to a public network. Neither asks for anything you have; both do what they say when pressed.
Die beiden Instrumente weiter unten tun mehr als lesen: Das eine legt einen Passkey auf dem Sicherheitsschlüssel an, der ans Telefon gehalten wird, das andere veröffentlicht eine Sicherung seines Inhalts in einem öffentlichen Netz. Keines verlangt Zugangsdaten oder persönliche Angaben; beide tun beim Drücken genau, was sie ankündigen.
Open them, read them, measure them — do not point them at a real calendar.
Zum Öffnen, Lesen und Messen — nicht für einen echten Kalender.
mesh-todo
OrbitDB on hardwareauf HardwareA todo list on two phones — the demo that first crossed the air, on 4 September 2026. Signed entries, a verifiable log, and a sync pane that prices every frame.
Eine Todo-Liste auf zwei Telefonen — die Demo, die am 4. September 2026 als erste über die Luft ging. Signierte Einträge, ein überprüfbares Log und ein Sync-Bereich, der jeden Frame beziffert.
Mesh-only is still a mode; with a radio the default is now internet first, and when it goes the page works out that it is gone by asking the network rather than believing a flag — then asks you before moving the list onto a carrier that spends a rationed budget. A list’s founding can arrive from an IPFS gateway over HTTPS instead of over the air — the radio carries only the CID, in a single frame — and the page can ask the channel whether another app is out there rather than counting radios.
Nur-Mesh bleibt ein Modus; mit Funk gilt jetzt zuerst das Internet. Fällt es weg, stellt die Seite das fest, indem sie das Netz fragt, statt einem Flag zu glauben — und fragt nach, bevor sie die Liste auf einen Träger verlegt, der ein rationiertes Budget verbraucht. Die Gründung einer Liste kann über HTTPS von einem IPFS-Gateway kommen statt über die Luft — der Funk trägt nur die CID, in einem einzigen Frame —, und die Seite kann den Kanal fragen, ob eine andere App da ist, statt Funkgeräte zu zählen.
A list no longer waits for a node: its link, or the page’s QR code, opens it on another device over the internet — and an LED under the title blinks until another device keeping the list answers over the radio, checked once an hour.
Eine Liste wartet nicht mehr auf einen Knoten: Ihr Link oder der QR-Code der Seite öffnet sie über das Internet auf einem anderen Gerät — und eine LED unter dem Titel blinkt, bis ein anderes Gerät mit dieser Liste über Funk antwortet, geprüft einmal pro Stunde.
It has an access controller, and this demo sets it to allow anyone, which is the honest default for something with no identities in it.
Sie hat einen Access Controller, und diese Demo stellt ihn auf »jeder darf« — der ehrliche Standard für etwas ohne Identitäten.
/funkpost/mesh-todo/Termine über Funk
Yjs
An appointment book for a shop around the corner, in the shape of
Calendly. Availability travels as a rule rather than a list, two
customers racing for one slot resolve identically on both phones
without a packet spent deciding, and the .ics you take
away carries a link that still works over the mesh.
Ein Terminbuch für das Geschäft um die Ecke, nach dem Vorbild von
Calendly. Verfügbarkeit reist als Regel statt als Liste; zwei Kunden,
die um denselben Termin konkurrieren, kommen auf beiden Telefonen zum
selben Ergebnis, ohne dass für die Entscheidung ein Paket gesendet
wird; und die mitgenommene .ics-Datei enthält einen Link,
der auch über das Mesh funktioniert.
mesh-heartbeat
beats a measurementeine MessungHow far does the mesh actually reach? One device stays where it is and answers; the other goes for a ride and asks. What comes back is not the mesh works but a list of places with an answer or a silence against each — and, where there was an answer, which beat of the round carried it. A round is three beats fifteen seconds apart and ends at the first answer, so a good spot costs one beat and a marginal one costs three: the number is the price of being heard.
Wie weit reicht das Mesh wirklich? Ein Gerät bleibt stehen und antwortet, das andere fährt und fragt. Zurück kommt nicht das Mesh funktioniert, sondern eine Liste von Orten mit einer Antwort oder einem Schweigen daneben — und wo geantwortet wurde, auf welchem Beat der Runde. Eine Runde sind drei Beats im Abstand von fünfzehn Sekunden und sie endet bei der ersten Antwort: eine gute Stelle kostet einen Beat, eine grenzwertige drei. Die Zahl ist der Preis dafür, gehört zu werden.
It carries no database at all — no OrbitDB, no Yjs, nothing to replicate. A range test that dragged a replication stack behind it would be measuring the stack.
Es trägt überhaupt keine Datenbank — kein OrbitDB, kein Yjs, nichts zu replizieren. Ein Reichweitentest, der einen Replikationsstapel hinter sich herzieht, misst den Stapel.
/funkpost/mesh-heartbeat/mesh-trail
positions a walkein SpaziergangEveryone on one map. Each device says where it is on a schedule, every other device hears it and draws the trail, and the arrow is which way that person was going when they were last heard. Names stay on the phone that typed them; the air carries four bytes and a place.
Alle auf einer Karte. Jedes Gerät sagt im Takt, wo es ist, jedes andere hört es und zeichnet die Spur, und der Pfeil zeigt, wohin die Person unterwegs war, als sie zuletzt gehört wurde. Namen bleiben auf dem Telefon, das sie getippt hat; über den Funk gehen vier Bytes und ein Ort.
The group size is a parameter here: ten people at one beacon a minute are the whole carrier, so the interval follows the group and the page shows what the choice costs. Sending is off until somebody turns it on.
Die Gruppengröße ist hier ein Parameter: Zehn Leute im Minutentakt sind der ganze Träger, also folgt der Takt der Gruppe und die Seite zeigt, was die Wahl kostet. Gesendet wird erst, wenn es jemand einschaltet.
/funkpost/mesh-trail/⚠ The OrbitDB bridge is under review⚠ Die OrbitDB-Brücke wird überarbeitet
The package underneath the database demo — orbitdb-storage-bridge — is being re-planned and reviewed. Replication over the radio works: that is the part the demos here stand on, and it crossed a real mesh on 4 September 2026. Backing a list up and getting it back does not scale — a restore of 2 000 entries did not finish inside ten minutes, measured on 13 October 2026. So whatever you back up from these pages, expect not to get it back.
Das Paket unter der Datenbank-Demo — orbitdb-storage-bridge — wird neu geplant und überprüft. Die Replikation über Funk funktioniert: Darauf stehen die Demos hier, und sie ist am 4. September 2026 über ein echtes Mesh gegangen. Eine Liste zu sichern und wieder zurückzuholen skaliert nicht — eine Wiederherstellung von 2 000 Einträgen war nach zehn Minuten nicht fertig, gemessen am 13. Oktober 2026. Was hier gesichert wird, kommt also unter Umständen nicht zurück.
The measurements are in the bridge's open issues; the short version, and what it means for the demos, is in the README.
Die Messungen stehen in den offenen Issues der Brücke; die Kurzfassung und was sie für die Demos bedeutet, steht im README.
Instruments, not demosInstrumente, keine Demos
Three more pages live here. They are not demonstrations of anything — they are how the hardware questions in issue #93 get answered, and each does something real when its buttons are pressed.
Drei weitere Seiten liegen hier. Sie demonstrieren nichts — mit ihnen werden die Hardware-Fragen aus Issue #93 beantwortet, und jede tut etwas Echtes, wenn ihre Knöpfe gedrückt werden.
-
passkey probe — asks a security key whether it can
carry an identity to a second device: the PRF value, a largeBlob,
and the public key recovered from two signatures. It
creates a test passkey on whatever key taps it.
It lives with the library it tests, not here.
webauthn-did/passkey-probe/ -
Passkey-Probe — fragt einen Sicherheitsschlüssel, ob
er eine Identität auf ein zweites Gerät tragen kann: den PRF-Wert,
einen largeBlob und den aus zwei Signaturen zurückgewonnenen
öffentlichen Schlüssel. Sie legt einen Test-Passkey an,
auf jedem Schlüssel, der ans Telefon gehalten wird.
Sie liegt bei der Bibliothek, die sie prüft, nicht hier.
webauthn-did/passkey-probe/ -
recovery — a list, a security key, and a device
that has lost everything. Whatever is typed into it is
backed up to a public network, and the pointer to
that backup is derived from the security key, so a second phone
finds it with no address and no file.
It lives with the packages it demonstrates, not here.
orbitdb-storage-bridge/recovery/ -
Recovery — eine Liste, ein Sicherheitsschlüssel und
ein Gerät, das alles verloren hat. Was dort eingetippt wird, wird
in einem öffentlichen Netz gesichert, und der Zeiger
auf diese Sicherung wird aus dem Sicherheitsschlüssel abgeleitet — ein
zweites Telefon findet sie ohne Adresse und ohne Datei.
Es liegt bei den Paketen, die es vorführt, nicht hier.
orbitdb-storage-bridge/recovery/ -
storage probe — asks two questions that decide how a
backup can be kept and fetched: do Pinata and Lighthouse answer a page at
all, without a server of ours, and does anybody on IPFS hold a CID at an
address a browser can dial? The checks need no credentials;
a real upload is a separate step, with a key you paste yourself. It lives with
the package it measures, not here.
orbitdb-storage-bridge/storage-probe/ -
Speicher-Probe — stellt zwei Fragen, die entscheiden, wie
eine Sicherung aufbewahrt und geholt werden kann: Antworten Pinata und
Lighthouse einer Seite überhaupt, ohne Server von uns, und hält jemand im
IPFS-Netz eine CID unter einer browser-wählbaren Adresse? Die Prüfungen
brauchen keine Zugangsdaten; ein echter Upload ist ein
eigener Schritt, mit einem selbst eingefügten Schlüssel. Sie liegt beim Paket,
das sie misst, nicht hier.
orbitdb-storage-bridge/storage-probe/
Trying them without a radioOhne Funkgerät ausprobieren
Append ?mesh=bc and two browser tabs play the two devices,
using a BroadcastChannel where the LoRa link would be. It has to be two
tabs in the same browser profile — that channel does not cross
profiles.
Mit ?mesh=bc spielen zwei Browser-Tabs die beiden Geräte;
ein BroadcastChannel steht dort, wo sonst die LoRa-Verbindung wäre. Es
müssen zwei Tabs im selben Browser-Profil sein — dieser Kanal
reicht nicht über Profilgrenzen.
-
mesh-todo: open it twice with
?mesh=bc. That also switches the internet path off, so the two tabs are a closed room;?ip=1brings it back. -
mesh-todo: zweimal mit
?mesh=bcöffnen. Das schaltet auch den Internetpfad ab, die beiden Tabs sind dann ein geschlossener Raum;?ip=1holt ihn zurück. -
Termine: one tab with
?mesh=bc&room=test&role=salon, the other withrole=customer. -
Termine: ein Tab mit
?mesh=bc&room=test&role=salon, der andere mitrole=customer.
With a Meshtastic node over Web Bluetooth, drop the parameter and press Connect — Chrome or Edge, and an HTTPS page, because Web Bluetooth refuses anything less. What a session on real radios still has to show — two runs, what to press, what to write down — is on the run sheet.
Mit einem Meshtastic-Knoten über Web Bluetooth entfällt der Parameter, und Verbinden stellt die Verbindung her — in Chrome oder Edge und auf einer HTTPS-Seite, denn Web Bluetooth verweigert alles andere. Was eine Sitzung mit echten Funkgeräten noch zeigen muss — zwei Durchläufe, was zu drücken und was zu notieren ist —, steht auf dem Laufzettel.