Local-first sync engines
A PouchDB alternative that does not need a CouchDB
IndexedDB in the browser, the same data on another device, and a design that treats offline as normal rather than as an error.
What PouchDB is
In its own terms.
A JavaScript database that runs in the browser, on IndexedDB, and replicates with CouchDB or anything that speaks its replication protocol. Bidirectional, incremental, with conflict detection through revision trees, and around for over a decade.
Side by side
Where they part ways.
| s3nd | PouchDB | |
|---|---|---|
| What it is | A CLI, a library and React hooks over your own S3 bucket | Browser database with CouchDB replication |
| Where the data lives | Your bucket: S3, R2, MinIO, Scaleway, Wasabi | A CouchDB server, or a compatible one |
| Both ends online at once | No. The code is redeemed later, until it expires | No |
| From inside your web app | Yes, through one route on your server | Yes |
| Accounts | None. The code is the whole handshake | CouchDB authentication |
| Hosting | Your bucket, plus your server when a browser takes part | Self-hosted or hosted CouchDB |
| Price | Free. You pay your storage provider for a few objects that expire | Free |
| License | MIT | Apache-2.0 |
The differences
What actually changes.
A database versus a snapshot of yours
PouchDB is the database, with its document model and its revisions. s3nd leaves your database alone, whatever it is, and moves an export of it.
A CouchDB versus a bucket
Replication needs a CouchDB, or a compatible server, running somewhere. s3nd needs object storage and nothing else.
Continuous replication versus a code
PouchDB syncs as long as it is connected. s3nd moves the data once, when the user asks, and the code is the only credential.
The decision
Pick the one that fits.
Pick PouchDB when
- You want a database that syncs, with revisions and conflicts as first-class concepts.
- A CouchDB you already run, or a hosted one you are happy to rent.
- Continuous bidirectional replication is the feature.
Pick s3nd when
- You keep your own IndexedDB schema and your own wrapper.
- Object storage is all you want to run.
- New device with a code, backup, or encrypted export.
More comparisons
Tool by tool.
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