The report
Write the interactive HTML report:
npx nestjs-doctor@latest . --reportWrites nestjs-doctor-report.html to the project root and opens it. One file,
no build step. Commit it or attach it to a pull request.
--output names a different path, which keeps the file out of the repository
being scanned.
Five things load from the network when opened. The graph layout library and the logo are one request each. The IBM Plex Mono font is a stylesheet plus the font files it names. The code viewer is a CodeMirror import map, so it pulls 18 modules from esm.sh. The fifth reports which tab was opened, carrying the nestjs-doctor version, the tab name, whether the file was generated in CI or from the CLI, and nothing read from the page.
Offline, the module graph falls back to a plain grid and the code viewers do not load. The text falls back to the system monospace font. Everything else works, including the schema diagram's layout.

What is in it
| Tab | Shows |
|---|---|
| Summary | The score, the category breakdown, and the counts behind them |
| Findings | Every finding with a code viewer and a fix example |
| Modules Graph | Your real module graph, clustered, with cycles in red |
| Endpoints | Traced HTTP routes per controller and the dependencies each one pulls |
| Relational Schema | The ER diagram extracted from your ORM |
| Rule Lab | A playground for writing a custom rule against your own code |
Endpoints and Relational Schema stay hidden until there is data. A project with
no controllers and no ORM entities sees four tabs. The Endpoints tab is badged
Beta.
Module graph covers reading that tab: cycles, blast radius, and the toggles.
Findings that do not score
A rule can report without moving the score. Summary shows how many under the
number, as 70 of 407 not scored, so the two reconcile. Findings hides those
findings behind a Show not scored checkbox above the severity filters, and
badges each one not scored beside its rule id when you turn it on.
Which rules those are is up to the rule and your config. See Surfaces.
Boot trace
The graph can overlay how long every provider and controller took to construct during one real boot. Lifecycle hook durations come along with them.
Producing those numbers needs one change to main.ts, because a scan never
runs your application. Boot trace covers the change
and how to read the result.