The local-first sync engine Linear never open-sourced

npx stratasync init my-app

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.

See the full mapping, part by part

How Strata Sync compares

Strata Sync

ElectricSQL

Your data

Your Postgres, in your app
Your Postgres

Extra service

None
Electric

Writes

Built in
Your own API

Conflicts

Server log, per-field rebase
Replication stream

Text and undo

Both built in
Bring your own

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.

Device A
Offline
Device B
Offline

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
}

Full quick start, five steps

Questions people ask

Ready to build apps that just work?

Open-source. No vendor lock-in.