Ballmac Verified
An open score for any shadcn registry
One command reads a registry’s source and scores it on the things users run into: accessibility, theme tokens, declared dependencies, loading and error states, motion and right-to-left support. The code is open, the checks are listed below, and our own registry is scored the same way.
Ballmac UI’s score
97 / 100
Ballmac UI, grade A
486 components, blocks, hooks and libraries scored from ui.ballmac.com/r/registry.json. Last run October 24, 2026. Read the scorecard.
What is checked
Each check is scored across the items it applies to. A check that does not apply to an item (a hook has no colors) is left out of its score, not counted as a pass. The score is the weighted average, so accessibility counts most.
Accessibility · weight 25
No unlabelled controls, missing alt text, clickable non-interactive elements, removed focus outlines or hand-made dialogs in the source.
454 of 475 pass · 21 did not
Valid item · weight 15
A kebab-case name, a known type, and at least one file with a path and content.
486 of 486 pass
Dependencies declared · weight 15
Every package the code imports is in dependencies, and every shared registry component it imports is in registryDependencies.
486 of 486 pass
Theme tokens · weight 10
Colors come from theme tokens, not hard-coded hex or rgb values, so the item follows the theme and dark mode.
412 of 475 pass · 63 did not
States · weight 10
Data views handle loading, empty and error, not only the filled case.
473 of 473 pass
Motion · weight 5
No endless decorative animation, which cannot be paused for people who ask for less motion.
474 of 475 pass · 1 did not
Right to left · weight 5
Logical classes (ms-, pe-, text-start) instead of physical ones (ml-, pr-, text-left), so the layout mirrors.
466 of 475 pass · 9 did not
Described · weight 5
A title and a description that says what the item is (20 characters or more).
486 of 486 pass
Documented · weight 5
A docs note, or at least one example item in the registry.
473 of 473 pass
Attributed · weight 5
The item names its author or license, so you know who maintains it.
486 of 486 pass
Where we lose points
The five lowest-scoring items in our own registry. Some are judgment calls by the rules (a scrim that is meant to be black), and we leave them visible instead of tuning the score.
- desktop-265a11y/clickable-non-interactive: <li> has onClick and a role but no keyboard handler (onKeyDown).
- finder-window65a11y/clickable-non-interactive: <div> has onClick and a role but no keyboard handler (onKeyDown).
- launchpad65a11y/clickable-non-interactive: <div> has onClick but is not focusable and has no role.
- template-northwind65a11y/focus-outline-removed: <button> removes the focus outline and adds no focus style.
- agent-275a11y/clickable-non-interactive: <li> has onClick and a role but no keyboard handler (onKeyDown).
Leaderboard
Registries that have published a scorecard, highest first. Every row links to the address the score was run on, so you can run the command and get the same number. A score is a snapshot of that registry on that day, and only registries that choose to submit appear here.
| # | Registry | Score | Grade | Items | Run |
|---|---|---|---|---|---|
| 1 | Ballmac UI · ours | 97 | A | 486 |
Want to be listed? Run the command below, then open a pull request that adds your scorecard to content/verified/submissions. We re-run it on your registry before merging.
Run it on your registry
Point it at a URL, a folder or a registry.json. It reads the registry and writes nothing to it, and needs TypeScript in the folder you run it from.
npx @ballmac/cli verify https://acme.com --badge verified.svg --out scorecard.jsonnpx @ballmac/cli verify ./public/r/registry.json --min-score 80name: Ballmac Verified
on:
push:
branches: [main]
pull_request:
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Build your registry first so each item's JSON sits next to registry.json.
- run: npm ci && npm run registry:build
- uses: vamsiy78/ballmac-ui/actions/verify@main
with:
registry: ./public/r/registry.json
min-score: 80
badge: public/verified.svg[](https://ui.ballmac.com/verified)The full guide, with every flag and how to read a failing item, is in Verify your registry.
What this score does not tell you
- It reads source. It does not load anything in a browser, so it cannot see contrast, focus order, phone width or a broken layout. For those, see how we measure every item in a real browser, or run
ballmac check --urlon your app. - Static rules make judgment calls and can be wrong in both directions. A flagged item is a place to look, not proof of a defect, and you can silence a finding with a reason.
- It is not a certification and not an audit. Nobody at Ballmac reviews a registry before it is scored.
- The weights are our choice. They are listed above and in the open source, and you can read the per-check numbers instead of the single score.