selfstore vs Dexie
TL;DR: Not rivals. Dexie is the best way to QUERY IndexedDB; selfstore is a persistence LOOP. Big queryable tables, pick Dexie. Whole-app durability with backups and sync, pick selfstore. Both together is a legitimate architecture.
What Dexie is
The reference IndexedDB wrapper: a pleasant promise-based API over tables,
indexes and range queries, mature, widely deployed, actively maintained. If
your app holds tens of thousands of records and needs where('age').above(25)
to return in milliseconds without loading everything into memory, Dexie is
exactly the right tool and this page will not pretend otherwise.
What Dexie does not set out to be
A durability story - and it does not claim to be one. Dexie presents itself as an IndexedDB wrapper: tables, indexes, queries. Backups, an export format, encryption, multi-device convergence and a persistence status for your UI are outside the job it takes on. (Dexie Cloud adds sync as a hosted, account-based service, a fine product and a different philosophy: your users’ data syncs through their servers.)
Check its current feature list yourself rather than trusting this page on it. Both projects move, and a page that speaks for someone else ages badly.
What selfstore is
The loop around the data: an IndexedDB working copy behind two functions you write, portable AES-256-GCM encrypted ZIP backups with an independent spec, durable homes the user owns (disk, Google Drive, WebDAV, S3), and serverless deterministic merge. No accounts, no hosted anything.
| Dexie | selfstore | |
|---|---|---|
| Layer | Query IndexedDB | Whole-app persistence loop |
| Data model | Tables + indexes | Named collections + files, plain JSON |
| Query engine | Yes, excellent | No, deliberately (snapshots) |
| Scale sweet spot | Large queryable sets | App state, MB scale |
| Backup file | DIY | Spec’d encrypted ZIP, built in |
| Sync | Dexie Cloud (hosted, accounts) | Serverless merge over user storage |
| License / cost | Apache-2.0; Cloud is a paid service | MIT, everything |
Use Dexie when
- Query performance over large local datasets is the requirement.
- You are happy with (or want) a hosted sync service with user accounts.
Use selfstore when
- The requirement is durable, private, portable app state: survive cleared browser data, hand users a real file, converge a laptop and a phone, without operating or renting a sync backend.
Use both when
Your app has a big catalog and precious user state. Keep the catalog in
Dexie tables; let selfstore own the user’s own data. gather() can even read
from Dexie: selfstore does not care where your snapshot comes from.