Local-First
All data is stored locally first. Reads never block on the network. Your app is always fast and responsive.
Build apps that work offline, sync automatically, and resolve conflicts โ with zero runtime dependencies in core.
OfflineSync is a monorepo organized into four layers: protocol, storage, core engine, and platform integrations.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 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) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโnpm install @offlinesync/core @offlinesync/storage-sqlite @offlinesync/transport-httpimport { 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()