v136 · performance
RUM Dashboard
Simulate a Real User Monitoring dashboard that uses Chrome 136's bimodal timing signals to split navigation samples into "cold start" and "warm" buckets. Watch p50/p95 diverge between buckets, and export the JSON payload a RUM endpoint would receive — showing why bimodal classification matters for performance budgets.
checking activationStart…
Chrome 136 exposes signals that let pages classify loads as "cold start" vs "warm":
performance.getEntriesByType('navigation')[0].activationStart (nonzero in prerendered pages), document.prerendering, and the timingConfidence attribute proposed in the spec. This demo simulates accumulating samples across page views and splitting the distribution.
RUM sample collector
Distribution split
Cold starts cold
No samples yet.
Warm loads warm
No samples yet.
Histogram (LCP ms)
Sample log
Add samples above…
What each signal means
// Chrome 136 signals for bimodal classification:
// 1. activationStart — nonzero for prerendered navigations
const nav = performance.getEntriesByType('navigation')[0];
const isColdStart = nav.activationStart === 0 && !document.prerendering;
// 2. timingConfidence (new in spec, Chrome 136)
// Indicates whether the browser was cold-starting vs warm
// Values: "high", "low" (low = cold start / high resource contention)
// 3. Cold-start heuristic (practical):
// If DOMContentLoaded - fetchStart > 2000ms AND no activationStart,
// likely cold start (browser was initializing in background)
// RUM pattern:
const lcpEntry = await new Promise(resolve => {
new PerformanceObserver(list => resolve(list.getEntries().pop()))
.observe({ type: 'largest-contentful-paint', buffered: true });
});
sendToRUM({
lcp: lcpEntry.startTime,
bucket: isColdStart ? 'cold' : 'warm',
activationStart: nav.activationStart,
// Group in your analytics by bucket to avoid bimodal distortion
});