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.