Adding a sync engine to Supabase
Supabase Realtime pushes database changes to connected clients. It keeps no local copy, no offline write queue and no conflict resolution. Strata Sync adds those three on top of the Postgres Supabase already gives you.
Where Realtime stops
Supabase Realtime has three parts. Broadcast sends messages between clients, Presence tracks who is online, and Postgres Changes streams row changes out of your database as they commit. All three do what they say.
None of them hold state on the device. When the connection drops, the changes you missed are gone rather than queued. When someone edits offline, there is nowhere for the edit to live and nothing to reconcile it against later. Realtime is the push. The local copy, the write queue and the conflict rule are the rest of the work.
What Strata Sync adds
Reads come from an IndexedDB copy, so screens render without a round trip. Writes apply at once and wait in a durable outbox until the server confirms them, with idempotency keys so a retry never applies twice. On reconnect the client asks for everything after the last sync id it saw and rebases its queued writes on top. Conflicts resolve per field, and rich text uses Yjs.
It runs on your Supabase database as it is
The sync log is three plain Postgres tables using bigserial, uuid, text, jsonb and timestamps. No extensions, no logical replication, no LISTEN/NOTIFY. Your existing schema is untouched.
What you still have to run
A Node process. The server is a set of Fastify routes, and Supabase Edge Functions are Deno. Run it wherever you already run one and point it at your Supabase connection string. If the appeal of Supabase is not operating a backend, this is the cost: you now operate one process.
Two things to get right
Pooling. Use the session-mode connection, or set prepare: false on postgres-js. The pooler in transaction mode does not support prepared statements.
Authorisation. Strata Sync resolves sync groups server-side and authorises writes itself. If you also use row level security on the same tables, decide which layer owns the rule rather than running both and hoping they agree.
When not to bother
If your app is online-only and a spinner is fine, Realtime plus optimistic updates gets you most of the feel for none of the commitment. What a sync engine is covers when the answer should be no. Still choosing a backend? Convex vs Supabase. Ready to build? The quick start is five steps.
Common questions
Get started
One command. It scaffolds a working app with the sync server wired up.