Reach scans a React repo and answers one question: of all the UI you rendered, how much came from your design system?
Reach counts every JSX opening element in the repo. You can make CI fail below a minimum score, but how things are counted never changes, so scores stay comparable between teams.
component_library, including subpath imports like @acme/ds/Button and member expressions like <Table.Row>.div or span with a className or style. It counts against you, because it is UI that bypassed the system.npx @usepolder/reach --library "@acme/ds"Zero config beyond your design system package name. Add --json for the full machine-readable report.Reach also reads the .polder.yml that Drift uses.
One pull request comment, updated on every push, with the score, the change against the base branch, and the leak count. It also sets score, base-score and leaks outputs.
- uses: actions/checkout@v4
- uses: usepolder/reach@v1
The job needs pull-requests: write to post the comment. If the base commit cannot be fetched, such as on fork pull requests, the comment shows the score only.
Set reach.fail_under to fail CI below a score. It gates the build and never changes the number. On every push to the default branch the action can commit a README badge, with no hosted service.
component_library: "@acme/design-system"
reach:
include: ["src/**"]
exclude: ["**/*.test.*", "**/*.stories.*"]
fail_under: 0
The share of countable UI that comes from your design system: DS instances divided by DS instances plus other component instances plus styled host elements, counted per JSX opening element across the repo.
No. A score you can tune is a score nobody trusts. You can set reach.fail_under to fail CI below a minimum score, which never changes the number.
Reach reads React code (JSX and TSX) and works with any design system that you name by its package, including in-house ones.
No. Reach runs on your machine or in your CI, with no server and no account.
Not yet. Per-package scores for monorepos and an Azure DevOps task are on the roadmap. Reach scores the whole repo today.
Yes. Public repos use a shields.io endpoint file that the action commits. Private repos use a committed static SVG, because shields.io cannot read private raw files.
Nothing. Reach is open source under Apache-2.0.
Part of Polder. See also Polder Drift. Latest release: v1.0.0, 2026-07-07.
npx @usepolder/reach --library "@acme/ds"npx @usepolder/drift scan --all