react-doctor
- 0.9.18 is the latest, published 12 October 2026.
- No known security advisory.
- 0.x: 117 releases since 13 February 2026, 22 in the last 90 days.
Releases in the last 90 days
Feed of releases and advisoriesEvery stable release, newest first. Notes are quoted as the maintainers published them.
0.9.18
12 October 2026Record the GitHub Action clean-comment preference in anonymized scan telemetry and document the workflow input.
Patch Changes
Record the GitHub Action clean-comment preference in anonymized scan telemetry and document the workflow input.
Match API Platform subscription IDs to the provider's resource-and-IDs unsubscribe contract.
Do not infer React hooks from relative helper imports in Angular component classes. Continue to check React and React ecosystem imports.
Do not classify a local state transition as a prop-driven adjustment when its only prop dependencies are called notifications. Keep checks for prop values used in guards, results, or reset dependencies.
Do not recommend lazy state initialization for cheap primitive toString calls, including numeric React Native Dimensions values. Keep warnings for unproven receivers and nested expensive calls.
Report inaccessible parent click actions when descendant handlers stop keyboard-generated clicks from reaching them.
Match listener cleanup when both branches of conditional options have the same capture value. Keep warnings for differing capture values, changed options, and missing cleanup.
Recognize exhaustive listener-removal loops extracted into a synchronous helper when the cleanup only invokes that helper.
Add the opt-in
--scope contextualreporting mode. Selected rules report existing findings when their owning function, JSX element, or file changes. Other rules retain line filtering. Support deletion-only edits, staged scans, untracked files, and separate result-cache entries while preserving existing scope defaults and diagnostic locations.Preserve count-based placeholder identity through a local array before mapping wrappers.
Preserve numeric placeholder-loop identity through local key aliases, including constant-prefix keys. Continue reporting index aliases for loops over array data.
Keep browser reads in helpers defined inside React effects out of server-render diagnostics. Preserve warnings for render callbacks and shadowed effect functions.
Do not classify zero-argument effect notifications as state payloads sent to a parent. Continue to report callbacks that pass local state.
Install and manage GitHub Actions workflows at the repository root when invoked from a nested package or linked worktree.
Exclude
.cloudflarebuild output directory from source file discovery. Cloudflare'scfCLI stores compiled Worker bundles and cache state there, mirroring the existing.wranglerexclusion.Honor explicit
rulessettings of"warn"or"error"for ported rules whencustomRulesOnlyis enabled. Current and legacy rule keys both work. Other ported rules and the React Compiler plugin stay disabled, and project requirements and tag exclusions still apply.fix(effect-needs-cleanup): accept Promise timer that resets its own handle in callback
Fixes #1882. The rule no longer flags a timer created in a Promise callback when the timer's own callback resets the handle to
nullorundefined. This is safe because the timer has already fired when the reset happens, so no live handle is lost.Fix
--stagedrefusing to scan in linked git worktrees whenGIT_DIRis set. Clear the inheritedGIT_DIRenvironment variable in the staged divergence check so git status resolves paths correctly, matching the fix for scoped scans in #1516.Use constant Boolean initializers before treating numeric-looking JSX guard names as numbers. Preserve warnings for mutable bindings, destructuring defaults, and numeric values.
Require root route error boundaries only for data routers, since declarative useRoutes configurations do not use data-router error handling.
Tha
0.9.17
5 October 2026Fix false new findings in --baseline and --scope changed after formatting or editing existing flagged code. Compare finding counts per file and rule, then use fingerprints, messages, and Git line shifts to identify added findings. Skip location matching when counts do not increase. Apply portable config filters to saved baseline findings and reject reports with missing or incompatible source-dependent filter settings; regenerate those base reports with the current version and settings.
Patch Changes
Fix false new findings in
--baselineand--scope changedafter formatting or editing existing flagged code. Compare finding counts per file and rule, then use fingerprints, messages, and Git line shifts to identify added findings. Skip location matching when counts do not increase. Apply portable config filters to saved baseline findings and reject reports with missing or incompatible source-dependent filter settings; regenerate those base reports with the current version and settings.Updated dependencies []:
oxlint-plugin-react-doctor@0.9.17
0.9.16
4 October 2026Fix changed-scope scans to compare findings for uncommitted changes and use flagged source spans instead of whole lines. Match duplicate findings by count and limit cross-file matches to Git renames.Add --baseline <report.json> to reuse a saved scan. JSON reports now include stable finding fingerprints, the source revision, the comparison source, and the number of matched base findings. Gates and summary counts use only new findings.
Patch Changes
Fix changed-scope scans to compare findings for uncommitted changes and use flagged source spans instead of whole lines. Match duplicate findings by count and limit cross-file matches to Git renames.
Add
--baseline <report.json>to reuse a saved scan. JSON reports now include stable finding fingerprints, the source revision, the comparison source, and the number of matched base findings. Gates and summary counts use only new findings.Disable
require-pnpm-hardeningby default; enable it explicitly throughruleswhen wanted. Describe await parallelization as a conditional opportunity, preserving ordering, resource limits, and error semantics. Recognize local Promise.all/allSettled collectors and stop describing async array callbacks as sequential.Fix
effect-needs-cleanupfalse positive for React 19 callback ref cleanup returns. React 19 callback refs can return cleanup functions with the signature(node: T | null) => void | (() => void). The rule now correctly handles cases where cleanup is only returned after resource usage (e.g., afterResizeObserver.observe()), allowingvoidreturns on the null branch.Updated dependencies:
oxlint-plugin-react-doctor@0.9.16
0.9.14
12 September 2026Upgrade oxlint to 1.81 and oxc-parser to 0.148.
Patch Changes
Upgrade oxlint to 1.81 and oxc-parser to 0.148.
Detect React Compiler when
@vitejs/plugin-reactis called with an enabledcompileroption (react({ compiler: true })orreact({ compiler: { ... } })), including aliased, namespace, and CommonJS forms of the default export.compiler: falseand unrelated objects with acompilerproperty stay undetected, so rules disabled under React Compiler now switch off for these Vite projects.Skip source files that Git still tracks but that no longer exist in the working tree (for example a deleted root
index.htmlin a TanStack Start app) instead of failing the scan withENOENTwhile preparing lint sources.Exclude every discovered nested workspace project from an ancestor scan, whether or not it was selected. Scanning only the root of a monorepo previously pulled a nested app's files into the root scan and judged them against the root's framework and React Compiler settings, so a compiler-enabled Expo app inside a Vite workspace reported compiler-gated rules like
prefer-module-scope-pure-functionthat its own config suppresses. A nested project's files are now only checked by that project's scan, matching what selecting both projects already did.Keep
--scope changedin baseline mode when the change set deletes a source file. A deleted file that cannot be read or linted at the base commit no longer degrades the whole comparison to a plain diff; only an unreadable or unlinted base file that still exists at head does, since that is the only gap that could surface a pre-existing finding as new.Speed up large-repository scans: reuse warm oxlint worker processes across projects, overlap project discovery with linting, and trim rule hot paths (2.4–5.5x faster wall-clock on the large-repo corpus).
Stop reporting local service
.use()methods as React hooks. Preserve diagnostics for React namespace calls, including aliases and CommonJS imports.Only recommend
setAnimationLoopwhen a recursive animation frame callback renders through a known Three.js renderer. Leave independent 2D canvas and DOM loops alone, including files that also import Three.js.- security
Retire 33 low-value rule IDs while keeping them registered as silent compatibility entries. Make 26 cleanup, migration, performance, and security-review rules opt-in. Existing rule configurations still load; default scans no longer report these recommendations as defects.
Skip TypeScript files without JSX support (
.ts,.mts, and.cts, including declarations) before applying JSX duplication analysis budgets. Large generated type files no longer make the maintainability scan incomplete or consume its source-file budget. JSX-capable files retain the existing limits.Increase runtime trace finalization timeout from 10 to 60 seconds to handle large traces from longer recording sessions
Updated dependencies:
oxlint-plugin-react-doctor@0.9.14
0.9.13
2 September 2026Add bippy as a runtime dependency.
Patch Changes
Add bippy as a runtime dependency.
Preserve plugin settings when React Doctor adopts an existing lint config.
Upgrade the Oxc parser and Oxlint runtime while preserving hard failures for broken JS plugins.
Use pnpm's strict dependency layout and declare the runtime dependencies that the CLI imports directly.
Keep the interactive score header intact in narrow split views and invalidate locally stale scan results when rule implementations change.
Report standalone Three.js render loops that use
requestAnimationFrameinstead of the renderer-managedsetAnimationLoopAPI.Include standalone Three.js, supported React framework, Remotion, and React Three Fiber ecosystem packages in automatic workspace project discovery.
Clean leading npm messages from GitHub Action JSON reports before later steps read them.
Stop multi-project scans from recommending GitHub Actions when the root workflow is already configured.
Fix
rn-no-raw-textfalse positives in components that return only direct<fbt>or<fbs>elements.Prevent
rn-no-raw-textreports for<fbt>content passed through verified React Native text wrappers.Show an npm-native recovery command when an incomplete npx installation is missing Ajv meta-schema files.
Fix
js-set-map-lookupsfalse positives for substring checks on values returned by the globalStringconstructor.Run
test-noiserules in ambiguous product-named directories such astools,demo, andmigrationswhen they are below a recognized application source root. Explicit test surfaces and root-level tooling or example directories remain excluded.Make generated GitHub workflows explain how to pin the action to an immutable commit SHA.
Improve repeated effect analysis and deeply nested JSX performance, preserve derived-state detection through transparent TypeScript wrappers, and upgrade Oxc parser and linter dependencies.
Run installed Claude Code and Cursor hooks once at the end of an agent turn, include untracked files in the changed-file scan, and migrate existing per-tool React Doctor hooks automatically.
Accept source file paths as positional CLI arguments.
Make React cleanup a first-class part of React Doctor with diagnostics for complex React functions and repeated JSX composition. Keep whole-project unused file, export, type, dependency, and import-cycle analysis as explicit opt-in rules while removing the separate Deslop packages, experimental language server, and IDE extensions.
Add an interactive URL scan and
/performanceskill that record Chrome DevTools traces, flash live component render outlines, and return agent-readable React performance context.Add component-composition and correctness rules for shadcn, Radix UI, Base UI, React Aria, TanStack Table, and TanStack Virtual behind six new project capabilities (
shadcnfromcomponents.json; the rest from their package dependencies). Dialog surfaces that render no title part and carry no accessible name are reported across all three libraries (shadcn DialogContent/SheetContent/AlertDialogContent/DrawerContent, Radix Dialog.Content and AlertDialog.Content, Base UI Dialog.Popup and AlertDialog.Popup). Icon-sized shadcn Buttons with no accessible name, shadcn FormItem fields wrapping a FormControl without a FormLabel, and Base UI Field.Root controls without a Field.Label are reported as unlabeled. Raw Input, Textarea, and Button controls placed directly inside shadcn InputGroup are reported in favor of its InputGroupInput, InputGroupTextarea, and InputGroupAddon parts, and presence-onlydata-[selected]:/data-[disabled]:Tailwind variants on command items are reported because cmdk renders both attributes as"true"or"false". TanStack Form submit handlers that call the form'shandleSubmitwithoutevent.preventDefault()are reported because the browser still performs a native full-page submission. Tabs triggers provably inside the
0.9.12
13 August 2026Restore the option to copy the full fix prompt from the interactive report.
Patch Changes
Restore the option to copy the full fix prompt from the interactive report.
Ignore Git-ignored configuration files when checking staged scan snapshot divergence.
Upgrade the Oxc toolchain to the latest releases.
Recognize every detected framework and library capability as a supported scan target, including plain Three.js projects and React-backed frameworks without direct React declarations, and anchor remote-installer diagnostics on the executable download command.
Avoid crashing when oxlint emits a code-less diagnostic while scanning Astro files.
Make
react-doctor/no-multi-compfaithfully enforce Oxlint's one-component-per-file contract, and preserve React Doctor's lower-noise default behavior underreact-doctor/no-multi-component-file.Reduce the CLI dependency graph by replacing narrow code-frame and terminal-symbol helpers with local implementations.
Updated dependencies:
oxlint-plugin-react-doctor@0.9.12
deslop-js@0.9.12
0.9.11
9 August 2026Updated dependencies:
Patch Changes
Updated dependencies:
oxlint-plugin-react-doctor@0.9.11
deslop-js@0.9.11
0.9.10
9 August 2026Send traces and metrics to Axiom instead of Sentry. Sentry keeps crash reporting,
Patch Changes
Send traces and metrics to Axiom instead of Sentry. Sentry keeps crash reporting, where its source-map symbolication, issue grouping, and quotable event ids have no Axiom equivalent — so error reports are unchanged, and the JSON report's
sentryEventIdfield keeps its meaning.Two user-visible changes:
--debugnow prints the run's Axiom trace id (crash reports carry the same id as a tag, so one id resolves in both backends), andREACT_DOCTOR_NO_TELEMETRYis now honored by the CLI as well as the language server.--no-scoreand--no-telemetryare unchanged and still disable everything.Updated dependencies []:
oxlint-plugin-react-doctor@0.9.10
deslop-js@0.9.10
0.9.9
8 August 2026Updated dependencies:
Patch Changes
Updated dependencies:
oxlint-plugin-react-doctor@0.9.9
deslop-js@0.9.9
0.9.8
8 August 2026Harden scan orchestration and cache persistence, modernize the Effect runtime, simplify package boundaries and analyzers, share cycle and suppression analysis, keep workflow paths inside the repository, and remove unused internals.
Patch Changes
Harden scan orchestration and cache persistence, modernize the Effect runtime, simplify package boundaries and analyzers, share cycle and suppression analysis, keep workflow paths inside the repository, and remove unused internals.
Updated dependencies:
oxlint-plugin-react-doctor@0.9.8
deslop-js@0.9.8
Show 12 earlier releases
0.9.7
8 August 2026Updated dependencies:
Patch Changes
Updated dependencies:
oxlint-plugin-react-doctor@0.9.7
deslop-js@0.9.7
0.9.6
7 August 2026Detect React Compiler transforms passed through an installed @rolldown/plugin-babel wrapper.
Patch Changes
Detect React Compiler transforms passed through an installed
@rolldown/plugin-babelwrapper.Load standard JavaScript and TypeScript Knip configuration files when collecting dead-code entry and ignore patterns.
Accept trailing loading resets after non-rethrowing catch handlers, and preserve effect-local cleanup helpers with deterministic false-positive and false-negative fuzz replay.
Updated dependencies:
deslop-js@0.9.6
oxlint-plugin-react-doctor@0.9.6
0.9.5
5 August 20260.9.4
4 August 20260.9.3
1 August 20260.9.2
27 July 20260.9.1
23 July 20260.9.0
22 July 20260.8.3
21 July 20260.8.2
21 July 20260.8.1
18 July 20260.8.0
18 July 2026
Quality and security signals
What npm and deps.dev say about the latest release. Signals, not a verdict.
Reading npm and deps.dev…
Registry facts last checked 14 October 2026. Releases and advisories last read 14 October 2026.
Know when your own dependencies move
Inlinr tracks your coding time automatically. Switch dependency tracking on for a project and it reads that repository's manifest to show what is behind and what has been deprecated — off by default, one project at a time.