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

Three fixes could raise the design system health score from 55 to 85.

01
Unwind the 90 !important declarations
+10
Each one is a selector losing an argument with another selector; Actions.scss alone carries 26. Fix the specificity at the source and they stop being necessary.
paste it into your agent ·
02
Collapse the 12 near-identical colours
+10
#0fb884 and #12b886 are the same colour to any eye, and they are used 5 times between them. Nobody chose to have both. Pick the one that is already a token, point the other at it, and the pair stops multiplying.
paste it into your agent ·
03
Fold 84 inline style blocks back into the system
+10
These are static values written as style attributes; start with packages/excalidraw/components/PublishLibrary.tsx (7 blocks). Dynamic positioning was already excluded, so all of these could be classes or tokens today.
paste it into your agent ·

What your AI agent sees today

Your agent reads CLAUDE.md, AGENTS.md, .github/copilot-instructions.md. 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.

CLAUDE.md · Claude CodeAGENTS.md · generic (AGENTS.md standard).github/copilot-instructions.md · GitHub Copilot

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

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. 0.5rem appears 105 times. An agent looking for how this repo does spacing reads a repeated value as the rule, so it will write use number 106. The most copied value here is the one you least want copied.
Agent trap. This palette holds 12 pairs of colours a screen can barely tell apart. An agent asked for the brand grey can not see the difference either, so it copies whichever twin is nearest, and when unsure it writes a third between them. 2 becomes 3.
Agent trap. 84 inline styles live where the system should. An agent learns a codebase by example, and every inline style is an example that says the system is optional. Each one it copies becomes the example for the next.
174
distinct colours
Ideal Design System~24 ▲
Avg Design System119 · messier than 68% ▲
Reputable systems14 ▲
39
shades of grey
Ideal Design System~13 ▲
Avg Design System28 ▲
Reputable systems4 ▲
78
off-scale spacing values
Ideal Design System~12 ▲
Avg Design System24 · messier than 91% ▲
Reputable systems5 ▲
0
duplicated components
Ideal Design System0 =
Avg Design System16 · cleaner than 74% ▼
Reputable systems9 ▼
84
inline style blocks
Ideal Design System0 ▲
Avg Design System51 · messier than 71% ▲
Reputable systems12 ▲
12
near-identical colour pairs
Ideal Design System0 ▲
Avg Design System7 ▲
Reputable systems1 ▲
90
!important declarations
Ideal Design System0 ▲
Avg Design System5 · messier than 94% ▲
Reputable systems3 ▲
0
components never imported
Ideal Design System0 =
Avg Design System17 ▼
Reputable systems0 =
0
arbitrary bracket values
Ideal Design System~20 ▼
Avg Design System56 · cleaner than 71% ▼
Reputable systems0 =

Package by package

2 packages with enough UI to judge · the repo score above is the whole thing blended, and 6 packages were too small or too backend to score

packagescoreworst findingsize
packages/excalidraw 55 83 !important declarations 352 files
excalidraw-app 80 7 !important declarations 40 files
Palette
174colours

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.

136 tokens38 strays
Colour usage
Sized by how often the code uses each colour
token named, colour not shown stray
+36
+26

Of every 100 colour uses, 83 use a theme colour by name and 17 are strays. A stray is a value written by hand.

Grey ramp · sorted dark → light · how many can you tell apart?
12 nearly identical pairs · each pair is 1 colour recorded twice
#0fb884 ×4 ≈ #12b886 ×1#121212 ×3 ≈ #111111 ×1#ecfdf5 ×2 ≈ #e6fcf5 ×1#a2f1a6 ×2 ≈ #a5eba8 ×1#d4d4d4 ×1 ≈ #d3d3d3 ×1#f1f3f5 ×1 ≈ #f4f4f6 ×1#f5f5f9 ×1 ≈ #f6f6f9 ×1#f5f5f5 ×1 ≈ #f4f4f6 ×1+4 more

78 off-scale spacing values

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

0.5rem
105
1rem
55
0.75rem
49
0.25rem
48
2px
18
8px
18
4px
17
1.5rem
16
2rem
14
1em
13
10px
12
0.625rem
11
0.375rem
10
0.125rem
9
1px
9
0.2rem
9
12px
8
6px
8

Typography & shape

3
typefaces
Ideal Design System~3 =
Avg Design System3 =
Reputable systems1 ▲
32
font sizes
Ideal Design System~10 ▲
Avg Design System18 · messier than 74% ▲
Reputable systems5 ▲
25
border radii
Ideal Design System~10 ▲
Avg Design System14 · messier than 79% ▲
35
shadow styles
Ideal Design System~6 ▲
Avg Design System2 · messier than 91% ▲
Reputable systems1 ▲
the type scale, at its real sizes · how many of these are the same decision?
2.8em ×1 Almost but not quite
2.6em ×1 Almost but not quite
2.25rem ×1 Almost but not quite
1.8em ×1 Almost but not quite
1.5em ×1 Almost but not quite
1.313rem ×2 Almost but not quite
1.3125rem ×2 Almost but not quite
1.25rem ×5 Almost but not quite
1.17em ×1 Almost but not quite
1.125rem ×5 Almost but not quite
1.1em ×1 Almost but not quite
1rem ×11 Almost but not quite
16px ×1 Almost but not quite
0.96em ×1 Almost but not quite
15px ×1 Almost but not quite
0.9rem ×4 Almost but not quite
and 15 more
the corners, drawn · 25 radii in one interface
4px ×14
0.5rem ×10
50% ×8
12px ×6
8px ×4
100% ×4
10px ×3
0.6875rem ×2
1rem ×1
0.75rem ×1
2.5rem ×1
0.2rem ×1
0.3em ×1
2px ×1
the elevations, cast, 6 of 35 · on the light surface they were drawn for
0 0 0 1px rgba(0, 0… ×2
0px 2px 4px 0 rgb(0… ×2
0 6px 16px rgba(0, … ×1
0 3px 8px rgba(0, 0… ×1
0 3px 5px -1px rgba… ×1
2px 2px 0 0 #494949… ×1

3 typefaces, declared 5 different ways

every distinct declaration is a chance for the next one to be wrong

"Assistant"×16
monospace×9
"Cascadia"×2
Cascadia×1
"Excalifont", "Xiaolai"×1

Where it hurts most

the 5 files carrying the most off-system styling

01 packages/excalidraw/css/variables.module.scss 11 stray colours
02 packages/excalidraw/components/PublishLibrary.tsx 7 inline
03 packages/excalidraw/components/Actions.tsx 6 inline
04 excalidraw-app/App.tsx 5 inline
05 packages/excalidraw/components/LibraryMenuItems.tsx 5 inline

Duplicated components

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

<CommandPalette> · defined twice, one wraps the other
packages/excalidraw/components/CommandPalette/CommandPalette.tsx
packages/excalidraw/components/main-menu/DefaultItems.tsx
<LiveCollaborationTrigger> · defined twice, one wraps the other
packages/excalidraw/components/live-collaboration/LiveCollaborationTrigger.tsx
packages/excalidraw/components/main-menu/DefaultItems.tsx
<SearchMenu> · defined twice, one wraps the other
packages/excalidraw/components/SearchMenu.tsx
packages/excalidraw/components/main-menu/DefaultItems.tsx
list family · 7 variants
<ScrollableList>
packages/excalidraw/components/ScrollableList.tsx
used 2×
<UserList>
packages/excalidraw/components/UserList.tsx
used 2×
<CustomColorList>
packages/excalidraw/components/ColorPicker/CustomColorList.tsx
used 1×
<FontPickerList>
packages/excalidraw/components/FontPicker/FontPickerList.tsx
used 1×
<LanguageList>
excalidraw-app/app-language/LanguageList.tsx
used 1×
<PickerColorList>
packages/excalidraw/components/ColorPicker/PickerColorList.tsx
used 1×
…and 1 more
popover family · 5 variants
<PropertiesPopover>
packages/excalidraw/components/PropertiesPopover.tsx
used 6×
<ToolPopover>
packages/excalidraw/components/ToolPopover.tsx
used 4×
<FreedrawToolPopover>
packages/excalidraw/components/Tools.tsx
used 2×
<SelectionToolPopover>
packages/excalidraw/components/Tools.tsx
used 2×
<Popover>
packages/excalidraw/components/Popover.tsx
used 1×
input family · 4 variants
<StatsDragInput>
packages/excalidraw/components/Stats/DragInput.tsx
used 5×
<ColorInput>
packages/excalidraw/components/ColorPicker/ColorInput.tsx
used 1×
<TTDDialogInput>
packages/excalidraw/components/TTDDialog/TTDDialogInput.tsx
used 1×
<DimensionDragInput>
packages/excalidraw/components/Stats/Dimension.tsx
footer family · 4 variants
<Footer>
packages/excalidraw/components/footer/Footer.tsx
used 2×
<AppFooter>
excalidraw-app/components/AppFooter.tsx
used 1×
<DebugFooter>
excalidraw-app/components/DebugCanvas.tsx
used 1×
<FooterCenter>
packages/excalidraw/components/footer/FooterCenter.tsx
toggle family · 4 variants
<DarkModeToggle>
packages/excalidraw/components/DarkModeToggle.tsx
used 1×
<PreferencesToggleGridModeItem>
packages/excalidraw/components/main-menu/DefaultItems.tsx
<PreferencesToggleZenModeItem>
packages/excalidraw/components/main-menu/DefaultItems.tsx
<ToggleTheme>
packages/excalidraw/components/main-menu/DefaultItems.tsx
radio family · 2 variants
<RadioSelection>
packages/excalidraw/components/RadioSelection.tsx
used 6×
<RadioGroup>
packages/excalidraw/components/RadioGroup.tsx
used 2×

84 inline style blocks

styling no system can see

packages/excalidraw/components/PublishLibrary.tsx×7
packages/excalidraw/components/Actions.tsx×6
excalidraw-app/App.tsx×5
packages/excalidraw/components/LibraryMenuItems.tsx×5
packages/excalidraw/components/Stats/index.tsx×4
packages/excalidraw/components/Toolbar.tsx×3
90 !important declarations · each one forces a style through
Actions.scss ×26styles.scss ×13ColorPicker.scss ×8LayerUI.scss ×5index.scss ×4QuickSearch.scss ×4

The adoption map

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

<IconButton> · used 44× · packages/excalidraw/components/IconButton.tsx IconButton 44× <FilledButton> · used 14× · packages/excalidraw/components/FilledButton.tsx FilledButton 14× <Trans> · used 14× · packages/excalidraw/components/Trans.tsx Trans 14× <Dialog> · used 13× · packages/excalidraw/components/Dialog.tsx Dialog 13× <Island> · used 13× · packages/excalidraw/components/Island.tsx Island 13× <Spinner> · used 12× · packages/excalidraw/components/Spinner.tsx Spinner 12× <DropdownMenuItem> · used 11× · packages/excalidraw/components/dropdownMenu/DropdownMenuItem.tsx DropdownMenuItem 11× <Tooltip> · used 10× · packages/excalidraw/components/Tooltip.tsx Tooltip 10× <Button> · used 9× · packages/excalidraw/components/Button.tsx Button 9× <DropdownMenuItemCheckbox> · used 8× · packages/excalidraw/components/dropdownMenu/DropdownMenuItemCheckbox.tsx DropdownMenuItemCh… 8× <TextField> · used 7× · packages/excalidraw/components/TextField.tsx TextField 7× <DialogActionButton> · used 6× · packages/excalidraw/components/DialogActionButton.tsx DialogActionBu… 6× <PropertiesPopover> · used 6× · packages/excalidraw/components/PropertiesPopover.tsx PropertiesPopo… 6× <RadioSelection> · used 6× · packages/excalidraw/components/RadioSelection.tsx RadioSelection 6× <DropdownMenu> · used 5× · packages/excalidraw/components/dropdownMenu/DropdownMenu.tsx DropdownMenu 5× <InlineIcon> · used 5× · packages/excalidraw/components/InlineIcon.tsx InlineIcon 5× <StatsDragInput> · used 5× · packages/excalidraw/components/Stats/DragInput.tsx StatsDragInput 5× <ColorPicker> · used 4× · packages/excalidraw/components/ColorPicker/ColorPicker.tsx ColorPicker 4× <LibraryMenuSection> · used 4× · packages/excalidraw/components/LibraryMenuSection.tsx LibraryMenuSect… 4× <MenuItemContent> · used 4× · packages/excalidraw/components/dropdownMenu/DropdownMenuItemContent.tsx MenuItemContent 4× <PickerHeading> · used 4× · packages/excalidraw/components/ColorPicker/PickerHeading.tsx PickerHeading 4× <Section> · used 4× · packages/excalidraw/components/Section.tsx Section 4× <Switch> · used 4× · packages/excalidraw/components/Switch.tsx Switch 4× <ToolPopover> · used 4× · packages/excalidraw/components/ToolPopover.tsx ToolPopover 4×

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

140 components are imported exactly once: <Actions>, <ActiveConfirmDialog>, <AIComponents>, <Angle>, <App>, <AppFooter> and 134 more. Quiet corners, not yet a system.

componentuseddefined inprops
<IconButton> 44× packages/excalidraw/components/IconButton.tsx size visible IconButtonProps
<FilledButton> 14× packages/excalidraw/components/FilledButton.tsx icon onClick label variant color
<Trans> 14× packages/excalidraw/components/Trans.tsx i18nKey
<Dialog> 13× packages/excalidraw/components/Dialog.tsx none
<Island> 13× packages/excalidraw/components/Island.tsx padding style viewportUI viewportUIName
<Spinner> 12× packages/excalidraw/components/Spinner.tsx size circleWidth synchronized
<DropdownMenuItem> 11× packages/excalidraw/components/dropdownMenu/DropdownMenuItem.tsx icon badge value shortcut selected
<Tooltip> 10× packages/excalidraw/components/Tooltip.tsx label long style disabled
<Button> 9× packages/excalidraw/components/Button.tsx type onSelect selected rest
<DropdownMenuItemCheckbox> 8× packages/excalidraw/components/dropdownMenu/DropdownMenuItemCheckbox.tsx none
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 · 93567984e0f7 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real