Why We Default to Next.js for Almost Everything
After 100+ products shipped, one framework keeps winning the same set of tradeoffs. Here is the honest case for Next.js.
The default is a deliberate choice
We do not pick Next.js because it is popular. We pick it because, across more than a hundred shipped products, it keeps being the right answer to the same brief: ship fast, ship performant, deploy without drama, and onboard a new engineer in a day.
This is the honest case. Including the parts where it is the wrong answer.
What it gets right
App Router and React Server Components
The App Router changed how we think about data fetching. Co-locating data requirements with the components that need them, without client-side waterfalls, removes an entire category of architectural arguments from project kickoffs. RSC means the browser receives less JavaScript by default. Not as a third-iteration optimization. As the starting point.
For a studio shipping multiple builds in parallel, that defaulting matters. The framework pushes you toward the right answer.
The Vercel deployment loop
Push to main. Get a preview URL. Merge. Deploy. The pipeline takes minutes to set up and gives every client a preview environment for every pull request. For a product studio, where client feedback is continuous and fast iteration is the product, this is not a convenience. It is leverage.
Ecosystem depth
Image optimization. Font loading. Bundle analysis. Middleware. API routes. Caching primitives. These are solved problems in Next.js. We do not reinvent them. We use them and spend the saved hours on the parts of the product that are actually differentiated.
The honest tradeoffs
Next.js is not the right answer to everything. The teams that pretend otherwise lose credibility quickly.
For deeply interactive client-side apps, real-time collaborative tools, offline-first products, complex canvases, the RSC model adds friction. Plain React on a static host is sometimes the cleaner answer.
For very simple marketing sites with no dynamic data, Astro ships less JavaScript and is easier to hand off to a non-React team.
For native mobile, Next.js is obviously not in play. We have a separate opinion on React Native vs native there, and it depends on what the product actually has to do on the device.
But for the eighty percent of work that walks through the door (web apps, product frontends, marketing sites with some dynamic behavior, API-backed dashboards) Next.js is the correct starting point. Defaulting to it costs us less than re-litigating the framework choice every kickoff.
The framework serves the product. When it stops serving it, we use something else. So far, it usually does.