Dancode-188/synckit: πŸ”„ A powerful, type-safe sync engine for building real-time collaborative applications. Local-first, CRDT-based, with zero-config offline support.


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

synckit demo

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 cash only
(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 manual βœ… CRDT βœ… CRDT
self hosted βœ… yes ❌no βœ… yes βœ… yes βœ… yes
multi language server βœ… ts
🚧 py/go/jung
❌no Postgres only ❌ JS only ❌ JS only
Price determination Free (self-hosted) $25-$2,000+/month $0-$25/month Free Free
typescript support βœ… Native βœ… good βœ… good issues βœ… good
learning curve βœ… 5 minutes medium medium steep Complex
production status βœ… v0.1.0 ready βœ…Mature βœ…Mature βœ…Mature Alpha Beta

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, SyncProvider hook
  • 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 (useText hook) for character-level sync
  • counter crdt – distributed counter (useCounter Hook) 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

Leave a Comment