The Next.js App Router is genuinely excellent — when you use it correctly. When you don't, you'll wonder why your Lighthouse scores are suffering and your Time To First Byte is embarrassing.
Default to server components
"use client" should be the exception, not the rule. Every time you add it, you're sending JavaScript to the browser. Start with a server component and only add interactivity where you need it.
Streaming with Suspense
Wrap slow data fetches in Suspense boundaries. This lets the shell render immediately and data stream in progressively. Users see something instantly instead of a blank page.