Why it matters
First-load JS is downloaded, parsed and executed before the page becomes interactive. Above ~170 KB gzip on marketing routes, mid-range phones on slow networks see multi-second TBT/INP; the Next 16 framework alone is ~133 KB.
How to fix it
Find what the route pulls in (next experimental-analyze), move work to Server Components, dynamic-import below-the-fold widgets and drop heavy client deps. Budget: marketing ≤170 KB, app ≤300 KB gzip (configurable via budgets.mobile.jsKb).
Example
const Chart = dynamic(() => import('./chart'), { loading: () => <ChartSkeleton /> })References
More lint rules
void lint reports 67 rules in this category. Static source checks with no browser: Tailwind v4 silent failures, Next.js 16 API traps, React render-body bugs, accessibility markup, SEO files and motion hygiene.
jsonld-missingNo JSON-LD structured datasitemap-lastmod-nowSitemap uses `new Date()` for `lastModified`multiple-h1More than one `<h1>` in a route's page + layoutsjsonld-deprecated-typeJSON-LD type that no longer produces rich resultsanimate-undefined`animate-*` class with no matching `--animate-*` theme variable or `@keyframes`random-in-render`Math.random()` / `Date.now()` / `new Date()` evaluated in a component render bodyduplicate-children-not-hiddenChildren repeated for a marquee/loop without `aria-hidden` or `inert` on the copiesconditional-hookHook called inside a JSX expression, `&&`, ternary or callback