Back

2026 · Amaca 1.2 → 6.0

One URL instead of eleven files

How my design system left the tool it was born in, measured itself against two dozen others, turned its rules into laws, and then stopped shipping a copy of itself for every AI tool: one server answers all of them, measured on 599 runs.

Reading time14 minutes
Tags
  • MCP
  • Design Systems
  • AI agents
  • Verification
Role
Design Engineer
Team
Solo, with Claude
Platform
Amaca design system · remote MCP server
Outcome
v6.0.0 at amaca.design, after 31 releases

01 · Where it started

A first file, 70% right.

The last time I wrote about Amaca, it was at v1.2.0 and it lived inside Claude Design. The tool built tokens, variants and first drafts; I kept the brand and the judgement. Next to the site sat a first DESIGN.md, version 0.1: a description of the system written for machines. An agent given only that file built a pricing page that was about 70% right, and each miss became a new Don't.

That loop never stopped. In the six months since, Amaca shipped 31 releases, five of them majors. The components specified in the contract went from 7 to 46, the file became the system's contract, and the site became its demo.

Componentsin the contract
v1.2.0v2.0.0v3.0.0v4.0.0v5.0.0v6.0.0
7814274646
Linesin DESIGN.md
v1.2.0v2.0.0v3.0.0v4.0.0v5.0.0v6.0.0
5015411,2192,0074,7124,957
Fig. 01By major release: from 7 components to 46, and from 501 lines to 4,957. The jump at v5.0.0 is every component the site already drew, finally written down; 6.0.0 added none, it tightened what was there.

This is the story of how it got there, and of the last step: how every AI tool now gets it.

02 · Leaving the tool

Two tools, two changelogs, then one.

In May, v2.0.0 made DESIGN.md the canonical context for AI. From then on the system had two halves: the site, still built and deployed from Claude Design, and the contract, written with an agent that worked on files. Each release crossed both, and each half kept its own record of what had changed.

Two records drift. On 5 August, v3.4.0 was the first release done end to end in one place, the contract, the site and the stylesheets together. The same release introduced the closed component registry, where anything the registry does not name is off-system: stop and ask. It also introduced the harness, a script that checks the whole system before anything ships. It ran about twenty checks then; on 6.0.0 it runs 130.

The pathv1.2.0 → v6.0.0

ReleaseWhenWhat changed
v1.2.0Spring 2026Built in Claude Design; a first DESIGN.md, v0.1
v2.0.0MayDESIGN.md becomes the canonical context for AI
v2.5.02 JuneOne system, several targets: CSS, Tailwind, Figma
v3.4.05 AugustThe first release end to end in one place; the registry, the state grammar, the harness
v5.0.018 OctoberA page per component; laws, conventions and ranked principles
v5.1.0 · v5.2.019 OctoberThe MCP server, then the check
v6.0.0NovemberWhat the benchmark and the study sent back
Fig. 02Seven of the 31 releases since the last case study, the ones the story turns on.

By the end of August I had written it down for myself.

I no longer go through Claude Design for releases. Or rather, if I do, it isn't the way it was.

03 · The study

Measured against two dozen other systems.

A system checked only against itself can be consistent and still wrong. So I put Amaca next to two dozen public design systems, among them Polaris, Primer, Carbon, Spectrum, Atlassian, Cloudscape and Salesforce Lightning. Each was rebuilt into the same set of pages as Amaca, component by component, and compared side by side, again after every change. When a component looked right everywhere except in Amaca, or looked right in Amaca for the wrong reason, the fix went into Amaca.

What the comparison sent backselected findings

FoundChanged in AmacaRelease
Ratified contrast exceptions written only in prose, so the comparison read them as errorsAn Exception column in the state index: a deliberate exception is a field, not a sentencev5.0.0
The colour roles written in two vocabularies, one in the contract and one on the siteOne vocabulary, the site's; every token carries its role in the DTCG filev6.0.0
A label 11px from its checkbox instead of 8The browser's default margin reset; the gap is the token againv6.0.0
A vertical stepper whose line drifted up to 9px from its dotsOne axis for dots and line, at any text heightv6.0.0
Animations whose keyframes lived outside the component's codeEvery card's code carries its keyframes, and runs on its ownv6.0.0
Fig. 03None of these was visible on Amaca's own site. They showed up only next to other systems.

04 · Laws and constraints

From a list of don'ts to a register of laws.

The study also showed how other systems state their rules. Amaca's were a list: seven principles and a table of anti-patterns. v5.0.0 rewrote them in three layers. Five principles, ranked, so that when two pull in opposite directions the higher one wins. Ten conventions for how the system is written. And nine laws, each with an id, a severity, the principle it serves and the check that holds it.

The law register on amaca.design 6.0.0: nine rules, L1 to L9, each with its severity, the principle it serves and the check that holds it.
Fig. 04The law register as the site shows it on 6.0.0. Seven of the nine laws stop the output; each names what holds it.

The contract draws the line in one sentence: A principle guides a judgement; a law is measured and enforced. Every row of the old anti-patterns table went to one place or the other.

Where the anti-patterns wentv4.3.2 → v5.0.0

WasNow
Gradient backgrounds on cardsCard · Usage
Emoji in UI copyLaw L6
Drop shadows for emphasisShadow · Usage
Border-radius > 16px on small componentsRadius · Usage
Carousels, auto-advanceLaw L2 (floor #6)
Placeholder-as-labelLaw L2 (floor #3) · Text input · Usage
Filled primary accents wider than the budgetLaw L1
Cubic-bezier literal in component CSSLaw L4
--ease-spring on an effect propertyLaw L8
Fig. 05Nine of the twelve rows. A rule a machine can check became a law; a matter of taste became a line in the Usage of its component.

Constraints got the same treatment. Each component's Usage now says when to use it and, for every other case, which component to use instead. Renames are measured, not assumed: --magenta-* became --primary-* in v5.0.0 with no paint change across 10,165 elements, and in 6.0.0 the "mono" register, which promised a monospaced face the system never had, became the label register with none across 23,399. And from v5.3.0, every finding of the check carries the id of the law it breaks.

A contract this strict was ready for readers that are not people. What was missing was a good way to reach them.

05 · The problem

One file per tool.

Every AI tool reads instructions its own way. Claude takes a skill, Cursor and Copilot take rule files, Figma takes its own skill, a chat app takes a pasted document, Tailwind takes a theme. So the system shipped a projection of the contract for each of them: eleven downloads by the time of 6.0.0.

Three of the download cards on amaca.design 6.0.0: Claude, the agent plugin and Figma, each with its zip and its own install steps.
Fig. 06Three of the eleven download cards, each a copy of the contract in the shape its tool expects, with its own install steps.

Copies fall behind

Each bundle is regenerated at release, but every file is one more place where an old value can survive. When 6.0.0 audited them, the rule files for the IDE still carried a stamp from amaca.design@3.1.0, and llms-full.txt carried a copy of the tokens from before v5.0.0.


Short files lose the parts

A file small enough for a chat window names the components but not their anatomy. An agent that knows there is a .card and nothing more invents the inside, card-body, card-head, classes the system has never had.


The whole file is heavy

The full DESIGN.md avoids both problems, at roughly 115,000 tokens every time an agent loads it.

06 · The server

A URL instead of files.

My bet was that a single MCP server could stand in for most of those files. An agent connected to it asks for what the task needs, one component, one token family, one section of the spec, and gets the published version every time.

Eleven bundles, one serverfrom v5.1.0

  • Claude
  • Agent plugin
  • Figma
  • Google design.md
  • AGENTS.md
  • Cursor · Copilot · Codex
  • ChatGPT · Gemini
  • v0 · Lovable · Base44
  • Tailwind v4
  • Raw CSS
  • DTCG
MCP serverhttps://www.amaca.design/mcp
Fig. 07Every tool that reads MCP can skip its bundle and ask the server. The files stay for the tools that cannot.

v5.1.0 put it online on 19 October 2026: Streamable HTTP, stateless, read-only, no key, because everything it returns is already public. It answers from the files of the deploy that serves it, so it can't drift from the release. Claude takes it as a custom connector, Claude Code with one command, Cursor and VS Code by URL; the Claude Code plugin declares it, so installing the plugin brings the skill and the server together.

ToolWhat it returns
list_componentsEvery component: name, when to use it, what it builds on, its page
get_componentOne component: its contract (usage, parts and their tokens, rules, variants), its CSS and one HTML example
get_tokensThe tokens as CSS custom properties or DTCG, whole or one family
get_design_sectionOne section of DESIGN.md, by title or § number
get_installWhich file a tool needs, and how to install it
check_complianceA scan of code the agent wrote, from v5.2.0
Fig. 08Six tools behind one URL. The first five shipped in v5.1.0, the sixth the same day in v5.2.0.

The server also carries instructions, which a client hands to the model when it connects. On 6.0.0 they open like this:

Before writing a component, read it with get_component: its contract (usage, parts and their tokens, rules, variants) and its CSS. Reference every value by name, var(--token); never hardcode a hex, a px or an easing.

07 · The check

The sixth tool checks the work.

Reading the contract is half the job. The other half is knowing whether the code that came out follows it, and a model is a poor judge of its own output. So check_compliance takes the code an agent wrote, HTML and CSS or React with Tailwind, and returns each violation with the token or class that fixes it, the section it comes from and the law it breaks. The server's instructions ask the model to run it before handing anything over.

A card written from memoryinput

<style>
.pricing-card{background:#1B1F24;padding:14px 20px;border-radius:10px;transition:background 250ms ease-in-out}
.pricing-card:hover{background:var(--obsidian-800);transform:scale(1.02)}
.pricing-card .card-body{color:var(--obsidian-100)}
</style>
<div class="pricing-card"><div class="card-body">Pro</div><button class="btn btn-primary">Buy</button><button class="btn btn-primary">Trial</button></div>

check_compliance, 6.0.06 errors · 3 warnings

error · line 2 · colour-literal · L4
found  #1B1F24
fix    no token has this value: pick one from get_tokens (primary, obsidian, secondary, tertiary, the semantic four)

error · line 2 · raw-px · L4
found  padding: 14px
fix    var(--s-3) (12px; it snaps from 14px, a visible change: check it)

error · line 2 · raw-px · L4
found  padding: 20px
fix    var(--s-5)

error · line 2 · raw-px · L4
found  border-radius: 10px
fix    var(--r-md) (8px; it snaps from 10px, a visible change: check it)

error · line 2 · raw-duration · L8
found  transition: 250ms
fix    var(--d-quick) (200ms; it snaps from 250ms, a visible change: check it)

error · line 2 · raw-easing · L8
found  ease-in-out
fix    var(--ease-standard)

warning · line 2 · reduced-motion · L7
found  transition or animation with no prefers-reduced-motion override
fix    components.css carries the global kill-switch (durations to 0.01ms); a component with a transform, a fade-in or an orchestrated animation also sets its own transitions to none inside @media (prefers-reduced-motion: reduce), or motion-reduce: in Tailwind

warning · line 6 · class-off-registry · C2
found  card-body
fix    not an Amaca class: compose the canonical ones (get_component card); if it is your project's own class, ignore this

warning · line 6 · one-primary · L3
found  .btn-primary × 2
fix    one .btn-primary per screen; the rest recede (secondary, ghost, outline)
Fig. 09A real scan. Each finding names its fix, and a snapped value says when it is a visible change.

The scan does not replace a review, and it says so whenever it finds nothing: A clean scan is not a review: it cannot see layout, hierarchy or the choice of component.

08 · Measuring it

599 runs, seven ways to give an agent a design system.

A bet needs a test. On 25 and 26 October I ran a benchmark: seven tasks, three runs per cell, four models working as subagents, and seven ways of giving them Amaca. No file at all, each of the short files, the skill, the whole DESIGN.md, and the server alone. Each output was scored against the contract; 599 runs were scored in the end.

  • Quality, server only
    93.8
    skill 89.3 · DESIGN.md 89.2 · short files 76 to 79
  • Tokens per run, server only
    42.3k
    skill 118.5k · DESIGN.md 85.3k
  • Refusing to invent, server only
    0.79
    the file routes 0.96 to 1.00
Scoremean per run
No fileAI-INSTRUCTIONS.mdAGENTS.md + tokensllms-full.txtThe skillDESIGN.mdMCP server
35.177.278.776.089.389.293.8
Tokensthousands per run
No fileAI-INSTRUCTIONS.mdAGENTS.md + tokensllms-full.txtThe skillDESIGN.mdMCP server
9.0k19.9k27.7k25.2k118.5k85.3k42.3k
Fig. 10Quality against cost. The server is the only route at the top of the first chart and in the middle of the second.

Mean per run, all models25–26 Oct 2026 · Amaca 5.2.0

ConditionScoreTokensTime (s)Tool calls
No file35.19.0k282.0
AI-INSTRUCTIONS.md77.219.9k393.1
AGENTS.md + tokens.css78.727.7k414.0
llms-full.txt76.025.2k453.0
The skill (9 files)89.3118.5k14814.4
DESIGN.md89.285.3k8710.2
MCP server only93.842.3k849.9
Fig. 11The skill and DESIGN.md score 93.2 and 93.3 once a false positive of the scorer is removed. At equal quality, the server uses a third of the skill's context and half of DESIGN.md's.

The conditions, the seven tasks, the failures by route and every caveat are in the full benchmark report.

Where the server won

Quality at the top, context at a third. And the parts: on the Badge task, the server and DESIGN.md got every variant right, 12 out of 12; the short files got none, because they do not list them.


Where it lost

Two tasks asked for a component the registry does not have. With a file in hand, agents stopped and asked, 0.96 to 1.00 of the time. With the server, 0.79: the agent assembled the missing component out of pieces from the registry. Easy access to parts made improvising easy too.


What the averages hide

"No file" is not "no context": every subagent received the server's instructions, so it knew the system existed. Running check_compliance unprompted happened in 34 of 83 server runs, but by model it went from 3 in 21 to 13 in 20; that is a property of the model, not of the system. And one model in four never received the server's instructions at all, only the tool descriptions: a fact about clients, not about Amaca.

The two weak spots went straight into 6.0.0.

The server names what is off-system

Asked for a component it does not have, the server no longer just lists the others. It tells the agent to stop: tell the user and ask before building it, never compose it from the registry. The same line now opens its instructions, and every get_component ends with the next step, run the check.


The short files carry the parts

AGENTS.md, AI-INSTRUCTIONS.md, the rules for Claude and llms-full.txt now give each component's root class, parts and variants, written from the registry, so a reader without the server stops inventing the inside of a card.

09 · Reflection

The files didn't disappear. They stopped being the system.

Each step of this path moved the system's truth into fewer places. First out of a tool and into one contract. Then out of prose and into laws a script can hold. Then out of eleven files and behind one URL. The server did what I expected of it: the published release, the parts and the rules on demand, at a fraction of the context. It did not make the downloads useless. Figma, Tailwind and a token pipeline still want files, and an agent with no network wants something on disk. What changed is their role: every file is generated from the contract and checked against it.

The other lesson is about where corrections come from. The comparison with other systems and the benchmark found things no review of Amaca on its own would have found, and both ended up in the same release. A design system for agents is not finished when it is written down; it is finished when something outside it has tried to use it.

What comes next is the obvious step: run the same benchmark on 6.0.0, and see whether naming off-system components and putting the parts in the short files close the gaps they were written for. Two parts of the original protocol, real chat clients and Figma, are still to be run.

Method The figures come from the benchmark of 25 and 26 October 2026 on Amaca 5.2.0: seven tasks, three runs per cell, four models as subagents, 599 runs scored, averages across models. Model names are left out on purpose; the full report has the setup and the caveats. A blind comparison of one task's outputs is not reported here. The scan in Fig. 09 was run on 13 November 2026 on the 6.0.0 release. The comparison with other systems ran from September to November 2026 on public packages.

Related

Connect it, read it, take it apart.

Sources

Where the facts come from.

  • DESIGN.md, § Changelog, v1.2.0 to v6.0.0, and the release tags of the repository.
  • The benchmark report of 26 October 2026, MCP server against files: full report.
  • The release plan of v6.0.0 and its review.
  • The comparison reports against other public design systems, September to November 2026.
  • The previous case study, for the Claude Design period.
  • The Amaca MCP server, 6.0.0 from the release branch, queried on 13 November 2026.

More cases

Learn more.

Imagine together
your next product

Get in touch