synckit is one production ready sync engine Which makes it trivial to build local-first applications.
“Add
sync.document()Get real-time sync automatically on your app.”
Problem: Building a sink from scratch takes months. Existing solutions are complex (Yjs), expensive (Firebase), or don’t work offline (Supabase).
Solution: SyncKit provides you with production-ready sync in 3 lines of code.
const sync = new SyncKit()
await sync.init()
const doc = sync.document<Todo>('todo-123')
await doc.update(Advanced features)
// β¨ Works offline, syncs automatically, resolves conflicts

Real-time collaboration with offline flexibility: See tasks instantly synced across tabs, even when offline. The example app demonstrates SyncKit’s offline-first capabilities combined with smart browser storage to create a seamless collaborative experience.
Works when there is no internet
True offline-first architectureβnot just caching. Your app works perfectly on planes, trains, tunnels and coffee shops with spotty WiFi.
Enterprise Features, Startup Bundle
~59 kb gzipped (10KB SDK + 49KB WASM) – Full WASM-based sync engine with TypeScript SDK.
Current Features (v0.1.0):
- β Offline-First Sync (LWW)
- β Real-time collaboration
- β Network protocol support
- β IndexedDB persistence
- β Cross-tab sync (see example)
Coming in v0.2.0:
- π§ Text CRDT (character-level editing)
- π§ Counters, Sets (distributed data structures)
Size-critical apps? Use the Lite variant (~45 KB gzipped: 1.5KB SDK + 44KB WASM, local only)
Competitive Bundle Size: Larger than Yjs (~19KB pure JS), smaller than Automerge (~60-78KB).
Your data, your rules
Open source and self-hosted. No vendor lock-in, no surprise $2,000/month bills, complete data sovereignty.
- <1ms local operation (~5-20ΞΌs single field update)
- <100ms sync latency (10-50ms p95)
- ~59KB bundle (10KB SDK + 49KB WASM), ~45KB Lite option
- Total sub-200KB with React
Data integrity guaranteed
- Zero data loss with automatic conflict resolution (last-write-wins)
- Formal validation with TLA+ (3 bugs found and fixed)
- 700+ comprehensive tests (unit, integration, chaos, load) in TypeScript and Rust
| Speciality | synckit | firebase | Supabase | Yajas | automerge |
|---|---|---|---|---|---|
| True offline-first | β Native | (40MB limit) |
β no one (#357 β 4+ years) |
β Complete | β Complete |
| works without servers | β yes | βno | βno | β yes | β yes |
| Bundle Size(Gzipped) | ~59KB (45kb lite) |
~150KB | ~45kb | ~19KB | ~60-78kb |
| text crdt | π§v0.2.0 | βno | βno | β yes | β yes |
| counter/set | π§v0.2.0 | βno | βno | β yes | β yes |
| automatic conflict | β LWW | β LWW | β CRDT | β CRDT | |
| self hosted | β yes | βno | β yes | β yes | β yes |
| multi language server | β
ts π§ py/go/jung |
βno | β JS only | β JS only | |
| Price determination | Free (self-hosted) | $25-$2,000+/month | $0-$25/month | Free | Free |
| typescript support | β Native | β good | β good | β good | |
| learning curve | β 5 minutes | ||||
| production status | β v0.1.0 ready | β Mature | β Mature | β Mature |
TL;DR:
- vs firebase: No vendor lock-in, real offline, predictable costs
- vs SupaBase: Really works offline (their #1 issue for 4+ years)
- vs YJS: WASM-based, simple API for structured data for multi-language server support
- vs automerge: Small bundle, fast performance, production ready
View detailed migration guides β
npm install @synckit-js/sdk
import { SyncKit } from '@synckit-js/sdk'
import { SyncProvider, useSyncDocument } from '@synckit-js/sdk/react'
// Initialize (works offline-only, no server needed!)
const sync = new SyncKit()
await sync.init()
function App() {
return (
<SyncProvider synckit={sync}>
<TodoApp />
</SyncProvider>
)
}
function TodoApp() {
const [todo, { update }] = useSyncDocument<Todo>('todo-1')
if (!todo || !todo.text) return <div>Loading...</div>
return (
<div>
<input
type="checkbox"
checked={todo.completed}
onChange={(e) => update({ completed: e.target.checked })}
/>
<span>{todo.text}</span>
</div>
)
}
Thatβs it! Now your app:
- β Works 100% offline
- β Syncs automatically across tabs
- β Data is persisted in IndexedDB
- β Resolves disputes automatically
bundle: SyncKit (~59 KB gzipped) + React (~130 KB) = ~189 KB total
Size-important? import { SyncKit } from '@synckit-js/sdk/lite' (~45 KB gzipped, local only)
Full Tutorial (5 mins) β
- π Real-time sync – WebSocket-based instant sync across devices
- π΄ Offline-First – Works perfectly with zero connectivity
- ποΈ Local persistence – IndexedDB storage, unlimited capacity
- πConflict Resolution – Automatic Last-Write-Win (LWW) merge
- Fast operation – <1ms local updates, <100ms sync latency
- π¦ Compact Bundle – ~59KB gzipped (10KB SDK + 49KB WASM)
- πsafe – JWT authentication, RBAC permissions
- βοΈ React Hook ,
useSyncDocument,useSyncField,SyncProvider - π TypeScript Server – ban + hono reference implementation
- π¦Multi-version – Default (~59KB gzipped) or Lite (~45KB gzipped) builds
- βοΈ TEXT CRDT – Collaborative text editing (character-level sync)
- π’ counter – Conflict-free salary increase/decrease
- π Sets and Lists – set overview-extract to archive
- π¨ Framework Adapter – View Composables, Svelte Stores
- π Multi-language server – Python, Go, Rust implementations
graph TD
A[Your Application
React/Vue/Svelte] --> B[SyncKit SDK
TypeScript]
B -->|Simple API| B1[document, text, counter]
B -->|Framework adapters| B2[React/Vue/Svelte hooks]
B -->|Offline queue| B3[Storage adapters]
B --> C[Rust Core Engine
WASM + Native]
C -->|80% of use cases| C1[LWW Sync]
C -->|Collaborative editing| C2[Text CRDTs]
C -->|Advanced features| C3[Custom CRDTs
counters, sets]
C --> D[IndexedDB Storage
Your local source of truth]
D -.->|Optional| E[SyncKit Server
TypeScript/Python/Go/Rust]
E -->|Real-time sync| E1[WebSocket]
E -->|Persistence| E2[PostgreSQL/MongoDB]
E -->|Security| E3[JWT auth + RBAC]
style A fill:#e1f5ff,stroke:#333,stroke-width:2px,color:#1a1a1a
style B fill:#fff4e1,stroke:#333,stroke-width:2px,color:#1a1a1a
style C fill:#ffe1e1,stroke:#333,stroke-width:2px,color:#1a1a1a
style D fill:#e1ffe1,stroke:#333,stroke-width:2px,color:#1a1a1a
style E fill:#f0e1ff,stroke:#333,stroke-width:2px,color:#1a1a1a
It’s loading
Detailed Architecture Document β
Browse all documents β
Tier 1: Simple Object Sync (LWW)
Perfect for: Task apps, CRM, project management, note apps (80% of apps)
// Initialize once
const sync = new SyncKit()
await sync.init()
// Use anywhere
const doc = sync.document<Project>('project-123')
await doc.update({ status: 'completed' })
// Conflicts resolved automatically with Last-Write-Wins
Tier 2: Collaborative Text Editing (coming soon)
Perfect for: Associate Editor, Documentation, Notes
// Note: Text CRDT API is planned for v0.2.0
const text = sync.text('document-456')
await text.insert(0, 'Hello ')
text.subscribe(content => editor.setValue(content))
// Character-level sync, conflict-free convergence
Tier 3: Custom CRDT (coming soon)
Perfect for: Whiteboard, design tools, specialized apps
// Note: Counter API is planned for v0.2.0
const counter = sync.counter('likes-789')
await counter.increment()
// Conflict-free counter (additions never conflict)
@synckit-js/sdk– Core SDK (TypeScript) + WASM Engine@synckit-js/sdk/react– React hooks and components (exported from the SDK)@synckit-js/sdk/lite– Light version (local only, 45KB gzipped)
@synckit-js/server– BUN+HONO Reference Server (Production Ready)
current version: v0.1.0
Production Ready: Core Sync Engine, React Hooks, TypeScript Server β
- core corrosion engine – LWW sync engine with CRDT foundation
- WASM compilation – 59KB gzipped (45KB lite), optimized performance
- typescript sdk – Document API, IndexedDB storage, offline queue
- cross-tab sync – Server-mediated sync with operation buffering for multi-tab sync
- feedback integration ,
useSyncDocument,useSyncField,SyncProviderhook - typescript server – WebSocket sync server with bun + hono
- example application – Todo app, collaborative editor, project management demo
- documentation – Comprehensive guide and API reference
- manufacturing system – Full toolchain with benchmarks and CI
- text crdt – Collaborative text editing (
useTexthook) for character-level sync - counter crdt – distributed counter (
useCounterHook) for conflict-free salary increases - BroadcastChannel Cross-Tab – Direct client-to-client sync without server (offline multi-tab)
- framework adapter – View Composables (
@synckit-js/sdk/vue), svelte stores (@synckit-js/sdk/svelte, - multi-language server – Python, Go, Rust server implementations (TypeScript complete)
- advanced storage – OPFS (Origin Private File System), SQLite Adapter
- conflict ui – Visual conflict resolution interface for complex merge scenarios
Complete Roadmap β
We welcome contributions from the community!
Ways to contribute:
- bug reports – open an issue
- documentation – Improve guides, fix typos
- tests – Add test coverage
- server – Implement Python/Go/Rust Server
- features – Propose new features in discussions
Contribute Guide β
Need enterprise support?
- managed hosting – We host SyncKit servers for you
- priority support – 24/7 support, SLA guarantee
- monitoring and analysis – Dashboard, Alerts, Insights
- Training and Consulting – Onboarding, Architecture Review
contact: danbitengo@gmail.com
Yjs: ~19 KB ββββ
SyncKit (lite): ~45 KB βββββββββ
SyncKit (default): ~59 KB ββββββββββββ
Automerge: ~60-78 KB ββββββββββββββββ
Firebase: ~150 KB ββββββββββββββββββββββββββββββββ
Local update: <1 ms ββββ
Cross-tab sync: <1 ms ββββ
Network sync: 10-50 ms ββββββββ
Firebase (cold): 2-30 s ββββββββββββββββββββββββββββββββ
Memory usage (10K documents)
SyncKit: 3 MB ββββ
Yjs: 8 MB βββββββββ
Automerge: 180 MB ββββββββββββββββββββββββββββββββββββββββ
Detailed benchmark β
Created with inspiration from:
- Yajas – YATA algorithm and performance optimization
- automerge – CRDT theory and formal verification
- linear – Practical approach to sync
- figma – Custom Sync Architecture Pattern
- rxdb – local-first database pattern
Special thanks to the local-first community for driving this movement forward.
MIT License β see License for details.
Copyright (c) 2025 Daniel Bitengo
<a href