Where will your agent have to guess?
No gaps found.
Your repo gives the agent a clear answer for every check in this scan.

Fixes you can make right now to increase the health score

Two of these three fixes could raise the design system health score from 78 to 91. The remaining one does not move the score.

01
Repaint the 40 colours from outside the theme
+9
stroke-gray-400/30 appears 4 times, avatar-circles.tsx alone carries 5. The theme file already has a variable for each (a grey is text-muted-foreground, a status colour is a Badge variant or a variable you add). Swap the class, not the value.
paste it into your agent ·
02
Crown the canonical <TypingAnimation>
+5
1 component name has competing implementations. Start with <TypingAnimation>: apps/www/registry/magicui/terminal.tsx vs apps/www/registry/magicui/typing-animation.tsx. Decide which one is canonical, re-export it from one home, and rename or fold in the other.
paste it into your agent ·
03
Delete the 4 theme variables nothing uses
not part of the score
--code-highlight, --code-number, --selection and more sit in apps/www/styles/globals.css next to the real theme, and nothing in the repo reads them. An agent opening that file sees 2 colour systems and can not tell which one is dead. 8 lines to delete; the cheapest fix on this page.
paste it into your agent ·

What your AI agent sees today

Your agent reads AGENTS.md. They tell it the kit is there. What they do not carry is how this repo actually uses it: the numbers below, which the rules file turns into rules with receipts.

AGENTS.md · generic (AGENTS.md standard)

Readable by: Claude Code — · Codex ✓ · Cursor ✓ · Claude Code skips AGENTS.md: add a CLAUDE.md containing the single line @AGENTS.md and it reads the same rules

2 rule references gone stale · a rule your agent obeys is worse than no rule when the repo has moved on
pages/_document.jsx named in AGENTS.md (written by Ultracite, not by this team), but the path no longer exists
pages/_document.js named in AGENTS.md (written by Ultracite, not by this team), but the path no longer exists

These lines were written by a tool, not by this team: a rule pack that speaks about files this app does not have. Not yours to fix; worth knowing your agent reads them.

Give the agent the answers

the rules file generated from this scan, wrapped as a present. Agents do not always ask before inventing, so the plugin also checks every file they edit, and guard-my-design-system checks the pull request.

35
distinct colours
Ideal Design System~24 ▲
Avg registry repo83 · cleaner than 75% ▼
Reputable systems14 ▲
14
shades of grey
Ideal Design System~13 ▲
Avg registry repo11 ▲
Reputable systems2 ▲
0
off-scale spacing values
Ideal Design System~12 ▼
Avg registry repo14 · cleaner than 100% ▼
Reputable systems5 ▼
1
duplicated components
Ideal Design System0 ▲
Avg registry repo21 · cleaner than 75% ▼
Reputable systems9 ▼
7
inline style blocks
Ideal Design System0 ▲
Avg registry repo45 · cleaner than 75% ▼
Reputable systems12 ▼
0
near-identical colour pairs
Ideal Design System0 =
Avg registry repo6 · cleaner than 75% ▼
Reputable systems1 ▼
2
!important declarations
Ideal Design System0 ▲
Avg registry repo1 ▲
Reputable systems3 ▼
0
components never imported
Ideal Design System0 =
Avg registry repo20 · cleaner than 75% ▼
Reputable systems0 =
library: internal use only, downstream consumers invisible
0
arbitrary bracket values
Ideal Design System~20 ▼
Avg registry repo131 · cleaner than 100% ▼
Reputable systems0 =
52
off-theme colours per 100 files
Ideal Design System~25 ▲
Avg registry repo50 ▲
0
components recoloured from outside per 100 files
Ideal Design System~2 ▼
Avg registry repo2 · cleaner than 81% ▼
—
published themes incomplete
not measured: an unrecognised component pattern
Palette
35colours

A healthy product palette is up to ~24 colours: one brand hue with a few tints, one accent, up to 13 greys, and status colours.

22 tokens13 strays
Colour usage
Sized by how often each is used
token stray
Grey ramp · sorted dark → light · how many can you tell apart?

The shadcn theme and the 2 shadcn checks

shadcn gives you a theme file of named variables and a set of components with variants. These receipts show where your own code went around both.

the theme file, variable by variable

47 variables for light, 39 for dark in apps/www/styles/globals.css · 13 custom variables of your own (--font-geist-sans, --font-geist-mono, --code, --code-foreground, --code-highlight…), 5 of them light only, 5 never mapped in @theme inline.

40 colours from outside the theme in 18 of 77 own files · 52 per 100 files
stroke-gray-400/30 ×4fill-gray-400/30 ×3dark:border-gray-800 ×2dark:text-black ×2text-neutral-700 ×2dark:text-white ×2text-neutral-600/70 ×1dark:text-neutral-400/70 ×1
avatar-circles.tsx ×5bento-grid.tsx ×5hero-video-dialog.tsx ×3interactive-grid-pattern.tsx ×3terminal.tsx ×3

Not counted above: 40 palette colours inside magicui, installed by a registry rather than written here. An agent reading those files will still copy them.

0 shadcn components recoloured through className · 0 per 100 files

No shadcn component is given a colour through className. Variants are doing their job.

0 off-scale spacing values

a disciplined repo keeps these around a dozen · on-scale Tailwind steps (·) shown for context · off-scale in coral

·0
66
·2
25
·4
17
·1
14
·1.5
4
·6
3
·5
3
·px
3
·0.5
2
·3
2
·8
1
·16
1
·20
1

Typography & shape

10
font sizes
Ideal Design System~10 =
Avg registry repo21 · cleaner than 88% ▼
Reputable systems5 ▲
10
border radii
Ideal Design System~10 =
Avg registry repo14 · cleaner than 81% ▼
4
shadow styles
Ideal Design System~6 ▼
Avg registry repo1 ▲
Reputable systems1 ▲
the font sizes, by use
·sm ×11·xs ×4·[15px] ×3·xl ×20.8rem ×1·2xl ×1·4xl ×1·[rgb(0,0,0,65%)] ×1·[rgb(255,255,255,90%)] ×1·6xl ×1
the radii, by use
·full ×16·xl ×8·[inherit] ×8·md ×8·lg ×6·2xl ×5·[2.5rem] ×1·sm ×1·none ×1·default ×1

Where it hurts most

the 5 files carrying the most off-system styling

01 apps/www/registry/magicui/progressive-blur.tsx 40 stray colours
02 apps/www/registry/magicui/shiny-button.tsx 10 stray colours 2 inline
03 apps/www/registry/magicui/android.tsx 9 stray colours
04 apps/www/registry/magicui/hero-video-dialog.tsx 2 stray colours 1 inline
05 apps/www/registry/magicui/scroll-progress.tsx 3 stray colours

Duplicated components

an agent asking which one is canonical gets several plausible answers. Paths open in VS Code

<TypingAnimation> · 2 implementations
apps/www/registry/magicui/terminal.tsx
apps/www/registry/magicui/typing-animation.tsx
card family · 5 variants
<BentoCard>
apps/www/registry/magicui/bento-grid.tsx
<ClientTweetCard>
apps/www/registry/magicui/client-tweet-card.tsx
<MagicCard>
apps/www/registry/magicui/magic-card.tsx
<NeonGradientCard>
apps/www/registry/magicui/neon-gradient-card.tsx
<TweetCard>
apps/www/registry/magicui/tweet-card.tsx
progress family · 2 variants
<AnimatedCircularProgressBar>
apps/www/registry/magicui/animated-circular-progress-bar.tsx
<ScrollProgress>
apps/www/registry/magicui/scroll-progress.tsx

7 inline style blocks

styling no system can see

apps/www/registry/magicui/shiny-button.tsx×2
apps/www/registry/magicui/dotted-map.tsx×1
apps/www/registry/magicui/glyph-matrix.tsx×1
apps/www/registry/magicui/hero-video-dialog.tsx×1
apps/www/registry/magicui/scroll-based-velocity.tsx×1
apps/www/registry/magicui/smooth-cursor.tsx×1
2 !important declarations · each one forces a style through
globals.css ×2

The composition map

95 components defined · tile area is internal use: how the system builds from itself, downstream consumers invisible from here · the real system, drawn to scale

2 components are imported exactly once: <MagicTweet>, <TweetSkeleton>. Quiet corners, not yet a system.

componentuseddefined inprops
<MagicTweet> 1× apps/www/registry/magicui/tweet-card.tsx tweet
<TweetSkeleton> 1× apps/www/registry/magicui/tweet-card.tsx none
Generated by roast-my-design-system ver. 9.4.0 · free to run: npx roast-my-design-system@latest · also a Claude Code + Codex skill and a local MCP server
Designed and built by Greg Kozakiewicz · 1feb933211f5 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real