We scored uiscanner against the accessibility tree and a token dumper.
Three Stripe pages, one rubric, ground truth read straight from the live DOM. The full table is below, misses included.
design-system fidelity across 3 Stripe pages, verified 2026-06-30
What each one reads
All three read the same rendered page. The difference is whether they read the computed CSS, a frequency dump of it, or the accessibility tree.
Renders the page, reads the real computed CSS off the live DOM, classifies each value's role, and adds a vision pass for composition.
A css-stats / Project Wallace class frequency dump: every value on the page, with no roles, no structure, no build brief.
Blind spot: Values without meaning. It can tell you #635bff is on the page, not that it is the button.
The accessibility tree: the structure Playwright, agent browsers, and most 'read the page' flows are actually built on.
Blind spot: Blind to the entire design system, and it hands back the page's exact copy: the bytes you must not reproduce.
Ground truth was read straight from the live DOM (a color picker on the real buttons), never seeded from uiscanner's own output.
Every page, every dimension
The accessibility tree scores zero on design on all three, and it is the layer most “read the page” tools are built on.
stripe.com/pricing
the blurple is the button, one gradient band, no serif| lane | PrimCTA | AccentRole | Hero | Decor | Serif | Exact | NoCopy | Brief | genPrompt | score |
|---|---|---|---|---|---|---|---|---|---|---|
| uiscanner | yes | yes | yes | yes | yes | yes | yes | yes | 89% | |
| oss-tokens | yes | yes | 22% | |||||||
| playwright-a11y | 0% |
stripe.com (home)
offset hero, a partner-logo strip that is not decorative art| lane | PrimCTA | AccentRole | Hero | Decor | Serif | Exact | NoCopy | Brief | genPrompt | score |
|---|---|---|---|---|---|---|---|---|---|---|
| uiscanner | yes | yes | yes | yes | yes | yes | 67% | |||
| oss-tokens | yes | yes | yes | 33% | ||||||
| playwright-a11y | 0% |
stripe.com/payments
a real split hero with a live checkout demo on the right| lane | PrimCTA | AccentRole | Hero | Decor | Serif | Exact | NoCopy | Brief | genPrompt | score |
|---|---|---|---|---|---|---|---|---|---|---|
| uiscanner | yes | yes | yes | yes | yes | 56% | ||||
| oss-tokens | yes | yes | 22% | |||||||
| playwright-a11y | 0% |
Image prompt scores 0 for every lane here: these Stripe pages are text-heavy, with no decorative art to recreate. It fires on image-rich pages like exa.ai's tiled hero, where only uiscanner returns one.
The same blue, two roles
On Stripe the bright blue is the button. On exa.ai the bright blue is a link and the button is black. A screenshot only sees the color, not which element uses it.
brand hue
primary button
the bright blue is a link; the button is black.
brand hue
primary button
the bright blurple is the button.
What you only get from the real page
Exact, measured values
The real computed color, radius, and spacing off the live DOM. Not a color eyeballed from a screenshot, which is the residual error in every vision-only path.
It never leaks the copy
The accessibility tree hands back the page's exact words and table data: the bytes you must not reproduce. uiscanner describes the shapes and redacts the content.
A build brief, not a value list
A section-by-section prompt you paste into your agent, with roles attached (this blue is the link, the button is black), so it builds instead of guesses.
It understands the pictures
For decorative art it says what the image is and hands you a runnable prompt to make your own version, so you copy the look without copying anyone's assets. No token dumper or a11y tree can.
Where it still misses
The DOM-only pass gets things wrong too.
On the home and payments heroes, the DOM-only run misread the primary CTA (it picked a near-white fill on those two layouts) and the accent's role.
Root cause, now filed: the accent was chosen by raw saturation, so on gradient-heavy pages the swoosh outvoted the real button. The fix is to weight by placement (does it recur on buttons and links) instead of saturation.
The vision pass recovers both on those pages. The scores above are the DOM-only floor, before that recovery.