Typed schemas
Define tables and validators with defineTable and v. Rows, queries, and
index columns are fully type-checked end to end.
HyperDB brings the developer experience of a backend like Convex to a database that runs everywhere your TypeScript runs — the browser and the server. You describe your data with typed schemas, read it through reactive selectors, and change it through transactional actions — without writing SQL and without thinking about the storage engine underneath. The same slice of schema, selectors, and actions runs unchanged on the client and the backend; only the storage driver differs.
It’s built for speed: every table is backed by a real B-tree, so inserting into a
sorted collection stays O(log n) instead of degrading the way a Redux or MobX
array does — and on the frontend, against the in-memory driver, selectors and
actions run synchronously, so a click updates the store and the UI in the
same tick. Why HyperDB? tells the full story.
Typed schemas
Define tables and validators with defineTable and v. Rows, queries, and
index columns are fully type-checked end to end.
Indexed queries
Query through B-tree and hash indexes with a fluent, type-safe builder.
Every table is a real B+tree, so sorted inserts and range scans stay O(log n) — ideal for local-first fractional ordering, where reordering an item
touches a single token instead of rebuilding the list.
Reactive by default
Selectors are cached and subscribed. They re-run only when a mutation touches a range they actually scanned.
Instant on the frontend
Against the in-memory driver, selectors and actions execute synchronously —
no await, no microtask hop — so reads and writes land in the same tick.
Runs everywhere
The same schema, selectors, and actions run in the browser (in-memory, IndexedDB, WebAssembly SQLite) and on the server (native SQLite). On the backend the runtime reads only the rows a selector touches — it never loads the whole dataset into memory.
Just JavaScript, no SQL
Write selectors and actions as ordinary JS — loops, conditionals, function calls — on both client and server. HyperDB gives you fast indexed lookups underneath, not a query language to learn.
Plain immutable data
Components get plain, frozen rows — no proxies and no observer() wrapper,
so it composes with React’s rendering model directly.
React & devtools
First-class React hooks plus an in-app devtool that traces every selector and mutation into a call tree.