The problem: AI-built UIs all look the same
Ask any coding agent to "build a landing page" and you get the same thing: a near-black hero, a violet gradient, Inter, three feature cards with rounded corners. It is competent and completely generic, because the model has no memory of your brand between prompts. Add a second page and the styling drifts: different spacing, a slightly different blue, a new button shape. There is no source of truth for the look, so there is no consistency.
It is worth being precise about why, because the reason determines the fix. The model is not failing at design. It is doing exactly what it was asked: producing the most probable interface given the request. Absent a constraint, the most probable interface is the centre of everything it has seen, and everyone else prompting without constraints lands on the same centre.
An unconstrained model produces the average of its training data. Everyone prompting without constraints gets the same average.
That reframes the fix. You are not trying to make the agent more creative. You are trying to move it off the centre and hold it somewhere specific, which requires stating what that place is and what is outside it.
What we found in 299 real design files
We sampled 299 DESIGN.md files published across public repositories and directories (real files, written by real teams to give agents design guidance) and measured what they contain rather than what they claim to. 72 were specifically visual-design files. The pattern is consistent enough to be diagnostic.
| Share of files | |
|---|---|
| Colours as raw hex, no semantic role | 86% |
| No prohibitions of any kind | 76% |
| No dark mode definition | 69% |
| No distinctive motifs | 57% |
| At least one vague adjective doing the work | 54% |
| No concrete size value anywhere | 44% |
| Mention typography at all | 83% |
The last row is the giveaway. Typography gets mentioned in 83% of files, and 44% of those same files contain no concrete size value. "Use a clear typographic hierarchy" is a mention. It is not an instruction, and a model satisfies it with whatever hierarchy is most common in its training data.
The two numbers that matter most are the prohibition figure and the semantic-role figure, and they fail in the same way. A file listing #3b82f6 as "primary" with nothing forbidden has told the model that a specific blue exists and left every decision about where to use it wide open. The agent then uses it on headings, links, icon fills, a border and a gradient, because all of those are plausible uses of a primary colour.
The cheapest single improvement to any design file: add a "Never" section. Five lines. No gradients, no drop shadows, no font weight above 600, no colour outside the token set, no spacing value off the scale. That section will change output more than anything else you write.
The six things a system has to contain
A design system that survives being read by a model, applied across twenty files and picked up again next session needs six parts. Each one closes a specific failure.
| Closes | Without it | |
|---|---|---|
| Semantic colour roles | Where each colour is allowed to appear | The accent shows up everywhere it is plausible, which is everywhere |
| A type scale with real numbers | Size and weight decisions | Hierarchy gets carried by bold, and the page reads loud and generic |
| A spacing scale | Rhythm across unrelated components | Every screen has its own vertical rhythm, and the drift is invisible per-file |
| Dark mode, defined not derived | The second theme | The agent inverts light mode and produces muddy contrast and dead shadows |
| Motifs | What makes this design specifically yours | Everything is correct and nothing is distinctive |
| Prohibitions | Everything you did not think to specify | All of it is permitted by default |
The dark mode row is the one teams underestimate. Deriving dark mode by inverting light mode is what a model does when nothing tells it otherwise, and it goes wrong in predictable ways: shadows stop reading against dark surfaces, mid-greys lose contrast against both text and background, and a saturated accent that looked confident on white becomes glaring on near-black. Defining it costs a second token set and removes an entire class of rework.
A real design kit, previewed
A kit is a whole system, not a palette. Below is a live preview of the free ambient-sage kit: the same tokens, fonts, and treatments an agent receives when it applies it. Everything on this page could be repainted by swapping the kit.
Ambient Sage
Live renderRendered from the kit's actual tokens, fonts, and treatments
Typography
Plus Jakarta Sans
Color system
28 semantic roles, light + dark
Agent outputs
DESIGN.md, CSS, Tailwind, shadcn
What the agent actually receives
However you install it, the payload is the same three things:
- A DESIGN.md: the written brief: the design's intent, the type system, spacing and layout rules, component treatments, distinctive motifs, and do's & don'ts. This is what stops the agent defaulting to generic. What a DESIGN.md is, and how to generate one.
- Semantic color tokens: 28 roles (background, foreground, primary, muted, card, border, chart-1…5, and more) in both light and dark. The agent styles against role names, not raw hex, so themes stay coherent. Semantic color tokens explained.
- Framework exports: the same system as CSS variables, Tailwind v3/v4
@theme, a shadcn registry item, or DTCG/W3C JSON. The agent wires whichever matches your stack.
The role names in the second item are doing more work than they appear to. --color-muted-foreground tells a model both what the value is and where it belongs; --gray-400 tells it only the value, and the agent then decides for itself which grey a caption should be. That decision is where consistency leaks out, one file at a time.
Per-tool guides
The mechanics differ by tool: coding agents run a local MCP server, web builders take the shadcn registry or the exported DESIGN.md. Pick your tool:
- Give Claude Code a design system: MCP via
.mcp.json, oridentityforge apply. - Give Cursor a design system: MCP via
.cursor/mcp.json, plus how to structure the rules files. - Give Windsurf a design system: manual MCP config for Cascade, plus the CLI path.
- Give v0 a design system: the shadcn registry + DESIGN.md as the brief.
- Give Lovable a design system: project knowledge + shadcn add in the repo.
- Give Bolt a design system: run
shadcn addright in Bolt's terminal.
One finding worth knowing before you evaluate any tool's native option: reading all six vendors' current documentation, every built-in design-system feature ingests a system you already maintain. None of them produces one, and two gate it behind a paid tier. These features are consumers of a design system, not substitutes for having one.
File or MCP server?
Both, and for different reasons. The distinction is worth getting right because installing an MCP server and expecting better-looking output is a common disappointment.
| A file in the repo | An MCP server | |
|---|---|---|
| Answers | What should this look like? | What is this component's API? Which kits exist? |
| Available | Every turn | When the agent chooses to call it |
| Size limit | Bounded by context | Unbounded |
| Good for | Roles, scales, motifs, prohibitions | Search, catalogues, live data, applying a kit |
Prohibitions are the clearest case for the file. An agent about to add a drop shadow has no reason to query "are drop shadows allowed", so a constraint that lives behind a tool call is a constraint that never fires. Constraints have to be present before the decision. More on where each belongs.
Choosing a kit
Browse kits by visual style to see complete systems in context: type, color, surfaces, and build rules. Every kit has a permanent id and a readable slug; once you know either, the agent can skip search and apply it directly. Slugs can be renamed, but the old one keeps resolving, so a stored handle does not go stale. If you have brand colors already, the match_palette MCP tool finds the closest-fitting kits perceptually.
Let the agent pick
With the MCP server connected, you do not have to choose a slug yourself. Tell the agent your product, audience, and desired mood. It can use search_themes to shortlist, get_design_md to read the brief, and apply_theme to install the chosen kit.
Verifying it is actually being followed
Installing a design system and assuming it worked is how teams end up surprised three weeks later. Four checks, in increasing order of effort:
- 1
Grep for literal colour values
The fastest possible signal. If the agent is following semantic tokens, there should be no hex outside your token file.
# any hex outside the token definitions grep -rn --include='*.tsx' --include='*.css' -E '#[0-9a-fA-F]{3,8}\b' src \ | grep -v 'tokens\|globals.css' - 2
Check the font weights
Weight is where hierarchy quietly reverts to the default. If your system says 400 and 600 only, anything else is drift.
grep -rn --include='*.tsx' -E 'font-(bold|extrabold|black|semibold)' src | head -30 - 3
Ask for the same screen twice, in separate sessions
Consistency between sessions is the actual test. If two runs produce meaningfully different spacing, radius or hierarchy, the system is not constraining what it needs to.
- 4
Build one screen in dark mode first
If dark mode was derived rather than defined, this is where it shows: dead shadows, muddy mid-greys, an accent that glares. Cheaper to find now than after twenty screens.
The first two are worth running in CI. A rule that catches a raw hex value in a pull request does more for long-term consistency than any amount of documentation, which is the same conclusion Salesforce reached with the SLDS linter.
FAQ
What is a design system for an AI coding agent?
It is a fixed set of design decisions: semantic color tokens for light and dark, a type pairing, spacing and layout rules, and a written DESIGN.md. The agent references those decisions instead of inventing styling again for each screen.
Do I need an account or API key to use Identity Forge with my agent?
No. Free kits and the shadcn registry work without an account. An API key (from /account/api-keys) is only needed for owned data, higher API quota, and Pro kits.
Which tools does this work with?
Coding agents: Claude Code, Cursor, Windsurf, Codex, Gemini CLI, VS Code/Copilot, opencode: run the local MCP server. Web builders: v0, Lovable, Bolt: consume the shadcn registry item or the exported DESIGN.md and tokens.
Is this different from just asking the agent for a color palette?
Yes. A palette is a handful of colors. A kit is a complete, coherent system: 28 semantic tokens in light and dark, real fonts, layout and component rules, motifs, and do's & don'ts, serialized into a DESIGN.md and exportable as shadcn/Tailwind/DTCG tokens.
Why does the agent still drift even with a design system installed?
Usually because the system states permissions without prohibitions. "Use the primary colour for actions" does not prevent using it for headings, borders and gradients too. Add an explicit list of what is forbidden: that single change moves output more than anything else in the file.
Can I use my existing brand colours instead of a prebuilt kit?
Yes. The match_palette MCP tool finds the closest-fitting kits to colours you already have, and kits can be edited in Studio before export. The point is that the result must still resolve to complete light and dark token sets with roles attached, not a list of brand hex values.