Get started

Design systems for AI coding agents

AI coding agents write good code and mediocre design. The fix is not a better prompt. It is a fixed set of decisions the agent reads before every screen. This is the hub for doing that: what the system has to contain, why most attempts fail, and the per-tool mechanics.

Updated July 27, 2026

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 role86%
No prohibitions of any kind76%
No dark mode definition69%
No distinctive motifs57%
At least one vague adjective doing the work54%
No concrete size value anywhere44%
Mention typography at all83%
What design guidance in the wild is missing (n=299).

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.

ClosesWithout it
Semantic colour rolesWhere each colour is allowed to appearThe accent shows up everywhere it is plausible, which is everywhere
A type scale with real numbersSize and weight decisionsHierarchy gets carried by bold, and the page reads loud and generic
A spacing scaleRhythm across unrelated componentsEvery screen has its own vertical rhythm, and the drift is invisible per-file
Dark mode, defined not derivedThe second themeThe agent inverts light mode and produces muddy contrast and dead shadows
MotifsWhat makes this design specifically yoursEverything is correct and nothing is distinctive
ProhibitionsEverything you did not think to specifyAll of it is permitted by default
What each part is for, and what happens without it.

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 render

Rendered from the kit's actual tokens, fonts, and treatments

Ambient SageOverview
Search anything⌘K
AS

Analytics

Revenue overview

See revenue and retention trends alongside account health.

Jan 1 to Jan 30, 2026
Overview
Analytics
Reports
Notifications

Active users

15.1k

2,491 new

+5%

MRR

$49.1k

Net of churn

+3%

Retention

89%

28-day window

+2%

NPS

69

1,204 replies

+3

Revenue

Last 12 months

$49.1k +18.2%

12m30d7d
JanFebMarAprMayJunJulAugSepOctNovDec

Acquisition

Goal completion

On track
78%of goal
Organic48%
Direct31%
Referral21%

Recent transactions

Latest activity across your workspace

View all
CustomerStatusDateAmount
AR

Alex Rivera

Founder & CEO

Paid2 min ago$1,999.00
MO

Mira Okonkwo

Head of Product

Pending1 hour ago$39.00
JF

Jonas Feld

Design Lead

Processing3 hours ago$299.00

Typography

Plus Jakarta Sans

Color system

28 semantic roles, light + dark

Agent outputs

DESIGN.md, CSS, Tailwind, shadcn

Ambient Sage rendered from its real tokens (Plus Jakarta Sans, warm-neutral surfaces, a single yellow accent). This is what your agent installs.

What the agent actually receives

However you install it, the payload is the same three things:

  1. 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.
  2. 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.
  3. 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:

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 repoAn MCP server
AnswersWhat should this look like?What is this component's API? Which kits exist?
AvailableEvery turnWhen the agent chooses to call it
Size limitBounded by contextUnbounded
Good forRoles, scales, motifs, prohibitionsSearch, catalogues, live data, applying a kit
Two delivery mechanisms, two jobs.

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. 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. 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. 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. 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.