Skip to content

Application architecture

Next.js App Router Development

App Router architecture for teams with their own engineers - the server/client boundary, the caching model and route organisation decided deliberately, with your developers in the pull requests.

This is the one to read if you have engineers and the problem is not capacity. You are building on the App Router, the team is capable, and the architecture decisions are being made by whoever touched the file last.

If what you want is a product built end to end, that is application development and it is a different engagement - we hold the delivery. Here you hold it, and we make sure the model underneath is right while your team builds on it.

The four decisions that are expensive later

Where the client boundary sits. use client drifts toward the root one reasonable commit at a time - a dropdown needs state, the header gets the directive, and eighteen months later the layout is a client component and every route ships the whole tree. We set the boundary deliberately and make it a review rule, which is worth more than any bundle analyser because it catches the drift when it starts.

Which cache holds what. There are four, with four lifetimes, and "we changed the data and the page did not update" is almost always a confusion between them rather than a bug. A tag naming convention your team actually applies is the deliverable here.

What is allowed to make a route dynamic. One cookies() call in a shared component turns every route below it dynamic and costs you the CDN. Knowing which reads do that, and keeping them behind a boundary, is the difference between a site that serves from the edge and one that renders per visitor.

How routes are organised. Route groups, parallel routes and intercepting routes solve real problems and are also the easiest way to build something nobody can navigate. We use them where they earn it.

How it runs

Not a deck. We work in your repository for a fixed period - typically four to eight weeks - and the work is pull requests your engineers review, plus the conventions written down where the code is.

The usual shape:

  1. A read of what exists. The rendering mode of every route, the boundary, the caches in use, the First Load JS per route. Two weeks, and the same document an audit produces.
  2. The decisions, made and written. Boundary rule, cache tag convention, route structure, and what is allowed to be dynamic.
  3. Applied to the routes that matter, with your team in the reviews. Not all of them - enough that the pattern is unambiguous and they can finish.
  4. A performance budget in CI, so the decisions survive the engagement.

Why this is a separate service

Because the alternative is a team learning the rendering model through production incidents, which is the most expensive way to learn it and the most common.

Most of what goes wrong in App Router applications is not difficulty. It is that the defaults are good enough to ship with, so nobody chooses, and the choices get made by accident. The full explanation of the model is public - the App Router rendering model, explained properly - and this is that, applied to your codebase with your engineers.