DX Score
ScoresHow it worksReliabilityFriction
DX Score
ScoresHow it worksReliabilityFriction

Find where your developer experience breaks, before your users do.

A linter cannot tell you that pnpm build exits 1 on a clean clone. DX Score runs your documented setup in a sandbox and reports what happened, with the commands that prove it and a fix to hand your coding agent.

↳
Search by name or paste a URL · three free audits a day, twenty signed in · we never write to your repository · most runs finish inside five minutes

For maintainers, developer experience and platform teams, and anyone shipping a CLI, an SDK or an API.

Run it as a check, not a website

your terminal, your CI

The gates are the part that belongs in CI. Five are decided in code from exit codes and timings alone; two more publish only when the code and the model agree, and read unverified when they do not. A fired gate is a fact you can block a merge on. The score is a summary of the run; the gate is the thing to act on.

The same checks ship as Agent Skills for Claude Code, so they run on your machine or your own runner: against a working tree you have not pushed, with no quota, no sign-in, and nothing leaving your infrastructure. Use the hosted audit when you want a shareable report with a transcript anyone can check.

Install
$ claude plugin marketplace add devarispbrown/devex-skills
$ claude plugin install developer-docs-skills@devex-skills

Then ask Claude run developer-experience-auditor on this repo. Forty-three skills, all of them on GitHub.

On a pull request, run it against the head commit and fail the job when a gate fires. Run it on the paths that can break a quickstart — the README, the manifest, the lockfile — rather than on every push.

PASS WITH DEBT71/100Observedvercel/swr · a4f21c9 · 4 September 2026
A worked example
P1errors and recovery · diagnose stage
A rejected fetcher throws Error: Failed to fetch with no cause or request id
$ pnpm vitest run examples/basic
Error: Failed to fetch
at fetcher (index.tsx:11:9)
exit 1
The transcript is what an audit prints. This one is the worked example, shown when no recent public audit has an executed failure.
The prompt that closes it
Wrap the rejection thrown at src/utils/fetch.ts:28 so the message states what failed, the underlying cause (attach the original as `cause`), the URL, the corrective step, whether retry is safe, and a request id. Keep the thrown value assignable to `Error`. Add a test in examples/basic asserting the message contains each of the six elements. If the devex-skills plugin is installed, run /error-experience on src/utils/ first. Verify by running `pnpm vitest run examples/basic` against a failing endpoint.
Paste into Claude Code, Cursor, Codex or v0. We never modify your repository.

One audit gives you

all of it out of the same run
A verdict, then a number
PASS, PASS WITH DEBT, FAIL, or UNVERIFIED when we could not finish. Only the first three carry a score out of 100, and 85 with no area under 75 is the bar we call world class.
The commands, with exit codes
Everything we ran on a clean clone, with exit codes and timings. The output of a failure travels with the finding it produced.
Seven gates, decided
BROKEN_CANONICAL_INSTALL, NON_REPRODUCIBLE_BUILD, BROKEN_QUICKSTART and four more, each with the condition that closes it. Three further gates are named and report as not yet decidable.
Findings ranked P0 to P4
Each names the stage it happened in, the evidence that proves it, a prompt that closes it, and the condition that decides when it is closed.

Your quickstart has 15 minutes to work

the standard, not the audit's runtime

We start from a clean clone with no credentials and follow your documented path exactly as written: install, build, the first example, and the check that proves it worked. Then one command we expect to fail, because how a tool explains an error is part of the experience.

Install, build and test have their own standard of 10 minutes. A run we cannot finish inside our own limits is reported as unverified with no score, never as a failure.

Nine weighted areas

weights and checks

Time to first value carries the most weight, then the API, then errors and recovery. The other six are CLI and configuration, documentation, SDK, local development, testing and quality, and release and compatibility. Weights re-normalise when an area does not apply, so a CLI with no HTTP API is not marked down for missing one.

We do not grade your claims. We test the experience.

Your CI runs these commands too, with your cache, your credentials, a toolchain it was configured with, and the commands your team wrote. We start from nothing and run only what your README tells a stranger to run. That is why every number here carries the class of evidence that produced it.

Observedwe executed it — can reach 100
Reviewedread the code and its generated output — capped at 84
Estimatedprose only — capped at 69

Some failures are not a deduction. A broken install, a build that does not reproduce, or a quickstart that never reaches a verified outcome fires a gate, and a fired gate is a FAIL whatever the number says. That is why the report leads with the transcript rather than the number.

What you do with a finding

the fix is yours to apply
Copy the prompt
Each finding carries one, written against the command and the file that produced it.
Hand it to your agent
Claude Code, Cursor, Codex or v0, in your editor and on your branch.
Apply the fix
On your branch, in your editor, reviewed by you before it lands.
Audit the new commit
A new SHA is a new run, and the gate that fired reports again against the fixed tree.

How we run it

security and method
Isolated execution

Commands run in a per-audit sandbox as an unprivileged user, with no credentials and no network beyond an allowlist of package registries and source hosts.

We only read

We clone and run. We never write to your repository and never open a pull request against it.

Public audits are public

A public repository's report has a shareable URL, and one recent finding is shown on this page. Private reports are visible only to you.

Private repositories

GitHub's repo scope is the narrowest that can read a private one. We ask for it only when you point us at one, and the token never enters the sandbox.

Point it at a repository and read the transcript.