Search selfstore
v1.8.21

Blog

Engineering notes on local-first storage. No growth hacks, no listicles: the same voice as the docs, on questions that deserve more room.

Schema migrations when you do not hold the database

Local-first inverts who owns the data, and with it who can run a migration. What replaces the deploy-time script - a read-time upgrade, a version that travels with the file, and a loud refusal in the other direction.

Designing an interface when the network is optional

Offline-first deletes most of the UI states a server app needs - spinners, retry toasts, optimistic rollback - and adds three smaller obligations in their place.

Why IndexedDB is the right working copy for a local-first app

A local database as the app's live state - not a server round-trip, not localStorage - and the separation between a working copy and a durable home that makes it safe.

Local-first is a security posture, not just a privacy feature

The largest breaches are server-side. Keeping one person's data on their own device removes a whole class of them - and here is exactly which class, and which threats it does not touch.

Encrypted backups in the browser, done right

What client-side encryption actually protects against, why AES-256-GCM over Argon2id, and why a format spec beats a vendor promise.

Your side project does not need a backend (yet)

An honest decision tree for when a web app actually needs a server - and how far durability, backups and multi-device sync go without one.

Multi-device sync without a sync server

Storage-as-mailbox, hybrid logical clocks and per-collection merge strategies - how deterministic convergence works when nobody runs a server.