Skip to content

Next.js Migration & Rescue

Pages Router to App Router, another framework to Next.js, or an inherited codebase nobody wants to touch — migrated incrementally, in production, without a freeze.

Two situations bring most teams here. Either an existing Next.js application has outgrown the Pages Router and the incremental path is not obvious, or an application built by someone else has become something the current team is afraid to deploy.

Both are tractable. Neither requires a rewrite.

Pages Router to App Router

The two routers interoperate. That is the whole strategy: a shared application where app/ and pages/ coexist, migrated leaf-first, with each route moving behind its own pull request and its own verification.

We start with low-traffic, low-risk routes to build the shared patterns — layouts, data access, error boundaries — then work up to the routes that matter. Data fetching moves from getServerSideProps into the component tree. Client state that only ever existed to compensate for the old rendering model usually disappears entirely.

Another framework to Next.js

Create React App, Vite SPAs, Gatsby, and a long tail of bespoke webpack configurations. The mechanical part is routing and build configuration; the part that takes judgement is deciding which of the application's assumptions were framework artefacts and which were real requirements.

Inherited codebases

Before we change anything, we read everything. Two weeks of orientation produces a dependency map, a rendering inventory of every route, a list of what is dead, and a ranked risk register. That document is yours regardless of what you decide next — it is the thing that makes the codebase governable again, and several clients have taken it in-house and done the work themselves.

We think that is a reasonable outcome.

Frequently asked questions

Do we have to stop shipping features during the migration?
No. The App Router and Pages Router run side by side in the same application, so we migrate route by route while your team keeps shipping. A feature freeze is a sign the migration was planned badly.
What if the existing code is genuinely bad?
Then we say so, with specifics and a cost comparison between incremental migration and a rebuild of the affected surface. We have no incentive to recommend the longer path, and a rewrite is usually the wrong answer.
Can you take over a project the previous team abandoned?
Yes. That is a meaningful share of our work. We start with a two-week orientation — reading, mapping and documenting — before touching anything, and you get that map whether or not you continue with us.