Notes · 3 September 2026

Thirty-four design sites, and none of them measure anything

We took apart thirty-four galleries, award sites, inspection tools and AI design tools. They curate, generate or re-host. Not one measures a shipped interface, and the one number we published about them was wrong until we measured properly ourselves.

By CSS Crème. Every figure below was measured by us; each one links to where it came from.

Over six days we ran teardowns on thirty-four sites in and around our category: eighteen galleries and award sites, ten CSS inspection tools, eight products that hand a coding agent a design system, and a handful of colour and typography utilities. The method was the same each time: fetch the page as a crawler receives it, then load it in a real browser, and write down the difference.

The pattern that emerged was not about quality. Several of these sites are excellent at what they do. The pattern was about method. They curate, they generate, or they re-host. None of them measure a shipped interface. A gallery shows you a screenshot. A theme builder starts from a blank slate. A pattern library re-hosts other people's screens and adds tags. An inspection extension reads an element and then the reading dies with the tab. Nobody takes a live page, reads its actual type scale, spacing, radii and contrast, and publishes the result with a date on it.

The number we got wrong

We nearly joined them. Our first pass over the eighteen galleries produced a clean statistic: fourteen of eighteen shipped no structured data on their homepage. We published it. It was wrong.

Five of the eighteen had refused our fetcher with a 403 or a 429, and a refused fetch had been counted as though we had looked and found nothing. Absence of evidence, recorded as evidence of absence. When we re-ran the set in a real browser, SiteInspire turned out to ship four JSON-LD blocks and Lapa Ninja two, both from the refused group, and the site we had credited with ten blocks rendered twenty-four words and shipped none. The honest figure is twelve of the seventeen we could measure, with one left uncounted behind a bot challenge rather than rounded into whichever total flattered us.

The correction is published on the page it corrects, with the cause named. A page about other people's numbers is exactly where getting one wrong is both an error and unfair, and quietly editing the figure would have taught us nothing. The lesson we kept: a blocked fetch is not a finding, and a site you could not measure is its own category.

What "AI-native" turned out to mean

One agency in the set describes itself as an AI-native design partner. Its portfolio, product and contact pages each carry a canonical tag pointing at the homepage, which instructs search engines to drop them from the index. Every URL on the domain answers 200, including one we made up. Its opening sentence appears zero times in the HTML it serves; a person sees 557 words, a crawler sees 280. The blog route is configured correctly, so the team knows how. It is applied to one route in ten.

We did not read the one page most relevant to us, because their robots.txt asked automated agents not to, and a site whose own position is that every crawler is welcome cannot coherently ignore another site's stated preference. The existence of that rule is the finding; its contents are not ours to take.

That case is why the AI-Legibility Check exists. Paste a URL and it reads the page the way an agent does, then reports named checks: served words, whether the canonical points at itself, whether a missing page returns a real 404, whether the files that claim to be for AI are files at all. There is no score, because a single number would have hidden every one of the failures above. And each presence check is paired with a request for a path that cannot exist, because the first version of the idea saw a 200 on /llms.txt and believed it.

What we do differently, stated as facts

Everything this site publishes about a design system is computed from the system itself, not written about it. A theme's DESIGN.md carries the contrast ratio of every colour pair an agent will produce, calculated at build time; when a pair fails WCAG AA, the file says so instead of shipping it quietly. Each file carries a fingerprint of its token set, so an agent holding a copy can ask the MCP server whether the copy is still current. The decoder reads a live page's type scale, spacing, radii, shadows, motion and accessibility off the rendered DOM. We ran it on ourselves and published the result, including the two counts where we exceed our own bands.

And since this week, the site counts what it serves. Every fetch of a DESIGN.md, a registry item or an MCP tool is recorded once per visitor per hour, and a theme page shows the number only when it is above zero. For weeks we refused to show a popularity figure because we would not invent one. Refusing to fabricate is necessary. It is not the same as measuring.

Why it matters more now

Coding agents are the new readers of design. An agent asked for a dashboard with no design system falls back on the average of everything it has read, and the result is recognisable on sight. The fix is a design system it can be held to, and "held to" requires numbers: a radius, a ratio, a scale. Prose about a palette being warm and confident cannot be checked. A contrast ratio can.

That is the whole difference between showing a design and decoding one, and it is why we will keep measuring even when the measurement is against us. The next thing we publish will be a dated record of how real design systems move, once the clock is running. We will get some of that wrong too. The point is to be wrong in a way that can be checked.