Skip to content

Next.js vs Remix: The Decision Is About Caching

Both render on the server, both do nested routing, both are fine. The difference that actually shows up in a codebase is how each one treats cached data.

3 min read

These two get compared constantly and the comparisons are usually a feature table. Feature tables are not how this decision goes wrong in practice.

The difference that shows up eighteen months later is what each framework assumes about your data.

Remix assumes your data is fresh

The Remix model is a loader per route that runs on every request. Data is fetched, the page renders, the response goes out. Caching is something you add deliberately - HTTP headers, a CDN in front, your own layer.

The consequence is that Remix applications tend to be correct by default and slower by default. Nothing is stale because nothing is cached until you cache it. When something is slow, the reason is usually visible: a loader is doing too much.

Next.js assumes your data can be cached

The Next.js model is the opposite. Routes are static unless something forces them dynamic, fetch has caching semantics attached, and there are four distinct caching layers operating at once.

The consequence is that Next.js applications tend to be fast by default and occasionally wrong. The most common production bug we find is not slowness - it is a page serving data from a layer nobody remembered was there.

That is the trade, stated plainly:

RemixNext.js
DefaultFresh, request-timeCached, build-time
Typical failureSlow because a loader does too muchStale because a cache layer was forgotten
What you tuneAdd cachingRemove accidental dynamism
DebuggingRead the loaderWork out which of four caches answered

Neither is better. They fail in different directions, and you should pick the direction your team will notice.

The second real difference: where the boundary is

Remix keeps the server-client split at the route level: loaders and actions on the server, components on the client. It is a simple line and easy to hold in your head.

Next.js draws the line per component with Server Components, which is more powerful and more subtle. Done well it means the bundle contains only what is interactive. Done carelessly a single 'use client' sends half the tree to the browser, and the cost is invisible until someone measures it.

If your team is experienced with React and willing to hold that line, the Next.js model wins on what users download. If it is not, Remix's simpler split will produce a better application, because a model people apply correctly beats a better model applied carelessly.

What should not decide it

Benchmarks. Both are fast enough that your database and your images dominate.

Which is more popular. Next.js is, and popularity only matters insofar as it means more people to hire and more answers to search. That is a real argument, just not a technical one.

Which has a better deployment story. Both deploy to Node anywhere. The platform coupling people worry about is a configuration choice, not a framework property - self-hosting Next.js works and specific things stop working, which is also true of the alternative.

The honest summary

Pick Remix if you want a simple, request-time mental model and would rather add speed than remove staleness.

Pick Next.js if your content can be cached and you want that for free, and you have someone who will keep the client boundary honest.

And if neither of those describes your project, the framework may not be the question.

Back to all articles