A small test for any productivity app: open it in an elevator.
If the screen becomes a spinner because the signal disappeared between floors, the app has revealed something important. The work you thought was on your phone was apparently visiting from a server.
We got used to this bargain because cloud software solved real problems. It made collaboration easy, backups somebody else's concern, and every device magically current. But it also made “open my own note” a network operation.
The elevator test
Local-first software begins with a stubborn requirement: the copy on the device is a real copy. Reads and writes happen locally. The network synchronizes changes when it can.
That sounds like an implementation detail until the network fails. Then it becomes a product feeling. The app opens immediately. Search still works. You can keep typing on a plane, in a tunnel, or during the five minutes when the office Wi-Fi decides it has fulfilled its purpose in life.
Where does the work live?
The original local-first essay from Ink & Switch frames this as ownership and agency, not merely offline support. If a service disappears, your work should not disappear with it. If you stop paying, your files should not become exhibits behind glass.
A good export button is the minimum version of that idea. A durable local format is better. The ambitious version is software where servers are replaceable because the authoritative data is already in users' hands.
Sync is the hard part
Of course, “just store it locally” lasts until two people edit the same paragraph on three devices. Synchronization needs identity, conflict handling, encryption, history, and a plan for the laptop that wakes after six months with ancient opinions.
CRDTs can merge concurrent changes without forcing every device through one central ordering service. They are powerful. They are not a seasoning to sprinkle on a database. Product semantics still matter: two people can concurrently edit a sentence, but should two people concurrently approve the same payment?
Start local-enough
Not every app needs a peer-to-peer manifesto. A useful path is more modest:
- make the primary workflow function offline,
- write locally before acknowledging success,
- offer complete export in an ordinary format,
- show sync state without making users manage it, and
- test what happens when the server never comes back.
The cloud is still excellent. Let it relay, back up, coordinate, and collaborate. Just do not make it the landlord of every thought a person writes down.