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

One of these three fixes could raise the design system health score from 80 to 88. One more pays once it is done in full. The remaining one does not move the score.

01
Repaint the 45 colours from outside the theme
+8
text-red-500 appears 4 times. weather.tsx alone has 10 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
Give your repeated bracket values names
under 20 · +4
[13px] appears 19 times, which reads as a decision, not drift. If it is one, name it in app/globals.css so the next component (and your agent) can reach for it; 3 more repeated values deserve the same look. The 7 values used once are worth a pass: keep the deliberate ones (optical nudges like the 1 under 4px, one-off layout widths) and round the accidents to a neighbouring step.
paste it into your agent ·
03
Delete the 3 theme variables nothing uses
not part of the score
--foreground-rgb, --background-start-rgb, --background-end-rgb sit in app/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. 6 lines to delete; the cheapest fix on this page.
paste it into your agent ·

What your AI agent sees today

Your agent reads .cursor/rules. But none of it points at a single source of truth for components and tokens, because there isn't one yet. The numbers below are what your agent actually works from.

.cursor/rules · Cursor

Readable by: Claude Code — · Codex — · Cursor ✓

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 .cursor/rules/ultracite.mdc (written by Ultracite, not by this team), but the path no longer exists
pages/_document.js named in .cursor/rules/ultracite.mdc (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.

Agent trap. [13px] appears 19 times. An agent looking for how this repo does spacing reads a repeated value as the rule, so it will write use number 20. The most copied value here is the one you least want copied.
41
distinct colours
Ideal Design System~24 ▲
Avg shadcn repo83 · cleaner than 69% ▼
Reputable systems14 ▲
11
shades of grey
Ideal Design System~13 ▼
Avg shadcn repo15 · cleaner than 69% ▼
Reputable systems4 ▲
4
off-scale spacing values
Ideal Design System~12 ▼
Avg shadcn repo13 · cleaner than 88% ▼
Reputable systems5 ▼
0
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 ▼
1
!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 =
71
arbitrary bracket values
Ideal Design System~20 ▲
Avg shadcn repo201 · cleaner than 75% ▼
Reputable systems0 ▲
66
off-theme colours per 100 files
Ideal Design System~25 ▲
Avg shadcn repo51 · messier than 63% ▲
1
components recoloured from outside per 100 files
Ideal Design System~2 ▼
Avg shadcn repo3 ▼
Palette
41colours

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.

32 tokens9 strays
Colour usage
Sized by how often the code uses each colour
token named, colour not shown Tailwind palette stray

Of every 100 colour uses, 80 use a theme colour by name, 6 use Tailwind's palette and 14 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

44 variables for light, 35 for dark in app/globals.css · 12 custom variables of your own (--shadow-card, --shadow-float, --shadow-composer, --shadow-composer-focus, --shadow-inset…), 3 of them light only, 3 never mapped in @theme inline.

45 colours from outside the theme in 10 of 68 own files · 66 per 100 files
text-red-500 ×4dark:text-neutral-50 ×4text-red-600 ×3text-green-600 ×2border-red-200 ×2bg-red-50 ×2dark:bg-red-950/50 ×2dark:bg-neutral-950 ×2
weather.tsx ×10message.tsx ×9sheet-editor.tsx ×8diffview.tsx ×6tool.tsx ×5

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

1 shadcn components recoloured through className · 1 per 100 files
<ToolOutput className="text-red-500"> ×1

Shown, not scored: 13 shadcn components given a text size or weight through className, 19 per 100 files. shadcn asks for a variant here too, but every shadcn repo does this at the same rate, so it says nothing about yours.

<SidebarGroupLabel className="font-semibold"> ×3<Shimmer className="font-medium"> ×2<Label className="font-normal"> ×2<Input className="text-sm"> ×2<SelectTrigger className="text-xs"> ×1<Badge className="text-xs"> ×1

4 off-scale spacing values

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

·2
116
·3
69
·4
61
·1
52
·0
49
·1.5
34
·2.5
21
·0.5
16
·8
14
·6
11
·20
5
·9.5
5
·12
4
·px
4
·5
4
·3.5
4
·16
3
·10
3
71 bracket values written outside the scale
[13px] ×19[10px] ×11[0.12em] ×8[12px] ×6[200px] ×4[24px] ×4[257px] ×4[11px] ×3[450px] ×3[300px] ×2+7 more

Typography & shape

3
typefaces
Ideal Design System~3 =
Avg shadcn repo3 =
Reputable systems1 ▲
12
font sizes
Ideal Design System~10 ▲
Avg shadcn repo21 · cleaner than 69% ▼
Reputable systems5 ▲
14
border radii
Ideal Design System~10 ▲
Avg shadcn repo14 =
4
shadow styles
Ideal Design System~6 ▼
Avg shadcn repo1 ▲
Reputable systems1 ▲
the font sizes, by use
·sm ×44·xs ×30·[13px] ×25·[10px] ×12·[12px] ×5·[11px] ×4·base ×4·2xl ×3·3xl ×2·lg ×2·[var(--shiki-dark)] ×1·xl ×1
the radii, by use
·md ×31·lg ×30·2xl ×18·xl ×18·full ×17·default ×13·none ×3·sm ×2·[12px] ×22px ×19999px ×1·3xl ×1·[inherit] ×1·[2px] ×1
the elevations, cast, 2 of 4 · on the light surface they were drawn for
0 0 0 0 oklch(0.55 … ×1
0 0 0 3px oklch(0.5… ×1

Where it hurts most

the 5 files carrying the most off-system styling

01 app/globals.css 10 stray colours
02 components/ai-elements/code-block.tsx 1 inline
03 components/ai-elements/reasoning.tsx 1 inline
04 components/chat/console.tsx 1 inline
05 components/chat/multimodal-input.tsx 1 inline

Duplicated components

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

<MessageActions> · defined twice, one wraps the other
components/chat/message-actions.tsx
components/ai-elements/message.tsx
button family · 6 variants
<Button>
components/ui/button.tsx
used 25×
<SubmitButton>
components/chat/submit-button.tsx
used 2×
<ArtifactCloseButton>
components/chat/artifact-close-button.tsx
used 1×
<CodeBlockCopyButton>
components/ai-elements/code-block.tsx
<ConversationScrollButton>
components/ai-elements/conversation.tsx
<PromptInputButton>
components/ai-elements/prompt-input.tsx
sidebar family · 5 variants
<Sidebar>
components/ui/sidebar.tsx
used 1×
<AppSidebar>
components/chat/app-sidebar.tsx
used 1×
<SidebarHistory>
components/chat/sidebar-history.tsx
used 1×
<SidebarLeftIcon>
components/chat/icons.tsx
used 1×
<SidebarToggle>
components/chat/sidebar-toggle.tsx
spinner family · 2 variants
<Spinner>
components/ui/spinner.tsx
used 3×
<LoaderIcon>
components/chat/icons.tsx
used 8×
modal family · 2 variants
<Dialog>
components/ui/dialog.tsx
used 1×
<SuggestionDialog>
components/chat/suggestion.tsx
used 1×

7 inline style blocks

styling no system can see

components/ai-elements/code-block.tsx×1
components/ai-elements/reasoning.tsx×1
components/chat/console.tsx×1
components/chat/multimodal-input.tsx×1
components/chat/sheet-editor.tsx×1
components/chat/suggested-actions.tsx×1
1 !important declaration · each one forces a style through
globals.css ×1

The adoption map

316 components defined · tile area is import count · the real system, drawn to scale

<Button> · used 25× · components/ui/button.tsx Button 25× <Tooltip> · used 10× · components/ui/tooltip.tsx Tooltip 10× <TooltipContent> · used 10× · components/ui/tooltip.tsx TooltipContent 10× <TooltipTrigger> · used 10× · components/ui/tooltip.tsx TooltipTrigger 10× <DropdownMenuItem> · used 8× · components/ui/dropdown-menu.tsx DropdownMenuItem 8× <LoaderIcon> · used 8× · components/chat/icons.tsx LoaderIcon 8× <SidebarMenuButton> · used 7× · components/ui/sidebar.tsx SidebarMenuButton 7× <CopyIcon> · used 6× · components/chat/icons.tsx CopyIcon 6× <SparklesIcon> · used 6× · components/chat/icons.tsx SparklesIcon 6× <ChatItem> · used 5× · components/chat/sidebar-history-item.tsx ChatItem 5× <ChevronDownIcon> · used 5× · components/chat/icons.tsx ChevronDownIcon 5× <SidebarGroup> · used 5× · components/ui/sidebar.tsx SidebarGroup 5× <SidebarGroupContent> · used 5× · components/ui/sidebar.tsx SidebarGroupCon… 5× <SidebarMenuItem> · used 5× · components/ui/sidebar.tsx SidebarMenuItem 5× <Tool> · used 5× · components/ai-elements/tool.tsx Tool 5× <CheckCircleFillIcon> · used 4× · components/chat/icons.tsx CheckCircleFill… 4× <DropdownMenu> · used 4× · components/ui/dropdown-menu.tsx DropdownMenu 4× <DropdownMenuContent> · used 4× · components/ui/dropdown-menu.tsx DropdownMenuCon… 4× <DropdownMenuTrigger> · used 4× · components/ui/dropdown-menu.tsx DropdownMenuTri… 4× <Input> · used 4× · components/ui/input.tsx Input 4× <MessageIcon> · used 4× · components/chat/icons.tsx MessageIcon 4× <MessageResponse> · used 4× · components/ai-elements/message.tsx MessageResponse 4× <RedoIcon> · used 4× · components/chat/icons.tsx RedoIcon 4× <SidebarMenu> · used 4× · components/ui/sidebar.tsx SidebarMenu 4×

60 more adopted components below the top 24, not drawn.

105 components are imported exactly once: <ActiveChatProvider>, <AppSidebar>, <Artifact>, <ArtifactActions>, <ArtifactCloseButton>, <Badge> and 99 more. Quiet corners, not yet a system.

componentuseddefined inprops
<Button> 25× components/ui/button.tsx variant size asChild
<Tooltip> 10× components/ui/tooltip.tsx none
<TooltipContent> 10× components/ui/tooltip.tsx sideOffset
<TooltipTrigger> 10× components/ui/tooltip.tsx none
<DropdownMenuItem> 8× components/ui/dropdown-menu.tsx inset variant
<LoaderIcon> 8× components/chat/icons.tsx size
<SidebarMenuButton> 7× components/ui/sidebar.tsx asChild isActive variant size tooltip
<CopyIcon> 6× components/chat/icons.tsx size
<SparklesIcon> 6× components/chat/icons.tsx size
<ChatItem> 5× components/chat/sidebar-history-item.tsx PureChatItem prevProps
Generated by roast-my-design-system ver. 10.1.5 · 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 · de4e42f38ff7 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real