Next.js 16 broke a lot of people's mental models. Not because it's bad. Because the App Router finally forced everyone to think clearly about where data actually lives.
We've taught this pattern to hundreds of builders inside MentorMe. Once it clicks, the whole framework stops feeling like magic and starts feeling like a system.
Here's the model. Strip away the jargon.
Every component in the App Router is either a server component or a client component. Server components run on the server, one time, per request (or zero times if the page is static). They can be async. They can hit your database directly. They cannot use useState, useEffect, or any browser API. Client components run in the browser and can do all the interactive things, but they cannot be async at the top level and they cannot directly touch your database.
That's the whole split. The confusion comes from forgetting which side of the line you're on.
"A route is static if it can be rendered at build time with no per-request data."
The second piece is the cache. Next.js 16 rebuilt this. The old cache was implicit and people hated it because it cached things they didn't want cached. The new model uses cacheLife and cacheTag and it's explicit. You opt in to caching. You tag what you cache. You revalidate by tag when the underlying data changes. This is how production apps should have always worked. We fought the old fetch cache for two years. The new one is a relief.
Third piece: dynamic versus static. A route is static if it can be rendered at build time with no per-request data. It's dynamic if it depends on cookies, headers, search params, or anything user-specific. Next.js decides this automatically based on what APIs you call. If you call cookies() or headers(), your route becomes dynamic. If you don't, it stays static and gets prerendered. Partial Prerendering (PPR) blurs this — the shell is static, the user-specific slots stream in dynamically. It's the best default for authenticated apps and we use it everywhere on mentorme.com.
Fourth piece, and this is where most people get stuck: where do you fetch data? Answer — as close to where it's used as possible. Don't fetch data in the root layout and prop-drill it down. Fetch it in the component that actually renders it. React and Next dedupe identical fetch calls automatically within a single render. If three components all call getUser(), only one database query runs. This means you can stop passing data through props and start calling the data function wherever you need it. This feels wrong the first time. Then it feels right forever.
Fifth piece: server actions are the new form handler. Forget API routes for mutations. A server action is an async function marked with 'use server' that runs on the server when the client calls it. It handles form submissions, button clicks, any mutation. After the mutation, you call revalidateTag or revalidatePath and Next re-renders the affected routes. No manual cache invalidation. No state management library. Just functions that touch the database and tell the cache what changed.
The common mistakes we see. First, people put 'use client' at the top of every component because they saw an error once and it made the error go away. Don't do that. Push client components to the leaves of the tree. Keep the shell server-rendered. Second, people call fetch with { cache: 'no-store' } everywhere because they're scared of stale data. Don't do that either. Use cacheTag and revalidate surgically when data changes. Third, people try to pass non-serializable props (like functions or class instances) from server to client. You can't. Props that cross the boundary must be JSON-serializable.
247%
Growth in AI job postings since 2023
The framework is doing a lot of work for you. It's deduping fetches, it's tree-shaking client bundles, it's streaming HTML, it's prerendering where it can. Your job is to not fight it. Write server components by default. Reach for 'use client' when you need interactivity. Tag your cached data. Revalidate when it changes. Let mutations be server actions.
That's the whole mental model. Everything else is documentation.
Action step: audit your Next.js app today and remove every 'use client' directive that doesn't need to be there.
Start free at mentorme.com — community, 2 courses, AI Operator Stack, and the skill library.
Related reading
Why Your AI Certificate Might Be Worthless — And What to Get Instead
Most AI certificates teach concepts. Employers hire execution. Here's why your certificate might not be helping — and what will.
Clone Yourself at Work — The Professional's Guide to AI Delegation
You're doing the job of 5 people. AI can handle 3 of those roles. Here's the professional's guide to cloning yourself.
The AI Certification That Actually Gets You Hired
62% of employers can't find AI-skilled workers. The MentorMe MCAO certification proves you can operate AI — not just use it.