1.Heavy hydration hurting responsiveness (INP)
INP is Next.js's weakest mobile metric by far. Marking whole page trees "use client" ships and hydrates far more JavaScript than needed, so early taps and inputs wait on a busy main thread — especially on mid-range Android devices.
How to fix it: Keep components server-first: push "use client" to the smallest leaf components possible, and load heavy, below-the-fold widgets dynamically so they stay out of the initial bundle. Note that ssr: false only works inside a Client Component — put the dynamic import in the leaf that owns the widget.
// Inside a Client Component: keep heavy widgets out of the initial bundle
import dynamic from "next/dynamic";
const Chart = dynamic(() => import("./Chart"), {
ssr: false,
loading: () => <ChartSkeleton />,
});