Bugs your users can see, with no error to log.

Unreadable text, broken images, layouts that break on phones, "undefined" on the page, buttons under an invisible layer. They render without an exception, so no error monitor records them. GenClass measures them on the page and names the element, what was measured, and a fix. Paste an address to run the checks on one public page.

The visual checks are built and measured in CI. They are not in runtime 0.2.1 yet: they are in testing for a later release. The page check runs the same checks on one public page, except click-blocked, which needs a visitor's clicks. Check numbers as of , from the results linked under Sources. The learned model is still being trained and evaluated and has no published numbers; nothing on this page comes from it.

What it finds

Every family of visual bug in the catalog, drawn.

The GenClass catalog of visual bugs collects what breaks on screen in AI-built sites, from studies, builder forums, code searches and audits, and ranks each bug by how strong the evidence is that it is common. These are its families, in its order. Under each: the measured checks for that family, by the names their reports use. A family's other bugs have no check yet.

Sign upLog in

Unreadable text

Text the same colour as its background, too faint, too small, or set over an image.

Checks: text-invisible

team-photo.jpg

Missing or broken media

Images, icons and charts that fail to load, never existed, or render stretched.

Checks: image-broken, image-css-broken, image-distorted, media-failed, icon-font-failed

class="bg-brand-600"Buy nowFree shipping on all ordersReturns within thirty days

Missing styles or fonts

CSS the page asks for and never gets: Tailwind classes that generated nothing, theme tokens that resolve to nothing, fonts and stylesheets that fail to load.

Checks: stylesheet-failed, font-failed, css-var-undefined, csp-blocked

Layout overflow and clipping

Content wider than its box: the page scrolls sideways on a phone, cards blow out, labels are cut off.

Checks: page-overflow-x

Order summary

Overlap and occlusion

Something paints over what the visitor needs: a sticky header over a heading, a dialog behind the page.

Checks: focus-obscured, control-unreachable, dialog-covered

Checkout

Hidden or unreachable controls

Controls that exist but cannot be used: an invisible layer takes the click, the page stays frozen after a modal closes, actions appear only on hover.

Checks: click-blocked, pointer-events-leak, scroll-lock-stuck

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

Template and data leaks

What should never reach a visitor: undefined, NaN, [object Object], Lorem ipsum, garbled characters.

Checks: text-template-leak, text-placeholder, text-encoding

<div id="root"></div>

Blank page and missing content

The page, or a part of it, renders nothing.

Checks: page-blank

Accept

Motion and shift

Content jumps while the page loads, or waits at opacity 0 for an animation that never runs.

Checks: layout-shift

Dark mode

A dark theme applied halfway: dark text left on a dark surface, light cards left behind.

Checks: text-invisible

no viewportmeta tag

Responsive

Bugs that appear only at some widths: a phone shown the desktop layout, rows that never wrap.

Checks: viewport-meta-missing, page-overflow-x

Alignment, spacing and consistency

Nothing is broken, but edges, gaps and buttons do not line up.

No check: design quality, not breakage

ana@example.comToronto

Other

Fields labelled only by placeholder text, emoji used as icons, and pages that render differently in Safari, Firefox and Chrome.

No measured check yet

Fig. 1 The bug families of the catalog, in its order. Check names are the kinds the measured checks report under. Drawn for this page; none is a screenshot of a real site.
How it works

Measured checks, a model still in evaluation, and opt-in fixes.

01

Measure in the browser

Each check is a measurement against a documented threshold, or a fact the browser reports: text below 1.5:1 contrast against a solid background, an image's error event, a page wider than the phone showing it. A report names the element, the value measured and the threshold, and suggests a CSS change for that selector. Text over photos and gradients is skipped, not guessed.

02

Learn from crawled pages

A learned model is still being trained and evaluated on a crawl of AI-built and regular sites, with faults injected from outside each page so every example has a known label. It has no published numbers yet. If it meets its bar, its recall and false reports will be published on this page with the data and the split.

03

Fix only when you ask

In testing: observe mode reports and never changes the page. With visual fixes turned on in guard or heal mode, three narrow fixes can run: a readable text colour, a leaked pointer-events: none removed from body, a stuck scroll lock released. Each is measured again after it runs, and each can be undone. On the unmodified pages of the bench, 0 fixes were applied in 128 page views.

Design and thresholds: the visual checks design. The checks never feed the network model, and they read no pixels.

Results

What was measured, and on what.

Every number below is for GenClass visual checks v1 (branch wave2/visual), measured on GitHub runners in Chromium 153 on , and copied with its label from the runtime results, sections 8 and 9. These are measurements of fixed checks with documented thresholds, not of a model. The page check runs the same checks, except click-blocked; these numbers were measured on the runtime's bench, not through the page check.

  • 35 of 35 planted faults found on fixture pages, each on its element, 23 kinds, 24 tests passed. These are fixture pages written by the same author as the checks, so this shows the checks work as designed.
  • 0 false reports and 0 fixes applied in 128 page views of unmodified pages (Table 2).
  • 8 findings in 96 loads of public home pages, 5 confirmed real by a person from the element's crop, 3 unconfirmed, 0 check errors (Table 3, run 4).
Table 1 Recall on planted faults, per kind. Bench run 5: faults applied from the harness to the 7 demo pages, the 4 templates and the 7 compat apps (scenario h), at desktop and phone width, each checked to have taken before it counts. Planted counts only faults that took effect. The planted forms are the author's, so this is recall on those forms in real app layouts, not on every way such a bug appears.
KindPlantedFoundRecall
text-invisible70701.00
image-broken36361.00
image-css-broken32321.00
media-failed36361.00
stylesheet-failed32321.00
font-failed28281.00
icon-font-failed36361.00
csp-blocked36361.00
text-template-leak54541.00
text-placeholder28281.00
text-encoding28281.00
image-distorted36361.00
page-overflow-x22221.00
viewport-meta-missing11111.00
layout-shift18181.00
page-blank18181.00
click-blocked18120.67
pointer-events-leak18170.94
scroll-lock-stuck36240.67
control-unreachable32321.00
focus-obscured18181.00
dialog-covered18181.00
css-var-undefined28270.96

Every click-blocked and scroll-lock-stuck miss is on one of the six demo pages, which update their DOM all the time; both checks wait for a moment with no DOM change, so they stay silent on such pages. css-var-undefined missed one phone load. The pointer-events-leak miss is a compat app whose requests were in flight during the reads: since the review a lock is not judged while a request runs.

Table 2 Findings on unmodified pages, bench runs 4 and 5 (the same in both). Desktop 1280 x 800 and phone 390 x 844, light and dark, with scripted hover over 8 controls, 8 Tab presses and scrolling to the end. Pages run in guard mode with fixes on, so a fix on a page that is not broken would count as a false fix. An unlabelled finding counts as false.
PagesPage viewsFindingsConfirmed realFalse reportsFixes applied
Demos, 7 pages282200
Templates, 4160000
Compat apps, 7 apps x 3 scenarios840000

The two findings are one real bug in two colour schemes: on the demos index at desktop width, the content under the hero headline moves 59 px 0.2 s after navigation start (a layout-shift window of 0.34). It is labelled real and the demo is left alone. The same zero false reports held in all five runs.

Table 3 Findings on public home pages, per bench run. 40 home pages: documentation, news, government, SaaS, shops, code hosting, an encyclopedia, design sites. One load per site and configuration, no clicks, no forms; dark loads only where the site has a dark design. Each finding was looked at from its element crop. Each of runs 2 to 4 followed changes made because of what the previous run found, so these sites are not held out. Run 5 followed a review of the checks; its findings were not looked at, so all count as unconfirmed. Sites are not named.
RunSites measuredLoadsFindingsPer loadConfirmed realCheck errorsUnconfirmed
132100490.495440
233100120.12552
33410270.069511
4319680.083503
5339760.062not looked atnot looked at6

The 5 confirmed real findings in run 4 are 3 bugs on 2 of the 40 sites, each found in two colour schemes where it applies: on a phone, a statistic 16 px wider than the 390 px viewport, so the page scrolls sideways; on a phone, a layout shift of 0.27 that moves the content below by 782 px; on a phone, a keyboard-focused link hidden under a fixed announcement banner. Bot challenges, HTTP errors and rate-limited loads are not measured.

Table 4 Cost, bench run 5. Time for the first automatic pass and its longest slice, p50 / p95 / max, in ms; the budget is 8 ms per slice and 100 ms per pass. The checks load as a separate chunk of about 35 KB gzip (97 KB minified), and add 582 B gzip to the first load of @genclass/runtime/auto.
LoadsCountPass timePass within budgetLongest slice
Local pages, 1x CPU1286.8 / 32.1 / 53.4100%6.2 / 10.5 / 12.5
Local pages, 4x CPU throttling3232.8 / 112.4 / 113.678.1%14.3 / 18.3 / 20.1
Public sites, 1x CPU11740.3 / 95.2 / 158.495.7%8.9 / 18.9 / 51.1

Three of the proposed cost gates are not met yet: p95 pass time on public sites is 95.2 ms against at most 50 ms, the longest slice at p95 is 18.9 ms on public sites against at most 12 ms, and the first pass finishes inside 100 ms at 4x throttling on 78.1% of local pages against at least 90%.

The learned model is still being trained and evaluated. It has no published numbers, and none of the numbers above come from it. If it meets its bar, this section adds its recall per bug family at two false-report rates, its precision on pages with no injected faults, its size and its cost, with the data and the split behind each.

Limits

What it does not do yet.

  • The learned model has no numbers yet. Nothing on this page claims a detection rate for it until one is measured and published.
  • Measured on GenClass's own apps and 31 to 34 of 40 public home pages per run. Recall is on faults planted in the author's own forms, and the public sites were also used to tune the checks between runs, so they are not held out.
  • No pixels. Text over photos, video and gradients is skipped, and canvas and WebGL content is not checked.
  • Only what the visitor's browser shows. Once they ship in the runtime, the checks run in your app in the colour scheme, width and hover state each visitor is using. The page check adds a phone view and dark mode.
  • Two checks need Chromium. Layout shifts and failed CSS background images have no browser signal elsewhere.
  • Not an accessibility audit. Readable text below WCAG AA contrast is not reported, and nothing here makes a site accessible or WCAG compliant.
  • Design quality is not reported as a bug. Uneven alignment and spacing are in the catalog; no check reports them.
  • It does not repair CSS in general. The three fixes above are the only changes it can make, and only when you turn them on.
Sources
Page check

Scan a page.

Paste the address of a public page. A cloud browser loads it, runs the measured checks (all but click-blocked, which needs a visitor's clicks), and shows each problem on a screenshot with what was measured and a suggested fix.

A cloud browser loads that one page as a desktop and as a phone and reports each problem with its element and what was measured. No form or POST request reaches your server. How it works →