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 has 5 palette classes. 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
Tokenise the 13 stray colours
already green
They are hardcoded where no token names them; apps/www/registry/magicui/progressive-blur.tsx alone carries 40. Every one is a value your agent will happily copy.
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 shadcn repo83 · cleaner than 75% ▼
Reputable systems14 ▲
14
shades of grey
Ideal Design System~13 ▲
Avg shadcn repo15 ▼
Reputable systems4 ▲
4
off-scale spacing values
Ideal Design System~12 ▼
Avg shadcn repo13 · cleaner than 88% ▼
Reputable systems5 ▼
1
duplicated components
Ideal Design System0 ▲
Avg shadcn repo14 · cleaner than 75% ▼
Reputable systems9 ▼
7
inline style blocks
Ideal Design System0 ▲
Avg shadcn repo33 · cleaner than 69% ▼
Reputable systems12 ▼
0
near-identical colour pairs
Ideal Design System0 =
Avg shadcn repo6 · cleaner than 75% ▼
Reputable systems1 ▼
2
!important declarations
Ideal Design System0 ▲
Avg shadcn repo1 ▲
Reputable systems3 ▼
0
components never imported
Ideal Design System0 =
Avg shadcn repo20 · cleaner than 75% ▼
Reputable systems0 =
library: internal use only, downstream consumers invisible
15
arbitrary bracket values
Ideal Design System~20 ▼
Avg shadcn repo201 · cleaner than 94% ▼
Reputable systems0 ▲
52
off-theme colours per 100 files
Ideal Design System~25 ▲
Avg shadcn repo51 ▲
0
components recoloured from outside per 100 files
Ideal Design System~2 ▼
Avg shadcn repo3 · 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 the code uses each colour
token named, colour not shown Tailwind palette stray
+3

Of every 100 colour uses, 48 use a theme colour by name, 10 use Tailwind's palette and 42 are strays. A stray is a value written by hand, or a palette class where the theme has its own colour.

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
0 shadcn components recoloured through className · 0 per 100 files

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

4 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
·[0%_0px]
2
·[-200%]
2
·8
1
·16
1
·20
1
·[12%]
1
·[var(--ray-left)]
1
15 bracket values written outside the scale
[15px] ×3[300vh] ×2[600vw] ×2[22rem] ×1[100%] ×1[58px] ×1[2.5rem] ×1[3px] ×1[2px] ×1[200vh] ×1+1 more

Typography & shape

10
font sizes
Ideal Design System~10 =
Avg shadcn repo21 · cleaner than 88% ▼
Reputable systems5 ▲
10
border radii
Ideal Design System~10 =
Avg shadcn repo14 · cleaner than 81% ▼
4
shadow styles
Ideal Design System~6 ▼
Avg shadcn 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. 10.2.1 · 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 · 272505940740 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real