Web application development
Next.js Application Development
Greenfield Next.js applications built on App Router - typed end to end, fast by budget, and structured so the second year of development is cheaper than the first.
Most Next.js projects fail slowly. The first release ships on time and looks
fine. Then the bundle creeps, use client spreads upward through the tree,
every page quietly becomes dynamic, and eighteen months later the team is
arguing about a rewrite.
That decay is architectural, and it is preventable. None of the decisions that cause it are difficult at the moment they are made - they are just made without anyone noticing that a decision was being made at all.
What we build
We take on greenfield applications where rendering strategy actually matters: commerce front-ends, SaaS product surfaces, documentation platforms, multi-region marketing sites, and content systems that have to serve thousands of routes without a build that takes an hour.
Where a build has a shape of its own, it has its own page - commerce has a catalogue and a cart with different cache lifetimes on the same screen, SaaS has authenticated surfaces where almost nothing can be static, and enterprise adds SSO, data residency and procurement to all of it. This page is the work those share.
How the architecture is decided
Rendering strategy is chosen per route, not per project, and it is written down before implementation starts:
- Static for anything whose content changes on a publish rather than a request - marketing pages, documentation, the blog.
- Incremental revalidation for content that changes on its own schedule, with revalidation tags wired to the CMS webhook rather than a fixed TTL.
- Dynamic and streamed for genuinely per-request surfaces - dashboards, carts, anything behind authentication - with Suspense boundaries drawn so the shell paints immediately and slow data arrives late.
The client/server boundary is treated as a design artefact. Server Components
are the default; use client is a deliberate, reviewed decision that stops at
the smallest interactive leaf rather than propagating to a layout.
That sounds like a style preference until you price it. A use client
directive on a layout ships that layout, its children and their dependencies
to every visitor on every route beneath it. The same directive on the one
dropdown that needs state ships a few kilobytes. The code is identical; the
placement is the entire cost.
The data layer is decided at the same time
Rendering strategy is meaningless without knowing where the data comes from and how stale it is allowed to be. So the two are specified together, per surface: the source system, the shape after it crosses into the application, who is allowed to read it, and what invalidates it.
Types run end to end - from the API client or database query through to the component that renders the value - because a typed boundary is what turns a backend change into a failed build rather than a blank space on a page in production. Where a CMS is involved, that integration is part of this work rather than a phase bolted on after the front end is built, which is the sequencing that produces a content model nobody can edit.
How an engagement runs
In phases, each ending with something deployed that you can use.
- Scope and architecture. Route inventory, rendering decision per route, data sources, the integration list, and the boundary rules. This is the phase that decides the cost of every later one, and it produces a document rather than a slide deck.
- The spine. Routing, layouts, the data layer, authentication if there is any, the component primitives, and CI with the budget already enforced. Nothing visual is finished; everything structural is.
- Surfaces, in priority order. Built against the conventions set in phase two, reviewed by your engineers if you have them, deployed at the end of each iteration rather than accumulated for a launch.
- Hardening and handover. Performance measured against the budget rather than a score, accessibility checked at the component level, the architecture note written, and a walkthrough per surface with whoever inherits it.
We work in your repository, on your issue tracker, in your review process. A build that lives in our tooling until launch day is a build your team meets for the first time when it is too late to disagree with it.
What makes the estimate move
Not the framework. The things that decide how long a Next.js build takes are the same things that decide how long any build takes, and being told which ones apply to you is more useful than a day rate:
- How many systems it has to talk to. One CMS is a week. A CMS, an ERP, a payment provider and a legacy SOAP endpoint that nobody has documented is a different project.
- Whether the content model exists. Building against a model that is still being argued about is the most reliable way to build the same screen three times.
- How much of the surface is authenticated. Authenticated surfaces cannot be statically served, so they cost more to make fast and more to test.
- Whether a design system exists or is being invented in flight. Both are fine; they are not the same amount of work.
- How many locales, and whether they are real translations or the same page with a flag on it. International routing changes the URL structure, which is not a late decision.
What ships with it
Every build leaves with a typed data layer, a component library documented in the repository, CI that runs typecheck, lint and a performance budget on every pull request, and an architecture note explaining why each route renders the way it does.
That last document is the one that matters in year two. It is the difference between a codebase your team extends and a codebase your team replaces.
When this is the wrong engagement
If you have capable engineers and the gap is architectural rather than capacity, you want App Router development: we set the boundary, the cache model and the route structure, your team builds on it, and the knowledge stays in your building.
If an application already exists and the problem is that it has become difficult to change, that is migration and rescue, and it starts by reading rather than writing.
If you are not yet sure which of those is true, an audit answers it in two weeks and costs a fraction of guessing wrong.
