Back to news

Next.js App Router: Why We Switched and Never Looked Back

After years of Pages Router, we moved our entire workflow to App Router. What changed, what broke, and why we'd do it again.

When Next.js dropped the App Router, the community was split. Some embraced it right away, others called it overcomplicated. We waited, tested it out, and eventually moved all new projects to App Router. Right call.

What We Gained

Server Components by default. Biggest win: components don't ship JS to the client unless they need to. Our bundle sizes dropped hard. Pages that shipped 200KB of client JS went down to 40KB because most rendering happens server-side.

Nested layouts. Shared UI (headers, sidebars, nav) that sticks around across route changes without re-rendering. Used to be painful with Pages Router. Now it's just built in.

Streaming and Suspense. We can show loading states for slow data fetches without blocking the whole page. The shell renders instantly, content fills in as data arrives. Users perceive it as faster even when total load time is similar.

Colocation. loading.js, error.js, and page.js in the same directory. Makes the codebase way easier to navigate. Everything for a route lives together.

What Was Painful

The 'use client' boundary took time to click. Figuring out when you need client interactivity vs. server rendering requires a mental shift. We spent a few weeks debugging hydration mismatches before it all made sense.

Third-party library compatibility was rough at first. Many React libraries assumed client-side rendering. Most have caught up by now, but in early 2025 it was a real pain point.

The Verdict

App Router is our default for every project now. Performance benefits alone justify the learning curve. If you're still on Pages Router, no rush to migrate existing stuff. But for anything new, App Router is the move.