Die fünf Schichten

Jede Schicht funktioniert ohne zentralen Dienst — und jede Schicht ist ein Open-Source-Baustein, den du einzeln nutzen kannst.

Bausteine

Showcases, Prototypen, Komponenten und Bibliotheken — keine Folien. Jedes ist Open Source, die meisten mit Live-Demo, viele als npm-Paket.

OrbitDB ⇄ Storage Bridge

beta
DatenSyncIdentität

Backup, Restore und Replikation von OrbitDB-Datenbanken über austauschbare Storage-Backends (Aleph, Pinata, Lighthouse), mit erhaltenen Hashes und Identitäten — und eine Datenbank auf ein Gerät zurückholen, das nichts hat, allein mit einem Sicherheitsschlüssel.

→ Früher die OrbitDB-Storacha-Bridge: Storachas Uploads endeten im Mai 2026, Aleph, Pinata und Lighthouse traten an ihre Stelle.

▶ Recovery — die Wiederherstellungsseite in funkpost — eine Liste zurück auf einem Telefon, das sie nie hatte, allein mit einem Sicherheitsschlüssel; gezeigt auf zwei Telefonen, eines davon zurückgesetzt, am 21. September 2026.

funkpost — Post über Funk

experimentell
SyncInfrastruktur

Ein Byte-Kurier für Local-first-Apps über LoRa-Mesh-Funk — er arbeitet mit Meshtastic-Knoten und trägt OrbitDB und Yjs dorthin, wo kein Internet ist.

  • Im Rahmen der Sendezeit-Regeln: Payloads werden in funkgerechte Frames zerlegt, gezielt wiederholt und im Duty Cycle der Region gesendet, den der Knoten selbst meldet.
  • Zuerst das Internet, das Mesh, wenn es wegfällt: der Todo-Demonstrator repliziert über libp2p und bietet an, die Liste auf den Funk zu verlegen, sobald die Verbindung abreißt — erst nach Rückfrage, denn Sendezeit ist rationiert.
  • Auf Hardware gemessen: erstmals am 4. September 2026 über die Luft; die Evaluation mit Laufzettel und Befunden steht auf lora.le-space.de.

→ Experimentell und GPL-3.0 — Forschungsdemonstratoren, nicht auditiert; wer den Kanal empfängt, kann in eine Liste schreiben.

▶ mesh-todo — eine Todo-Liste auf zwei Telefonen, die über das Internet repliziert und, wenn es wegfällt, über LoRa — zugleich das Messinstrument, das jeden gesendeten Frame beziffert.

▶ Termine über Funk — ein Terminbuch für das Geschäft um die Ecke: Verfügbarkeit reist als Regel statt als Liste, und zwei Kunden, die um denselben Termin konkurrieren, kommen auf beiden Telefonen zum selben Ergebnis.

Yogasūcī (योगसूची) screenshot

Yogasūcī (योगसूची)

Showcase · Alpha
IdentitätDatenSync

Kursbuchung für Yogastudios mit mehreren Standorten — gebaut, um zu zeigen, was der Stack leistet, wenn eine Anwendung tatsächlich davon abhängt.

  • Ganz ohne Relay: Geräte finden sich per gescanntem QR-Code oder Einladungslink — libp2p-webrtc-qr als einziger Transport, und damit der laufende Beweis, dass der kostenlose Weg genügt.
  • Kein Konto, kein Passwort: Ein Passkey ist die Identität, ein zweites Gerät wird vom ersten freigegeben.
  • Karten sind ein Append-only-Log: Das Guthaben wird aus den Ereignissen gefaltet und nie gespeichert — zwei Theken an verschiedenen Orten können verkaufen und entwerten, ohne jemanden um Erlaubnis zu fragen.
  • Wo es unbequem wird, steht geschrieben: Das Handbuch hat ein Kapitel darüber, was die App nicht kann, und das Repository dokumentiert die Grenzen, an die sie gestoßen ist, statt der Funktionen, die man sich erhofft hatte.

→ Showcase für OrbitDB und WebRTC über QR — eine echte Anwendung, keine Demo

Relay Button screenshot

Relay Button

beta
Infrastruktur

Libp2p-Relay-Nodes auf Knopfdruck — die Toolchain im Zentrum des Local-First-Stacks.

  • Ein Klick, ein Relay: deployt einen libp2p/OrbitDB-Relay (Signaling, Bootstrap, IPFS-Pinning) — läuft für ein Meeting, ein Projekt oder Jahre, danach wird er gestoppt.
  • Volle Automatisierung: qcow2-RootFS-Images bauen, auf IPFS publizieren, VM-Lifecycle & Retention per CLI und GitHub Actions.
  • Einbettbare UI: React- & Svelte-Komponenten — der eigentliche „Relay Button" — für jede App.
  • Bootstrap-Discovery: Relays registrieren sich selbst; Apps finden sie automatisch.
  • Neu — Remote-Browser-Replication: Die CI startet einen echten Browser auf einer frischen VM in einem anderen Netz und verifiziert echte Cross-Network-P2P-Replikation Ende-zu-Ende — ersetzt Dienste wie testingbot.com für Local-First-P2P-Apps.
  • Läuft auf Aleph Cloud: dezentrales Compute, VMs ohne Cloud-Account; weitere Anbieter — dezentrale wie zentrale — geplant.

ablage screenshot

ablage

beta
DatenSync

Ein Ordner auf diesem Gerät, der derselbe bleibt wie ein Ordner auf einem anderen — hinzugefügte, geänderte und gelöschte Dateien — ohne Konto und ohne irgendetwas dazwischen.

  • Einmal per Code gekoppelt, danach Peers: Zwei Geräte scannen je einen Code vom Bildschirm des anderen — einmal in jede Richtung, und nur beim Koppeln — über libp2p-webrtc-qr. Danach reisen die Bytes direkt, und kein Server hält sie je.
  • Der Index ist ein CRDT, die Bytes sind es nicht: Yjs trägt eine Karte aus Pfaden und Inhalts-Adressen; die Dateien selbst gehen über Bitswap. Dateiinhalte in ein CRDT zu legen ist genau der Fehler, den das hier vermeidet.
  • Beide Fassungen überleben einen Konflikt: Haben zwei Geräte dieselbe Datei geändert, bleiben beide erhalten — wie bei Dropbox. Der gerettete Name kommt aus der Inhalts-Adresse, zwei Geräte mit identischen Bytes landen also bei einem Eintrag statt bei zweien.
  • Ein echter Ordner unter Chromium: Ordner auswählen, und genau der wird abgeglichen — inklusive Änderungen, die außerhalb der App passieren. Sonst dient der private Speicher des Browsers, den jede Engine hat.
  • Öffnet sich ohne Netz: installierbar, und der Ordner ist da, wenn das Internet es nicht ist.

→ Ein Ordner zwischen zwei Geräten — der Stack angewandt auf das Schlichteste, was man von ihm will

libp2p WebRTC over QR screenshot

libp2p WebRTC over QR

experimentell
Sync

Zwei Browser verbinden sich direkt als libp2p-Peers — ohne Relay, ohne Signaling-Server. Jedes Handy scannt einen Code vom Bildschirm des anderen — einmal in jede Richtung.

  • Signaling als QR-Code: Offer und Answer laufen out-of-band als signierte, deflate-komprimierte Payloads statt über ein Circuit-Relay. Beide Wege werden von Hand getragen, weil kein Server die Answer zurückbringt — ein zweiter Code, ein Einladungslink, ein Textfeld oder ein hörbarer Ton, wenn das antwortende Gerät keine brauchbare Kamera hat.
  • Ein Viertel der Größe, wahlweise: eine kompakte Payload überträgt nur Fingerprint und Kandidaten und baut das SDP auf beiden Seiten neu — die Packidee von QWBP, ergänzt um die Signatur. ~284 Zeichen statt ~995 sind der Unterschied zwischen einem stehenden Code und einer animierten Folge — und sie lassen einen Handschlag in Träger passen, in die ein volles SDP nicht hineingeht: zwei LoRa-Pakete, ein paar Sekunden Ton.
  • Signiert, nicht nur gescannt: das SDP enthält den DTLS-Fingerprint — wird es mit dem libp2p-Schlüssel signiert, ist die WebRTC-Session an die Peer-ID gebunden. Dasselbe Prinzip wie certhash bei WebRTC-Direct, und genau deshalb darf der übliche Verschlüsselungs-Handshake entfallen.
  • Manipulation scheitert sicher: eine veränderte Payload wird vor jedem Verbindungsversuch abgelehnt, und ein Browser verweigert sein eigenes Offer statt sich selbst zu dialen.
  • Funktioniert ohne Infrastruktur: nützlich, wo kein Relay erreichbar ist — derselbe Raum, dasselbe LAN, ein abgeschottetes Netz.

→ Experimentell — ein QR-Code macht den Signalisierungsserver überflüssig, nicht alles andere, was eine direkte Verbindung braucht. Browser und Netze stellen das oft nicht bereit: ein NAT, das Hole Punching zulässt, ein WLAN, in dem zwei Clients einander adressieren dürfen, eine sichere Herkunft für die Kamera. Vor dem Daraufbauen ins README schauen.

Simple Todo — simple-todoSimple Todo — collab01Simple Todo — passkey01Simple Todo — acl01Simple Todo — qr01Simple Todo — privacy01Simple Todo — delegation01 simple-todo

Simple Todo

Tutorial
IdentitätDatenSync

Tutorial für local-first P2P-PWAs: WebAuthn/Passkey-Identität, OrbitDB-Daten, Browser-zu-Browser-Sync. Kein Server, keine Accounts, keine Passwörter.

▶ simple-todo — Kapitel „main" — alle Besucher teilen automatisch dieselbe gemeinsame Todo-Liste; URL öffnen genügt.

▶ collab01 — Kapitel „collab01" — eigene Listen erstellen und gezielt per OrbitDB-Adresse mit anderen Peers teilen.

▶ passkey01 — Kapitel „passkey01" — Anmeldung per Passkey statt Wegwerf-Schlüssel. Die WebAuthn-DID signiert jeden Eintrag und wird als Autor angezeigt.

▶ acl01 — Kapitel „acl01" — private Listen nur für den Owner, mit Schreibrechten pro DID. Rechte zur Laufzeit vergeben oder entziehen, ohne dass sich die Listen-Adresse ändert.

▶ qr01 — Kapitel „qr01" — eine Liste per gescanntem Code an ein anderes Gerät übergeben. Kein Relay, keine Bootstrap-Liste, kein Internet: Die beiden Geräte finden sich direkt, und die Daten bleiben im Speicher des Browsers.

▶ privacy01 — Kapitel „privacy01" — eine private Liste ist verschlüsselt, die Adresse allein genügt also nicht mehr zum Mitlesen. Wer hineingelassen wird, bekommt den Schlüssel mit; zurückholen lässt er sich danach nicht.

▶ delegation01 — Kapitel „delegation01" — ein einzelnes Todo an eine andere DID übergeben und wieder zurückholen, ohne den Rest der Liste aus der Hand zu geben. Die beiden Geräte machen das direkt untereinander aus: Der Relay pinnt die Einträge des Besitzers und nimmt die eines Delegierten nicht an, beide müssen also gemeinsam online sein.

Libp2ps Universal Connectivity — Beispiel über Alephs dezentrales Compute: der Relay ButtonUniversal Connectivity — chatUniversal Connectivity — relay button

Universal Connectivity

stabil
Sync

Unser Fork des offiziellen libp2p-Projekts mit eingebautem Relay-Button: der Cross-Language-Showcase — Chat zwischen Go-, Rust-, TypeScript- und Nim-Peers im Browser — erweitert, sodass jeder auf Knopfdruck einen eigenen Relay deployen kann.

▶ chat — der öffentliche Raum mit den gerade verbundenen Peers — die Discovery braucht nach dem Öffnen etwa eine halbe Minute.

▶ relay button — der eingebettete Relay-Button: Tier wählen und einen eigenen Relay deployen, ohne den Chat zu verlassen.

OrbitDB Relay screenshot

OrbitDB Relay

beta
InfrastrukturDaten

Relay- und Pinning-Service, der OrbitDB-Datenbanken verfügbar hält, während Peers offline sind.

OrbitDB WebAuthn DID — webauthn-didOrbitDB WebAuthn DID — encrypted-keystoreOrbitDB WebAuthn DID — varsig webauthn-did

OrbitDB WebAuthn DID

beta
Identität

Passkey-basierte Identität für OrbitDB — keine Extensions, nur Browser und Biometrie. Jeder Oplog-Eintrag muss signiert werden; die eigentliche Frage ist, wo der Signaturschlüssel liegt:

  • Klartext-Keystore (OrbitDB-Default): der Ed25519-Schlüssel liegt unverschlüsselt in der IndexedDB des Browsers. Alles, was auf deinem Origin Skript ausführt, kann die Identität kopieren und dauerhaft in deinem Namen schreiben.
  • WebAuthn-verschlüsselter Keystore: derselbe Schlüssel, per AES-GCM at rest verschlüsselt und erst nach einem WebAuthn-Unlock (PRF, largeBlob oder hmac-secret) in den Speicher geholt. Ein Prompt pro Session, Schreibvorgänge bleiben schnell; sicher at rest, im Speicher solange der Tab offen ist. Der pragmatische Default — Demo.
  • Hardwaregestützte Schlüssel (Varsig): gar kein OrbitDB-Keystore. Der Schlüssel entsteht im Authenticator — Secure Enclave, TPM, Security Key — und verlässt ihn nie. Ein Passkey-Prompt pro Schreibvorgang, dafür bleibt im Browser nichts zu stehlen — Demo.
  • Wozu Varsig: ein Authenticator liefert nie eine schlichte Signatur über deine Payload — er signiert seine eigene Struktur aus authenticatorData + clientDataJSON-Hash. Dazu kommt, dass das Verfahren variiert: die Plattform-Authenticator von Apple, Android und Windows signieren mit ES256 (P-256), während EdDSA/Ed25519 (COSE -8) zwar im Standard steht und auf einigen Security Keys funktioniert — eine Passkey-DID kann also weder die eine noch die andere Kurve voraussetzen. Varsig ist der selbstbeschreibende Envelope, der Struktur und Verfahren gemeinsam transportiert, sodass die Assertion als OrbitDB-Oplog-Signatur und über toUcantoSigner() auch als UCAN-Delegation-Signatur verifizierbar ist. Ohne Varsig kann ein Hardware-Schlüssel für beides nicht der Signierer sein — ganz gleich, welche Kurve er verwendet.

▶ webauthn-did — ein Passkey wird zur OrbitDB-Identität — die DID leitet sich aus dem Credential ab, ganz ohne Keystore.

▶ encrypted-keystore — ein Ed25519-Keystore, at rest verschlüsselt und einmal pro Session per WebAuthn entsperrt — der pragmatische Default.

▶ varsig — gar kein Keystore — der Authenticator signiert jeden Eintrag selbst, ein Passkey-Prompt pro Schreibvorgang.

P2P Spreadsheet + UCEP

Hackathon
DatenSync

Eine Peer-to-Peer-Tabellenkalkulation auf einem Yjs-CRDT, die ihre Fähigkeiten anderen Anwendungen anbietet. Das Universal Connectivity Extension Protocol lässt libp2p-Anwendungen ankündigen, was sie können, und die Erweiterungen der anderen direkt finden — ohne zentrale Registrierung. Die Diensterkennung läuft über libp2p-eigenes Identify: Jede Verbindung tauscht ohnehin aus, welche Protokolle beide Seiten sprechen — eine Erweiterung kündigt sich also an, indem sie eines ist. In einer Woche entstanden, beim Hackathon des libp2p-Projekts selbst, erster von fünf Beiträgen.

→ Erster Platz, libp2p Universal Connectivity Hackathon, Dezember 2025

UCAN Store screenshot

UCAN Store

in Entwicklung
IdentitätArchiv

Browser basierter Storage mit WebAuthn/Passkey-DIDs und UCAN-Delegationen — Upload nach Filecoin (geplant) ohne Accounts oder Passwörter.

→ Storacha-Upload-Service-Fork — Upgrade auf UCAN 1.0 geplant

p2pass

Prototyp
IdentitätSync

Eine Komponente zum Einsetzen, die einer Anwendung eine Passkey-Identität über mehrere Geräte hinweg gibt — auf Basis unseres WebAuthn-Identity-Providers. Kein Credential verlässt je das Gerät, auf dem es entstanden ist:

  • Jedes Gerät bringt seinen eigenen Passkey und seine eigene OrbitDB-Identität mit. Ein zweites Gerät zu verbinden heißt, dass das erste ihm namentlich Schreibrechte in einem OrbitDBAccessController erteilt — keine Wildcards, kein geteiltes Geheimnis, kein kopiertes Credential.
  • Das Pairing läuft über libp2p, nicht über einen Server: Gerät zwei wählt Gerät eins über ein eigenes Protokoll an, ein Mensch bestätigt die Anfrage, und erst danach kommt die Registry-Adresse zurück.
  • Wiederherstellung ohne zweites Gerät: Aus dem PRF-Output des Passkeys entsteht ein IPNS-Schlüssel, der ein Manifest auflöst, das auf das Ed25519-Archiv zeigt — verschlüsselt, auf IPFS. Browser-Speicher gelöscht, und dieselbe Identität kommt über ein öffentliches Gateway zurück, ganz ohne Anmeldung.
  • Wo es noch nicht fertig ist, steht geschrieben: Die Pairing-Anfrage ist noch nicht signiert, und der Weg dort heraus — zusammen mit dem Umstieg auf libp2p 3, Helia 7 und OrbitDB 4 — wird offen nachgehalten.

→ entwickelt mit @asabya — Upstream unter github.com/asabya/p2pass

Akash Deploy PWA

Prototyp
Infrastruktur

Relay-Button-artige Deployments auf dem Akash Network — zweites dezentrales Compute-Target.

→ Konsolidierung mit Relay Button geplant

Orbit Blog

Prototyp
DatenSyncArchiv

Dezentrales Bloggen mit Replikation zwischen Browsern — publizieren ohne Hosting-Anbieter.

FAQ

Häufige Fragen zu Local-First, Verschlüsselung, Metadaten und Infrastruktur — ehrlich beantwortet, inklusive dessen, was noch nicht fertig ist.