Anatomy of a Vercel Migration: Moving a Legacy App to Next.js Without a Rewrite

"Just rewrite it" is rarely the right answer for a legacy app that's still generating revenue. The teams that migrate successfully tend to move incrementally — routing an increasing share of traffic to the new stack while the old one keeps running underneath it.

That usually means standing up Next.js and Vercel alongside the existing app, using routing rules to peel off one section of the product at a time, and treating each migrated section as a small, independently shippable win rather than one long project with no visible progress until the end.

This post walks through that process as a composite case study drawn from migration work I've done, including where the incremental approach paid off and where it added complexity worth knowing about going in.