Skip to content
·4 min read

Next.js App Router Patterns That Actually Scale (After 3 Production Apps)

App Router shipped in 2023. Three years later, most teams still use it like Pages Router with extra folders. Here's what actually scales past the demo.

Next.jsReactApp RouterWeb Dev

App Router shipped in Next.js 13. Three years and three production apps later, most teams still use it like Pages Router with extra folders. They add "use client" to everything, write API routes for every form, and wonder why their bundle is 800KB.

The win of App Router isn't the folders. It's Server Components, layouts that don't re-render, and Server Actions that replace half your API routes. Here's what actually scales, after shipping this on real client projects.

Default to Server Components — opt out, don't opt in

The biggest mental shift: every component is a Server Component by default. You don't add anything. You opt out with "use client" only when you need interactivity.

// app/products/page.tsx
// No directive. This is a Server Component.
 
import { db } from '@/lib/db'
import { ProductGrid } from './ProductGrid'
import { Filters } from './Filters'
 
export default async function ProductsPage() {
  const products = await db.product.findMany()
  return (
    <>
      <Filters />           {/* Client Component — interactive */}
      <ProductGrid products={products} />  {/* Server Component */}
    </>
  )
}