Skip to content

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Scope and terms

Engagement model
Fixed scope, agreed in writing before work starts. Not a day rate against an open backlog.
Price and timeline
Both are set per project, once the scope is. Quoted together, before anything is built.
What we need from you
One person who can approve decisions, and access to your repository and issue tracker.
Not included
Anything outside the agreed scope. It becomes its own scope rather than a variation order.
Third-party costs
Hosting, licences, API fees and SaaS subscriptions are contracted and paid by you.
Invoicing
Codefacture Yazılım A.Ş., Türkiye. EUR, USD or GBP by bank transfer, with no Turkish VAT on exported services.

Frequently asked questions

Do you work with the App Router or the Pages Router?
App Router, on every new build. We maintain Pages Router codebases and migrate them, but we do not start new projects on it - the rendering model, caching primitives and streaming support in the App Router are where the framework is actually going.
How long does a typical build take?
There is no typical build - it depends on scope, and a number given before we have seen yours would be a guess. How many surfaces, how much data behind them, how many systems to integrate: those decide it, not the framework. We scope it with you first, then work in fixed phases with a deployment you can use at the end of each one.
Who owns the code?
You do, from the first commit. We work in your repository or hand over ours, with the git history intact.
Can our own engineers work alongside you?
Yes, and on most builds they should. Their reviews are how the conventions transfer. Where your team is already capable and the gap is architectural rather than capacity, the engagement you want is App Router development instead - we set the model, your team builds on it.
What happens when the engagement ends?
You get the repository, the architecture note explaining why each route renders the way it does, the CI configuration including the performance budget, and a handover session per surface. If you want us to stay for maintenance that is a separate arrangement, not a dependency we build in.
Do you take over if the build is already half finished?
Often, yes - but that is migration and rescue rather than this, and it starts with reading the codebase rather than writing in it. The route inventory that produces is yours whether or not the work continues with us.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page