The report

Write the interactive HTML report:

npx nestjs-doctor@latest . --report

Writes 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.

Module graph

What is in it

TabShows
SummaryThe score, the category breakdown, and the counts behind them
FindingsEvery finding with a code viewer and a fix example
Modules GraphYour real module graph, clustered, with cycles in red
EndpointsTraced HTTP routes per controller and the dependencies each one pulls
Relational SchemaThe ER diagram extracted from your ORM
Rule LabA 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.