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 navigation timing… 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 });