Skip to content

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.

Frequently asked questions

Do you work from Lighthouse scores?
Not as the primary signal. Lighthouse is a lab tool and it is useful for reproducing a problem, but ranking and revenue follow field data. We start with Chrome UX Report and your real-user monitoring, then use the lab to isolate causes.
What if the problem is our CMS or our third-party scripts?
Then that is the finding. A large share of LCP and INP regressions we trace end at a tag manager, a chat widget or an unoptimised media pipeline rather than at application code. We report the cause we find, not the one that is convenient.
Can you guarantee a score?
We agree a target with you against field data and we tell you before we start whether it is reachable within the current architecture. If it is not, the honest answer is a rebuild of the affected route, and we will say so.