Insight
Web Performance as an Engineering Discipline
By Alajdin Fetahi, Founder & Chief Executive Officer4 min read
Web Performance, Core Web Vitals, Engineering Practice, CI/CD

Performance is a product metric
Most teams treat web performance as a one-off exercise: an audit before launch, a sprint of fixes when someone complains, then silence until the next escalation. That model fails predictably, because performance is not a state you reach — it is a property you either defend continuously or lose gradually. Every dependency upgrade, every marketing script and every new feature adds weight, and the drift never announces itself unless you have built the alarm.
The teams that stay fast treat Core Web Vitals the way they treat conversion rate or error budgets: as product metrics with owners, targets and consequences. That reframing — from cosmetic concern to engineering discipline — is the entire argument of this article.
Reading Core Web Vitals correctly
Core Web Vitals measure what users actually experience: Largest Contentful Paint (LCP) for loading, Interaction to Next Paint (INP) for responsiveness and Cumulative Layout Shift (CLS) for visual stability. Two details matter more than the acronyms.
- The thresholds are field thresholds — LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1 — each evaluated at the 75th percentile of real users, not on a development machine over office Wi-Fi.
- Lab tools such as Lighthouse are reproducible but synthetic; field data reflects real devices, networks and sessions. A page can score 95 in the lab and still fail INP for users on mid-range phones.
The p75 requirement is the part leadership most often under-appreciates: it means a quarter of your traffic is allowed to be slower than the number you report. Optimizing the median flatters the dashboard while your slowest users — often the ones on the devices your customers actually own — churn quietly.
Budgets turn intent into constraints
A performance budget converts “we care about speed” into a number a build can enforce: a JavaScript weight per route, a byte ceiling for images, a maximum LCP on a throttled reference device. The exact figures matter less than three properties.
- Budgets live in the repository, versioned next to the code they constrain — not in a slide deck.
- They are allocated per route, because a marketing page and a data-heavy dashboard have legitimately different weight.
- Exceeding one is a build failure with a named owner, not a metric someone reviews quarterly.
Once a budget exists, performance conversations change character. “Can we add this analytics tag?” becomes a trade-off with a visible price, negotiated before the merge instead of discovered in production.
Gate regressions in CI, where they are cheap
A performance regression caught at code review costs minutes; the same regression found in production costs a bisect across weeks of merges, a hotfix cycle and whatever revenue it burned in between. The economics point one way: gate in CI.
- Run Lighthouse, or an equivalent synthetic check, against key routes on every pull request — with assertions that fail the build, not advisory scores.
- Diff bundle sizes per route and block the merge when a threshold is crossed; dependency bloat is the most common silent regression.
- Track remaining budget headroom over time — a budget that is 98% consumed is a warning, not a pass.
Real-user monitoring closes the loop
CI gates prevent known failure modes; they cannot see a slow third-party endpoint, a CDN misconfiguration in a single region, or the mid-range devices your lab profile never emulates. Real-user monitoring — collecting LCP, INP and CLS from actual sessions through the browser's performance APIs — is the ground truth. Segment it by device class, connection type, geography and route; aggregate at p75; alert on sustained shifts rather than single spikes. When field and lab disagree, the field is right.
What a regression actually costs
The cost of a regression is rarely one dramatic incident. It is a slow tax: a few hundred milliseconds of added LCP that shave conversion by a measurable fraction, a degraded INP that makes an interface feel cheap, a failing Core Web Vitals assessment that quietly suppresses search visibility. Because each individual regression is small, none of them triggers a project — which is precisely why only a standing discipline catches them.
This is how we approach performance in the systems we build at Vendenis: budgets defined at the start, gates in every pipeline, real-user telemetry in every production deployment. Not a service bought once, but a property the codebase enforces on itself. Teams that adopt this discipline stop running performance projects — because they stop accumulating performance debt.