Synchro
Offline-first sync between PostgreSQL and native client SDKs for Swift, Kotlin, and React Native. Your tables. Minimal changes.
import { Card, CardGrid } from ‘@astrojs/starlight/components’;
Why Synchro
Section titled “Why Synchro”How it works
Section titled “How it works”flowchart TB
subgraph Client["Client Device"]
direction LR
APP[Your App] -- "query / execute" --> SDK
subgraph SDK["Native SDK"]
direction TB
DB[(SQLite)]
CDC[CDC Triggers]
PQ[Pending Queue]
DB --> CDC --> PQ
end
end
subgraph Server["Go Server"]
direction TB
PG[("PostgreSQL")]
WAL[WAL Consumer]
CL[Changelog]
PG --> WAL --> CL
end
PQ -- "push" --> PG
CL -- "pull" --> DB
Your app writes standard SQL to a local SQLite database. CDC triggers detect changes and queue them for push. The Go server uses PostgreSQL WAL to detect changes and serves them to clients via pull. Conflicts are resolved automatically using last-writer-wins with configurable strategies.
One interface, every platform
Section titled “One interface, every platform”// Swifttry client.execute("INSERT INTO tasks (id, user_id, title) VALUES (?, ?, ?)", params: [uuid, userId, "Ship v1"])let tasks = try client.query("SELECT * FROM tasks WHERE completed = 0")// Kotlinclient.execute("INSERT INTO tasks (id, user_id, title) VALUES (?, ?, ?)", arrayOf(uuid, userId, "Ship v1"))val tasks = client.query("SELECT * FROM tasks WHERE completed = 0")// React Native (bridges to native Swift and Kotlin SDKs)await client.execute('INSERT INTO tasks (id, user_id, title) VALUES (?, ?, ?)', [uuid, userId, 'Ship v1']);const tasks = await client.query('SELECT * FROM tasks WHERE completed = 0');Deploy your way
Section titled “Deploy your way”Same library. Same protocol. Same SDKs. Moving between modes is a configuration change, not a rewrite.