The demo video
What it does
Two Meta model steps (SAM 3.1, Muse Spark); everything else is deterministic code you can check.
- Capture
Playwright opens the live web app and takes a full-page screenshot plus the computed style of every element.
- Segment
SAM 3.1 finds buttons, inputs and icons from the pixels, even where the markup describes nothing.
- Name
Muse Spark names a three-tier token set, primitive → semantic → component, with a reason for each token. Code checks every proposal.
- Review
A person accepts, renames, rejects or merges tokens in the HTML report.
- Rewrite
Hardcoded values in the real source become
var(--token, original), so the original stays as the fallback. - Verify, then open a pull request
Four checks: fallbacks only must be 0 px changed, merged colors must be invisible, the full cleanup is shown for review, and no text may get harder to read (text contrast, WCAG AA).
Three tiers, one name each
Real lines from the Argon Dashboard run: tokens.css and the rewritten main.css.
--color-blue-500: #5e72e4;Primitive · the raw value--color-action-primary: var(--color-blue-500);Semantic · what it means--button-bg: var(--color-action-primary);Component · where it’s usedbackground-color: var(--button-bg, #5e72e4);Source · the original kept as the fallback
Try it
Argon Dashboard React (Creative Tim, MIT) on our fork's GitHub Pages: the original, the tokenized build, a proposed change previewed live, and the token playground.
- Original
The app as published, every color typed in place.
- Tokenized
Same pixels, now driven by
tokens.css. - A proposed change, previewed
color.action.primaryset to orange: every button, badge and link follows. - Token playground
Change any token, check text contrast, build a dark theme (static, no model calls).
The review reports
- Argon Dashboard: review report
Every proposed token with its reason, SAM regions, and the verify table.
- Light Bootstrap Dashboard: review report
The second demo app, same pipeline.
- Argon
tokens.css2.8 KB, the token file the rewrite points at.
- Light Bootstrap
tokens.css2.3 KB.
Evidence
All numbers from real runs, reproducible from the repo (as in docs/SUBMISSION.md).
| Claim | Result | Where |
|---|---|---|
| Rewrite is safe on real sites | 28 public, permissively licensed sites we didn't build: 3,687 values rewritten, 0 px changed on 23 of 23 stable sites with edits; a second run gave the same verdict on all 27 reachable | docs/breadth.md |
| Segmentation on real sites | Hand-labeled first screens of 3 sites: the combined segmenter passes all three | docs/real-site-segeval.md |
| End to end, Argon Dashboard | 17 to 23 s, naming 4.2 to 4.9 s; checks 0 px · 0.000% · 0.919% | docs/latency.md |
| Human review | Accept, rename and merge take the fixture's answer-key score from 20/21 to 21/21, still 0 px | demo/L5-review-take.md |
| Text contrast vs the W3C rule | ACT rule afw4f7 (text has minimum contrast): 32 of 32 approved test cases consistent, 31 exact | docs/a11y.md |
| Text contrast vs axe-core 4.14 | 28 sites: agrees on 308 of 309 violations and 2,165 of 2,174 passes, 99.9% agreement (1 opposite verdict in 2,483, on a page that animates); of the items axe-core can't decide (text on gradients and images), it settles 97% and flags the rest for review | docs/a11y.md |
| Icons and controls (SAM) | On the div page, SAM found 9 controls the code doesn't describe; each measured for contrast and size | docs/a11y-nontext.md |
| Visible keyboard focus | 30 real sites, 1,779 Tab stops: 52% show a focus indicator that meets the bar, 17 sites under half. One focus-ring token set takes Argon from 0 of 25 to 25 of 25, still 0 px when nothing is focused. SAM also finds controls a keyboard can't reach: on the div page, 7 of 7 clickable controls | docs/keyboard.md |
| Dark mode as a token file | Light Bootstrap Dashboard: 83 of 84 text pairs pass in dark (14 of 84 in its original light theme) | docs/dark-mode.md |
| Point and say: contrast | Argon, click "Since last month", "This label is too light. Make it readable, keep our gray.": color.text.muted moves, 21 elements 2.95:1 → 4.53:1, whole page 41 → 20 failing text pairs, 0 regressions, 3 of 3 runs. Light Bootstrap: 12 elements 2.81:1 → 4.54:1 | docs/point-and-say.md |
| Point and say: keyboard focus | Argon, "Give every control a visible focus ring in our blue.": visible focus on 0 → 25 of 25 controls, 0 worse, 3 of 3 runs | docs/point-and-say.md |
| Point and say: blocked on regression | Argon, "Make these buttons red.": blocked and reverted, naming "Month" (4.20:1 → 3.77:1) and 2 more | docs/point-and-say.md |
| Tests | 291 passing | pnpm test |
| Run outputs | the verify and timing summaries behind every row above are committed | runs/ |
Dark mode as a token file
Light Bootstrap Dashboard: 83 of 84 text pairs pass text contrast in dark (14 of 84 in its original light theme). One token file, every text pair checked; the top navbar is not a token, so it stays light.


28 public sites we didn't build
Mirrored, tokenized and verified end to end: 3,687 values rewritten, 0 px changed on 23 of 23
stable sites with edits. Two sites animate on their own and are reported, not counted as passes. From docs/breadth.md.
| Site | Framework | Licence | Status | Tokens | Edits | Safety checks |
|---|---|---|---|---|---|---|
| wonyong-jang.github.io | jekyll | MIT | ok | 70 | 460 | fallback-only 0 px (pass); colors 0.000% (pass) |
| devbattery.github.io | jekyll | MIT | ok | 106 | 358 | fallback-only 0 px (pass); colors 0.000% (pass) |
| ragu-manjegowda.github.io | jekyll | MIT | ok | 53 | 125 | fallback-only 0 px (pass); colors 0.000% (pass) |
| tw93.github.io | jekyll | MIT | ok | 42 | 1 | fallback-only 0 px (pass); colors 0.000% (pass) |
| josh-wong.github.io | docusaurus | MIT | ok | 66 | 85 | fallback-only 0 px (pass); colors 0.000% (pass) |
| diogoribeiro7.github.io | jekyll | MIT | ok | 75 | 294 | fallback-only 0 px (pass); colors 0.000% (pass) |
| geuni620.github.io | gatsby | ISC | ok | 43 | 2 | fallback-only 0 px (pass); colors 0.000% (pass) |
| utzcoz.github.io | jekyll | Apache-2.0 | ok | 32 | 84 | fallback-only 0 px (pass); colors 0.000% (pass) |
| andra-sun.github.io | jekyll | MIT | ok | 74 | 50 | fallback-only 0 px (pass); colors 0.000% (pass) |
| awfp1314.github.io | astro | MIT | ok | 36 | 17 | fallback-only 0 px (pass); colors 0.000% (pass) |
| proinsias.github.io | jekyll | MIT | ok | 52 | 243 | fallback-only 0 px (pass); colors 0.000% (pass) |
| gaotianchi.github.io | jekyll | MIT | ok | 41 | 213 | fallback-only 0 px (pass); colors 0.000% (pass) |
| burning-cost.github.io | jekyll | MIT | ok | 150 | 0 | fallback-only 43 px (FAIL); colors 0.000% (pass) |
| cgoldberg.github.io | jekyll | MIT | ok | 72 | 42 | fallback-only 0 px (pass); colors 0.000% (pass) |
| mavrikant.github.io | jekyll | MIT | ok | 111 | 305 | fallback-only 1100 px (FAIL); colors 0.010% (pass) |
| zzy979.github.io | jekyll | MIT | ok | 74 | 50 | fallback-only 0 px (pass); colors 0.000% (pass) |
| ethmarks.github.io | hugo | Apache-2.0 | mirror-failed | - | - | site returns 404 |
| nithinbekal.github.io | jekyll | MIT | ok | 29 | 42 | fallback-only 0 px (pass); colors 0.000% (pass) |
| infi-defi.github.io | hugo | MIT | ok | 27 | 16 | fallback-only 0 px (pass); colors 0.000% (pass) |
| cwwhitney.github.io | hugo | MIT | ok | 36 | 514 | fallback-only 0 px (pass); colors 0.331% (FAIL) |
| c-gyeltshen.github.io | jekyll | MIT | ok | 0 | 0 | fallback-only 0 px (pass); colors 0.000% (pass) |
| ruzickap.github.io | jekyll | Apache-2.0 | ok | 76 | 43 | fallback-only 0 px (pass); colors 0.000% (pass) |
| stuocs.github.io | jekyll | MIT | ok | 72 | 51 | fallback-only 0 px (pass); colors 0.000% (pass) |
| cheonjoosung.github.io | jekyll | MIT | ok | 26 | 23 | fallback-only 0 px (pass); colors 0.000% (pass) |
| dieghernan.github.io | jekyll | MIT | ok | 76 | 502 | fallback-only 0 px (pass); colors 0.000% (pass) |
| hacksocnotts.github.io | hugo | MIT | ok | 50 | 65 | fallback-only 0 px (pass); colors 0.000% (pass) |
| linkarzu.github.io | jekyll | MIT | ok | 74 | 59 | fallback-only 0 px (pass); colors 0.000% (pass) |
| zeikar.github.io | jekyll | MIT | ok | 69 | 43 | fallback-only 29719 px (FAIL); colors 0.350% (FAIL) |
Point and say
Try it live On Argon Dashboard, with a shared demo budget that counts down on the page.
Click a control in the live web app, then say or type the change. Meta's speech model transcribes it, SAM 3.1 outlines what was clicked, contrast and focus fixes are computed (no model), and every change is re-checked on the whole page and blocked if any text gets harder to read. Screenshots from the recorded runs on Argon:



Code and pull request
- The repo on GitHub
Public from Nov 3. Clone it and run it on your own app.
- Pull request #2 on our fork of Argon Dashboard React
The rewrite with the verify table and the text pairs below AA, each with the token that controls it.