A brief in, a system out
Foundations, semantic roles, component recipes and a documented export — validated against the criteria that apply, and honest about the exceptions.
A brief in, a system out
Foundations, semantic roles, component recipes and a documented export — generated from six answers, validated against the criteria that apply, and honest about the exceptions.
Foundations
Starter components
Built from the semantic roles, not from raw values. Changing the brand colour moves all of it.
Validation
Token dependencies
What breaks if a primitive changes. A semantic token is a reference, so the answer is knowable.
The export bundle
What is generated, and in what order
Primitives first. Brand, accent, neutral and four status ramps in OKLCH, each 50–950.
Then semantic roles, chosen by measurement rather than by fixed step: the ramp is walked from the end nearest the canvas until a step actually meets the contrast target. That is why an unusual brand colour still produces a system that passes.
Then scales — type, spacing, radii, shadows — from the ratio and density you chose.
Then component recipes, which reference only the semantic layer. No component names a ramp step, which is what makes the whole system move together.
Then validation, which checks contrast, state distinction, focus visibility, target size and whether every reference resolves. Anything it cannot fix is listed as an exception in the README rather than quietly dropped.
A generated system is a starting point
What a generator can do is make the arithmetic consistent: even lightness steps, roles that meet their thresholds, states that are actually distinguishable, scales that relate. That is a real amount of work and it is the part most hand-built systems get wrong.
What it cannot do is know your product. The naming, which components exist, what the brand should feel like, and every decision that depends on the domain — those are yours, and nothing here pretends otherwise.
The exceptions matter more than the passes
Any generator can produce a system that passes when the brand colour is a mid-tone blue. The interesting output is what happens with a pale yellow or a near-black: which roles cannot reach their target, and what the honest options are.
Those go in the README, so whoever inherits the system knows what was compromised and why rather than discovering it in an audit.
Everything stays in your browser
No account, no upload, no server. The bundle is generated here and downloaded from here, and the workspace that carries it between tools is a single record in this browser's local storage.