framework / 01 — updated may 2026

Next.jsby vercel

The most opinionated full-stack React framework. App Router is the default in 2026; Pages Router is legacy. The right choice for most product builds — for the right reasons, not for hype.

languageTypeScript-first
runtimeNode.js · Edge · Bun
renderingRSC · SSG · ISR · streaming
bundlerTurbopack (default in 16+)
verdict.txt — frameworks/nextjs.mdhonest
$cat verdict.txt

Pick Next.js if you want the best deploy-to-Vercel experience, the largest React-framework ecosystem, and you're okay with strong opinions about routing, caching, and where your code runs.

verdict / bull case + bear case

Why we picked it — and why we might not

Next.jsis the default React framework in 2026 not because it’s the smallest or the simplest, but because it’s the one with the least friction across the widest set of problems — provided your problem is shaped like a React product on Vercel.

The bull case is straightforward. App Router, Server Components, and Server Actions collapse what used to be three layers (page, API route, client fetcher) into one mental model. The Vercel deploy story is unmatched — push to git, get a preview URL, promote on click. The ecosystem is the largest in React: every auth provider, every database client, every UI library has a first-class Next.js example, and the AI assistants understand Next.js better than they understand any other framework. For a team that’s already on React, choosing Next.js means choosing the path with the most documentation, the most third-party integrations, and the most worked examples.

The bear case is also real. The cache model is the most complex in the ecosystem; newcomers fight it before they understand it, and “wait, is this server or client?” is a permanent confusion for the first month. Bundle size meaningfully exceeds Astro and SvelteKit — fine if you’re using RSC, pure overhead if you’re not. Lock-in is medium-strength: ISR-on-demand, image optimization, and middleware all bind tighter to Vercel-style hosts than to a generic Node server. Self-hosting works, but you trade deploy ergonomics for it.

For most product teams the calculus comes out in Next.js’s favor, but the failure modes are specific and worth naming. If your app is a SPA, Vite + React Router ships less code. If your site is content-first, Astro is a better fit. If you need a pure backend, Hono or Fastify are the right answer. The honest summary: Next.js is the right default, not the right answer in every case.

scoreboard / at a glance

At a glance

One row per dimension. The value is what Next.jsgives you; the note is the editorial framing — the quiet caveat that the marketing page won’t mention.

Routing
file-system · App Router (server-component default)Powerful but introduces a learning curve for teams used to Pages Router or React Router.
Rendering
RSC · SSG · ISR · PPR · streamingEvery rendering strategy in one framework. Powerful, also the source of “wait, is this server or client?” confusion.
Data fetching
async server components · server actions · use cacheBest-in-class for the App Router model; can confuse teams coming from REST/GraphQL clients.
Hosting fit
Vercel-native · Cloudflare Pages · Node servers · DockerDeploys anywhere Node runs, but Vercel's integration is the most polished.
Bundle size
meaningful overhead vs Astro/SvelteKitPays for itself if you need React Server Components; pure waste if you don't.
Learning curve
steep for App Router · gentle for PagesPages Router is being phased out — invest in App Router.
Ecosystem
largest in React · all major auth/db/ui libs first-classThird-party docs and AI assistants understand Next.js better than any other framework.
TypeScript support
first-class · types ship with the frameworkTyped routes, typed metadata, typed server actions.
Lock-in
medium · ISR + image + middleware bind to Vercel-style hostsSelf-hostable, but you lose ISR-on-demand and pay for the rest in operational complexity.
Framework age
9 years · Next.js 16 (May 2026)Mature, with the update cadence to match — major version every ~12 months.
pricing / three scenarios

Pricing at three scales

Three receipts at three traffic shapes. Numbers are illustrative — list-tier prices from May 2026, rounded to the dollar. Nothing here is invented; actual bills will vary with usage shape.

hobby.txt — 1k MAU · weekend projectmonthly
line itemdetailcost
HostingVercel Hobby — freefree
DatabaseNeon free tier — freefree
TOTAL · monthlyfree/mo
>Both Vercel Hobby and Neon free tier cover any side project. The free tier is genuinely usable in production for very small workloads.
side-project.txt — 10k MAU · steady traffic · paying customersmonthly
line itemdetailcost
HostingVercel Pro$20
DatabaseNeon Launch$19
Bandwidthwithin Pro 1TBfree
TOTAL · monthly$39/mo
>Vercel Pro buys you preview deploys, team seats, and headroom for moderate traffic. Neon Launch is the right DB tier for a real product at this scale.
scale.txt — 100k MAU · production · multi-regionmonthly
line itemdetailcost
HostingVercel Pro + Active CPU$60
Bandwidth1TB+ over Pro · egress$60
DatabaseNeon Scale$69
Functionsoverage$30
TOTAL · monthly$219/mo
>Vercel's pricing rewards you for elasticity but bandwidth scales aggressively. At this scale teams sometimes front Vercel with Cloudflare to cut egress.
features / deep dives

Feature by feature

Six rows. The body describes how the feature works in 2026; the honest tradeoff is the part the docs won’t tell you. Skim the bold lines if you’re in a hurry.

01

Routing

where files become URLs

App Router uses file-system conventions in /app with nested layouts and Server Components as the default. Pages Router lives in /pages and uses traditional React + getServerSideProps. In 2026 App Router is the default — Pages Router still works but new features ship to App first.

Honest tradeoff

App Router is more powerful but the file-system conventions take a week to internalize. Pages Router is simpler mentally but is a sunsetting technology.

02

Server Components

the new default

RSC are the default. Components run on the server unless marked "use client". Async/await in components, direct DB access from JSX, no API layer needed for many cases. The mental model takes adjustment but the simplification is real once it clicks.

Honest tradeoff

When you fight RSC, you're fighting Next.js's direction of travel. When you embrace it, you write less code.

03

Data fetching + caching

fetch, dedupe, revalidate

Server Components fetch with native fetch() that’s automatically deduplicated and cached. The "use cache" directive (Cache Components, GA in Next.js 16) makes the cache lifecycle explicit. cacheLife() and cacheTag() control invalidation.

Honest tradeoff

The cache model is the most powerful in the ecosystem and also the most complex. Newcomers fight it before they understand it.

04

Server Actions

no more /api boilerplate

Server Actions let you call server functions directly from forms or event handlers — no /api routes, no fetch wrapper. Type-safe end-to-end when paired with TypeScript.

Honest tradeoff

Eliminates the API layer for many use cases. Doesn't eliminate the need for an API layer when you have mobile clients or external consumers.

05

Deployment

git push, get a URL

Vercel deploys are the gold standard — push to git, get a preview URL, promote to production. Self-hosting works via next start or Docker, but ISR-on-demand requires platform support. Cloudflare and Netlify have decent Next.js support; neither matches Vercel.

Honest tradeoff

Vercel-deploy is best-in-class. Anywhere else, you trade deploy ergonomics for portability.

06

Bundling (Turbopack)

the new default in 16+

Turbopack replaced Webpack as the default in Next.js 16. Build times are 2-5x faster on large apps; HMR is meaningfully snappier. Some Webpack-only plugins haven't ported yet.

Honest tradeoff

Faster by default. The plugin ecosystem gap closes monthly.

fit / use or skip

Use it for, skip it for

use / nextjs

Use Next.js for…

  • You're building a React product and want one framework, one team, one deployment story.
  • SEO and content surface area matter — RSC + ISR + image optimization compound on a content site.
  • Vercel is the deploy target you want, or platform-locked-to-Vercel is acceptable for the polish.
  • Your team is comfortable with TypeScript and async-await as daily tools.
  • Realtime / streaming UX is part of the roadmap and you want React Server Components' streaming for it.
skip / nextjs

Skip Next.js for…

  • Your app is fundamentally a SPA — Vite + React Router is simpler and ships less JS.
  • You're allergic to magic. Next.js's caching and routing conventions are opinionated; some teams find them too implicit.
  • You're not on Vercel and don't want to be — self-hosting works, but loses platform features.
  • Static-content first sites — Astro ships less JS and has better DX for content-heavy use cases.
  • You need a pure backend without a frontend — Hono / Fastify are the right answer.
gotchas / observed

Gotchas worth knowing

Six pitfalls visible in public docs and community discussion. None will stop you shipping; all of them will cost you an afternoon if you don’t know about them.

  • Next.js / caching

    fetch() is cached by default, silently

    In RSC, fetch() responses are cached indefinitely unless you opt out. The first time a developer realizes their “fresh” data is stale until rebuild is a formative moment. Pass { cache: 'no-store' } or use revalidatePath/revalidateTag.

  • Next.js / dynamic

    use client doesn't make a component dynamic

    A "use client" boundary is for interactivity, not for skipping prerendering. Marking a component with cookies()/headers() forces dynamic rendering; "use client" alone does not. Two different concepts that look similar.

  • Next.js / images

    next/image needs configured domains

    External image hosts must be allowlisted in next.config.js. Forgetting this in production gives you 400 errors that don’t reproduce locally because dev mode is more permissive. Configure remotePatterns up front.

  • Next.js / middleware

    middleware runs on every request, including assets

    A naive middleware that queries a DB on every request will exhaust connection pools. The matcher config exists for a reason — restrict middleware to the routes that need it.

  • Next.js / ISR

    revalidate=0 is not the same as no caching

    revalidate: 0 means “always revalidate at request time” but the response is still cached briefly between builds. For truly dynamic content, opt out of caching with cookies()/headers() or noStore().

  • Next.js / build

    static generation runs your server-side code at build time

    A page that fetches from a DB at the top level will hit the DB during next build. Builds fail in CI when DB credentials aren’t available there. Either supply build-time creds or skip static generation for those routes.

how it compares / different bets

How it compares

Three short framings. No clear-winner declarations — these are different bets, and the right pick is mostly a question of what you’re optimizing for. Linked comparison pages have the side-by-side detail.

Next.js ━▶ SvelteKitdifferent bets

SvelteKit ships less JS by default and has a tighter, more cohesive API surface. The compiler buys you smaller bundles and a friendlier mental model — there's less to learn before you're productive.

Next.js wins on ecosystem reach and on RSC-shaped problems where streaming and partial hydration pay off. SvelteKit wins on bundle size, API consistency, and any project where the React ecosystem isn't already a hard requirement. Pick SvelteKit when team familiarity with React isn't the deciding factor.

Next.js ━▶ Astrodifferent bets

Astro is content-first. Islands architecture means most of the page is HTML with selectively-hydrated components, and the result ships dramatically less JavaScript than a Next.js app. For docs sites, marketing sites, and blogs, the DX gap is real and so is the performance gap.

Next.js wins the moment the product is more app than content — dashboards, social products, anything with frequent state and authenticated views. Astro wins when the page is mostly content with a few interactive bits. Use the right tool for the page shape; many teams use both side-by-side.

Next.js ━▶ Remixdifferent bets

Remix (now part of React Router 7) bets on web-platform primitives — forms, fetch, nested routes — and on running anywhere. It feels closer to a server-rendered framework with progressive enhancement than a React metaframework.

Next.js wins on Vercel polish, on RSC + caching, and on third-party integration breadth. Remix wins on portability, on form-and-mutation-heavy apps, and on teams that prefer convention-over-configuration with fewer escape hatches. The two have converged enough in 2026 that the right pick is mostly a question of hosting target and team taste.