Features · Measure
LCP, INP, CLS, FCP and TTFB collected from actual visitors through the browser's own PerformanceObserver. Reported at the 75th percentile, because that is how Google defines the thresholds and because an average hides exactly the visits that hurt.
A synthetic run from a fast machine on a fast connection tells you very little. These are your real visitors on their real devices.
A handful of slow visits drags a mean around and manufactures a "nothing is wrong" reading. The 75th percentile is what the standard uses.
Mean LCP per page with a minimum sample size, so a single unlucky visit cannot put a page at the top of the list.
PerformanceObserver is already in the browser. Adding the web-vitals package would have cost more bytes than the rest of our tracker.
The evidence
SELECT ROUND(MAX(CASE WHEN rn_lcp = target_lcp THEN lcp END), 0) AS lcp, …
FROM (SELECT lcp, inp, cls,
ROW_NUMBER() OVER (ORDER BY lcp) AS rn_lcp,
CAST(0.75 * COUNT(*) OVER () AS INTEGER) + 1 AS target_lcp
FROM (SELECT CAST(json_extract(props,'$.lcp') AS REAL) AS lcp …
FROM events
WHERE site_id = ? AND ts >= ? AND ts < ?
AND bot_kind = '' AND name = 'web_vitals'))
The percentile is computed in SQL, so the number you see is the number that ran.