Catch the bugs that never throw. Then stop them.
Add one line. An on-device model reports double submits, stale responses and failing endpoints. Stopping them is opt-in.
Check any page.
Invisible text, broken images, layouts that break on phones. Paste a URL to find them.
Invisible text
A label in the same colour as its button.
Broken images
An image URL that was made up, or a host that went away.
Layouts that break on phones
One fixed-width block and the whole page scrolls sideways.
Template leaks
undefined, NaN or [object Object] where the data should be.
Covered buttons
An invisible layer on top takes the click.
35 of 35 planted bugs found. 0 false alarms in 128 views of correct pages. How we measured →
Before and after.
The worst bugs never throw an error.
Duplicate submits
A double-tap on a slow checkout sends the order twice.
75% detected on held-out real apps
Stale responses
Results for "pa" land under a search box that already says "paris".
30% detected on held-out real apps
Broken state
A cart total stops matching its lines.
6% detected on held-out real apps
Failure storms
An endpoint starts failing and the app keeps polling it.
Write races
A server echo overwrites what the user just typed.
Slow and flaky calls
A call far slower than its usual self, or a failure one retry would survive.
Detection rates: model 0.2.0 at the default balanced profile. All results
The real runtime, running on this page.
This demo turns on guard with every gain margin at 0 and the eager profile, so you can see it act. The shipped defaults only report. Keep this tab in front: the model loads at idle and the stock poll pauses while the tab is hidden.
The double-click that emails your customer twice
A slow "Send invoice" button with no double-click protection, the kind every app has somewhere. Same code on both sides. The right side has GenClass.
- No emails yet
- No emails yet
Bugs that never throw, reported live
A search box whose answers race each other, and a stock widget whose API you can break. No errors are thrown. Watch what GenClass reports.
- Type in the search box or break the API. Detections appear here with the model's confidence and evidence.
Everything above is the real @genclass/runtime@0.2.1 from npm, deciding on your device (model loading). This run's settings: mode: "guard", aggressiveness: "eager", policy: { thresholds: { guard: 0, heal: 0 } }. The shipped defaults are mode: "observe", aggressiveness: "balanced": run the demo with them, or with guard at its shipped gates. In the compatibility matrix guard at those gates left 249 of 250 runs with a latent bug buggy, so with the defaults this demo shows reports and no fix. The endpoint is real; the page asks for the delays so the race is reproducible. Telemetry is off on this site. Open DevTools to see the same [GenClass] lines.
A model in the browser, deciding at the network boundary.
Observe
One line wraps fetch, XHR, WebSocket and EventSource, and finds React, Redux and Zustand (devtools) state.
Triage
Cheap facts are computed for everything; only salient situations reach the model.
Decide on the device
The model runs in a Web Worker and returns a diagnosis and an action, with no server call.
Report, or act
Observe reports with the evidence. Guard can drop a stale write or merge a duplicate, with undo.
One line, first in your app.
// npm i @genclass/runtime, then first line of src/main.ts import "@genclass/runtime/auto"; // observe: reports, changes nothing // import "@genclass/runtime/auto/guard"; // let it act
// instrumentation-client.ts (project root) import "@genclass/runtime/auto";
<!-- first in <head>, no build step; keep the version pinned --> <script src="https://cdn.jsdelivr.net/npm/@genclass/runtime@0.2.1"></script>
# detects your framework, shows the diff, asks, then writes npx @genclass/runtime init npx @genclass/runtime init --mode guard npx @genclass/runtime remove # undo exactly what init added
Anonymous diagnostics, with no page text, are on by default. Turn them off with GenClass.init({ telemetry: false }) or npx @genclass/runtime init --no-telemetry. See what is sent.
Precise when it acts, and it rarely acts.
introduced in 3,510 compatibility runs across 7 frameworks and 15 data layers
runtime 0.1.0-beta.4 (shipped as 0.2.1), model 0.2.0, balancedfalse interventions in guard mode at the default profile; 0 on held-out real apps
model 0.2.0, balanced, held-out simulated appsof the cases where acting would help get an action from guard; it reports far more than it fixes
model 0.2.0, balanced, held-out real appsQuestions
Is GenClass free?
Yes. The runtime is open source under Apache-2.0 and free, including in commercial apps, with no usage limits. The optional genclass.dev dashboard is free for 3 apps with 7 days of history; Pro ($99 a month) adds unlimited apps, 1 year of history, data export and forwarding, and Custom ($599 a month) adds a model trained on your app. See pricing.
Does GenClass need an account or an API key?
No account or API key is needed to run it: one script tag or import "@genclass/runtime/auto" is all it takes, and the model runs on the device. An optional free account shows your app's detections on a dashboard at genclass.dev. The dashboard fills from deployed pages with diagnostics on, so telemetry: false leaves it empty, and runtime 0.2.2 and earlier do not send to it.
Will GenClass break my app?
The default mode only observes and changes nothing. Across 7 frameworks and 15 data layers, GenClass introduced no bugs in 3,510 test runs (runtime 0.1.0-beta.4, the code shipped as 0.2.1; model 0.2.0). Adding ?genclass=off to a URL turns it off on that page.
Where do GenClass reports go in production?
By default to the end user's browser console, which you do not see. The sinks option hands each report to your own code, for example to send it to your logging. On Pro, the genclass.dev collector can also forward detections to Sentry, PostHog, Datadog, Slack or a signed webhook, with no code in your app. Anonymous diagnostics go to the GenClass maintainers to improve the model, and to your dashboard if you have one; telemetry: false turns them off.
Start in observe mode.
It reports what it sees and changes nothing until you turn on guard.