The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Roast My Design System listing page.
A free CLI tool (and Claude Code skill) that roasts your repo's design system with real data, then generates the rules that keep your AI agent on-system.
New in 5.10: it reads Tailwind v3 shadcn, and every colour space. shadcn on Tailwind v3 stores colour tokens as bare HSL channels, for the opacity trick. So a textbook shadcn repo used to scan as "2 colours, none defined as CSS variables". It now reads those tokens. It finds the greys (an oklch palette used to report 0). And it spots twins across notations: a token written as hsl and a hardcoded copy written as rgb are the same colour, and now count as a near-identical pair. Checked before and after on 6 real shadcn repos.
New in 5.9: the agent card knows which doors your rules actually reach. The report now states, as plain fact, which tools can read the rules files you have. Claude Code reads CLAUDE.md. Codex reads AGENTS.md. Cursor reads AGENTS.md and
.cursor/rules. Where a door is missing, the card shows the one-line fix: Claude Code skips AGENTS.md, and a CLAUDE.md containing the single line@AGENTS.mdcloses the gap. The scan also finds rules files nested in subfolders, which is how monorepos really do it (twenty carries 35 AGENTS.md files; a root-only look reported 1). It recognises GEMINI.md,.windsurf/rulesand.github/instructionstoo.
New in 5.8: every finding can explain itself. A "why this matters" toggle sits under each finding. It unfolds the calm story behind the brutal number. How the mess arrives innocently, what it costs later, how an agent multiplies it, and why the ideal sits where it sits, benchmark medians included. Written to a plain-language standard and reviewed word by word.
New in 5.0: it runs as a local MCP server. One command, and your agent asks the design system before writing UI, then gets the work checked after. Which Button is canonical? Which token holds that colour? Review my changes. Local, deterministic, nothing leaves your machine. See Live answers over MCP.
Run it on your codebase and get, in about a second:
packages/ui scores 80 while apps/web scores 40, and now you can see it.design-system-rules.md with canonical components, your token file, and known duplicates to avoid, so your AI agent follows your system instead of guessing at it. --apply injects them into every agent file you have: Claude, Cursor, GitHub Copilot, and Windsurf. Every scan also checks the rules you already have for stale references: paths that no longer exist, components named canonical that nothing imports anymore. And the agent card states which tools can actually read the rules you have (Claude Code, Codex, Cursor), with the one-line fix where a door is missing.Your AI agent (Claude, Cursor, Copilot) builds UI by imitating what's already in your repo. If your repo has 112 colours and 4 Button implementations, your agent guesses which one is canonical, and it picks wrong half the time. That's why AI-generated UI looks almost-but-not-quite right. The first step to fixing it is seeing the mess measured.
One scan powers all of it; the flags decide what lands on disk. Combine freely.
| Command | What you get |
|---|---|
npx roast-my-design-system@latest | The scan and design-system-roast.html, opened in your browser |
npx roast-my-design-system@latest <path> | Scan a different repo than the current directory |
... --apply | The generated agent rules injected straight into every agent file you have: CLAUDE.md, AGENTS.md, .cursorrules, .cursor/rules/, .windsurfrules and .github/copilot-instructions.md, inside a marked block. Re-running replaces only that block, never your own text. Windsurf and Copilot get a compact variant sized for their limits |
... --rules | The same rules written to design-system-rules.md instead, for pasting by hand |
... --card | roast-card.svg: a shareable 1200x630 card with the score and worst findings. Pure SVG, embeds in a README |
... --sarif | design-system-roast.sarif for GitHub code scanning: upload it in CI and findings appear in the Security tab, annotated on files |
... --mcp | The scan as a local MCP server: 5 tools your agent calls while writing UI, from "is there a Button already?" to "review my changes", plus the roast-fix prompt that serves the top fix from a fresh scan. See Live answers over MCP |
... --check | The working tree's changed files checked against the design system, in the terminal. Exits 1 on findings, so it slots into scripts |
... --by "Dwayne Hicks" | A requester credit in the report header, next to the scan date |
... --notes <file.md> | An agent-written analysis embedded in the report as "What the numbers mean": labelled as written by AI, kept apart from the measured numbers. The Claude Code skill writes and passes this automatically; the flag is here so any agent can |
... --section "Title" <file.md> | An agent-written chapter appended after the notes, same styling, same written-by-AI label, with sub-headings allowed. Repeatable, so analysis that outgrows the notes still lives inside the report instead of a hand-built page |
... --exclude lab/ | Leave a folder out of the scan (repeat the flag or comma-separate). Or list folders in a .roastignore file at the repo root. Either way the report says so in the header; see Scoping the scan |
... --json | The scan summary as JSON on stdout, for scripts and pipelines |
... --theme light / --out <file> / --no-open | Light report, custom report path, don't open the browser |
/roast-my-design-system (in Claude Code) | The full experience: the roast in chat and embedded in the report as "What the numbers mean", the rules offer, and the fix loop with Claude on your own numbers |
One scan writes rules for every agent: Claude, Cursor, GitHub Copilot, and Windsurf. Every scan also checks the agent rules you already have and flags stale references, no flag needed.
/roast-my-design-system before a design-system cleanup to get the measured baseline: every colour, spacing value, duplicated component and inline style, with real file paths.The full report for vercel/ai-chatbot, top to bottom, including "What the numbers mean", Claude's read of the scan, embedded right under the verdict:

The same report in light mode (one file, built-in toggle):

.roastignore, --exclude) are printed in the report header with file counts, so a scoped scan can never pass itself off as the whole repo.Some repos host more than one visual world on purpose: the product plus a marketing site, a playground, a batch of experiments. Blending them produces a score that describes none of them. Scope the scan to the design system you are actually judging:
Or make it permanent with a .roastignore file at the repo root, one repo-relative folder per line:
Both routes merge, and both are loud on purpose. The harvest JSON records every active pattern and how many files it removed. The report prints a line in the header ("2 folders excluded by .roastignore (lab/, playground/) · 946 files kept out of this scan"). You can narrow the question, but the report always says which question was asked, so a scoped score can't be quietly gamed. There is no negation and no glob syntax: plain folder prefixes, nothing clever.
The report and the rules file describe the repo as it was at scan time. --mcp keeps the same engine running while your agent works, so questions get answered from the code as it is right now, and mistakes get caught before they land:
| Tool | The question it answers |
|---|---|
roast_get_context | What should I know before touching UI here? Routed by the folder being edited |
roast_find_component | Is there already a component for this, and which one is canonical? With one real usage example. When two candidates tie, it says so and names both |
roast_find_token | I have #111111 / 13px in hand. What should I have used? |
roast_validate | I am about to save this. Does it break the system? |
roast_review | Review my changed files. Reads the git diff itself, so no code is pasted back |
The loop: context before building, find while building, validate before saving, review before finishing.
When the goal is fixing the system rather than building on it, the roast-fix prompt serves the top Where-to-start move from a fresh scan. It is a ready-made fix prompt, byte-identical to the report's copy buttons. Fix it, ask again, and the next move has risen to the top: the scan is the progress bar. Pass move: 2 to jump the queue.
To use it in Claude Code, type /mcp__roast__roast-fix in the chat. MCP prompts appear as slash commands, named after whatever you registered the server as, and the / autocomplete menu lists them too. Add the move number to jump the queue: /mcp__roast__roast-fix 2. Other clients list server prompts in their own prompt picker; wherever roast-build-ui and roast-review-ui show up, roast-fix sits beside them.
Add it to Claude Code:
Verified in Claude Code, Cursor, and Windsurf (now Devin Desktop). Each was tested end to end: server connected, all 5 tools listed, real answers in the editor's own chat. Same promise as the scan: local, read-only, one scan at startup, no port, no account, nothing about your code leaves your machine. A clean answer reads "no measured violations found" with the list of checks attached, because a scanner can only certify what it can count.
Cursor: put this in .cursor/mcp.json inside the project (the project, not your home directory, so the scan sees one repo, not your whole disk):
Cursor holds workspace servers at arm's length until you approve them: open Settings → Tools & MCP and enable roast the first time. The first start takes a few seconds while npx fetches the package; Cursor retries on its own.
Windsurf (Devin Desktop): its MCP config is global (~/.codeium/windsurf/mcp_config.json), so name the project folder in the entry to keep the scan scoped to one repo:
Any other MCP client can register the same stdio command.
The scanner already speaks SARIF, so wiring it into GitHub code scanning is 6 lines. Findings appear in the Security tab, annotated on the files themselves:
No install, no Claude needed. Just try it:
Run it inside any repo. Same scanner, same report, straight from npm. The Claude Code skill below adds the conversation on top: the roast in chat, then a punch list you can actually work through with Claude.
Claude Code (recommended):
If those commands error, your Claude Code is likely older than the plugin marketplace feature. Update Claude Code and retry, or use the manual route below: it works everywhere and installs the same skill.
Manual (Claude Code, any version):
(Use .claude/skills/ inside a repo instead to share it with your team.)
OpenAI Codex CLI (same SKILL.md, same folder):
Invoke with $roast-my-design-system (or let Codex auto-match it). Use .codex/skills/ inside a repo to share with your team.
npx skills: npx skills add gregkozakiewicz/roast-my-design-system works for agents that read ~/.agents/skills/. Claude Code currently reads ~/.claude/skills/, so prefer one of the routes above.
Requires Node 18+.
Open Claude Code in the repo you want roasted and type:
You get the roast in chat plus design-system-roast.html at your repo root: a self-contained page (open it, Slack it, email it, no external requests) with:
design-system-rules.md is wrapped inside the report itself. Unwrap, then copy or download the agent rules generated from your scan.After the roast, the skill also offers to write design-system-rules.md to disk and merge it into your CLAUDE.md, .cursor/rules or AGENTS.md.
5 real roasts of public repos, hosted as-is (the same self-contained HTML the skill generates), spanning React, Stencil and Lit:
--spectrum-* namespace named in the header| Metric | Ideal Design System | Median of 34 scanned repos | Median of 10 reputable systems |
|---|---|---|---|
| Distinct colours | ~24 | 130 | 24 |
| Shades of grey | up to 13 | 17 | 5 |
| Off-scale spacing values | ~12 | 34 | 6 |
| Typefaces | 2 to 3 | 3 | 1 |
| Border radii | up to 10 | 13 | 2 |
| Duplicated components | 0 | 20 | 12 |
| Inline style blocks | 0 | 49 | 12 |
| Arbitrary Tailwind values | ~20 | 70 | 0 |
| Near-identical colour pairs | 0 | 13 | 1 |
| !important declarations | 0 | 7 | 3 |
| Components never imported | 0 | 0 | 0 |
Yes, the median repo is already a mess. That's the point.
Your AI can write the UI. This makes sure it writes your UI.
MIT. The code is yours to fork, modify and redistribute; the copyright notice travels with it.
Building your own report, summary or audit from this tool's scores, counts or benchmark comparisons? Keep one line in it: Built with roast-my-design-system by Greg Kozakiewicz. The scan data asks the same of AI agents that consume it.
roast-my-design-system™ and the GK mark are trademarks of Greg Kozakiewicz. Forking is welcome, republishing under this name is not: see brand and attribution.
Built and designed by 