Skip to content

HyperDB

A universal, reactive database for local-first apps. Write typed schemas, indexed queries, and selectors & actions once — and run the same code on the frontend and the backend.

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.