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.
- 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.
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
| Release | When | What changed |
|---|---|---|
| v1.2.0 | Spring 2026 | Built in Claude Design; a first DESIGN.md, v0.1 |
| v2.0.0 | May | DESIGN.md becomes the canonical context for AI |
| v2.5.0 | 2 June | One system, several targets: CSS, Tailwind, Figma |
| v3.4.0 | 5 August | The first release end to end in one place; the registry, the state grammar, the harness |
| v5.0.0 | 18 October | A page per component; laws, conventions and ranked principles |
| v5.1.0 · v5.2.0 | 19 October | The MCP server, then the check |
| v6.0.0 | November | What the benchmark and the study sent back |
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
| Found | Changed in Amaca | Release |
|---|---|---|
| Ratified contrast exceptions written only in prose, so the comparison read them as errors | An Exception column in the state index: a deliberate exception is a field, not a sentence | v5.0.0 |
| The colour roles written in two vocabularies, one in the contract and one on the site | One vocabulary, the site's; every token carries its role in the DTCG file | v6.0.0 |
| A label 11px from its checkbox instead of 8 | The browser's default margin reset; the gap is the token again | v6.0.0 |
| A vertical stepper whose line drifted up to 9px from its dots | One axis for dots and line, at any text height | v6.0.0 |
| Animations whose keyframes lived outside the component's code | Every card's code carries its keyframes, and runs on its own | v6.0.0 |
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 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
| Was | Now |
|---|---|
| Gradient backgrounds on cards | Card · Usage |
| Emoji in UI copy | Law L6 |
| Drop shadows for emphasis | Shadow · Usage |
| Border-radius > 16px on small components | Radius · Usage |
| Carousels, auto-advance | Law L2 (floor #6) |
| Placeholder-as-label | Law L2 (floor #3) · Text input · Usage |
| Filled primary accents wider than the budget | Law L1 |
| Cubic-bezier literal in component CSS | Law L4 |
--ease-spring on an effect property | Law L8 |
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.
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
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.
| Tool | What it returns |
|---|---|
list_components | Every component: name, when to use it, what it builds on, its page |
get_component | One component: its contract (usage, parts and their tokens, rules, variants), its CSS and one HTML example |
get_tokens | The tokens as CSS custom properties or DTCG, whole or one family |
get_design_section | One section of DESIGN.md, by title or § number |
get_install | Which file a tool needs, and how to install it |
check_compliance | A scan of code the agent wrote, from 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)
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 only93.8skill 89.3 · DESIGN.md 89.2 · short files 76 to 79
- Tokens per run, server only42.3kskill 118.5k · DESIGN.md 85.3k
- Refusing to invent, server only0.79the file routes 0.96 to 1.00
Mean per run, all models25–26 Oct 2026 · Amaca 5.2.0
| Condition | Score | Tokens | Time (s) | Tool calls |
|---|---|---|---|---|
| No file | 35.1 | 9.0k | 28 | 2.0 |
| AI-INSTRUCTIONS.md | 77.2 | 19.9k | 39 | 3.1 |
| AGENTS.md + tokens.css | 78.7 | 27.7k | 41 | 4.0 |
| llms-full.txt | 76.0 | 25.2k | 45 | 3.0 |
| The skill (9 files) | 89.3 | 118.5k | 148 | 14.4 |
| DESIGN.md | 89.2 | 85.3k | 87 | 10.2 |
| MCP server only | 93.8 | 42.3k | 84 | 9.9 |
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.
- amaca.design, the system and its documentation.
- The MCP server, at
https://www.amaca.design/mcp. - github.com/angelomacaione/amaca-design, the repository, the server included.
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.

Who decided the default?
How I take design decisions back from AI models: a contract, checks written as code, and a person who signs. Tested on a real deliverable, measured in a benchmark, and told in part on stage at WUDRome 2026.

The system I couldn't build until AI let me
This is the story of how I designed, built and published Amaca Design System with Claude, after years of waiting for the right tool.

SaaS solution to manage OTA operations on vehicle fleet
Design a SaaS solution to allow the convergence of 2 different legacy production chains.