Local-first: why the app works without an internet connection

Updated 22 September 2026

An ordinary web application is a window onto a database running somewhere else. Every click is a request across the internet. When the connection or the server goes down, the application stops working.

Local-first turns that around. The database runs on your device and the application talks to it directly. The server exists only so your devices can pass changes to each other. When it is unreachable, nothing happens except that syncing waits.

What follows from it

  • It is fast. A task opens immediately, because nothing is fetched. No waiting on a server.
  • Offline is not a special mode. A train, a plane, a basement. The application does not notice anything changed.
  • Our outage does not stop you. If our server goes down, you carry on and the data catches up later.
  • The data stays yours. If the service ended, a copy is in your browser and can be exported.

How it avoids arguing with itself

When two people change the same thing, each on their own device, one result has to come out of it. That result cannot be picked by who connected first, because the order of connections says nothing about the order of the changes.

We use Evolu, a library built on CRDT data structures. In short: every change carries enough information to be merged with the others regardless of the order they arrive in. Everyone ends up with the same result.

In practice you can work offline on a laptop for a week while a colleague works on theirs, and once you reconnect it merges without asking which version you would like to keep.

What it costs

  • The data takes up space in your browser. That is why attachments are small.
  • Clearing browser data deletes the local copy. Without the backup phrase it cannot be restored.
  • The first load on a new device takes a while, because the whole history is downloaded and decrypted.

Export

The data can be exported and imported back at any time. That is not a concession, it follows from the design: when the database sits with you, there is nothing to lock.

Try it offline

Open the app, turn off your wifi and keep working. Once you reconnect, the changes sync by themselves.

Open App