Local-first substrate
Loam is the soil your apps grow in — a shared delivery node and an offline Bluetooth mesh, so many people can edit the same thing and always converge. Online, on the same Wi-Fi, or just in the same room.
Sync that doesn’t need the cloud to keep a promise.
Most collaborative apps stop the moment the internet does — even when the people who want to sync are standing next to each other. Loam is built the other way around: every write is a sealed event that any device can carry, over any pipe.
Apps don’t manage servers, sockets, or merge conflicts. They append events; Loam moves them and folds them into the same state on every device — a CRDT that can’t lose a write and a transport that reaches for Wi-Fi, the wider network, or Bluetooth, whichever is there.
What grows here
Each one is just multi-writer state over Loam — no backend of its own, offline by default, yours on your devices.
Know Your Money — local-first, zero-based budgeting a household shares. No bank login, no server.
budget · householdSecure CALendar — a shared calendar rebuilt on Logos; devices converge offline, each calendar signed by your own key (Keycard optional).
calendar · has a site ↗Live Q&A for a room — ask, upvote, answer — even on a saturated conference network.
q&a · eventsPrivacy-first run tracker — background capture plus analytics, syncing your routes over Loam.
tracker · gpsThe ground beneath
Dig down from an app and this is what holds it up — the node it talks to, the engine that makes everyone agree, and the transport that reaches the next device by any means.
The device-wide shared delivery node. One shared Logos node per phone, shared by every Loam app behind a consent gate — so ten apps don’t each run ten radios. Also hosts the Bluetooth mesh for the whole device.
The agreement engine. An event-log CRDT with HLC ordering and range-based set reconciliation: every device folds the same events into the same state, in any arrival order, with no lost writes and no merge conflicts to resolve.
The reach. A shared node over the Logos network, plus a Bluetooth-LE mesh bearer that carries the same sealed writes phone-to-phone when there’s no internet at all. One frame, whichever pipe is there; the sync layer dedups the rest.
How it holds together
No server is in the critical path. A device works alone, holds its own history, and syncs whenever a peer appears. The network is an optimization, not a requirement.
When the internet is gone or the venue Wi-Fi is drowning, nearby devices form a Bluetooth mesh and keep syncing directly — then heal back to the wider network the moment it returns.
Every write is a commutative event folded by a CRDT. Two people editing the same thing offline both keep their change; the log converges to one state everywhere.
Data lives on your devices as sealed bytes. The transport — Logos or Bluetooth — only ever moves ciphertext; it never needs to understand what it carries.
Read the ground
The failures that matter happen off the network — a dead zone, a basement, a room on Bluetooth alone — where you can’t watch live. So each node keeps its own diagnostics and, the moment it reaches the fleet again, flushes them — sealed — to a telemetry topic. A collector turns them into Prometheus metrics, so phones and desktop nodes sit side by side in Grafana, the offline stretch and all. Opt-in, ciphertext-only, and off by default.
A node records its own health to disk while it’s cut off, then drains the backlog to the fleet when a path reappears — so the offline story survives, not just the moments you happened to be watching.
Snapshots are encrypted; the topic and key derive from one shared secret, so only a holder can locate or read them. Nothing ships unless you turn it on.
Android and Basecamp publish the same shape over delivery; the hub decodes it into /metrics labelled by device and platform — compare a phone against a desktop node in one dashboard.
The collector subscribes the telemetry topic and serves Prometheus metrics — point Grafana at it:
logos-hub telemetry loam --secret <shared> --port 9109
Get started
Everything is open and self-hostable. Start with the substrate, or install the shared node and let an app bind to it.
Public F-Droid repo at apps.vpavlin.xyz (also reachable over the home LAN or the mesh). Add it in F-Droid — the fingerprint pins it as its own repo:
https://apps.vpavlin.xyz/fdroid/repo?fingerprint=2373710A76ACB09F287F053E99E533F9D3685529C44E9027CDBC79B1DC0C9105