{"record":{"id":"316912f1a8dea83d","repo":"GoogleChrome/lighthouse","slug":"invalid-speedline","errorCode":"INVALID_SPEEDLINE","errorMessage":"Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. ({errorCode})","messagePattern":"Chrome didn't collect any screenshots during the page load\\. Please make sure there is content visible on the page, and then try re-running Lighthouse\\. \\((.+?)\\)","errorType":"exception","errorClass":"LighthouseError","httpStatus":null,"severity":"error","filePath":"core/audits/screenshot-thumbnails.js","lineNumber":92,"sourceCode":"    /** @type {Map<SpeedlineFrame, string>} */\n    const cachedThumbnails = new Map();\n\n    const speedline = await Speedline.request(trace, context);\n\n    // Make the minimum time range 3s so sites that load super quickly don't get a single screenshot\n    const minimumTimelineDuration = context.options.minimumTimelineDuration || 3000;\n    const numberOfThumbnails = context.options.numberOfThumbnails || NUMBER_OF_THUMBNAILS;\n    const thumbnailWidth = context.options.thumbnailWidth || null;\n\n    const thumbnails = [];\n    const analyzedFrames = speedline.frames.filter(frame => !frame.isProgressInterpolated());\n    const maxFrameTime =\n      speedline.complete ||\n      Math.max(...speedline.frames.map(frame => frame.getTimeStamp() - speedline.beginning));\n    const timelineEnd = Math.max(maxFrameTime, minimumTimelineDuration);\n\n    if (!analyzedFrames.length || !Number.isFinite(timelineEnd)) {\n      throw new LighthouseError(LighthouseError.errors.INVALID_SPEEDLINE);\n    }\n\n    for (let i = 1; i <= numberOfThumbnails; i++) {\n      const targetTimestamp = speedline.beginning + timelineEnd * i / numberOfThumbnails;\n\n      /** @type {SpeedlineFrame} */\n      // @ts-expect-error - there will always be at least one frame by this point. TODO: use nonnullable assertion in TS2.9\n      let frameForTimestamp = null;\n      if (i === numberOfThumbnails) {\n        frameForTimestamp = analyzedFrames[analyzedFrames.length - 1];\n      } else {\n        analyzedFrames.forEach(frame => {\n          if (frame.getTimeStamp() <= targetTimestamp) {\n            frameForTimestamp = frame;\n          }\n        });\n      }\n","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/audits/screenshot-thumbnails.js#L74-L110","documentation":"The screenshot-thumbnails audit runs SpeedLine (a visual progress analysis library) on the trace, then filters to non-interpolated frames. If zero analyzed frames remain after filtering, or if the computed timelineEnd is not a finite number (e.g., SpeedLine failed to produce a valid beginning timestamp), Lighthouse throws a LighthouseError with code INVALID_SPEEDLINE. Like error 15, this is an lhrRuntimeError surfaced in the LHR. The condition checks both analyzedFrames.length === 0 and Number.isFinite(timelineEnd).","triggerScenarios":"SpeedLine processes the trace but all frames are marked as interpolated (isProgressInterpolated returns true for every frame), leaving zero real frames. Alternatively, speedline.complete is falsy and the max frame time calculation produces NaN or Infinity, making timelineEnd non-finite.","commonSituations":"Traces from pages with very minimal or no visual changes where SpeedLine interpolates all frames; corrupted or incomplete trace files; Chrome version mismatches producing trace events SpeedLine cannot parse; running on pages with near-instant loads that produce no perceptible visual progress; CI/headless environments with rendering issues.","solutions":["Update Chrome to a version compatible with your Lighthouse version (check Lighthouse's chromeVersion requirement)","Ensure the page produces visible visual changes during load (not a fully cached instant load)","In headless environments, enable software rendering: --chrome-flags=\"--use-gl=swiftshader\"","Retry the run — SpeedLine can fail intermittently on traces that are valid but edge-case","If using saved traces/artifacts, verify the trace file is not corrupted or truncated"],"exampleFix":"# before\nlighthouse https://example.com --chrome-flags=\"--headless --no-sandbox\"\n# after (enable rendering for visual progress)\nlighthouse https://example.com --chrome-flags=\"--headless --no-sandbox --use-gl=swiftshader\"","handlingStrategy":"fallback","validationCode":"// Verify the trace has visual frames before running screenshot-thumbnails analysis\n// (Applicable when processing saved traces/artifacts)\nfunction verifyTraceHasFrames(traceEvents) {\n  const screenshotEvents = traceEvents.filter(e => e.name === 'Screenshot');\n  if (screenshotEvents.length === 0) {\n    console.warn('Trace has no screenshot events — speedline/screenshot audits will fail');\n  }\n}","typeGuard":null,"tryCatchPattern":"// When using the programmatic API, check for INVALID_SPEEDLINE in runtimeError\nconst result = await lighthouse(url, flags, config);\nif (result.lhr.runtimeError && result.lhr.runtimeError.code === 'INVALID_SPEEDLINE') {\n  console.warn('SpeedLine analysis failed — retrying with software rendering');\n  flags.chromeFlags = '--use-gl=swiftshader';\n}","preventionTips":["Ensure Chrome can render visual frames by adding --use-gl=swiftshader in headless","Use a Chrome version compatible with your Lighthouse version","Avoid running on pages with no visual changes (fully cached instant loads)","Retry on intermittent failures — trace analysis can be sensitive to timing"],"tags":["runtime","chrome","performance","trace","speedline","headless"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}