Le-Space

Data and software you own.

The Local-First Peer-to-Peer Stack

No servers. No accounts. No passwords. Your data lives on your device, collaboration happens directly between devices — relay infrastructure starts on demand and stops when you're done. Data archiving on decentralized storage.

The Local-First Stack

Every layer works without a central service — and every layer is an open-source building block you can use on its own.

Projects

Demos and prototypes, not slideware — each project is a building block of the stack with demo, source, and packages.

Relay Button screenshot

Relay Button

beta
Infrastructure

Deploy libp2p relay infrastructure on demand — the toolchain at the core of the local-first stack.

  • One click, one relay: deploys a libp2p/OrbitDB relay (signaling, bootstrap, IPFS pinning) — run it for a meeting, a project or years, then stop it.
  • Full automation: build qcow2 RootFS images, publish to IPFS, manage VM lifecycle & retention via CLI and GitHub Actions.
  • Embeddable UI: React & Svelte components — the actual "Relay Button" — for any app.
  • Bootstrap discovery: relays register themselves; apps discover them automatically.
  • New — remote browser replication: CI spins up a real browser on a fresh VM in another network and verifies true cross-network P2P replication end-to-end — replacing services like testingbot.com for local-first P2P apps.
  • Runs on Aleph Cloud: decentralized compute, VMs without a cloud account; further providers — decentralized and centralized — planned.

Simple Todo — simple-todoSimple Todo — collab01Simple Todo — passkey01Simple Todo — acl01 simple-todo

Simple Todo

tutorial
IdentityDataSync

Tutorial for local-first P2P PWAs: WebAuthn/Passkey identity, OrbitDB data, browser-to-browser sync. No server, no accounts, no passwords.

▶ simple-todo — chapter "main" — every visitor automatically joins the same shared todo list; just open the URL.

▶ collab01 — chapter "collab01" — create your own lists and share them with chosen peers via their OrbitDB address.

▶ passkey01 — chapter "passkey01" — sign in with a passkey instead of a throwaway key. Your WebAuthn DID signs every entry and is shown as its author.

▶ acl01 — chapter "acl01" — private, owner-only lists with per-DID write permissions. Grant or revoke access at runtime, without the list address changing.

Universal Connectivity — chatUniversal Connectivity — relay button chat

Universal Connectivity

stable
Sync

Our fork of the official libp2p project with the Relay Button built in: the cross-language showcase — chat between Go, Rust, TypeScript and Nim peers in the browser — extended so anyone can deploy their own relay on demand.

▶ chat — the public room with the peers currently connected — discovery takes about half a minute after you open it.

▶ relay button — the embedded Relay Button: pick a tier and deploy your own relay without leaving the chat.

UCAN Store screenshot

UCAN Store

in development
IdentityArchive

Browser-based storage with WebAuthn/Passkey DIDs and UCAN delegations — upload to Filecoin (planned) without accounts or passwords.

→ Storacha upload-service fork — UCAN 1.0 upgrade planned

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

OrbitDB WebAuthn DID

beta
Identity

Passkey-based identity for OrbitDB — no extensions, just your browser and a biometric sensor. Every oplog entry has to be signed, so the real question is where the signing key lives:

  • Plain keystore (OrbitDB default): the Ed25519 key sits unencrypted in the browser's IndexedDB. Anything that runs script on your origin can copy your identity and write as you — permanently.
  • WebAuthn-encrypted keystore: same key, AES-GCM-encrypted at rest, rehydrated into memory only after a WebAuthn unlock (PRF, largeBlob or hmac-secret). One prompt per session, writes stay fast; safe at rest, in memory while the tab is open. The pragmatic default — demo.
  • Hardware-backed keys (varsig): no OrbitDB keystore at all. The key is generated inside the authenticator — Secure Enclave, TPM, security key — and never leaves it. One passkey prompt per write, and nothing in the browser left to steal — demo.
  • Why varsig: an authenticator never hands you a plain signature over your payload — it signs its own authenticatorData + clientDataJSON-hash structure. The algorithm varies on top of that: Apple, Android and Windows platform authenticators sign with ES256 (P-256), while EdDSA/Ed25519 (COSE -8) is in the spec and works on a handful of security keys — so a passkey DID cannot assume either curve. Varsig is the self-describing envelope carrying structure and algorithm together, so the assertion verifies as an OrbitDB oplog signature and, via toUcantoSigner(), as a UCAN delegation signature. Without it a hardware key cannot be the signer of either, whichever curve it happens to use.

▶ webauthn-did — a passkey becomes your OrbitDB identity — the DID is derived from the credential, no keystore involved.

▶ encrypted-keystore — an Ed25519 keystore encrypted at rest, unlocked once per session by WebAuthn — the pragmatic default.

▶ varsig — no keystore at all — the authenticator signs every entry itself, one passkey prompt per write.

libp2p WebRTC over QR screenshot

libp2p WebRTC over QR

beta
Sync

Two browsers connect directly as libp2p peers — no relay, no signaling server. One phone scans the WebRTC handshake off the other screen.

  • Signaling as a QR code: offer and answer travel out-of-band as signed, deflate-compressed payloads instead of through a circuit relay. A text field is the copy/paste fallback.
  • Signed, not just scanned: the SDP carries the DTLS fingerprint, so signing it with the libp2p key binds the WebRTC session to the peer id — the same idea certhash uses in WebRTC-Direct. That is what makes it safe to skip the usual encryption handshake.
  • Tampering fails closed: a modified payload is rejected before any dial happens, and a browser refuses its own offer instead of self-dialing.
  • Works without infrastructure: useful where there is no relay to reach — the same room, the same LAN, an air-gapped network.

→ New — released on npm as @le-space/libp2p-webrtc-qr

OrbitDB Relay

beta
InfrastructureData

Relay and pinning service keeping OrbitDB databases available while peers are offline.

p2pass

prototype
IdentitySync

Peer-to-peer distribution of passkey credentials — recover your identity when a device is lost.

Akash Deploy PWA

prototype
Infrastructure

Relay-Button-style deployments on Akash Network — a second decentralized compute target.

→ Consolidation with Relay Button planned

Orbit Blog

beta
DataSync

Decentralized blogging that replicates between browsers — publish without a hosting provider.

OrbitDB ⇄ Storacha Bridge

beta
Archive

Backup and restore local-first data to Filecoin/Storacha with full hash and identity preservation.

FAQ

Common questions about local-first, encryption, metadata and infrastructure — answered honestly, including what isn't finished yet.