Solutions

Reactive web & mobile

Your existing app is slow because every screen round-trips a distant backend. Vantage puts a reactive facade API in front β€” a live cache you deploy close to your users that streams changes straight into your frontend. That's Dio and Scenery at work.

Your web and mobile apps are only as fast as the network between them and your backend. Every screen round-trips a database that's hundreds of milliseconds away, so lists arrive with a spinner, data goes stale the moment it lands, and every team ends up rebuilding the same caching, retry and state-sync plumbing by hand.

Vantage puts a reactive facade API in front of your data β€” a small service you deploy close to your users that keeps a live local copy of the data, answers reads instantly from it, and streams every change back into your app as it happens. Your frontend stops polling and starts reacting.

That live layer is Dio (the cache) and Scenery (the reactive views) β€” the same engine behind Vantage UI, open-source Rust with a full guide today.

Where it sits in your stackπŸ”—

Your web & mobile app

unchanged frontend β€” it renders from a cache and watches for changes

Vantage facade API

Dio cache Β· Scenery views Β· deployed at the edge, close to your users

Your data

SQL Β· SurrealDB Β· MongoDB Β· REST Β· GraphQL β€” however far away

The facade is a plain Rust service, so you run it wherever your users are β€” one per region, at the edge β€” while your database of record stays put. The distant round-trip happens once, in the background; your app talks to something milliseconds away.

What your frontend getsπŸ”—

bolt
Instant reads

The screen paints from the local cache the moment it opens β€” no waiting on the backend for the first frame.

sync
Changes stream in

Every open view holds a watch connection; when data changes, the update arrives on its own β€” no polling loop to write.

visibility
Only what's on screen

The facade fetches details for the rows the user is actually looking at, so a million-row list stays cheap.

How the reactive layer worksπŸ”—

Each connected client opens a Scenery β€” a standing view onto the Dio's cache β€” and drives it in one repeating loop. It's the same loop whether the consumer is a desktop grid, a terminal, or a browser tab across the network.

1

The client declares what it shows

Open a page, and it hands the facade a viewport β€” "these are the rows on screen." Nothing more.

2

It paints instantly from cache

Rows appear straight from the Dio's local copy, with … standing in for details still pending. No frozen prompt, even on a cold start.

3

Hydration follows attention

The Scenery fetches details only for the viewport rows. Scroll, and the window moves with the user; off-screen rows never cost a download.

4

Changes stream back

Each landed value streams to the client as a watch event β€” the cell flips from … to a number the moment its data arrives, and every open tab stays current.

5

Closing the view withdraws its work

Disconnect, and the Scenery's queued fetches are dropped. A closed tab stops pulling data β€” the load matches what's actually being watched.

Under many viewers at once, the Dio coordinates the fetches: one flight per row. Two clients watching the same page share a single download, fanned out to both; clients on different pages interleave fairly, so neither starves behind the other's backlog.

On the wire, and in the frontendπŸ”—

The facade answers a plain GET with a snapshot from the cache, and the same URL with ?watch=true keeps the connection open and streams changes as Kubernetes-style NDJSON β€” one line per change:

watch stream
{"type":"ADDED",   "object":{"index":3,"filename":"…","rows":null,  "latest":null}}
{"type":"MODIFIED","object":{"index":3,"filename":"…","rows":143676,"latest":"20260531"}}

The frontend reads that stream straight off fetch β€” no client library, and the rows fill themselves in:

React client
const res = await fetch(`/api/files?offset=${offset}&limit=${LIMIT}&watch=true`)
const reader = res.body.getReader()
// …split the stream on '\n'…
const event = JSON.parse(line)
setRows(rs => ({ ...rs, [event.object.index]: event.object }))

The table renders immediately, and each cell flips as its value lands. Paging away aborts the fetch, which closes the connection, which drops the Scenery server-side β€” the whole lifecycle, for free.

A gradual path, not a rewriteπŸ”—

You don't cut over all at once. Stand a Vantage facade up in front of the databases you already have, move one screen onto it, and let the rest keep hitting the old backend. Migrate at your pace, then delete the legacy tier behind it β€” no risky big-bang.

swap_horiz
Swap databases underneath

The facade is backend-agnostic β€” read from one store and write through another while you migrate, without your clients noticing.

delete_sweep
Delete plumbing you own

No more hand-rolled caching, retry and state-sync in the client β€” the facade does it once, correctly, for every screen.

lock_open
Open-source & yours

High-performance modern Rust that runs on your own infrastructure β€” fully open-source and forever in your control.

constructionThe framework β€” Dio, Scenery and the watch adapter β€” ships open-source on crates.io with a full guide today; build the reactive facade now. Generating and hosting these facades for you β€” geographically distributed as a managed service β€” is on the roadmap.

Start hereπŸ”—