Skip to content

OfflineSyncLocal-first sync engine

Build apps that work offline, sync automatically, and resolve conflicts โ€” with zero runtime dependencies in core.

12 Packages, 4 Layers โ€‹

OfflineSync is a monorepo organized into four layers: protocol, storage, core engine, and platform integrations.

text
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Platform Integrations                                              โ”‚
โ”‚  React hooks ยท Vue composables ยท Electron IPC ยท Discovery           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Core Engine                                                        โ”‚
โ”‚  SyncEngine ยท Collection ยท MutationQueue ยท ConflictResolver         โ”‚
โ”‚  RecoveryManager ยท IntegrityChecker ยท SyncScheduler                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Transport Layer                                                    โ”‚
โ”‚  transport-http (request/response) ยท transport-websocket (push)     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Protocol & Storage                                                 โ”‚
โ”‚  protocol (wire types) ยท storage (interface) ยท storage-sqlite       โ”‚
โ”‚  conflict (strategies) ยท server (ref implementation)                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Quick Start โ€‹

bash
npm install @offlinesync/core @offlinesync/storage-sqlite @offlinesync/transport-http
typescript
import { Collection, MutationRecorder, MutationQueue, SyncEngine, SyncScheduler } from '@offlinesync/core'
import { SQLiteStorageAdapter } from '@offlinesync/storage-sqlite'
import { HttpSyncTransport } from '@offlinesync/transport-http'
import { ConflictResolutionManager, LastWriteWinsStrategy } from '@offlinesync/conflict'

const storage = new SQLiteStorageAdapter({ dbPath: './myapp.db' })
const recorder = new MutationRecorder({ idGenerator: { generate: () => crypto.randomUUID() } })
const queue = new MutationQueue({ storage })

const tasks = new Collection<{ title: string; done: boolean }>('tasks', storage, {
  mutationRecorder: recorder,
  mutationQueue: queue,
})

// Write data locally โ€” works offline!
await tasks.create('task-1', { title: 'Build offline sync', done: false })

// Configure and start syncing
const transport = new HttpSyncTransport({
  syncEndpoint: 'https://api.example.com/sync',
  clientId: 'client-abc',
})
const conflictManager = new ConflictResolutionManager({
  defaultStrategy: 'last-write-wins',
  strategies: { 'last-write-wins': new LastWriteWinsStrategy() },
})
const engine = new SyncEngine({ clientId: 'client-abc', storage, mutationQueue: queue, transport, conflictResolver: conflictManager })
const scheduler = new SyncScheduler({ engine })
scheduler.start()

Released under the MIT License.