We've now shipped half a dozen production apps on the Next.js 15 App Router. Here's the honest scorecard.
What we love
- Server components by default. Less client JavaScript, faster TTI, simpler data fetching.
- Route groups & parallel routes. Modeling complex layouts (auth/session/marketing) is finally clean.
generateStaticParams+ ISR. Best of both worlds for content-heavy sites.
What still has sharp edges
- Caching is powerful and confusing. The
fetchcache layer,revalidatePath, andrevalidateTagare all great — but the mental model takes a real investment to internalize. - Client/server boundaries. Forgetting a
"use client"directive still produces error messages that don't directly point to the fix. - Edge runtime gotchas. Some Node APIs you take for granted aren't there. Test early.
Patterns that have aged well
- Keep server components as the default. Only opt-in to client when you need state or browser APIs.
- Co-locate data fetching with the component that uses it — server components make this easy.
- Treat the URL as the source of truth for filter/sort/page state.
searchParamsmakes this nearly free.
If you're starting a new project today, App Router is the right default. Just budget a few extra days for the team to internalize the caching model.