From 148a2fc43ad854faae2c42df4aaa9d50d260f879 Mon Sep 17 00:00:00 2001 From: Malin Date: Tue, 7 Apr 2026 11:46:00 +0200 Subject: [PATCH] fix: correct browsertime JSON paths for LCP, FCP, TTFB, navigation timings - LCP/TTFB/TBT: read from statistics.googleWebVitals (flat median values) - FCP: statistics.timings.paintTiming['first-contentful-paint'] - pageTimings: nested under statistics.timings.pageTimings, not at root - Remove PerceptualSpeedIndex (not present in this sitespeed version) Co-Authored-By: Claude Sonnet 4.6 --- parser.js | 29 +++++++++++++++-------------- views/partials/timings.pug | 1 - 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/parser.js b/parser.js index 0930892..fc865d6 100644 --- a/parser.js +++ b/parser.js @@ -80,26 +80,27 @@ export async function parseResults(outputFolder, _url) { console.log('[parser] browsertime statistics keys:', s ? Object.keys(s).join(', ') : 'NONE'); if (s) { - metrics.lcp = med(safe(s, 'timings', 'largestContentfulPaint')); - metrics.fcp = med(safe(s, 'paintTiming', 'first-contentful-paint')); + // Core Web Vitals — use googleWebVitals aggregate (flat, direct median) + metrics.lcp = med(safe(s, 'googleWebVitals', 'largestContentfulPaint')); + metrics.fcp = med(safe(s, 'timings', 'paintTiming', 'first-contentful-paint')); metrics.cls = med(safe(s, 'pageinfo', 'cumulativeLayoutShift')); - metrics.tbt = med(safe(s, 'cpu', 'longTasks', 'totalBlockingTime')); - metrics.ttfb = med(safe(s, 'pageTimings', 'backEndTime')); + metrics.tbt = med(safe(s, 'googleWebVitals', 'totalBlockingTime')); + metrics.ttfb = med(safe(s, 'googleWebVitals', 'ttfb')); metrics.max_potential_fid = med(safe(s, 'cpu', 'longTasks', 'maxPotentialFid')); - metrics.page_load_time = med(safe(s, 'pageTimings', 'pageLoadTime')); + // Navigation timings — pageTimings is nested under statistics.timings + metrics.page_load_time = med(safe(s, 'timings', 'pageTimings', 'pageLoadTime')); metrics.fully_loaded = med(safe(s, 'timings', 'fullyLoaded')); - metrics.dom_content_loaded = med(safe(s, 'pageTimings', 'domContentLoadedTime')); - metrics.dom_interactive = med(safe(s, 'pageTimings', 'domInteractiveTime')); - metrics.front_end_time = med(safe(s, 'pageTimings', 'frontEndTime')); - metrics.back_end_time = med(safe(s, 'pageTimings', 'backEndTime')); + metrics.dom_content_loaded = med(safe(s, 'timings', 'pageTimings', 'domContentLoadedTime')); + metrics.dom_interactive = med(safe(s, 'timings', 'pageTimings', 'domInteractiveTime')); + metrics.front_end_time = med(safe(s, 'timings', 'pageTimings', 'frontEndTime')); + metrics.back_end_time = med(safe(s, 'timings', 'pageTimings', 'backEndTime')); metrics.time_to_first_byte = metrics.ttfb; - metrics.speed_index = med(safe(s, 'visualMetrics', 'SpeedIndex')); - metrics.first_visual_change = med(safe(s, 'visualMetrics', 'FirstVisualChange')); - metrics.last_visual_change = med(safe(s, 'visualMetrics', 'LastVisualChange')); - metrics.visual_complete_85 = med(safe(s, 'visualMetrics', 'VisualComplete85')); - metrics.perceptual_speed_index = med(safe(s, 'visualMetrics', 'PerceptualSpeedIndex')); + metrics.speed_index = med(safe(s, 'visualMetrics', 'SpeedIndex')); + metrics.first_visual_change = med(safe(s, 'visualMetrics', 'FirstVisualChange')); + metrics.last_visual_change = med(safe(s, 'visualMetrics', 'LastVisualChange')); + metrics.visual_complete_85 = med(safe(s, 'visualMetrics', 'VisualComplete85')); metrics.long_tasks_count = med(safe(s, 'cpu', 'longTasks', 'tasks')); metrics.long_tasks_duration = med(safe(s, 'cpu', 'longTasks', 'totalDuration')); diff --git a/views/partials/timings.pug b/views/partials/timings.pug index 0c84ad3..0761a3f 100644 --- a/views/partials/timings.pug +++ b/views/partials/timings.pug @@ -8,7 +8,6 @@ - ['First Visual Change', job.first_visual_change], - ['Last Visual Change', job.last_visual_change], - ['Visual Complete 85%', job.visual_complete_85], -- ['Perceptual Speed Index', job.perceptual_speed_index], - ['Front End Time', job.front_end_time], - ['Back End Time', job.back_end_time], - ['Max Potential FID', job.max_potential_fid],