NM Company
A portfolio and enquiry site for events firm NM Company
A visual portfolio and enquiry website for an event management and supplies firm — presenting a full...
Read itNext.js 15 · App Router · RSC
React that renders on the server, ranks in Google and does not ship 300 KB of JavaScript to say hello. We build Next.js applications on the App Router with Server Components, Server Actions and a caching strategy written down per route.
For a decade the trade was miserable: pick React and lose the search engine, or pick server-rendered HTML and lose the interface. Next.js on the App Router ends the trade. Server Components render on the server and ship no JavaScript for themselves, so Google gets real HTML and your user gets a page that is interactive before a single-page app would have finished downloading its bundle. That is the theory. The reason we reach for it in practice is narrower and more useful: it is the only mainstream React framework where a marketing site, a logged-in dashboard and a public content archive can share one component library, one design system and one deploy pipeline without anybody pretending they are the same kind of page.
Talk to a Next.js engineerAcross the Next.js builds we currently run, measured on 4G field data — not lab scores.
Our budget for a content route, gzipped. CI fails the build if a PR pushes it past.
Typical reduction when we move an existing React SPA onto Server Components.
On-demand ISR revalidation from a CMS webhook. No rebuild, no redeploy.
We have shipped the App Router in production since it stabilised, and we have also had to un-ship it once. Both experiences inform how we build. What follows is what we actually do, not what the marketing site says.
The default in every project we start is a React Server Component that reads from the database or an internal API, renders to HTML on the server, and ships no JavaScript for itself. Client components are introduced deliberately, at the leaves — a date picker, a chart, a cart drawer — and they are the exception we justify in review, not the default we drift into. The practical effect is a first-load JS budget we can hold under 90 KB gzipped on a content route, against the 300 KB+ that a conventional React SPA of the same surface area ships before it renders a single pixel.
For product surfaces where the Next.js app is the only consumer, we write mutations as Server
Actions with Zod validation at the boundary and revalidateTag() for cache invalidation.
That deletes an entire tier of hand-written route handlers, request DTOs and client fetch wrappers.
We do not do this when a mobile app or a third party also needs the same operation — then it
is a real versioned REST or tRPC endpoint, and the Server Action, if it exists at all, calls it.
Choosing wrong here is the most common architectural mistake we are asked to clean up.
The Next.js cache is four caches wearing a trench coat: the request memo, the Data Cache, the Full Route Cache and the client Router Cache. Most "why is my page stale" incidents are someone reasoning about one of them while a different one is serving. We put every fetch into an explicit tag namespace on day one, keep a single module that owns revalidation, and treat an untagged fetch as a review failure. ISR with on-demand revalidation from the CMS webhook then gives us static-file latency with a publish-to-live time in the low seconds.
Marketing and content routes are statically generated and revalidated on publish. Logged-in dashboard routes are dynamic and streamed, with Suspense boundaries around anything that touches a slow upstream so the shell paints immediately. Partial Prerendering, where the static shell ships instantly and the personalised holes stream in, is the direction we take when a route is genuinely both. We record the choice per route segment in the repo, because the alternative is a codebase where nobody can say why a page is slow.
Next.js will run happily on Vercel, and for a marketing site it is worth every rupee. For an application with heavy traffic and long-running server work, the economics change fast, and we will tell you so. We deploy Next.js in a container on your own infrastructure — AWS ECS, Fly, Hetzner, whatever fits — behind a CDN, with Redis holding the Data Cache so multiple instances share it. The same app, the same code, a materially different invoice at the end of the month.
| Choose Next.js | Choose something else | |
|---|---|---|
| Public content that must rank | Yes. Server rendering plus ISR is the strongest combination available in the React ecosystem, and metadata is a first-class API. | WordPress is still fine if the site is purely content and your team already lives there. Do not rebuild it out of fashion. |
| Internal dashboard behind a login | Only if it shares a codebase and design system with your public site. Then the reuse pays for the complexity. | A plain Vite + React SPA. There is no SEO to win, so server rendering buys you nothing and costs you a build pipeline and a caching model. |
| Team has no React experience | Not on a deadline. RSC is a genuinely new mental model, and the failure mode is a codebase where everything is "use client". | Laravel with Livewire, or Blade. You will ship faster in a stack your team can already debug at 2am. |
| Highly interactive canvas or editor | The shell can be Next.js, but the editor itself is a client component and gains nothing from the framework. | Vite. Faster HMR, no server-rendering constraints to fight, and you keep the whole app in one mental model. |
| You need to control hosting cost precisely | Workable. We deploy it in a container with Redis-backed caching and the bill behaves like any Node service. | If you cannot self-host and Vercel usage-based pricing is a risk you cannot carry, a static site generator like Astro is cheaper and simpler. |
| Mobile app is also on the roadmap | Strong. The API layer, types and validation schemas are shared with a React Native client with almost no duplication. | Nothing changes this — but do build a real API tier from the start rather than leaning on Server Actions, or the mobile client will have nothing to call. |
Six shapes of project cover almost everything we are asked for.
Next.js front end, a CMS your marketing team will actually open, ISR so a publish is live in seconds without a rebuild.
Auth, org and role modelling, billing, a dashboard that streams rather than spinner-blocks, and an admin panel that support can use.
Headless Shopify, Medusa or a custom backend. Static product pages, dynamic cart, checkout that survives a sale-day traffic spike.
An existing React app moved onto Server Components route by route, shipping continuously, with the JS budget falling every sprint.
A typed, documented component library the marketing site and the product both consume, so the brand stops drifting between them.
A performance audit against field data, then the work to fix it — with budgets enforced in CI so it does not silently regress again.
The three things anyone evaluating Next.js is actually trying to find out, answered without hedging.
Statically generated content routes served from a CDN edge. The HTML is already sitting there; there is no round trip to a database on the critical path.
Because most of the page is a Server Component, there is very little JavaScript on the main thread to block an interaction in the first place.
No client-side hydration gap, no "render-blocked" pages in Search Console, no arguments with the SEO agency about whether Google runs your JavaScript.
Pages are cached as static files and revalidated on demand when the CMS fires a webhook. You get CDN latency with a four-second publish cycle.
A container on Hetzner or ECS with Redis for the shared Data Cache. Vercel is a fine choice too — but it should be a choice, not a default.
Lighthouse CI and a bundle-size check run on every pull request. A regression past the budget fails the build. Performance stops being a quarterly cleanup.
The single most common thing we are asked to do with Next.js. Here is the sequence, and it is deliberately boring.
A full crawl becomes the acceptance baseline: every URL, title, meta description, canonical and structured-data block. Any URL that changes gets a 301 mapped before code is written, not discovered afterwards in Search Console.
WordPress content is usually a pile of page-builder markup. We model it into real content types with real fields and migrate into a headless CMS, so the next redesign is a template change rather than another rebuild.
Templates are built against the migrated production content from day one — not lorem ipsum. The 4,000-word legal page and the post with fourteen images are in the build, so they cannot ambush you at launch.
The new site goes up on a staging domain and we crawl it and diff against the baseline. Missing metadata, dropped canonicals, orphaned pages and broken internal links surface here, where they are cheap.
DNS switches with redirects live and the sitemap resubmitted. We watch Search Console and field Core Web Vitals daily for a fortnight. Expect a dip while Google recrawls; expect recovery, then improvement, because the new site is faster.
Opinionated defaults. We will happily swap any of them for something you already run — but these are what we reach for when the choice is ours.
Numbers from production, not from a lab run on a MacBook on office wifi.
A Shopify storefront for a Surat ethnic-wear label — 200+ SKUs of lehengas, sarees and suits organised by type, colour,...
A fleet, ePOD and route-optimisation platform built offline-first for drivers in low-connectivity corridors — because th...
A Shopify storefront for a Surat watch and eyewear retailer — browsable by gender, brand, style and combo, with predicti...
Tell us what you are building and what is in the way. A senior engineer reads every enquiry and replies within one business day with scope, risk and a number — not a brochure.
FAQ
Proof
NM Company
A visual portfolio and enquiry website for an event management and supplies firm — presenting a full...
Read itSwasthya Sarathi
A multi-service healthcare platform that helps people find hospitals, doctors, labs, medical stores,...
Read itMV Tech Education
A course-catalogue and admissions website for a Bihar vocational institute — leading with industrial...
Read itThe framework we have shipped more business systems on than any other. Laravel 12 with Oct...
ExploreOne codebase, both stores, and a release you can fix the same afternoon. We build React Na...
ExploreNode is the right answer for real-time tiers, streaming and high-concurrency I/O — and the...
ExploreLet's talk next.js development
A senior engineer reads every enquiry. You'll get a real answer — scope, risk and a number — within one business day.