Skip to content
s3nd
Menu

Local-first sync engines

A PowerSync alternative when there is no backend database

Both are offline-first: the app reads and writes locally and the network is a background concern. Both let a user pick up on another device.

What PowerSync is

In its own terms.

A sync engine that keeps a SQLite database on the client in step with your Postgres, MongoDB or MySQL. Sync rules decide which rows each user receives, writes go back through your own backend, and the client SDKs cover web, React Native, Flutter, Swift and Kotlin. Available as a hosted cloud or self-hosted.

Side by side

Where they part ways.

 s3ndPowerSync
What it isA CLI, a library and React hooks over your own S3 bucketPostgres, MongoDB or MySQL to client-side SQLite sync engine
Where the data livesYour bucket: S3, R2, MinIO, Scaleway, WasabiYour database, replicated to each client
Both ends online at onceNo. The code is redeemed later, until it expiresNo
From inside your web appYes, through one route on your serverYes, web SDK
AccountsNone. The code is the whole handshakeRequired, JWT
HostingYour bucket, plus your server when a browser takes partHosted cloud or self-hosted
PriceFree. You pay your storage provider for a few objects that expireFree tier and paid plans; self-hosting is free
LicenseMITClient SDKs Apache-2.0; the service is source-available

The differences

What actually changes.

A database on the server versus none

PowerSync replicates from a backend database that is the source of truth. s3nd assumes the browser is the source of truth and there may be no backend database at all; the bucket holds a snapshot, not a replica.

Partial, continuous replication versus a whole snapshot

PowerSync streams the rows a user is allowed to see, as they change. s3nd moves the whole local database once, or rewrites one backup object per user.

A service versus a bucket

PowerSync is a service to run or rent, with sync rules to write. s3nd is one route and a bucket, and a day’s work.

Users versus codes

PowerSync authenticates every client with a JWT. s3nd works without any identity: a code, an expiry, a rate limit.

The decision

Pick the one that fits.

Pick PowerSync when

  • You have a Postgres and want it on the client, offline-first.
  • Many users, row-level permissions, live updates.
  • Native mobile SDKs are a requirement.

Pick s3nd when

  • There is no backend database; the browser holds the data.
  • A code, not a login.
  • The whole feature should take an afternoon.

Put a file. Hand over the code.

Point it at the bucket you already pay for. Nothing to deploy, nothing to sign up for, nothing in the middle.

npm install -g @s3nd/clis3nd init --provider r2 --bucket drops3nd put ./anything.zip