Server-first, nested layouts, streaming, Server Actions, and cacheComponents: what makes App Router the reasonable base for SaaS in 2026.
If you've been around React for a while, you remember Pages Router. It worked, but dragged a lot of
baggage: getServerSideProps, _app.tsx, mixed runtimes. With App Router (stable since Next.js 13,
mature in Next.js 16), Vercel reshuffled the deck: server-first, nested layouts, native streaming.
This guide explains why App Router is the 2026 default and what Next.js 16 brings over previous versions.
In App Router, every component is a Server Component unless you mark it 'use client'. That
changes how you think:
getServerSideProps.// Server Component - default
import { db } from '@/lib/db/client';
export default async function PostsPage() {
const posts = await db.post.findMany();
return (
<ul>
{posts.map((p) => (
<li key={p.id}>{p.title}</li>
))}
</ul>
);
}No getServerSideProps. No prop drilling. No SWR for data only the server reads.
Each folder can have its own layout.tsx. Layouts persist across navigations (don't re-mount),
which improves UX and saves work:
app/
layout.tsx ← root layout (HTML, fonts)
dashboard/
layout.tsx ← persistent sidebar
page.tsx ← dashboard home
settings/
page.tsx ← content changes, sidebar staysIn Pages Router you simulated this with _app.tsx and tricks. In App Router it's native.
You can render partially: show the layout fast and fill heavy parts as they arrive. <Suspense>
with a per-folder loading.tsx gives progressive spinners without you writing state.
<Suspense fallback={<Skeleton />}>
<SlowComponent />
</Suspense>The user sees UI before the whole page is ready.
Server Actions are server-side functions invoked from the client with no explicit endpoint. For forms and mutations it's the most comfortable thing React has ever had.
'use server';
export async function createPost(formData: FormData) {
await db.post.create({ data: { title: formData.get('title') as string } });
}No /api/posts/create, no fetch, no duplicated types. Modern boilerplates wrap them in helpers like
createAuthenticatedAction for validation + auth.
Next.js 16 consolidates the trajectory:
cacheComponents: granular opt-in caching per component. Fine control over what caches
and what revalidates.use() for promises, better transitions.1. Defaulting to 'use client': turn it on and you lose server-first. Only use it when needed
(hooks, events, browser APIs).
2. Calling hooks in Server Components: not possible. If you need state, that part is client.
3. Importing heavy SDKs in the client: Prisma, AWS SDK, etc., are server-only. Import them in client components and the bundle blows up.
4. Not using nested layouts: if everything hangs off the root layout, you lose persistence across navigations. Use the hierarchy.
Almost never. In 2026 App Router is mature. The only real case is a legacy project deep in Pages Router with no migration budget. New project: App Router every time.
Next.js 16 + App Router is the reasonable default for SaaS in 2026. Server-first, nested layouts,
streaming, Server Actions, and cacheComponents cover 95% of needs without extra libraries.
If your boilerplate still ships Pages Router in 2026, technical debt will catch up with you. And if you're starting something new, the decision is already made before day 1.
Subscribe for more tutorials and tips on building products with AI
On Apr 25 2026 MinIO archived its community edition. We migrated Click2Eat and yamltools.dev to self-hosted Garage (S3-compatible, AGPLv3). Four undocumented gotchas, the shared S3 API + product-dedicated CDN pattern, and a complete migration checklist.