| Hey HN, I'm Daniel, creator of SyncKit. 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. |