incremental view maintenance, anywhere

reactive queries, anywhere.

Live queries, the cache, and optimistic updates — the three things every app gets wrong — handled by one small engine that runs wherever your data does: the browser, a Node server, over the wire, or embedded in Rust. Write the query once; it stays live everywhere. The playground below is that engine — ~200 kB of wasm — running live in this tab.

scroll ↓

01 / 03

materialize a query

Point a source at it — a table, a replication stream, an API, a queue, anything that produces rows. Materialize a query and the result stays live as writes land. No polling, no re-running. The view is the cache, and it never goes stale.

02 / 03

enrich it

Bring in a second source — your model’s relevance scores, joined in. The same live view, now ordered by what your model thinks matters. Operational data and AI output, side by side, kept current by the engine.

03 / 03

and again

Add a third source, a live comments stream. Three sources, one query, one view. Each write touches one row; the engine propagates just that delta and the view updates in place. Nothing re-scans — cost tracks the change, not the table.

rindleread · write

04 / playground · live in your browser

now it’s real.

This is the actual @rindle/wasm engine, booted in your tab. Change the query with the knobs — the engine re-materializes and streams genuine incremental deltas. The code on the left is exactly what runs.

store.query.thread .countAs("commentCount", comment, { parent: ["id"], child: ["threadID"] }) .orderBy("votes", "desc") .limit(6) .sub("comments", comment, { parent: ["id"], child: ["threadID"] }, (c) => c.orderBy("id", "desc").limit(2)) .materialize();
6
thread ⟨ comments · votes · top 6
booting the real @rindle/wasm engine in your browser…
engine wasm · this tabΔ 0 rowsre-scans 0latency <0.001 mswrites 0rows 0

proof · measured, not promised

fast where it counts.

Incremental maintenance means you pay for the change, not the table. Measured end to end over a real dataset, scaled 30×.

~430nsper incremental update, in-process
flat·30×cost holds as the dataset grows 30×
200kbthe whole engine, gzipped, in a tab
0locinvalidation or rollback code you write

the docs · two ways in

pick your path.

incremental view maintenance · browser · node · network · rust