Why it matters
Analytics, chat and tag-manager scripts loaded with the default afterInteractive (or as a blocking ) compete with hydration and inflate TBT/INP. beforeInteractive only works in the root layout.
How to fix it
Load third-party scripts with next/script strategy="lazyOnload" (or worker). Reserve beforeInteractive for consent/bot-detection in app/layout.tsx.
Example
import Script from 'next/script'
<Script src="https://www.googletagmanager.com/gtag/js?id=G-XXXX" strategy="lazyOnload" />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.
missing-altImage without `alt`google-fonts-linkGoogle Fonts loaded via `<link>` / `@import`font-display`@font-face` without `font-display`too-many-font-familiesMore than 3 font families loadedbrowser-global-in-renderBrowser global (`window`, `document`, `navigator`, `localStorage`) at module scope or during rendertimer-in-render`setTimeout` / `setInterval` called in a component bodymotionvalue-subscribe-in-renderMotionValue `.on("change")` subscription in a component bodywebgl-in-mapWebGL canvas rendered inside `.map()`