Your agent writes bad React, this catches it.
React Doctor deterministically scans your codebase and finds issues across state & effects, performance, architecture, security, and accessibility.
Works for all React frameworks and libraries - Next.js, Vite, TanStack, React Native, Expo, you name it.
Install
1. Quick start
Run this at your project root to get an audit.
npx react-doctor@latest
https://github.com/user-attachments/assets/07cc88d9-9589-44c3-aa73-5d603cb1c570
2. Install for agents
Once you have an audit, you can install the skill for your coding agent to learn from the issues and fix them in the future.
npx react-doctor@latest install
Works with Claude Code, Cursor, Codex, OpenCode, and many more.
3. Run in CI (GitHub Actions) for your team
Add the reusable GitHub Action from Marketplace to scan every pull request, show inline annotations, and leave findings where reviewers already look.
name: React Doctor
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
pull-requests: write
issues: write
concurrency:
group: react-doctor-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
react-doctor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: millionco/react-doctor@v1
@v1 always resolves to the latest v1.x release of the Action. For hardened CI — recommended whenever the workflow is granted pull-requests: write — pin to a full commit SHA instead and let Dependabot or Renovate keep it current:
- uses: millionco/react-doctor@b612664043a9be414166e3c6a69b355e39a8dcf4 # v1.1.1
4. Configure rules in doctor.config.ts
Configure with a doctor.config.ts (or .js, .mjs, .cjs, .json, .jsonc) in your project root.
// doctor.config.ts
import type { ReactDoctorConfig } from "react-doctor/api";
export default {
lint: true,
rules: {
"react-doctor/no-array-index-as-key": "off",
},
} satisfies ReactDoctorConfig;
Prefer JSON? Use doctor.config.json:
{
"$schema": "https://react.doctor/schema/config.json",
"lint": true,
}
Telemetry
The CLI reports crashes, basic run traces, and anonymous usage counters to Sentry to help us fix bugs and prioritize work.
We collect:
- Environment: CLI version, platform, Node version
- Invocation: which command, package manager, and run context (whether it's local vs. CI vs. coding agent)
- Project shape: framework, React version, TypeScript, project size NO file contents)
- Rules fired: rule names and counts only (e.g.
react-doctor/no-array-index-as-key) (NO code or specific findings) - De-minified React Doctor CLI stack traces
To opt out, run: npx react-doctor@latest --no-telemetry
Contributing
MIT-licensed
/doctor, asks to scan, triage, or clean up React…; improve-react: Survey a whole React codebase as a senior React engineer, using React Doctor's scan as evidence, then produce a prioritized audit and self-contained…