0.2.1Out now, signed with npm provenance →

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.

Works withReactNext.jsVueSvelteAngularSolidplain HTML
Visual bugs

Check any page.

Invisible text, broken images, layouts that break on phones. Paste a URL to find them.

Desktop and phone. Nothing is submitted to your site. How it works →

Invisible text

Sign upLog in

A label in the same colour as its button.

Broken images

team-photo.jpg

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

Hi,undefined[object Object]Pro plan$NaN/ month

undefined, NaN or [object Object] where the data should be.

Covered buttons

Checkout

An invisible layer on top takes the click.

Drawn examples. Every bug family →

35 of 35 planted bugs found. 0 false alarms in 128 views of correct pages. How we measured →

Drag to compare

Before and after.

Fixed liveFixed from the reportScan your own page →A made-up landing page: broken on the left, fixed on the right.
What it catches

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

Try it

The real runtime, running on this page.

Live demo guard gain margins 0 eager profile (demo)shipped defaults (observe, balanced) Loading GenClass 0.2.1 on your device…

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.

Without GenClass
customer@acme.com · Inbox
  • No emails yet
With GenClass
customer@acme.com · Inbox
  • 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.

Search shows–
Stock–
GenClass0 checked · 0 flagged · 0 acted on
  1. 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.

How it works

A model in the browser, deciding at the network boundary.

01

Observe

One line wraps fetch, XHR, WebSocket and EventSource, and finds React, Redux and Zustand (devtools) state.

02

Triage

Cheap facts are computed for everything; only salient situations reach the model.

03

Decide on the device

The model runs in a Web Worker and returns a diagnosis and an action, with no server call.

04

Report, or act

Observe reports with the evidence. Guard can drop a stale write or merge a duplicate, with undo.

How it works in detail · Everything it touches

Install

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

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.

Results

Precise when it acts, and it rarely acts.

0 bugs

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, balanced
0.13%

false interventions in guard mode at the default profile; 0 on held-out real apps

model 0.2.0, balanced, held-out simulated apps
7.5%

of 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 apps

Every number with its full label, and where it still misses

FAQ

Questions

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.

Read the docs