The local-first software movement has gone from a fringe idea discussed in academic circles to one of the most exciting paradigm shifts in application development in 2025-2026. If you haven’t read the Ink & Switch “Local-First Software” paper from 2019, it’s worth revisiting — not because the ideas are new, but because the ecosystem has finally caught up to the vision.
CRDTs Have Grown Up
The core technology enabling local-first is CRDTs — Conflict-free Replicated Data Types. These data structures allow multiple users (or devices) to edit the same data independently and merge changes without conflicts. What used to be a PhD-level topic is now shipping in production libraries:
- Automerge 2.0 rewrote the internals in Rust for dramatic performance improvements. Documents that used to choke at 10K operations now handle millions. The JavaScript bindings are seamless via WASM.
- Yjs continues to be the go-to for real-time collaborative editing. Its ecosystem of bindings (ProseMirror, CodeMirror, Monaco) makes it trivially easy to add multiplayer to existing editors.
- cr-sqlite is the sleeper hit — it brings CRDT semantics directly into SQLite, meaning you can use familiar SQL for your local database and get automatic conflict-free sync. This is huge for mobile and desktop apps.
Real Apps Are Shipping Local-First
This isn’t theoretical anymore. Major products have embraced local-first principles:
- Linear built their entire app around an offline-first sync engine. Open Linear on an airplane and it just works — create issues, update statuses, write comments. Everything syncs when you’re back online. The UX difference is night and day.
- Figma’s multiplayer architecture uses CRDT-inspired techniques for real-time collaboration. Their CTO has spoken extensively about how operational transforms and CRDTs influenced their design.
- Notion’s offline overhaul in late 2025 was a massive engineering effort, but the result is that Notion now feels genuinely fast. No more loading spinners when you open a page. The data is already there.
Why Developers Love It
Having built a local-first side project with Automerge over the past few months, I can tell you the developer experience is surprisingly good — but the mental model shift is real. Here’s what changes:
- No loading spinners. The UI renders instantly from local state. There’s no
useEffectfetching data from an API on mount. The data is just… there. - No REST APIs for CRUD. You stop thinking about HTTP requests entirely. Your app writes to a local document, and a sync layer handles replication in the background.
- Offline by default. You don’t need to build an “offline mode.” The app IS offline mode. Network is a nice-to-have enhancement, not a requirement.
- Users own their data. The data lives on the user’s device first. This is philosophically appealing and increasingly important in a privacy-conscious world.
The biggest mental shift is thinking in terms of document state and sync rather than request/response cycles. Instead of POST /api/todos you’re doing doc.change(d => d.todos.push(newTodo)) and the library handles the rest.
The Hard Parts
It’s not all sunshine, though. Here are the challenges I’ve hit:
- Conflict resolution UX: CRDTs guarantee eventual consistency, but “consistent” doesn’t always mean “what the user expected.” If two people edit the same paragraph, the merged result can be semantically nonsensical. You need thoughtful UX to surface and resolve these situations.
- Initial sync for large datasets: If a new device needs to sync a large document history, it can take a while. Automerge’s binary format helps, but this remains a real challenge.
- Auth and permissions: This is the big gap. Most local-first libraries have no concept of access control. Who can read this document? Who can write to it? In server-first architectures, this is trivial — the server enforces it. In local-first, you need cryptographic approaches, and the tooling is immature.
The Elephant in the Room
Here’s the uncomfortable question: most business models depend on server-side data control. SaaS companies monetize by hosting your data and providing access to it. If users own their data locally, what’s the business model? Subscription for the sync service? One-time purchase?
The companies succeeding with local-first tech (Figma, Linear) are still fundamentally cloud services. They use CRDT-like techniques for performance and UX, but the server remains the source of truth.
So I’ll pose the question to the group: is local-first a genuine paradigm shift that will reshape how we build apps, or is it a niche approach best suited for specific categories like developer tools, note-taking, and creative software?
I’d love to hear from folks who’ve tried building (or shipping) local-first in production. What was your experience?