Loam

Local-first substrate

Fertile ground for
local-first apps.

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

Apps rooted in the same ground.

Each one is just multi-writer state over Loam — no backend of its own, offline by default, yours on your devices.

The ground beneath

Three layers of substrate.

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.

How it holds together

Four properties, all the way down.

01

Offline by default

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.

02

Room-scale mesh

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.

03

Convergent, not coordinated

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.

04

Yours, sealed

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

See every node — even the offline ones.

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.

01

Buffered offline

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.

02

Sealed & opt-in

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.

03

One pane, every node

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.

Watch it from the hub

The collector subscribes the telemetry topic and serves Prometheus metrics — point Grafana at it:

logos-hub telemetry loam --secret <shared> --port 9109

Get started

Open the ground up.

Everything is open and self-hostable. Start with the substrate, or install the shared node and let an app bind to it.

Install the Loam node

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