Supported
Two Next majors, both bundlers. Outside that range crust refuses to run rather than emit output
derived from artifacts whose shape has not been verified.
The production-build compatibility suite pins route classification, shell discovery, source
attribution, and cause relationships across:
- Next.js 15 with webpack and its legacy rendering rules
- Next.js 16 with webpack, Cache Components on and off
- Next.js 16.3 with webpack, Instant Navigations declared in config and per route
- Next.js 16 with Turbopack
- static, dynamic, ISR, partially static, catch-all, optional catch-all, and route-handler output
- monorepos, aliases, workspace packages, and barrel exports
- source attribution across webpack and Turbopack
Manifest shapes and artifact locations are undocumented and move on minor releases. A nightly CI job
runs the fixtures against
next@canary, so breakage surfaces before an issue does.Non-goals
These are permanent. They were written down before the first user arrived, because saying no in month three is only easy if you said it in month zero.Not a runtime APM
Not a runtime APM
No error tracking, no distributed tracing, no alerting. The optional
span aggregator groups render time by route and stops there.
No composite performance score
No composite performance score
Build and runtime observations remain separate and retain their source evidence. crust does not
collapse unrelated measurements into one score.
Not multi-framework
Not multi-framework
Next.js App Router only. A Pages Router app gets a clear refusal; a hybrid app gets its
app/
routes analysed with a warning that pages/ is invisible to every number.Not a hosted service
Not a hosted service
No accounts, no SaaS dashboard. Snapshots live in your repository.
Not a bundler
Not a bundler
It reads build output. It never changes how your app builds in production.
No config file
No config file
Until three separate people request the same option. Zero-config is a feature, and config
surface is permanent API you cannot remove. The two JSON escape hatches in
.perf/ are data, not configuration.Known limits
- Per-file attribution needs
productionBrowserSourceMaps. Without it, route totals and shell analysis still work; attribution reports itself unavailable. - Function tracing has a conservative fallback. Direct imports are narrowed per export; namespace imports, computed calls, and opaque edges fall back to module-level taint and are reported in coverage.
- The stamping transform is not built. Component-level runtime attribution would need it; source maps cover file-level attribution instead, and measure better on Turbopack than webpack.
- Server components rendered from props or
childrenare reported as unknown rather than guessed at.