Ballmac UI home

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.

Ballmac Verified: 97 out of 100, grade A

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.

#RegistryScoreGradeItemsRun
1Ballmac UI · ours97A486

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.json
Local registry, failing under 80
npx @ballmac/cli verify ./public/r/registry.json --min-score 80
.github/workflows/verified.yml
name: 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
README.md
[![Ballmac Verified](https://ui.ballmac.com/verified/ballmac.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 --url on 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.