v133 · performance

RUM Migration Guide

Chrome 133 reverts responseStart to its pre-Early-Hints meaning and adds finalResponseHeadersStart. This guide shows the exact code change needed in a Real User Monitoring library, with a live PerformanceObserver reading your browser's actual values.

checking finalResponseHeadersStart… checking Resource Timing…
What changed in Chrome 133: responseStart reverted to return the first response (103 Early Hints included). New field finalResponseHeadersStart gives the 2xx/4xx/5xx response time. RUM libraries that were using responseStart for TTFB should now use finalResponseHeadersStart ?? responseStart.

Code diff — RUM TTFB calculation

Before pre-133 / other browsers

function getTTFB(entry) {
  // responseStart = first non-103 response
-  return entry.responseStart
-         - entry.requestStart;
}

function getServerTime(entry) {
-  return entry.responseStart
-         - entry.requestStart;
}

After Chrome 133+

function getTTFB(entry) {
  // Use finalResponseHeadersStart when
  // available (Chrome 133+) for true 2xx
+  const start = entry.finalResponseHeadersStart
+    ?? entry.responseStart;
+  return start - entry.requestStart;
}

function getServerTime(entry) {
+  const start = entry.finalResponseHeadersStart
+    ?? entry.responseStart;
+  return start - entry.requestStart;
}

Field semantics across eras

Field Pre-Chrome 130 intent Chrome 130-132 (reverted) Chrome 133+
responseStart First byte of final (non-103) response Changed to first byte incl. 103 — broke RUM Reverted: first response (103 or final)
finalResponseHeadersStart Did not exist Did not exist New: first byte of 2xx/4xx/5xx response headers
TTFB (no Early Hints) responseStart − requestStart Same (no change when no 103) finalResponseHeadersStart ?? responseStart
TTFB (with Early Hints) Only final 200 measured 103 timestamp — too early finalResponseHeadersStart − requestStart

Live PerformanceObserver — your browser's values