Postgres<>SQLite sync layer

Build local-first apps with simplified state management and real-time reactivity.
Tyler Shukert
Supabase
“PowerSync is really bulletproof — every single kind of interaction that you might have with the data, it's got covered.”
Tyler Shukert
Supabase
Sebastian Röhl
HabitKit
“Integrated @powersync_ into an experimental branch of @HabitKit. Setup was pretty easy and fast. Really love the developer experience and I'm amazed how good it works 🤩”
Sebastian Röhl
HabitKit
Praful Mathur
Sarama / 5 Gyres volunteer
“It was incredible to work with PowerSync. Probably the easiest thing that we had to do in terms of development.”
Praful Mathur
Sarama / 5 Gyres volunteer
How it works

Plugs into your existing database,
backend and app

Writes made to the local SQLite database are queued for upload by the PowerSync SDK.
You control how those writes are applied to the Postgres database through your existing backend API.

PowerSync architecture overview
Visit this website on your desktop to see a demo
PowerSync architecture overview
WHY LOCAL-FIRST?

Build fast, always-available apps

Local reads and writes with a performance-optimized SQLite database make your apps responsive and always available:

Users can access and modify data even when their network connection is unreliable or offline.

No client-side migrations are ever necessary.

// Local queries
db.get(‘SELECT * FROM lists WHERE id = ?‘, [id])

// Local writes
db.execute(‘DELETE FROM lists WHERE id = ?‘, [id])

// Indexing
Index(‘list‘, [IndexedColumn(‘list_id‘)])

// Transactions: Flutter example
await db.writeTransaction((tx) async {
  await db.execute('UPDATE accounts SET balance = balance - 100 WHERE account_no = ?', [account_1]);
  await db.execute('UPDATE accounts SET balance = balance + 100 WHERE account_no = ?', [account_2]);
});

Automatically stream data update events from your backend Postgres to users.

Live queries on the local database listen to changes and update your UI in real-time,

// Flutter syntax
db.watch(‘SELECT count() AS count FROM data‘).listen((results) {
  // update UI
}
why powersync

Dynamic partial replication proven at scale

PowerSync was spun off from a product that's been in production for over 10 years.
Our sync rules approach to dynamic partial replication is battle-tested at scale.

Diagram showing how relevant rows are organized per user into data "buckets" that stream data to the right clients in real-time.
bucket_definitions:
  user_lists_and_todos:
    parameters: SELECT token_parameters.user_id as user_id
    data:
       - SELECT * FROM lists WHERE owner_id = bucket.user_id
       - SELECT * FROM todos WHERE created_by = bucket.user_id

Robust consistency using
server reconciliation

We use a proven server reconciliation architecture with a default of last write wins. Developers
can customize conflict resolution if required, and are in full control of the write process.

How TO Try

Get started with PowerSync

Existing support
Future support
Flutter
React Native
& Expo
Web
(All frameworks)
Kotlin
PostgreSQL
COMMUNITY

Join the community

"How PowerSync approach the community and support us is really outstanding.
I've simply never experienced such support."
Ben M.