Why it matters
Subscribing during render adds a new listener on every render and never unsubscribes, so callbacks multiply and memory grows while the animation runs.
How to fix it
Use useMotionValueEvent(value, 'change', cb), or subscribe in useEffect and return the unsubscribe function.
Example
useMotionValueEvent(scrollY, 'change', (y) => setScrolled(y > 8))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.
too-many-font-familiesMore than 3 font families loadedscript-strategyThird-party script loads too earlybrowser-global-in-renderBrowser global (`window`, `document`, `navigator`, `localStorage`) at module scope or during rendertimer-in-render`setTimeout` / `setInterval` called in a component bodywebgl-in-mapWebGL canvas rendered inside `.map()`raf-without-cancel`requestAnimationFrame` loop in an effect without `cancelAnimationFrame`listener-without-cleanupEvent listener or interval added in an effect without cleanupscroll-listener-nonpassive`wheel` / `touchstart` / `touchmove` listener without `{ passive: true }`