The local-first sync engine Linear never open-sourced
Strata Sync is an open-source implementation of Linear's sync engine for TypeScript. Local reads, offline writes, one server-ordered log, on your own Postgres. MIT.
Most apps stop working when the network does
Strata Sync keeps the app working
Reads from the device
Every query reads a local IndexedDB replica. No spinners, no round-trips, no loading states to design.
Writes queue offline
Edits apply in memory at once and wait in a durable outbox until the server confirms them, however long that takes.
One ordered log
The server gives every change a syncId. Each tab, device and client replays the same ordered log and lands on the same state.
See how it works : the mechanism built up one idea at a time, in figures you operate yourself.
Linear’s sync engine, open-sourced
Linear’s engineers described their sync engine in talks and posts but never released it. Strata Sync implements each part in TypeScript, on your own Postgres. It contains no Linear code, and Linear is not affiliated with the project.
How Strata Sync compares
Strata Sync
ElectricSQL
Your data
Extra service
Writes
Conflicts
Text and undo
Strata Sync
ElectricSQL
Your data
Extra service
Writes
Conflicts
Text and undo
In detail: vs Zero, vs Convex, all five.
Columns describe each project’s documented defaults as of September 2026.
In production at Done Bear
Done Bear is a task manager by the same author. Six clients share one Postgres through Strata Sync.
Web dashboard
React 19, MobX, IndexedDB
Desktop
Tauri 2 shell
iOS
SwiftUI, Swift port of the protocol
CLI
npm package, OAuth
Raycast
macOS launcher extension
MCP server
Hosted, for AI agents
What you can build
Tick off items and reorder lists instantly, even in aeroplane mode.
Get started in minutes
Define a model · lib/sync/models.ts
import { ClientModel, Model, Property } from "@stratasync/core"
@ClientModel("Todo", { loadStrategy: "instant" })
class Todo extends Model {
@Property() declare title: string
@Property() declare completed: boolean
}