Rindle is one incremental view-maintenance engine that runs everywhere your data lives, behind one query API and one correctness contract — folding in the live queries, caching, and optimistic updates an app would otherwise hand-build and maintain. This page is the “should you use this?”: who it’s for, what it replaces, how it stacks up, and where it isn’t the right tool.
What it replaces
The status quo for “keep this query fresh on the client” is a stack you assemble by hand:
- a WebSocket or polling layer to push updates,
- a client cache and the invalidation logic to keep it from going stale,
- bespoke optimistic-update code per mutation, and the rollback logic when the server disagrees,
- and a pile of refetch-on-focus / refetch-on-reconnect heuristics to paper over the gaps.
Rindle collapses that into: write a query, materialize() it, and write through
named mutators. The engine keeps the result exact — view-after-write equals a
fresh query — and the local-first client makes reads
instant and writes optimistic, rebased by the engine itself: deterministic
mutators re-run against the server’s authoritative result, so read-dependent
writes recompute correctly and a rejected write snaps back with zero rollback
code. There is no separate cache to invalidate, because the engine derives every
view from the data and keeps it correct by construction.
Who it’s for
- App developers who want live, reactive queries with optimistic updates and don’t want to build (or operate) a sync stack. → Start with the local-first client.
- Platforms that generate apps for others — app builders, internal-tool platforms, AI app generators. Rindle is a small, embeddable engine you can drop into every app you ship, so live queries and optimistic updates come for free in the generated output instead of being something each app has to get right.
- Systems / Rust engineers who want embeddable IVM as a library —
std-only, single-threaded, no hosted dependency. → Start with the crates. - Teams replacing a read-model / cache layer server-side — derive live views off a SQLite replica fed by CDC, instead of cron-refreshed tables and Redis invalidation. → Start with replica & views.
How it compares
The comparison here isn’t about query semantics — it’s about shape. Rindle is an embeddable engine with the same correctness contract at every tier — run it yourself, or let us run it for you on Rindle Cloud. Either way it’s your data and your contract, not a black-box runtime you can’t audit or move off of.
| Rindle | Typical alternative | |
|---|---|---|
| Hosted reactive backends (Convex, etc.) | self-host, embed, or managed Rindle Cloud — your data, your contract, runs in the browser too | turnkey and managed, but their service, their runtime, their lock-in |
| Sync frameworks (KV + hand-written mutators) | you write queries + deterministic mutators; the engine derives the result and rebases optimistic writes itself | you write mutators and diffs by hand against a KV store, and own the rebase semantics |
| Postgres→local sync (ElectricSQL, etc.) | backend-agnostic; one engine over wasm, native SQLite, or the wire | tied to Postgres logical replication and a specific topology |
| Warehouse-scale IVM (Materialize, differential dataflow) | small enough to run in a tab; client-first | server/cluster-scale, not embeddable on the client |
| Hand-rolled (WebSocket + cache + invalidation) | one engine, one contract, optimistic + local query resolution built in | N moving parts you own and debug forever |
When Rindle is not the answer
Managed-vs-self-hosted is not one of these limits: if you’d rather not operate anything, Rindle Cloud runs the same engine and the same correctness contract for you instead of by you (see deploying & scaling for the full menu and what’s managed today). The limits below hold either way:
- Your bottleneck is sustained write throughput beyond one logical master. A Rindle deployment accepts concurrent HCTree transactions at one write master and commits them into the total order that lets every replica and client converge. More connections and execution threads scale that master up; sharding by tenant scales writes out. Write-throughput-bound firehoses (high-frequency telemetry, clickstream ingest) are the wrong shape. The fit guide walks through exactly where that line is.
- You need ad-hoc analytics over large, cold datasets. Rindle maintains defined queries incrementally; it is not a column store and won’t win a full-table scan over hundreds of millions of cold rows. A bounded, pre-declared aggregate kept live? Yes. The whole warehouse, ad-hoc? No.
- You need rich multi-party offline conflict resolution today. Rindle’s write model is server-authoritative: optimistic locally, rebased against the server’s result. That’s the right model for most apps, but it is not a general CRDT merge engine.
- Your query is outside the supported shape. The engine covers a large, growing subset documented in supported queries — check it against what you need.
Next steps
- Overview — what Rindle is, in one page.
- The local-first client — the high-level story: optimistic, instant, synced.
- Reactive queries in the browser — the primitive underneath: one runtime, no server.
- Performance — the measured cost of incremental maintenance.
- Supported queries — exactly what builds today.