Skip to main content

1. Write the manifest

This file lists every route, source path and component name in your app. Generate it in analyze builds only — never in the build you deploy.

2. Mount it

components/CrustDevtools.tsx
Render it in your root layout, then build with the gate on:
A crust pill appears in the corner.

Why it is built this way

With the variable unset, the bundler eliminates both dynamic imports entirely — neither the widget nor the collector reaches your production bundle. A runtime if inside the module would still ship the code and the manifest.
Your CSS cannot break the panel and the panel’s CSS cannot leak into your app. A devtool that restyles the page it is measuring is worse than no devtool.
Plain DOM. This ships into your page, and coupling it to a React version would make it a support burden and drag a second renderer into the bundle.
The manifest loads only when the panel is first opened. The widget must not move the numbers it exists to report.

Options

Both calls return a disposer.

Without any integration

If you would rather not touch the app at all:
Same data, same design, as one self-contained HTML file.