I've been obsessed with the Ink & Switch "Local-First Software" vision for some time now—apps that work offline, feel instant, and give users control of their data. But every time I tried to build a local-first app, I hit the same wall: integration complexity.
The existing CRDT libraries (Yjs, Automerge) are incredible—they pioneered the algorithms that make local-first work. Kevin's optimization work on Yjs is masterful, and Automerge changed how I think about distributed systems.
But they're designed as modular primitives. You compose networking, storage, and conflict resolution yourself. That flexibility is powerful for complex systems, but it creates what I call the "Day 1 problem" for local-first: you spend 3 days wiring infrastructure before writing features.
I built SyncKit to solve this.
Different philosophy: Where Yjs gives you powerful primitives (build your own local-first stack), SyncKit gives you a pre-wired local-first database. Persistence, sync, presence—built-in, not plugins.
The technical approach:
- Rust core with zero unsafe blocks (you can grep the codebase)
- TLA+ verified (explored 6.5M states to prove correctness)
- 154KB bundle (everything compiled together)
- 1,081 tests, 80 chaos tests
Performance: Competitive within 1-2ms of Yjs for standard ops. The win is local-first DX - one package that handles offline, sync, and conflict resolution.
What's included:
- Rich text editing (Fugue algorithm for non-interleaving edits)
- Live cursors & presence
- Undo/redo (CRDT-native)
- IndexedDB persistence
- React/Vue/Svelte adapters
Built this in Nairobi, 9pm-3am. v0.1.0 got 601 stars in 3 weeks which honestly shocked me.
danbitengo•1h ago
I've been obsessed with the Ink & Switch "Local-First Software" vision for some time now—apps that work offline, feel instant, and give users control of their data. But every time I tried to build a local-first app, I hit the same wall: integration complexity.
The existing CRDT libraries (Yjs, Automerge) are incredible—they pioneered the algorithms that make local-first work. Kevin's optimization work on Yjs is masterful, and Automerge changed how I think about distributed systems.
But they're designed as modular primitives. You compose networking, storage, and conflict resolution yourself. That flexibility is powerful for complex systems, but it creates what I call the "Day 1 problem" for local-first: you spend 3 days wiring infrastructure before writing features.
I built SyncKit to solve this.
Different philosophy: Where Yjs gives you powerful primitives (build your own local-first stack), SyncKit gives you a pre-wired local-first database. Persistence, sync, presence—built-in, not plugins.
The technical approach: - Rust core with zero unsafe blocks (you can grep the codebase)
- TLA+ verified (explored 6.5M states to prove correctness)
- 154KB bundle (everything compiled together)
- 1,081 tests, 80 chaos tests
Performance: Competitive within 1-2ms of Yjs for standard ops. The win is local-first DX - one package that handles offline, sync, and conflict resolution.
What's included: - Rich text editing (Fugue algorithm for non-interleaving edits)
- Live cursors & presence
- Undo/redo (CRDT-native)
- IndexedDB persistence
- React/Vue/Svelte adapters
Built this in Nairobi, 9pm-3am. v0.1.0 got 601 stars in 3 weeks which honestly shocked me.
Try it live: https://synckit-demo.netlify.app GitHub: https://github.com/Dancode-188/synckit
Happy to answer questions about the TLA+ verification or the local-first architecture choices.