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 47 to 71.

01
Fold 539 inline style blocks back into the system
+8
These are static values written as style attributes; start with frontend/src/metabase/metabot/components/MetabotChat/MetabotAgentDataSourcePills.tsx (13 blocks). Dynamic positioning was already excluded, so all of these could be classes or tokens today.
paste it into your agent ·
02
Unwind the 139 !important declarations
+8
Each one is a selector losing an argument with another selector; FieldItem.module.css alone carries 6. Fix the specificity at the source and they stop being necessary.
paste it into your agent ·
03
Tokenise the 71 stray colours
+8
They are hardcoded where no token names them; frontend/src/metabase/metabot/components/MetabotChat/MetabotAgentDataSourcePills.tsx alone carries 2. Every one is a value your agent will happily copy.
paste it into your agent ·

What your AI agent sees today

Your agent reads CLAUDE.md, .github/copilot-instructions.md, .github/instructions, plus 2 rules files nested in subfolders. 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 Code.github/copilot-instructions.md · GitHub Copilot.github/instructions · GitHub Copilot (scoped)+2 nested in subfolders

Readable by: Claude Code ✓ · Codex — · Cursor — · copy the same rules into an AGENTS.md and the other tools see them too

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. <ModalBody> alone has 5 implementations. An agent asked for one can not tell which is the real one, so it picks 1 at random or writes another. Every wrong pick becomes the example the next agent copies.
Agent trap. 0.5rem appears 217 times. An agent looking for how this repo does spacing reads a repeated value as the rule, so it will write use number 218. The most copied value here is the one you least want copied.
Agent trap. This palette holds 15 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.
87
distinct colours
Ideal Design System~24 ▲
Avg mantine repo74 ▲
Reputable systems14 ▲
18
shades of grey
Ideal Design System~13 ▲
Avg mantine repo18 =
Reputable systems2 ▲
109
off-scale spacing values
Ideal Design System~12 ▲
Avg mantine repo28 · messier than 89% ▲
Reputable systems5 ▲
154
duplicated components
Ideal Design System0 ▲
Avg mantine repo1 · messier than 95% ▲
Reputable systems9 ▲
539
inline style blocks
Ideal Design System0 ▲
Avg mantine repo127 · messier than 89% ▲
Reputable systems12 ▲
15
near-identical colour pairs
Ideal Design System0 ▲
Avg mantine repo7 · messier than 79% ▲
Reputable systems1 ▲
139
!important declarations
Ideal Design System0 ▲
Avg mantine repo6 · messier than 84% ▲
Reputable systems3 ▲
0
components never imported
Ideal Design System0 =
Reputable systems0 =
0
arbitrary bracket values
Ideal Design System~20 ▼
Avg mantine repo1 ▼
Reputable systems0 =
0
colours written on components per 100 kit files
Ideal Design System~1 ▼
Avg mantine repo3 · cleaner than 79% ▼
2
pixel sizes written on components per 100 kit files
Ideal Design System~3 ▼
Avg mantine repo6 · cleaner than 74% ▼
Palette
87colours

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.

16 tokens71 strays
Colour usage
Sized by how often each is used
token stray
+27
Grey ramp · sorted dark → light · how many can you tell apart?
15 nearly identical pairs · each pair is 1 colour recorded twice
#84bb4c ×9 ≈ #88bf4d ×1#2d353a ×4 ≈ #2f353a ×1#2d353a ×4 ≈ #323232 ×1#f0f0f0 ×2 ≈ #eeeeee ×1#eeecec ×2 ≈ #ededed ×1#696e7b ×2 ≈ #6b7280 ×1#eef6fd ×2 ≈ #eaf4ff ×1#181818 ×2 ≈ #141414 ×1+7 more

Your Mantine theme, and what is written around it

the theme, and the places a colour or a pixel size was written onto a component instead

Theme in frontend/src/metabase/ui/theme.ts and 9 more · read 3,045 times from components

Components reach the theme 114 times per 100 kit files, through c="dimmed", p="md" and var(--mantine-color-…). That is the system working.

2 colours written on components · 0 per 100 kit files
hsl(0,0%,${lightness}%) ×1#e2e4e8 ×1
SchemaViewerMinimap.tsx ×1ClickMappingsTargetWithSource.tsx ×1
43 pixel sizes written on components · 2 per 100 kit files
p: 40px ×6mr: 10px ×4gap: 10px ×3p: 12px ×3gap: 12px ×3p: 48px ×2px: 12px ×2paddingLeft: 16px ×1
Onboarding.tsx ×4EditorTabs.tsx ×3CollectionPermissionsHelp.tsx ×2AddSectionButton.tsx ×2IFrameViz.tsx ×2

109 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
217
1rem
159
0.25rem
87
0.75rem
87
1.5rem
52
8px
40
4px
29
2rem
24
6px
22
1px
22
2.5rem
21
0.375rem
20
1.25rem
19
0.125rem
18
1em
17
0.5em
17
10px
16
12px
14

Typography & shape

23
typefaces
Ideal Design System~3 ▲
Avg mantine repo2 · messier than 95% ▲
Reputable systems1 ▲
42
font sizes
Ideal Design System~10 ▲
Avg mantine repo11 · messier than 89% ▲
Reputable systems5 ▲
36
border radii
Ideal Design System~10 ▲
Avg mantine repo8 · messier than 84% ▲
53
shadow styles
Ideal Design System~6 ▲
Avg mantine repo3 · messier than 84% ▲
Reputable systems1 ▲
the type scale, at its real sizes · how many of these are the same decision?
2.5em ×1 Almost but not quite
2em ×1 Almost but not quite
2rem ×1 Almost but not quite
1.75rem ×2 Almost but not quite
1.5em ×2 Almost but not quite
24px ×1 Almost but not quite
1.375rem ×2 Almost but not quite
1.25rem ×8 Almost but not quite
1.17em ×3 Almost but not quite
1.15em ×1 Almost but not quite
1.143em ×1 Almost but not quite
18px ×4 Almost but not quite
1.125rem ×3 Almost but not quite
1.12em ×2 Almost but not quite
17px ×2 Almost but not quite
1.0625rem ×1 Almost but not quite
and 22 more
the corners, drawn · 36 radii in one interface
0.5rem ×48
8px ×28
6px ×21
4px ×19
50% ×17
0.75rem ×12
0.25rem ×9
1rem ×9
2px ×8
100% ×8
99px ×7
0.375rem ×6
100px ×4
3px ×3
the elevations, cast, 10 of 53 · on the light surface they were drawn for
0 10px 30px 0 hsla(… ×3
0 2px 4px 0 hsla(0,… ×3
0 6px 24px 0 rgba(0… ×2
0 0.25rem 1.25rem 0… ×1
0 6px 24px 0 #00000… ×1
0 0 0 1px rgba(0, 0… ×1
0 5px 14px rgba(0, … ×1
0 2px 2px rgb(0 0 0… ×1
0 2px 4px 0 rgba(13… ×1
0 1px 3px rgb(0 0 0… ×1

23 typefaces, declared 26 different ways

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

×4
Lato×3
Merriweather×3
Montserrat×3
Raleway×3
Roboto×3
"Source Sans Pro"×3
"Noto Sans"×3

Where it hurts most

the 5 files carrying the most off-system styling

01 frontend/src/metabase/metabot/components/MetabotChat/MetabotAgentDataSourcePills.tsx 2 stray colours 13 inline
02 enterprise/frontend/src/embedding-sdk-package/cli/snippets/embedding-provider-snippet.ts 9 stray colours
03 frontend/src/metabase/static-viz/components/Gauge/stories-data.ts 9 stray colours
04 frontend/src/metabase/ui/colors/ColorHarmonyStory/ColorHarmonyDemo.tsx 3 stray colours 5 inline
05 frontend/src/metabase/ui/colors/ColorHarmonyStory/HarmonyWheel.tsx 4 stray colours 4 inline

Duplicated components

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

<ModalBody> · 5 implementations
frontend/src/metabase/timelines/common/components/ModalBody/ModalBody.tsx
enterprise/frontend/src/metabase-enterprise/replacement/components/SourceReplacementModal/ModalBody/ModalBody.tsx
frontend/src/metabase/timelines/collections/components/TimelineDetailsModal/TimelineDetailsModal.styled.tsx
frontend/src/metabase/timelines/collections/components/TimelineListModal/TimelineListModal.styled.tsx
frontend/src/metabase/common/components/ModalContent/ModalContent.tsx
<CardRoot> · 5 implementations
frontend/src/metabase/admin/settings/auth/components/AuthCard/AuthCard.styled.tsx
frontend/src/metabase/timelines/collections/components/EventCard/EventCard.styled.tsx
frontend/src/metabase/timelines/collections/components/TimelineCard/TimelineCard.styled.tsx
frontend/src/metabase/timelines/common/components/TimelinePicker/TimelinePicker.styled.tsx
frontend/src/metabase/timelines/questions/components/EventCard/EventCard.styled.tsx
<Sidebar> · 4 implementations
frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.styled.tsx
frontend/src/metabase/common/components/Sidebar/Sidebar.tsx
frontend/src/metabase/monitor/components/MonitorLayout/Sidebar.tsx
frontend/src/metabase/querying/components/NativeQueryEditor/slots/Sidebar.tsx
<Label> · 4 implementations
frontend/src/metabase/common/components/MetadataInfo/MetadataInfo.styled.tsx
frontend/src/metabase/metadata/components/FieldOrderPicker/Label.tsx
frontend/src/metabase/admin/databases/components/DatabaseFeatureComponents/DatabaseFeatureComponents.tsx
frontend/src/metabase/common/components/type/Label.tsx
<Table> · 4 implementations
frontend/src/metabase/common/components/MetadataInfo/MetadataInfo.styled.tsx
frontend/src/metabase/common/components/ItemsTable/BaseItemsTable.styled.tsx
frontend/src/metabase/common/components/Table/Table.tsx
frontend/src/metabase/visualizations/visualizations/Table/Table.tsx
<SidebarHeader> · 4 implementations
enterprise/frontend/src/embedding-sdk-ee/metabot/SidebarHeader.tsx
enterprise/frontend/src/metabase-enterprise/monitor/dependency-diagnostics/components/DiagnosticsSidebar/SidebarHeader/SidebarHeader.tsx
frontend/src/metabase/common/components/SidebarHeader/SidebarHeader.tsx
frontend/src/metabase/monitor/tools/notifications/NotificationDetailSidebar/SidebarHeader.tsx
<EmptyStateContainer> · 4 implementations
frontend/src/metabase/common/components/AccordionList/AccordionListCell.styled.tsx
frontend/src/metabase/parameters/components/widgets/ParameterFieldWidget/FieldValuesWidget/ListField/ListField.styled.tsx
frontend/src/metabase/parameters/components/widgets/ParameterFieldWidget/FieldValuesWidget/SingleSelectListField/SingleSelectListField.styled.tsx
frontend/src/metabase/nav/components/search/SearchResults/SearchResults.tsx
<CardTitle> · 4 implementations
frontend/src/metabase/timelines/collections/components/EventCard/EventCard.styled.tsx
frontend/src/metabase/admin/settings/auth/components/AuthCard/AuthCard.styled.tsx
frontend/src/metabase/timelines/collections/components/TimelineCard/TimelineCard.styled.tsx
frontend/src/metabase/timelines/common/components/TimelinePicker/TimelinePicker.styled.tsx
tag family · 7 variants
<TagEditorSidebar>
frontend/src/metabase/parameters/components/TagEditor/TagEditorSidebar.tsx
used 3×
<TagSection>
frontend/src/metabase/transforms/components/JobEditor/TagSection/TagSection.tsx
used 2×
<OptionalTag>
frontend/src/metabase/common/components/FormField/FormField.styled.tsx
used 1×
<TagEditorHelp>
frontend/src/metabase/parameters/components/TagEditor/TagEditorHelp/TagEditorHelp.tsx
used 1×
<TagEditorParam>
frontend/src/metabase/parameters/components/TagEditor/TagEditorParam.tsx
used 1×
<ViewOnlyTag>
frontend/src/metabase/query_builder/components/view/ViewHeader/components/SavedQuestionLeftSide/ViewOnly.tsx
used 1×
…and 1 more
switch family · 6 variants
<Switch>
frontend/src/metabase/ui/components/inputs/Switch/index.tsx
used 69×
<FormSwitch>
frontend/src/metabase/forms/components/FormSwitch/FormSwitch.tsx
used 7×
<DetailedViewSwitch>
frontend/src/metabase/transforms/components/DetailedViewSwitch/DetailedViewSwitch.tsx
used 2×
<IncludeCurrentSwitch>
frontend/src/metabase/querying/common/components/DatePicker/RelativeDatePicker/IncludeCurrentSwitch/IncludeCurrentSwitch.tsx
used 2×
<EntityViewSwitch>
frontend/src/metabase/admin/permissions/components/EntityViewSwitch/EntityViewSwitch.tsx
used 1×
<PreemptiveCachingSwitch>
enterprise/frontend/src/metabase-enterprise/caching/components/PreemptiveCachingSwitch.tsx
checkbox family · 5 variants
<Checkbox>
frontend/src/metabase/ui/components/inputs/Checkbox/index.tsx
used 69×
<FormCheckbox>
frontend/src/metabase/forms/components/FormCheckbox/FormCheckbox.tsx
used 10×
<SelectionCheckbox>
frontend/src/metabase/ui/components/data-display/TreeTable/SelectionCheckbox/SelectionCheckbox.tsx
used 2×
<CheckboxIcon>
frontend/src/metabase/ui/components/inputs/Checkbox/CheckboxIcon.tsx
<FormCheckboxGroup>
frontend/src/metabase/forms/components/FormCheckboxGroup/FormCheckboxGroup.tsx
progress family · 5 variants
<Progress>
frontend/src/metabase/visualizations/visualizations/Progress/Progress.tsx
used 5×
<MetabotToolProgress>
frontend/src/metabase/metabot/components/MetabotChat/MetabotChainOfThought/MetabotToolProgress.tsx
used 1×
<MigrationInProgress>
frontend/src/metabase/admin/settings/components/CloudPanel/MigrationInProgress.tsx
used 1×
<ProgressBar>
frontend/src/metabase/static-viz/components/ProgressBar/ProgressBar.tsx
used 1×
<ProgressSkeleton>
frontend/src/metabase/visualizations/components/skeletons/ProgressSkeleton/ProgressSkeleton.tsx
used 1×
radio family · 4 variants
<Radio>
frontend/src/metabase/ui/components/inputs/Radio/index.tsx
used 65×
<FormRadioGroup>
frontend/src/metabase/forms/components/FormRadioGroup/FormRadioGroup.tsx
used 5×
<ChartSettingRadio>
frontend/src/metabase/visualizations/components/settings/ChartSettingRadio.tsx
used 3×
<ChartSettingIconRadio>
frontend/src/metabase/visualizations/components/settings/ChartSettingIconRadio.tsx
avatar family · 4 variants
<Avatar>
frontend/src/metabase/common/components/UserAvatar/UserAvatar.styled.tsx
used 15×
<UserAvatar>
frontend/src/metabase/common/components/UserAvatar/UserAvatar.tsx
used 9×
<ChannelAvatarStack>
frontend/src/metabase/monitor/tools/notifications/NotificationDetailSidebar/ChannelAvatarStack.tsx
used 1×
<TransformOwnerAvatar>
frontend/src/metabase/transforms/components/TransformOwnerAvatar/TransformOwnerAvatar.tsx
used 1×

539 inline style blocks

styling no system can see

frontend/src/metabase/metabot/components/MetabotChat/MetabotAgentDataSourcePills.tsx×13
frontend/src/metabase/common/components/ItemsTable/Columns.tsx×8
frontend/src/metabase/visualizations/visualizations/List/components/ListView/ColumnValue.tsx×8
frontend/src/metabase/visualizations/visualizations/List/components/ListView/ListView.tsx×7
enterprise/frontend/src/embedding-sdk-ee/metabot/hooks/use-metabot.stories.utils.tsx×5
enterprise/frontend/src/metabase-enterprise/monitor/ai-auditing/metabot-analytics/components/ConversationDetailPage/ConversationDetailPage.tsx×5
139 !important declarations · each one forces a style through
FieldItem.module.css ×6EChartsTooltip.module.css ×6DocumentHeader.module.css ×5EntityItemMenu.module.css ×4Glossary.module.css ×4DashCard.module.css ×4

The adoption map

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

<Text> · used 1563× · frontend/src/metabase/static-viz/components/Text/Text.tsx Text 1563× <Text> · used 1559× · frontend/src/metabase/dashboard/visualizations/Text/Text.tsx Text 1559× <Icon> · used 1365× · frontend/src/metabase/ui/components/icons/Icon/Icon.tsx Icon 1365× <Tooltip> · used 336× · frontend/src/metabase/querying/components/expressions/Editor/Tooltip/Tooltip.tsx Tooltip 336× <Tooltip> · used 336× · frontend/src/metabase/ui/components/overlays/Tooltip/Tooltip.tsx Tooltip 336× <LoadingAndErrorWrapper> · used 260× · frontend/src/metabase/common/components/LoadingAndErrorWrapper/LoadingAndErrorWrapper.tsx LoadingAndErrorW… 260× <Title> · used 210× · frontend/src/embedding-sdk-bundle/components/private/SdkQuestion/components/Title.tsx Title 210× <Title> · used 210× · frontend/src/metabase/visualizations/components/FunnelNormal.styled.tsx Title 210× <Ellipsified> · used 189× · frontend/src/metabase/ui/components/data-display/Ellipsified/Ellipsified.tsx Ellipsified 189× <Modal> · used 152× · frontend/src/metabase/ui/components/overlays/Modal/index.tsx Modal 152× <Link> · used 150× · frontend/src/metabase/common/components/Link/Link.tsx Link 150× <Loader> · used 149× · enterprise/frontend/src/embedding-sdk-package/components/private/Loader/Loader.tsx Loader 149× <Loader> · used 149× · frontend/src/metabase/ui/components/feedback/Loader/Loader.tsx Loader 149× <FixedSizeIcon> · used 135× · frontend/src/metabase/ui/components/icons/Icon/Icon.tsx FixedSize… 135× <FormTextInput> · used 126× · frontend/src/metabase/forms/components/FormTextInput/FormTextInput.tsx FormText… 126× <ExternalLink> · used 116× · frontend/src/metabase/common/components/ExternalLink/ExternalLink.tsx ExternalLink 116× <TextInput> · used 97× · frontend/src/metabase/dashboard/visualizations/Text/Text.styled.tsx TextInput 97× <Popover> · used 94× · frontend/src/metabase/common/components/MetadataInfo/Popover/Popover.tsx Popover 94× <Menu> · used 92× · frontend/src/metabase/ui/components/overlays/Menu/Menu.tsx Menu 92× <Select> · used 87× · frontend/src/metabase/ui/components/inputs/Select/Select.tsx Select 87× <SettingsSection> · used 83× · frontend/src/metabase/settings-components/SettingsSection/SettingsSection.tsx SettingsS… 83× <Form> · used 78× · frontend/src/metabase/forms/components/Form/Form.tsx Form 78× <FormProvider> · used 75× · frontend/src/metabase/forms/components/FormProvider/FormProvider.tsx FormProv… 75× <Skeleton> · used 74× · frontend/src/metabase/ui/components/feedback/Skeleton/Skeleton.tsx Skeleton 74×

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

1,696 components are imported exactly once: <AboutModal>, <AbsoluteContainer>, <AccessGrantList>, <AccountHeader>, <AccountLayout>, <ActionCell> and 1690 more. Quiet corners, not yet a system.

componentuseddefined inprops
<Text> 1563× frontend/src/metabase/static-viz/components/Text/Text.tsx none
<Text> 1559× frontend/src/metabase/dashboard/visualizations/Text/Text.tsx onUpdateVisualizationSettings dashboard dashcard gridSize settings
<Icon> 1365× frontend/src/metabase/ui/components/icons/Icon/Icon.tsx name size defaultSize tooltip tooltipPosition
<Tooltip> 336× frontend/src/metabase/querying/components/expressions/Editor/Tooltip/Tooltip.tsx query stageIndex database reportTimezone tooltipRef
<Tooltip> 336× frontend/src/metabase/ui/components/overlays/Tooltip/Tooltip.tsx none
<LoadingAndErrorWrapper> 260× frontend/src/metabase/common/components/LoadingAndErrorWrapper/LoadingAndErrorWrapper.tsx loading error noBackground noWrapper showSpinner
<Title> 210× frontend/src/embedding-sdk-bundle/components/private/SdkQuestion/components/Title.tsx style
<Title> 210× frontend/src/metabase/visualizations/components/FunnelNormal.styled.tsx none
<Ellipsified> 189× frontend/src/metabase/ui/components/data-display/Ellipsified/Ellipsified.tsx showTooltip alwaysShowTooltip tooltip lines ignoreHeightTruncation
<Modal> 152× frontend/src/metabase/ui/components/overlays/Modal/index.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 · b3ab0f770bd7 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real