GetMD.Design

Reverse-engineering the web into structured design systems using AI.

Give it a URL. It renders the page in a real browser, recovers the typography, spacing, colour and components underneath, and writes them as documentation you can diff. Not a scrape. A reconstruction from evidence.

Year
2026
Discipline
AI Design Engineering
Status
Production
Role
AI Engineer

Built end to end: browser automation, the analysis pipeline, the API and workers, and the frontend.

01 / Live demo
GetMD.Design

See GetMD.Design in action

One URL in, a reviewable design system out, in real time.

Demo · full runOpen post
Loading player
Real runUnedited capture. No speed-up, no cuts.
What happens in that minute
01

Render Website

~4s

A real Chromium context, held until the page looks the way a visitor would see it: fonts resolved, lazy content triggered, layout settled.

02

Capture Structure

~2s

A full-page screenshot and the computed style of every visible node, taken in the same frame, so pixels and properties describe one moment.

03

AI Analysis

~20s

Statistics find the repeats: type scale, spacing rhythm, colour, clusters. The model gets the ranked candidates and names them.

04

Generate Documentation

~8s

Each section is generated against a required shape and checked against the evidence. Anything ungrounded is dropped.

Validation and reachability run inline, so a site that will be rejected is rejected in under 300ms. Everything that owns a browser is one BullMQ job with four checkpointed stages, because a run holds around 400MB of Chromium and a crash has to cost one stage rather than the whole analysis.

02 / Problem and solution

Everyone reverse-engineers by hand

Every team that has admired an interface has done the same manual archaeology.

The problem

Devtools open, padding values copied into a scratch file, colours eyedroppered one at a time. Nothing tells you which values are deliberate tokens and which are one-off overrides.

Existing tools each capture one layer and lose the relationship between them. Scrapers return markup. A stylesheet dump reports a hundred and forty font sizes: true and useless. Screenshots return design with the structure removed.

The approach

GetMD.Design renders the page for real, then treats design as a statistics problem before it treats it as a language problem. Frequency analysis over computed styles finds the type scale, the spacing grid and the repeated component signatures.

Only then does a model get involved, and only to name what was already found. What comes out is schema-validated markdown: every claim tied to a selector, a measurement or a crop, and anything ungrounded dropped rather than softened.

03 / How I tackled it

Four decisions that shaped it

Every architecture looks inevitable once you delete the version that didn’t work. Each of these starts with the version that didn’t.

8
Pipeline stages
~40s
Median run, cold
400MB
Chromium per worker
0
Model calls before statistics
01

Knowing when a page is finished

networkidle never fires on the real web: analytics polling keeps the connection busy. Readiness is composite instead: load, then document.fonts.ready, then 400ms without DOM mutations, capped at eight seconds, plus a scripted full-height scroll to trigger the lazy loaders.

02

Statistics before the model

Sending markup to an LLM produced fluent, confident, unfalsifiable prose about intent that was never in the input. Computed styles become feature vectors ranked by frequency instead. When four hundred elements use six spacing values and thirty use everything else, the grid identifies itself.

03

Deciding twelve nodes are one component

Class hashes differ and subtrees are never equal, so grouping by either returns every node as its own component. Each node gets a signature (tag path, child multiset, style fingerprint at reduced precision), and two instances agreeing at 85% make a component. Tuned to split, because a false merge invents something that does not exist.

04

Documentation anyone would keep

Free-form generation regresses to “a clean sans-serif typeface and generous whitespace.” Each section is now prompted separately and validated against a required shape: token table, usage rule, evidence. Documents got 40% shorter and considerably more trusted.

Stack
PlaywrightNode.jsOpenAIVision modelsBullMQRedisMongoDBNext.jsCloudflare

Real browser rendering rather than HTML scraping, checkpointed background workers so a crashed render costs one stage instead of one run, and a model asked exactly one narrow question at the end.

04 / Output

What one run produces

One run against stripe.com. Every value below was measured on the rendered page, not read out of a stylesheet.

Colour roles, not a colour list
Colour roles, not a colour list

Frequency analysis separates the tokens carrying the system from the long tail of one-off values. The model assigns each one a role.

A type scale recovered from computed styles
A type scale recovered from computed styles

Size, weight, leading and tracking per step. The numbers are odd because they are real: 0.256px of tracking is what the page does.

Components rebuilt from their signatures
Components rebuilt from their signatures

Four pricing cards that share a signature, including the inverted variant, rendered live so the recovered tokens have to hold up.

The artefact itself
The artefact itself

Schema-validated markdown with stable anchors. This is the file that gets committed, reviewed and diffed after the next redesign.

Run it on a site of your own