Search selfstore
v1.8.21

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

Use selfstore when

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.