Next.js Performance Engineering
Core Web Vitals work on existing Next.js applications — measured against field data, fixed at the architectural cause, and defended in CI so the numbers stay fixed.
Performance work has a failure mode: a team spends a sprint on optimisation, the score jumps, and six weeks later it is back where it started. Nothing was wrong with the fixes. What was missing was a mechanism to keep them.
How an engagement runs
Measure first, from the field. We begin with Chrome UX Report data and your RUM, segmented by device class and route template. A p75 LCP of 3.4s on mobile product pages is an actionable statement; "our Lighthouse score is 62" is not.
Find the cause, not the symptom. A slow LCP is a rendering decision, a font strategy, an image pipeline or a blocking third party. A poor INP is almost always the size and shape of the JavaScript that hydrates above the fold. We trace each metric to the specific commit-level decision that produced it.
Fix at the architectural level. Moving a component across the server boundary, removing a client-side data fetch that should have been a server render, replacing a 300KB date library, splitting a route that ships the entire admin bundle to anonymous visitors. These are the changes that hold.
Defend the result. Every engagement ends with a performance budget enforced in CI. A pull request that pushes the route bundle past its ceiling fails the check. The budget is the deliverable; the score is a side effect.
What you receive
A prioritised findings document with each issue traced to its cause and sized by effort, the implemented fixes as reviewable pull requests, the CI budget configuration, and a before/after comparison against field data once the change has been live long enough to move the 28-day window.
