Virgu Technology
Back to all articles
Next.jsFrontend

Lessons from a year on the Next.js 15 App Router

What changed, what we love, and the sharp edges we still work around — a candid retrospective from production projects.

February 4, 2026 1 min readBy Rohan Karki

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

  1. Caching is powerful and confusing. The fetch cache layer, revalidatePath, and revalidateTag are all great — but the mental model takes a real investment to internalize.
  2. Client/server boundaries. Forgetting a "use client" directive still produces error messages that don't directly point to the fix.
  3. 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. searchParams makes 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.