<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sitespeed.io release feed</title>
        <link>https://www.sitespeed.io</link>
        <description>New releases and changelog feed of sitespeed.io</description>
        <lastBuildDate>Wed, 29 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>sitespeed.io release feed</title>
            <url>https://www.sitespeed.io/img/logos/sitespeed.io.png</url>
            <link>https://www.sitespeed.io</link>
        </image>
        <copyright>All rights reserved 2022, Peter Hedenskog and team</copyright>
        <atom:link href="https://www.sitespeed.io/feed/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[sitespeed.io 42.5.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.5.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.5.1</guid>
            <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- The Compare tab merged metrics with identical run values into one stacked row, which read as if before-FCP and before-LCP element counts were one metric when they are different measurements that happen to agree whenever FCP and LCP are the same paint, and the stacked names broke the name column mid-word. Every metric is its own row again and counts separately in the verdict; a row whose values match an earlier one carries a quiet &quot;same values as X&quot; tag instead, so identical numbers don&#39;t read as a rendering mistake. Direction words now follow the unit (higher/lower for counts and unitless metrics like CLS, slower/faster for times), since a &quot;slower&quot; chip on an element count read as a bug, and the about-the-statistics fold spells out what negligible, small, medium and large effect mean in plain text #4885.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.5.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.5.0</guid>
            <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Every tested Compare row now shows how big the change is, not just how certain: the Hodges-Lehmann shift estimate with a 95% confidence interval (&quot;shift +7 (+4 to +9 ms)&quot;). A p-value kept being read as a size, but 21 fully separated runs give p = 1e-10 whether the shift is 1 ms or 100 ms. An interval away from zero is a real change of about that size, an interval straddling zero is noise no matter what the bare delta suggests. Added as a new additive field on the compare.pageSummary message, the graphite export is untouched #4882.<br>
- Compare catches regressions that change run-to-run behaviour without moving the median. The rank test is blind to a metric whose median holds while the runs split into a fast and a slow group, for example a race sending a third of the iterations down a slow path. Every compared metric now also runs a two-sample Kolmogorov-Smirnov test over the whole distributions; it only surfaces when the rank test saw nothing, marking the row amber with &quot;spread changed&quot; and the change in the middle-80% span, and the verdict card lists it as possible intermittent behaviour rather than a regression. The new statisticalTestKS field is additive #4883.<br>
- The Compare statistics explain themselves to engineers who are not statisticians: the setup strip carries a collapsed &quot;about the statistics&quot; fold naming every algorithm and what it contributes, the verdict card ends with a &quot;How to read the numbers&quot; primer, every p-value and effect line explains itself on hover and the spread verdict is worded from the data (&quot;spread changed&quot; when the median held, &quot;less steady&quot; when it moved but runs vary more) instead of citing test initials #4884.<br>
<br>
<strong>Fixed</strong><br>
- The compare plugin skipped the statistical test whenever either sample had zero variance, reporting &quot;No variability&quot;. In a WebPageReplay lab the most deterministic metrics are constant within a session, so the guard suppressed exactly the clearest regressions: every run shifting cleanly from 303 ms to 310 ms was never tested while noisy metrics always were. Constant samples now reach Mann-Whitney (which handles them fine), only truly identical datasets are short-circuited. Also fixes the compare CLI option definitions: the only non-default Mann-Whitney method choice was misspelled so picking it crashed scipy, three choices carried leading spaces and one misspelled describe key kept its help text from rendering #4881.<br>
- The Compare tab is honest about tiny, duplicate and hidden changes. A 0.0005 CLS shift rendered as &quot;0 → 0, Δ 0 (0 %)&quot; yet was flagged red as significantly slower; small values now keep two significant digits and a significant change whose medians display the same value gets an amber &quot;detectable, tiny&quot; tier so it cannot read as a regression. Before-FCP/before-LCP pairs with identical values merge into one row instead of rendering and counting twice (old #chart- anchors kept), runs piling on the same value render as counted pills instead of a single dot, the effect size gets its own line under a short verdict pill and a clear improvement under a one-sided test is called out as &quot;likely faster&quot; instead of &quot;no change&quot; #4880.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.4.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.4.0</guid>
            <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Where the JavaScript and CSS bytes go: the Coverage tab opens with a plain-language lead and a treemap sized by bytes and tinted by unused share, so you can see at a glance which few files own most of the weight and how much never ran. Bundles with a module breakdown drill into a per-module treemap and back, the smallest files fold into one tile so nothing becomes an unclickable sliver#4875.<br>
- Cumulative Layout Shift is now actionable: the card leads with a verdict naming the element that took the biggest share of the shift, when it fired and the fix that always applies (reserve space). Each shift shows its exact share of CLS, a score coloured by how dominant it is, its timing and its selector, and a cause line appears only where the markup proves one (an image or embed with no width and height, unmistakable ad markup), never a guess from a loose substring #4874.<br>
- The Compare graphic shows run-to-run spread, not just the median: each series draws its middle-80% band (p10 to p90) behind the dots with a grey stripe marking where the two bands overlap, so a wide grey band means the shift sits inside run-to-run noise and a clean gap means it is real. Cliff&#39;s delta rides on every chip whether the change is significant or not, and the median percentage is shown only when the test calls the change real #4879.<br>
- Firefox 153 and Edge 150 in the Docker container #4876.<br>
<br>
<strong>Fixed</strong><br>
- A shared or bookmarked link to any Metrics-tab card opened on the default tab with the target hidden, so the card looked empty. Every Metrics-tab anchor now resolves to its tab so deep links land on the card they name #4874.<br>
- The Cumulative Layout Shift list showed sub-0.01 shifts that printed as &quot;0.000&quot; and &quot;0% of CLS&quot;, a row that reads like a bug, and disagreed with the screenshot beside it, which only highlights shifts above 0.01. The list now shows shifts of 0.01 and up while smaller ones stay counted in the score and the verdict, and a page whose whole CLS is tiny movements gets an honest empty state pointing at the video #4878.<br>
- The Coach Page info card was lopsided, stacking Document, DOM structure and Storage and connection in the left column while the right showed only a short Resource hints card. Storage and connection moved to the right column so the two end at roughly the same height, and the right column is no longer empty on pages that ship no resource hints #4872.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.3.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.3.0</guid>
            <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- The per-URL summary page leads with an action-first hero (what the user saw, the Coach score and the top fixes) instead of a box of numbers #4867.<br>
- The CrUx tab opens with a Core Web Vitals verdict and draws the field-data breakdowns as donuts #4865.<br>
- The Axe tab sorts violations worst-first, leads with a verdict and shows a real clean state when nothing failed #4866.<br>
- The Coach Page info card groups the facts and explains each value in plain language #4870.<br>
- Report composition donuts and cleanups #4871:<br>
<br>
<strong>Fixed</strong><br>
- Score bands are inclusive at 80 and 90, so an exactly-80 score is no longer colored as a failure #4868.<br>
- The summary hero&#39;s verdict phrases no longer look spaced out before their commas #4869.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.2.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.2.0</guid>
            <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Browsertime 28.2 #4862, with the report surfacing its new visual diagnostics #4863. <code>--videoParams.filmstripDiff</code> adds a Diff toggle in the filmstrip lightbox (working on file:// too, where a tainted canvas used to block it) and a heatmap that tells a restless element apart from sub-pixel noise that inflates Last Visual Change and Speed Index. <code>--videoParams.noiseTolerance</code> ignores that noise at the source.<br>
- The Rendering tab&#39;s &quot;Why was rendering delayed?&quot; section now opens with a verdict, and the render-blocking requests are one sortable table named by file (ResourceLoader <code>load.php</code> batches by their first module) with each download drawn on a clock ending at the paint, so a late-injected resource is visibly not the culprit Chrome&#39;s blocking flag makes it look like. Falls back to the pagexray shape without bars when the run has no HAR (Safari, old data) #4856 #4859.<br>
- The Rendering tab&#39;s style cards lead with a verdict on whether to act and where, and Chrome&#39;s raw invalidation reasons (<code>Affected by :has()</code>, <code>Inline CSS style declaration was mutated</code>) are translated to plain language with a one-line fix on the four a developer can act on #4857 #4861.<br>
- Web fonts, the classic &quot;document done, text late&quot; cause, appear in the render-blocking table as context rows flagged when they finished after a paint. With browsertime 28.2 the style-invalidation split uses the real first-paint boundary from the trace instead of guessing by reason category #4858.<br>
- The playback timeline marks when the main thread was busy: the run&#39;s long tasks draw as a thin red band under the axis, so a filmstrip stall shows whether the CPU was the cause without leaving the tab #4860.<br>
<br>
<strong>Fixed</strong><br>
- The CPU tab&#39;s bar lists now line up: each row was its own grid, so bars started at a different x position whenever the value text length changed #4855.<br>
- Shared links to the newer Rendering anchors (<code>#slow-ttfb</code>, <code>#recalculate-style</code>, <code>#reflows-before-paint</code>, <code>#main-thread-animations</code>) loaded onto the default tab with the target hidden #4859.<br>
- The render-blocking document row disappeared on sites that redirect to a trailing slash #4857.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 28.2.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#28.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#28.2.0</guid>
            <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- New <code>videoParams.noiseTolerance</code>: a percentage of a frame&#39;s pixels that is allowed to differ before duplicate-frame elimination still treats the frame as unchanged. Browsers re-rasterize a visually-done page long after it settles, leaving invisible sub-pixel noise on glyph edges that the default handful-of-pixels tolerance counts as real change, inflating Last Visual Change, VisualComplete95/99 and Speed Index. Off by default #2528.<br>
- New <code>videoParams.filmstripDiff</code> frame diffs: writes <code>diff_&lt;ms&gt;.png</code> next to each filmstrip frame (the frame dimmed with every changed pixel painted red, using the same per-pixel threshold report UIs use at runtime) plus a Frame Diffs metric. Report UIs cannot read frame pixels from <code>file://</code> results, so an exact &quot;what changed in this frame&quot; view was impossible exactly where people debug local results. Off by default #2531.<br>
- Visual instability heatmap: the same <code>videoParams.filmstripDiff</code> run now also writes one <code>instability.png</code> showing how many times each pixel changed across the video (amber for changed once, deep red for ten or more), plus a Frame Instability summary in the JSON. Answers &quot;which parts of the page keep changing&quot;, so invisible re-rasterization noise can be told apart from a genuinely restless element #2533.<br>
- <code>cpu.styleInvalidations</code> (Chrome only) now splits every reason, trigger and source at first paint: new <code>afterFirstPaint</code> counts and <code>styleRecalcsAfterFirstPaint</code> / <code>layoutInvalidationsAfterFirstPaint</code> totals separate building the page from churn on a page the user is already looking at. The fields only exist when the trace carried the FCP event, so absent means unknown rather than zero #2530.<br>
<br>
<strong>Fixed</strong><br>
- Visual metrics no longer require OpenCV and pyssim unless the metrics that need them are requested: OpenCV is only used by <code>--contentful</code> and pyssim only by <code>--perceptual</code>, so a default install now runs on just ffmpeg, Numpy and Pillow. The Docker image keeps installing everything so both metrics keep working there #2535.<br>
- <code>VisualComplete99</code> is now reset when the page repaints backward. Two copy-paste typos reset <code>VisualComplete95</code> twice and never reset <code>VisualComplete99</code>, so on a page that reaches 100%, repaints backward and then recovers, <code>VisualComplete99</code> could report a time earlier than <code>VisualComplete95</code> (99% complete before 95%, which cannot happen) #2537.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.1.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.1.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.1.1</guid>
            <pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- The HTML report no longer speaks Chrome internals: raw data keys shown as metric labels (backEndTime, RecalcStyleCount, FirstVisualChange), LoAF/Long Task spec tokens, HAR phase keys (blocked, ssl, wait), trace event names used as headings and profiler jargon (self time, invoker) are replaced with plain language across every page. The raw keys stay in tooltips and explainer folds since the exported JSON and metrics still use them, and the help page&#39;s Firefox metric entries now lead with what each metric means instead of which browser preference enables it #4854.<br>
- The CPU tab tells you what to do, not just what happened: the blocking-time card leads with a verdict and links each dominant kind to the section that names the culprits, the Timers section calls out the page&#39;s own polling and timeout-0 offenders with their cost and a suggested fix, and headings, KPI labels and quicklinks were renamed so the chip row scans as a table of contents #4853.<br>
- On the Pages listing the Web Vitals verdict pill and the metric dots were centered against each other, so whichever was wider pushed the other sideways and the column looked randomly misaligned from row to row. Both are left-aligned now and line up across every row #4852.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.1.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.1.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.1.0</guid>
            <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Browsertime 28 #4844 and 28.1 #4850. The engine can now tell you not just <em>that</em> the main thread was busy but <em>what</em> kept it busy: function-level CPU sampling, setTimeout/setInterval pressure per install site, per-selector style-recalculation cost, style/layout invalidation tracking, blocking time split by kind, CPU time per module — and in 28.1 the Long Animation Frame data carries per-script timings, frame timestamps, whole-page totals and readable <code>load.php</code> labels. See the Browsertime changelog for the full list.<br>
- The CPU tab leads with the verdict: a top-offender callout, then long tasks and blocking time split into script, style/layout and HTML parsing (a page blocked by parsing its own huge document is named as such instead of hiding as &quot;unknown&quot;). Two new sections: Slowest JS functions (self vs total time from the V8 sampling profiler) and Timers (setTimeout/setInterval churn credited to the script that installed each timer). The tab is always present on Chrome and points to <code>--enableProfileRun</code> when the deeper data is missing #4845.<br>
- Long Animation Frames are actionable and live on the CPU tab next to Long tasks: exact totals over every frame, each frame placed on the page timeline (blocking before LCP = fix first, after load = a different conversation), frames where an input was waiting flagged for INP, and one attribution model everywhere — blocking split by run-time share of the frame&#39;s work, capped at each script&#39;s own run time, so a parse-heavy frame can&#39;t pin 240 ms on an 8 ms inline script. Inline scripts and <code>load.php</code> batches get readable names, zero-blocking frames collapse into one quiet line, and old <code>#longAnimationFrames</code> links keep working #4851.<br>
- The Rendering tab explains where style time goes: the slowest CSS selectors during style recalculation — including wasted selectors with thousands of match attempts and zero matches — and style invalidations: which class/attribute changes keep forcing recalculation and which scripts cause them #4845. Frame delivery (dropped frames, effective FPS, longest gap) also moved here from the CPU tab — it is the smoothness half of &quot;what did the user see&quot; #4849.<br>
- Big JavaScript bundles are split into their modules: CPU time and code coverage per module (ResourceLoader bundles, including TemplateStyles labels for inline CSS). Everything sourced from the extra profile run carries a &quot;Profile run&quot; badge, and the PageXray tab shows the main document&#39;s response headers per run #4845.<br>
<br>
<strong>Fixed</strong><br>
- Long tasks that started after the last visual change painted outside the visual progress timeline. Tasks past the axis end are dropped from the lane (the CPU tab still lists them all) and an edge-straddling task is clamped #4839.<br>
- With <code>--enableProfileRun</code> the coverage section claimed no data was collected whenever the median run wasn&#39;t run 1 — the profile run is a single sample and is now shown regardless of which iteration became the median #4841.<br>
- <code>--enableProfileRun</code> leaked into the measured runs, misnaming every measured trace as the profile trace and letting the profile trace overwrite the first iteration&#39;s. Per-run traces and the extra-run trace now coexist with correct names #4842.<br>
- The Toplist page&#39;s run links were off by one ever since iteration pages became 1-based: with one iteration every link 404:ed, with more the link silently opened the previous run&#39;s page #4843.<br>
- Long CSS selectors (deep <code>:has()</code>/<code>:not()</code> chains) made the Rendering tab&#39;s selector tables horizontally scrollable, pushing the metric columns out of view — selectors now wrap #4846.<br>
- The timers table underlined its whole install-site cell, running a blue line under the code pills — the links are quiet now and tint on hover #4847.<br>
- The Pages table forced a horizontal scroll even for a single tested page: the full metric names made the header row the widest thing in it. Headers now use the short Web Vitals vocabulary (LCP, CLS, TBT, …) with the full name in the tooltip #4848.<br>
- GitHub Actions use Node.js 24 by default, with Node.js 26 added to the test matrix #4840.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 28.1.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#28.1.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#28.1.0</guid>
            <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Long Animation Frames (<code>pageinfo.loaf</code>) now ship every per-script field the LoAF API exposes (<code>startTime</code>, <code>duration</code>, <code>executionStart</code>, <code>pauseDuration</code>) plus <code>startTime</code> and <code>firstUIEventTimestamp</code> per frame — enough to attribute blocking time to individual scripts, place each frame on the page timeline and spot frames where an input was waiting #2522 #2523 #2526.<br>
- New <code>pageinfo.loafSummary</code> key (<code>totalFrames</code>, <code>totalBlockingDuration</code>, <code>totalDuration</code>): <code>pageinfo.loaf</code> only ships the 10 frames with the most blocking, so totals computed from it understate busy pages #2524.<br>
- LoAF script URLs get the same ResourceLoader <code>label</code>s as <code>cpu.urls</code> (<code>load.php[startup]</code> and friends) #2525.<br>
- Multi-module <code>load.php</code> batches are labeled with their first module name — pages lazy-load several general batches, so the bare <code>load.php[scripts]</code> label collided as soon as there was more than one #2527.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 28.0.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#28.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#28.0.0</guid>
            <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- New <code>mainDocument</code> field per iteration (any browser with a HAR): final URL, status, redirect count and response headers of the main document, with sensitive headers always removed. Tag runs by cache state (<code>x-cache</code>, <code>age</code>) or experiment enrollment (<code>server-timing</code>) without HAR post-processing #2500.<br>
- New <code>cpu.blocking</code> and <code>cpu.domains</code> keys (Chrome/Edge, <code>--cpu</code>): long-task blocking time per script (whole trace and before LCP) plus first vs third party CPU totals. Answers &quot;which script should I fix first&quot; #2503.<br>
- <code>cpu.blocking</code> also splits blocking time by kind of work (<code>kinds</code>: script, style/layout, HTML parsing, …), and blocking HTML-parse tasks are attributed to the document URL instead of the anonymous <code>unknown</code> bucket. A page blocked by parsing its own large HTML needs a completely different fix than one blocked by JavaScript #2512.<br>
- New <code>cpu.functionCosts</code> key (Chrome/Edge): the slowest JS functions by main-thread self time, with total time, source position and the owning ResourceLoader module for bundled code, parsed from the V8 sampling profiler that <code>--enableProfileRun</code> already enables. Says which function is slow instead of stopping at &quot;this script used 300 ms&quot; #2511. Rows also carry <code>callees</code>, showing where an orchestrator&#39;s total went (for example which modules MediaWiki&#39;s <code>runScript</code> executed) #2515.<br>
- New <code>cpu.selectorStats</code> key (Chrome only, on <code>--enableProfileRun</code>): per-selector CSS matching cost, showing the slowest selectors by elapsed time plus the wasteful ones with thousands of match attempts and zero matches. The only signal that says which selectors the style-recalc time goes to #2517.<br>
- New <code>cpu.styleInvalidations</code> key (Chrome only, with <code>--chrome.timeline</code>): style/layout invalidations aggregated by reason, by trigger (which class/attribute keeps changing) and by source, resolved to the owning ResourceLoader module when coverage runs. The invalidation-tracking events were in every trace for years but never parsed #2516 #2521.<br>
- New <code>cpu.timers</code> key (Chrome only, with <code>--chrome.timeline</code>): setTimeout/setInterval pressure per script (installs, fires, fire time, timeout-0 and recurring counts) plus the individual timers grouped by install site, resolved to the owning ResourceLoader module when coverage runs. On Wikipedia the timeout-0 offender turns out to be jquery&#39;s deferred machinery #2518 #2519 #2520.<br>
- <code>cpu.nonCompositedAnimations</code> entries now include <code>failureReasons</code>, the <code>compositeFailed</code> bitmask decoded via Blink&#39;s FailureReason enum, so consumers can tell a harmless &quot;animation has no visible change&quot; from a real &quot;unsupported CSS property&quot; #2514.<br>
- New <code>cpu.frames</code> key (Chrome/Edge, <code>--cpu</code>): presented/partial/dropped frames, effective FPS and the longest gap between presented frames, from Chrome&#39;s PipelineReporter events. Counts only drops Chrome flags as smoothness-affecting #2506.<br>
- Per-module coverage for MediaWiki ResourceLoader bundles: <code>load.php</code> coverage entries get a <code>modules</code> array with used/unused bytes per module, derived from the <code>mw.loader.impl</code> boundaries in the bundle source. Automatic, Chrome only #2502.<br>
- New <code>cpu.moduleCosts</code> key: per-module main-thread CPU time inside ResourceLoader bundles, when both trace and coverage are collected. Per-module <code>selfTime</code> plus an <code>otherTime</code> bucket for whole-bundle work #2505.<br>
- Stable <code>label</code> fields (<code>load.php[startup]</code>, <code>load.php[scripts]</code>, …) on ResourceLoader URLs in <code>cpu.urls</code>, <code>cpu.blocking</code>, <code>scriptCosts</code>, <code>forcedReflows</code> and coverage entries #2504, and on <code>cpu.moduleCosts</code> #2507. The raw URLs embed a <code>version=</code> parameter that changes every deploy and breaks per-bundle time series. Additive: <code>url</code> is untouched.<br>
- Inline CSS coverage entries are labeled with the owning MediaWiki template (<code>TemplateStyles:rNNNNNNN</code>, from the style element&#39;s <code>data-mw-deduplicate</code> attribute). Inline sheets all share the document URL (or an empty one), so Wikipedia&#39;s CSS coverage collapsed into anonymous buckets and nobody could see which template ships the dead CSS #2509.<br>
- The <code>renderBlocking.recalculateStyle</code> summary (Chrome only) now includes the event <code>count</code> and the largest single event (<code>maxElements</code>, <code>maxDurationInMillis</code>), before FCP and LCP. Tells one massive style invalidation apart from thousands of small forced recalcs #2496.<br>
- Bumped <code>chromedriver</code> and <code>edgedriver</code> to 149 #2487.<br>
- Updated the Docker image to Chrome 149 / Firefox 151 / Edge 149 #2486 #2488.<br>
- Updated <code>@sitespeed.io/throttle</code> to 6.0.1 #2499.<br>
- Releases are now built and published from GitHub Actions with npm provenance and an SBOM, so the published package can be verified against the source it was built from #2491.<br>
<br>
<strong>Fixed</strong><br>
- <code>--enableProfileRun</code> no longer affects the measured runs: combined with <code>--cpu</code> it misnamed every measured trace as <code>trace-N-extra-run.json</code>, let the profile trace overwrite iteration 1&#39;s trace and suppressed the result log line #2508.<br>
- Navigation-script failures now include the URL and iteration number in the error message #2489.<br>
<br>
<strong>Changed</strong><br>
- Coverage from <code>--enableProfileRun</code> is now a single object marked <code>source: &#39;profileRun&#39;</code> instead of a one-element array keyed by iteration; indexing it by run number read <code>undefined</code> and reported no coverage. <code>--chrome.coverage</code> keeps the per-iteration array shape #2501.<br>
- Document body-loading events (<code>DocumentLoader::*</code>, <code>NavigationBodyLoader::*</code>, <code>URLLoader::*</code>) now count as parse time and V8 interrupt/housekeeping as script evaluation in <code>cpu.categories</code>, instead of falling into <code>other</code>. What remains in <code>other</code> is almost entirely Chrome&#39;s task-scheduling overhead (RunTask self time), so consumers can present the bucket honestly instead of as unexplained mystery time #2513.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[throttle 6.0.1]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#6.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#6.0.1</guid>
            <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Make throttle work on GitHub Actions again: Linux throttling no longer fails with &quot;Exclusivity flag on, cannot modify&quot; when another tool already holds the ingress qdisc slot on the interface. GitHub-hosted Actions runners now come with an eBPF network-monitoring agent that attaches a clsact qdisc to the default interface (other eBPF-based security agents do the same), and since only one ingress/clsact qdisc can exist per device, throttle&#39;s <code>tc qdisc add ... ingress</code> failed and took the whole measurement run down with it. The original code path is unchanged and runs first; only when it fails does throttle fall back to attaching its redirect filters to the existing qdisc (on the clsact ingress hook when needed), with explicit filter priorities so stop removes exactly its own filters and leaves the other tool&#39;s qdisc and filters untouched. #108.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.0.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.0.1</guid>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- The Timings Summary&#39;s &quot;Runs agree?&quot; column grades agreement in three bands instead of two. A single stable/disagree cutoff had to choose between two audiences: on a controlled test rig ±10% is too forgiving to call &quot;stable&quot;, while on shared cloud runners ±5% flags ordinary noise as disagreement on most rows — and a column that always warns stops meaning anything. Stable now means within ±5%, a neutral uncolored &quot;varies&quot; band covers the ±5–10% range that is normal run-to-run noise, and &quot;runs disagree&quot; is reserved for spreads past ±10% where the median genuinely hides something #4837.<br>
- Removed em dashes from user-facing text in the HTML report #4838.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 42.0.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#42.0.0</guid>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- The start page is a scorecard: one verdict for the whole test (&quot;2 of 6 pages pass every check&quot;) and every tested page plotted as a dot on each metric&#39;s threshold track — hover a dot to trace that page across metrics, click to open its report. Failed URLs are called out instead of silently lowering the page count. The classic summary boxes remain only as a fallback for runs without browsertime data #4807.<br>
- CrUX field data is shown alongside the lab Web Vitals, so you can see what real Chrome users experience next to what the lab measured #4794.<br>
- The Domains page answers &quot;which domain is hurting me&quot;: callout tiles for the slowest/heaviest/chattiest domains, worst-first ordering, warning/error tones on slow DNS/connect/SSL/TTFB and third-party marking #4808.<br>
- The Toplist page answers &quot;which files do I fix first&quot;: a plain-language hint per list, warning/error tones on huge transfers, short cache times and slow responses, and a new short-cache-time list. Fonts and other content types are no longer dropped #4809.<br>
- The Assets page opens with an overview (unique assets, total transfer/size, biggest asset, per-type counts) and spells out transfer (wire bytes) vs size (decoded bytes) so the numbers can&#39;t be misread #4811.<br>
- The Detailed Summary groups all metrics into cards by concern and leads with a &quot;What stands out&quot; strip (worst Web Vital, 4xx/5xx responses, redirect-heavy pages, critical accessibility violations). Single-run results collapse the five identical stat columns into one value column #4812.<br>
- The Pages tab sorts pages worst Web Vitals first with a per-page verdict and per-metric status dots, and large runs get a URL filter. Missing data renders as a dash instead of a misleading zero, and an unknown metric name no longer breaks the whole page #4813.<br>
- Long Animation Frames are actionable: the frames with the most blocking time, split into phases, with the scripts that ran in them #4803.<br>
- Visual metrics are easier to understand: a milestones timeline on the page summary shows when the page started rendering, hit 85% and finished #4804.<br>
- Video and Filmstrip are merged into one Rendering tab: the video plays with a clickable milestone timeline (TTFB/FCP/LCP/visual metrics), the filmstrip is one chronological strip with per-frame completeness that seeks the video, and frames open full size in a lightbox. Runs that keep a filmstrip but no video get the same experience with a frame preview instead of the player. Old <code>#video</code> and <code>#filmstrip</code> links keep working #4816.<br>
- The Rendering tab tells the full render story: what the user saw (video, filmstrip, this run&#39;s screenshots) followed by why it was delayed — recalculate-style work from the Chrome trace, render-blocking requests, forced reflows before the page painted (a page can paint early and still thrash layout before its largest paint) and animations running on the main thread instead of the compositor. The tab shows up whenever any of that exists, so a <code>--cpu</code> run without video still gets its render story, and old <code>#screenshots</code> and <code>#requests-render-blocking</code> links keep working #4827 #4828. A server that is slow to answer is part of the story too: when TTFB is past the 800 ms Web Vitals threshold, the why-section opens with the value and its share of the time to first contentful paint — and a slow TTFB alone brings the tab up, even for runs without video, filmstrip or trace data #4834.<br>
- The render blocking section answers &quot;what do I attack first&quot;: one section per blocking type with a plain-language line on what the status means and how to fix it, and the assets in a sortable table with transfer size and total time, heaviest first — instead of raw URLs and Chrome&#39;s enum values. Dynamically injected resources that never block rendering no longer show up as something to investigate #4824 #4826.<br>
- Problems are easier to find: the Errors page counts and tints its errors, the Budget page shows value/limit/verdict per check with failing URLs first, the Coach tab leads with a &quot;What to fix first&quot; strip, the Pages and Detailed pages link to the Errors page when a run had errors, and console errors surface as a red KPI tile on the PageXray tab #4819.<br>
- The side-by-side runs page got the modern card treatment; run navigation is now compact number chips with the current run highlighted — a 21-run test fits on one line instead of three — and all tabs share the same jump-link style #4820 #4835.<br>
- The Timings Summary table answers &quot;do the runs agree?&quot;: a new column grades run-to-run agreement per metric (identical, stable ±N%, or runs disagree ±N%), so a flaky Total Blocking Time of 0/0/214 ms no longer hides behind a perfect-looking median of 0. It grades agreement rather than speed, so it works for every metric without per-metric limits, and only renders with more than one iteration #4832.<br>
- The page summary&#39;s stacked metric boxes became one overview stat card that leads with the values — big numbers, quiet labels, opening with a Google Web Vitals group so the summary shares vocabulary with the Timings Summary and the Metrics tab — and the screenshot now says which run it shows #4833.<br>
- The Compare tab is one row per metric: the p-value, a distribution strip showing every baseline and current run on a shared value axis, median → median with the delta, and a verdict chip — replacing a nine-column statistics table cross-referenced against 24 scatter charts. A verdict card on top gives the headline count with chips that jump to the flagged metrics, significant rows are tinted by direction (regressions red, improvements green — the old layout showed a significant improvement in error-red), and old chart deep links keep landing on their metric #4836.<br>
<br>
<strong>Fixed</strong><br>
- Runs that collect no asset data at all (for example a CrUX-only configuration) no longer crash the Toplist page — the empty aggregator fallbacks were plain objects where the populated case ships arrays, so the template died with &quot;pool is not iterable&quot; and the whole page was lost #4829.<br>
- A User Timing mark that fires several times in one run (or only in some runs) produces statistics whose computed median matches no run; the Timings Summary silently dropped that cell and shifted every later column left. The cell is now always emitted, just without a run link when no run matches #4832.<br>
- Report polish: asset content types render as a color swatch plus plain text instead of pill chips, and the Assets overview shows the type composition as the same stacked bar the start page uses #4822; explanation texts use the full card width instead of wrapping at 80 characters #4823; information labels no longer look like clickable buttons #4825; and the Pages tab&#39;s verdict pill is centered over its status dots #4830.<br>
- The Waterfall tab works in dark mode: its ~350 lines of inline light-only CSS moved into proper light/dark stylesheets built on the theme tokens, reusing the report&#39;s card, button and filter components #4818.<br>
- Style consistency across all report pages: one cell size for data tables, one numeric-cell class, one cell-tone spelling, h3 card titles/h2 tab leads, and the nav no longer narrower than the content on wide screens. Also fixes the Screenshots tab id typo that broke <code>#screenshots</code> deep links, screenshots glowing white in dark mode, and adds the missing good/poor dots to the Timings Summary Web Vitals #4817.<br>
- The Timings Summary table matches the modern report styling, and its markup no longer relies on browser error recovery #4806.<br>
- Cap the &quot;Elements that shifted&quot; text in the CLS card at 300 characters — an ad iframe attribute could dump an entire serialized HTML document into the report #4805.<br>
- Upgrade waterfall-tools to 0.4.0 #4801.<br>
- Upgrade @tgwf/co2 to 0.19.0. Reported CO2 numbers are unchanged — sitespeed.io always passes an explicit model — but co2.js&#39;s own default changed to SWD v4, which affects library users who enable the sustainable plugin without setting <code>sustainable.model</code> #4810.<br>
<br>
<strong>Changed</strong><br>
- The Pages tab&#39;s default columns are now timing-first — LCP, CLS, TBT, Speed Index, total transfer, total requests and the Coach score — and the auto-appended visual metrics columns are gone. Any old column can be restored with <code>--html.pageSummaryMetrics</code> #4813.<br>
- The Assets page selects the heaviest assets instead of the most requested ones (a huge asset requested once could be missing entirely) and <code>--maxAssets</code> defaults to 100 instead of 20 #4811.<br>
- The green/yellow/red KPI tiles are gone from the Detailed and page summaries. They duplicated verdicts that already live elsewhere — the &quot;What stands out&quot; strip, the &quot;Runs agree?&quot; column and the Web Vitals verdicts — so every summary led with a second color-coded scoreboard that added noise without adding information #4831.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[sitespeed.io 41.4.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.4.1</guid>
            <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Update base Ubuntu and NodeJS #4799<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/sitespeed.io.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 27.4.1]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.4.1</guid>
            <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- <code>--chrome.coverage</code> no longer reports &quot;0 B unused&quot; for functions that executed at least once. The JS used-bytes calculation took the union of every V8 range with count &gt; 0, but V8 returns nested ranges — an outer range over the whole function body and inner ranges over sub-blocks. If a function ran at all, its outer range already covered the whole body and the inner count == 0 ranges (the actual dead branches) got absorbed into the union and contributed nothing. On modern bundles where module-evaluation top-level code runs for almost every function, the per-script unused-% collapsed to roughly zero across the board, leaving sitespeed.io rendering a &quot;0 B unused&quot; column on pages that obviously ship plenty of dead code. The calculation now walks the ranges as nested intervals, painting the innermost range&#39;s count at every byte (the same definition Chrome DevTools&#39; Coverage panel uses), so dead branches inside executed functions show up correctly. CSS rule-usage tracking returns flat, non-overlapping ranges and is unchanged #2484.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 27.4.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.4.0</guid>
            <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- JS/CSS coverage collection for Chrome. <code>--chrome.coverage</code> turns it on for every iteration for users who want the data and accept that detailed V8 coverage deoptimizes scripts and will skew their timing metrics. <code>--enableProfileRun</code> also turns coverage on for Chrome alongside the existing trace, so users who want coverage without affecting their timings can lean on the same extra-iteration pattern they already use for tracing — the result is merged back into the main <code>browsertime.json</code> so consumers like sitespeed.io see the data in the same place they read every other metric. Each entry has a per-file breakdown (<code>url</code>, <code>totalBytes</code>, <code>usedBytes</code>, <code>unusedBytes</code>, <code>unusedPercent</code>) #2480.<br>
<br>
<strong>Fixed</strong><br>
- HAR post-processing no longer throws when a page has no matching entries. Occasionally a HAR contains a page whose <code>pageref</code> has no entries — typically a navigation that didn&#39;t produce any requests, or an extension-injected page. <code>getDocumentRequests</code> and <code>getFinalURL</code> dereferenced <code>shift()</code> / <code>pop()</code> without a guard, and <code>getMainDocumentTimings</code> wrapped its entire per-page loop in a single try/catch so one bad page wiped out the main-document timings for every other page in the same HAR. Downstream this surfaced as a noisy triplet of warnings followed by an empty coach-data payload in sitespeed.io. The three crash points are now guarded and unresolvable pages are skipped #2483.<br>
- Bumped <code>geckodriver</code> to a version with native ARM-64 support #2482.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[onlinetest 4.0.1]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#4.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#4.0.1</guid>
            <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Compare page now renders screenshots, the filmstrip and the run video when the HAR points at a different sitespeed.io result server (e.g. wikiperformance comparing HARs that live on wikimedia.sitespeed.io). The helmet CSP only allowed <code>&#39;self&#39;</code> for images and — via the inherited <code>default-src</code> — for video, so the cross-origin URLs the HAR carries in <code>_meta.screenshot</code> / <code>_meta.filmstrip[].file</code> / <code>_meta.video</code> were blocked and the slots came up empty. <code>img-src</code> now also allows any <code>https:</code> origin and a new <code>media-src</code> does the same for video #269.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[browsertime 27.3.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.3.0</guid>
            <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- <code>browsertime --help</code> is now navigable by topic. The default view shows a short curated list of common options plus the available topic names. <code>browsertime --help &lt;topic&gt;</code> shows just that topic, and <code>browsertime --help-all</code> reproduces the historical full dump for scripts and power users. The old single-screen dump of every option from all 13 topic groups was overwhelming for new users and slow to skim; the topic-filtered view follows the curl/ffmpeg pattern #2467.<br>
<br>
<strong>Fixed</strong><br>
- TypeScript types and IntelliSense for navigation scripts are tightened across the script-facing surface. A new <code>BrowsertimeScript</code> type alias lets scripts annotate their default export and get both <code>context</code> and <code>commands</code> typed in one line. The high-level command helpers (<code>navigate</code>, <code>find</code>, <code>getText</code>, <code>fill</code>, <code>hover</code>, <code>press</code>, <code>getTitle</code>, <code>waitForUrl</code>, …) now surface their JSDoc parameter and return types in IntelliSense instead of being typed as <code>Function</code>, and <code>commands.find</code> resolves to a real <code>WebElement</code> so chained calls get completion from selenium-webdriver #2476. <code>context.options</code>, <code>context.result</code>, and <code>context.taskData</code> are typed as <code>Record&lt;string, any&gt;</code> so editors offer completion on <code>context.options.</code> etc. #2478. <code>commands.mouse</code> is now a proper shape (selector typed as <code>string</code>, <code>singleClick</code>&#39;s options surface <code>waitForNavigation</code>) instead of an anonymous object literal, and <code>measure.stop</code> / <code>measure.clickAndMeasure</code> / <code>measure.stopAsError</code> return types are explicit (<code>Promise&lt;void&gt;</code> / <code>Promise&lt;unknown&gt;</code>) instead of <code>Promise&lt;any&gt;</code> #2479.<br>
- How Browsertime publishes its TypeScript types is now safer. <code>scripting.d.ts</code> moved to the repo root next to <code>package.json</code> so it can&#39;t be clobbered by a future <code>tsc</code> outDir change, the <code>types</code> condition comes first under <code>exports</code> to match TypeScript&#39;s documented resolution rules, and <code>publint</code> runs as part of <code>prepublishOnly</code> so common package.json mistakes fail before a release goes out #2477.<br>
- Replaced the direct <code>lodash.merge</code> dependency with a small in-tree <code>merge()</code> helper in <code>lib/support/util.js</code>. The helper matches lodash&#39;s actual semantics for the cases Browsertime relies on — arrays merged by index, <code>undefined</code> source values skipped unless the key is missing on the target, <code>Date</code>/<code>RegExp</code>/class instances passed by reference, prototype-pollution keys rejected — which finishes the lodash unbundling the same way sitespeed.io did #2468.<br>
- Bumped dependencies: <code>chrome-har</code> 1.3.1 #2469, <code>chrome-remote-interface</code> and <code>selenium-webdriver</code> #2475, <code>@sitespeed.io/log</code> 2.0 #2471, <code>chromedriver</code> / <code>edgedriver</code> / <code>geckodriver</code> #2472.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.3.1]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.3.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.3.1</guid>
            <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 4.0.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#4.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#4.0.0</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- New <code>failed_reason TEXT</code> and <code>finished_date TIMESTAMP</code> columns on <code>sitespeed_io_test_runs</code>. <code>failed_reason</code> is populated from three paths the DB previously knew nothing about: Bull&#39;s <code>global:failed</code> event (the testrunner threw), the queue-down submit path in <code>add-test.js</code> (Redis unreachable when the test was queued), and the result-queue path when sitespeed.io itself exits non-zero (testrunner now sends <code>Test runner exited with code N: &lt;last line of stderr&gt;</code>, capped at 500 chars). <code>finished_date</code> is stamped on every terminal transition, so end-to-end duration can be derived as <code>finished_date - added_date</code> and run duration as <code>finished_date - run_date</code> (which is the browsertime <em>start</em> timestamp, not finish) #264.<br>
- <code>server/database/migrations/</code> directory establishes the convention for schema changes against existing deployments — <code>setup.sql</code> only runs on a fresh Postgres data dir, so live databases need ALTERs applied separately. Each migration ships with a <code>.sh</code> helper (<code>check</code> / <code>backup</code> / <code>dry-run</code> / <code>apply</code> / <code>verify</code> / <code>rollback</code>) that runs <code>psql</code> inside the compose Postgres container, plus a README documenting the manual path. Existing deployments must run <code>001-add-failure-fields.sh apply</code> before rolling the server forward #264.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.8.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.8.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.8.0</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Default sitespeed.io Docker image bumped from 40 to 41 in <code>.env.example</code>. The README &quot;Update sitespeed.io version&quot; snippets now reference 41 / 42 as the current and next-major tags.<br>
- Vendored compare bundle rolled to pagexray 5.0.0 (HTTP/3 detection, case-insensitive <code>Cache-Control</code> directives, <code>missingCompression</code> over-count fix). The bundle shrinks from ~28 KB to ~17 KB thanks to pagexray&#39;s switch from uglify-es to terser #262.<br>
<br>
<strong>Fixed</strong><br>
- <code>/admin</code> &quot;failed&quot; pill is now a real health signal: it counts failed test runs in the last 24 h from Postgres instead of Bull&#39;s <code>getJobCounts()</code>, which was capped by <code>removeOnFail</code> and only decayed on a successful retry — so the pill accumulated weeks of stale failures and shouted &quot;13 failed&quot; next to activity cards that correctly showed 0 in 24 h #261.<br>
- Compare cookie list no longer renders domains like <code>.example.com\nUIDR=...</code> when a HAR concatenates multiple <code>Set-Cookie</code> response headers into one newline-joined value — the next cookie&#39;s name was leaking into the previous cookie&#39;s <code>Domain=</code> attribute. Picked up via the pagexray bump #262.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[pagexray 5.0.0]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#5.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#5.0.0</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- CLI can now read a HAR from stdin: <code>pagexray -</code> or piping into <code>pagexray</code> with no path argument #131.<br>
- CLI prints a friendly error to stderr and exits 1 when the file is missing or the input isn&#39;t valid JSON (previously threw a raw Node stack trace) #131.<br>
- README updated to drop the long-removed <code>cookieStats</code> example block and document fields added across 3.x / 4.x (<code>fullyLoaded</code>, <code>afterOnLoad</code>, <code>afterOnContentLoad</code>, <code>renderBlocking</code>, <code>googleWebVitals</code>, <code>cpu</code>, <code>firstPartyRegEx</code>) #130.<br>
<br>
<strong>Fixed</strong><br>
- Classify <code>HTTP/3</code> / <code>HTTP/3.0</code> connections as <code>h3</code> (previously only the lowercase <code>h3</code> / <code>h3-29</code> shorthand was recognised — the canonical form fell through to <code>h1</code>) #128.<br>
- Parse <code>Cache-Control</code> directives case-insensitively (RFC 7234 §5.2). <code>Max-Age=42</code> is now read as 42 instead of 0, and <code>No-Cache</code> / <code>No-Store</code> are honoured #128.<br>
- Replace the deprecated <code>url.parse</code> (Node DEP0169) with the WHATWG <code>URL</code> parser in <code>getHostname</code> #128.<br>
- Stop throwing in <code>getDocumentRequests</code> when a page has no matching entries — return an empty array instead #128.<br>
- <code>missingCompression</code> was flagging every large text asset, including gzipped ones, because <code>headers.flatten</code> wraps values in arrays and the encoding check compared the array to a string. Unwrap before comparing, accept compound codings (<code>br, gzip</code>), and recognise <code>zstd</code> #129.<br>
- Match the <code>Domain=</code> cookie attribute case-insensitively (RFC 6265 §5.2) so third-party cookies set with lowercase <code>domain=</code> are detected #129.<br>
- Recognise common two-label public suffixes (<code>.co.jp</code>, <code>.com.br</code>, <code>.com.au</code>, ...) in <code>getMainDomain</code> so the auto-generated first-party regex isn&#39;t wrong for non-<code>.co.uk</code> country domains #129.<br>
- <code>defaultContentTypes</code> now includes <code>favicon</code> so every page has a consistent shape (matches the example in the README) #129.<br>
- <code>xml</code> is now considered for <code>missingCompression</code> reporting #129.<br>
- <code>engines.node</code> bumped from <code>&gt;=8.9.0</code> to <code>&gt;=22.0.0</code> (the current Node.js LTS), and the GitHub Actions matrix now runs on Node 22 + 24 #132, #133.<br>
- Test runner switched from Mocha + Chai to AVA, matching the rest of the sitespeed.io / browsertime ecosystem. Test helpers no longer depend on bluebird or lodash #133.<br>
- ESLint upgraded from 8 to 9 with the new flat config (<code>eslint.config.js</code> replaces <code>.eslintrc.json</code> and <code>.eslintignore</code>) #133.<br>
- All devDependencies bumped to current major versions: prettier 3, browserify 17, browserify-banner 2, @babel/core + preset-env 7.29, jsdoc 4. The abandoned <code>uglify-es</code> is replaced by <code>terser</code>, and <code>mkdirp</code> is dropped in favour of native <code>fs.mkdirSync({recursive:true})</code> in the browserify script #133.<br>
<br>
<strong>Changed</strong><br>
- Node.js 22 is minumium.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.7.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.7.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.7.0</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Per-queue 24 h sparkline on each <code>/admin</code> queue row, independently scaled so low- and high-traffic queues both show shape #256.<br>
- Subtle motion on <code>/admin</code>: one-time staggered bar-chart entrance, refresh-indicator pulse, and tweened number rollups when totals change. All honour <code>prefers-reduced-motion</code> #256.<br>
<br>
<strong>Fixed</strong><br>
- Queue defaults bumped to <code>removeOnComplete: 50 / removeOnFail: 100 / attempts: 2</code>; code-level fallbacks aligned with the yaml #255.<br>
- Internal queues (<code>testrunners</code>, <code>result</code>) no longer listed on <code>/admin</code> — they had no failures, no sparkline, and an inert Empty button #258.<br>
- Refresh indicator on <code>/admin</code> now sits in a fixed-width column so the version pill can&#39;t shift sideways each tick #258.<br>
- Testrunner setup duplicated on restart — registration was concatenating old + new instead of deduping #257.<br>
- Multi-type setups on one location (e.g. desktop + emulatedMobile) collapsed into the last entry after a restart; dedupe now keys on full setup identity, not just queue name #259.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.6.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.6.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.6.0</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Activity stats on <code>/admin</code>: totals for the last 24 hours and 7 days plus a stacked bar chart of tests per hour over the last 24 h (completed / failed / other). Pure server-rendered SVG, cached for 60 s so the auto-refresh doesn&#39;t beat on Postgres #252.<br>
<br>
<strong>Fixed</strong><br>
- Hide the Failed count for the internal <code>testrunners</code> and <code>result</code> queues — the number was unactionable because the queues don&#39;t appear in Recent failures #251.<br>
- Age labels in Recent failures now graduate to <code>d</code>/<code>mo</code> past 48 h instead of shouting <code>12608h ago</code> #251.<br>
- Long URLs no longer push the <code>/search/</code> results table past its container and shove the page off-centre. URL cells now wrap at any character; the form has <code>overflow-x: auto</code> as a safety net #253.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.5.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.5.0</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Health banner on <code>/admin</code>: Redis up/down, Postgres up/down, connected testrunners, totals for pending/running/failed jobs #247.<br>
- &quot;Currently running&quot; table on <code>/admin</code> — every active job with URL/script, queue, runner, and elapsed time. Runs over 10 minutes are highlighted #247.<br>
- &quot;Recent failures&quot; table on <code>/admin</code> with the error message and a one-click Retry button #248.<br>
- Active and Failed counts on the queue table, plus a red &quot;no worker&quot; badge when a queue has pending jobs but no testrunner serving it #246.<br>
- <code>/admin</code> auto-refreshes every 15 seconds. Pauses in background tabs #249.<br>
- Opt-in auto-refresh toggle on <code>/search/</code>, 60 seconds. Off by default. Pauses while any test is ticked, so Compare selections aren&#39;t lost. State remembered in <code>localStorage</code> #250.<br>
- <code>/admin</code> mobile layout reworked for the new tables — rows stack into name → counts → action on narrow screens #246 #247 #248.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.4.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.4.0</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- <strong>Connected testrunners</strong> table on <code>/admin</code> showing hostname, location, the setup each machine serves, and a fresh / stale &quot;last seen&quot; badge. Each testrunner publishes a heartbeat on the existing <code>testrunners</code> Bull queue every 30 s; the server tracks <code>lastSeenAt</code> per runner and prunes anything quiet for &gt;120 s, so crashed runners (OOM, host reboot, <code>docker kill</code>) drop off the admin page within ~2 minutes instead of haunting the metrics gauge forever. When two runners pick the same <code>LOCATION_NAME</code> + <code>deviceId</code>, the server logs a clear <code>Testrunner queue collision: hostA and hostB both claim queue X. Change LOCATION_NAME (or deviceId) on one of them.</code> — the registration still goes through so existing deployments don&#39;t break, but the collision is no longer silent #244.<br>
- <code>deploy/PRODUCTION.md</code> gets an &quot;Adding a third (or Nth) testrunner&quot; section with three concrete troubleshooting cases: not registering, stale row, queue collision #244.<br>
- <strong>Compare workflow on <code>/search/</code></strong>: the column over the per-row checkbox is now its own <code>Compare</code> header (split out from the generic &quot;Actions&quot;), a one-line helper below the table explains the affordance, and each checkbox carries an <code>aria-label</code> / <code>title</code> of &quot;Select this run to compare with another&quot;. The Compare button itself starts disabled, gates submission until exactly two completed runs are ticked (a third tick is refused — the unchecked boxes go disabled when the limit is hit), and shows a transient inline message on a premature click (&quot;Select 1 more test to enable Compare.&quot; / &quot;Select 2 completed tests above first.&quot;) via <code>aria-disabled</code> + a polite <code>aria-live</code> region #240.<br>
- <code>deploy/update.sh</code> — a single operator command that pulls the latest images, restarts services with <code>up -d --remove-orphans</code>, prints <code>docker compose ps</code>, and tails logs for 10 seconds so first-boot errors land in the same terminal. <code>--mode {all-in-one|server|testrunner}</code> picks the right production compose file; <code>--version X.Y.Z</code> rewrites <code>SITESPEED_IO_SERVER_VERSION</code> / <code>SITESPEED_IO_TESTRUNNER_VERSION</code> in <code>.env</code> atomically before pulling. <code>PRODUCTION.md</code> is updated to call the helper in every place it used to spell out the compose invocation by hand.<br>
- <code>.env.example</code> is now the single source of truth for every variable any compose file reads (dev or production). New header walks through the three deployment shapes, and the previously-undocumented <code>DOMAIN</code> variable (used by the Caddy single-server compose for automatic HTTPS) is included. <code>PRODUCTION.md</code> drops its inline env-var snippets and points at <code>.env.example</code> so the two can&#39;t drift.<br>
<br>
<strong>Fixed</strong><br>
- <code>SIGTERM</code> / <code>SIGINT</code> now actually drain in-flight HTTP requests before the process exits. The previous shutdown chain ended at <code>this.app.close()</code> on the Express app object (no such method exists), so the HTTP server was never told to stop — it just disappeared when <code>process.exit(0)</code> fired a few lines later, killing in-flight requests mid-response. The web server now keeps the real <code>http.Server</code> reference and calls <code>close()</code> on it; a configurable <code>server.shutdown.timeoutMs</code> (default 30 s) caps the drain and falls back to <code>closeAllConnections()</code> after the deadline. A second signal during shutdown short-circuits to immediate exit for operators who&#39;d rather not wait #243.<br>
- Custom hero / navbar logo overrides now use whatever dimensions the operator sets in <code>html.logo.*</code>. Two hardcoded <code>aspect-ratio: 90.488 / 19.543</code> / <code>aspect-ratio: 123 / 25.375</code> CSS rules were forcing every logo back to the bundled SVG&#39;s proportions #239.<br>
- The analyze button on the Extras tab no longer sits a few pixels lower than on the other tabs. <code>#extras .control</code> was applying <code>padding: 4px 0</code> to the submit button&#39;s wrapper as well as to the intended checkbox rows; scoped to <code>.extras-fieldset .control</code> so only the diagnostics checkboxes get the extra spacing #239.<br>
- Footer spacing: removed the duplicate <code>&amp;nbsp;</code> before &quot;version&quot; and added one between the trailing dash and &quot;AGPLv3&quot;, so the footer now reads &quot;©sitespeed.io  2026 - version X.Y.Z - AGPLv3&quot; with consistent spacing #239.<br>
- Search help panel: tighter copy. &quot;You can combine your search commands. To find a test for a URL, date and browser you can search like this&quot; is now &quot;Combine commands to narrow your search. Example&quot;. The &quot;Find tests by …&quot; preamble that repeated on every line is gone — each command now leads with its field name and (where applicable) the allowed values #239.<br>
<br>
<strong>Security</strong><br>
- Stop logging and echoing back invalid API keys. <code>validateKey</code> used to write the rejected value to the server log and return it in the 403 response body, so typos and stale secrets piled up in log aggregation. The log line is now <code>Invalid API key supplied</code> (no value, no length) and the response carries a single &quot;Invalid API key.&quot; message in every locale #242.<br>
- Close two XSS vectors that the recent UI work uncovered:<br>
- Enforce a defense-in-depth CSP (<code>default-src &#39;self&#39;</code>; <code>script-src</code> / <code>style-src</code> allow <code>&#39;unsafe-inline&#39;</code> transitionally because pug templates still ship inline blocks; <code>frame-ancestors &#39;none&#39;</code>, <code>object-src &#39;none&#39;</code>, <code>base-uri &#39;self&#39;</code>, <code>form-action &#39;self&#39;</code>) and re-enable HSTS. Both were disabled previously #242.<br>
- Block sensitive sitespeed.io flags from the GUI&#39;s &quot;Command line args&quot; tab. The user-supplied extras textarea used to forward arbitrary flags to the testrunner with only <code>--verbose</code> filtered. A GUI submission could load plugin / JS code (<code>--plugins.add</code>, <code>--browsertime.preScript</code>), run any binary as the browser (<code>--browsertime.chrome.binaryPath</code>), redirect HARs and metrics to an attacker-controlled destination (whole <code>--graphite.*</code> / <code>--s3.*</code> / <code>--gcs.*</code> / <code>--scp.*</code> / <code>--slack.*</code> / <code>--matrix.*</code> / <code>--datadog.*</code> / <code>--influxdb.*</code> namespaces), or read arbitrary files via <code>--config</code>. A denylist now drops these tokens (and their value arguments) before they reach sitespeed.io, and <code>/sitespeed-help.json</code> filters the same set so the CLI picker stops suggesting them (277 → 187 entries). API submissions (which pass a <code>userConfig</code> object, not extras) are deliberately untouched #241.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[compare 2.0.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#2.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#2.0.0</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Swapped the waterfall renderer from PerfCascade to<br>
- Page X-ray table grouped into sections (Content, Render blocking,<br>
- Filmstrip section (when both HARs have one) with frames sampled from<br>
- Visual progress chart now shows per-HAR timing markers<br>
- Core Web Vitals row in the page X-ray table:<br>
- Render-blocking metrics from Chrome HARs (blocking, potentially<br>
- Long Tasks, Total Blocking Time and Max Potential FID under CPU.<br>
- <code>stripVersion</code> configuration flag (and a checkbox on the start page)<br>
- Support for <code>.har.gz</code> HAR files via the browser&#39;s native<br>
- Skip-to-content link, ARIA labels and visually-hidden table captions<br>
- Comment slot for the request/response diff section<br>
- First/third party support — PageXray now auto-detects the host page&#39;s<br>
<br>
<strong>Changed</strong><br>
- Build tooling moved to Vite. The build output<br>
- Styling rewritten in plain CSS (Sass dropped) with a small design-token<br>
- Templates rewritten as plain JS template literals (Template7 dropped).<br>
- Upgraded PageXray to 4.x.<br>
<br>
<strong>Removed</strong><br>
- The service worker / Workbox offline support. A one-time cleanup<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.3.1]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.3.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.3.1</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Filmstrip 404s in the compare view, again — the 3.3.0 pass still constructed frame URLs on a fixed 100 ms cadence inside <code>(FirstVisualChange, LastVisualChange)</code>, which broke whenever visual progress sat flat between two boundaries (the expected JPGs were never written to disk). The vendored compare bundle now reads frame timestamps straight from <code>_visualMetrics.VisualProgress</code> — one JPG per VP sample, named after that exact ms — and lets the existing 100 ms padding step forward-fill the uniform grid, so the rendered strip still reads &quot;nothing happened for 2 s&quot; differently from &quot;everything changed in 50 ms&quot; #238.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.3.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.3.0</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Refreshed the vendored compare bundle with a sharing pass, accurate transfer-size diffs and style recalculation visibility:<br>
<br>
<strong>Fixed</strong><br>
- Filmstrip and Visual Progress thumbnails no longer 404 — frame timestamps are now derived from the same <code>_visualMetrics.VisualProgress</code> change points sitespeed.io&#39;s own report uses, matching the cadence sitespeed.io actually wrote to disk.<br>
- Millisecond timings in the page-x-ray diff are rounded to whole ms — the new recalc duration field reports sub-ms precision (&quot;17.099 ms&quot;) that&#39;s noise at this scale.<br>
- &quot;Switch HAR&quot; and run-dropdown changes preserve the previous source URLs / config / stripVersion choice, so the Share UI doesn&#39;t downgrade from &quot;Copy share link&quot; to &quot;Download bundle&quot; on every toggle.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[onlinetest 3.2.0]]></title>
            <link>https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/onlinetest/blob/main/CHANGELOG.md#3.2.0</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Refreshed the vendored compare bundle to pick up the upstream regression-spotting pass:<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[pagexray 4.5.0]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.5.0</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Surface page-level style recalculation work on <code>renderBlocking.recalculateStyle</code><br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 27.2.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.2.0</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Surface the page-level <code>recalculateStyle</code> summary (beforeFCP / beforeLCP element counts + durations) on the first HAR page as <code>_renderBlocking.recalculateStyle</code>. The per-request <code>_renderBlocking</code> map already projected onto each entry stays where it is — the page-level summary is what powers the &quot;Elements that needed recalculate style before FCP&quot; view and was previously only reachable via <code>browsertime.json</code> #2466.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.3.0]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.3.0</guid>
            <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Lift CDP <code>renderBlockingStatus</code> onto entries as <code>_renderBlocking</code> (Chrome 108+) so downstream HAR consumers (waterfall-tools&#39;<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[browsertime 27.1.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.1.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.1.0</guid>
            <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Three new analyses on <code>result.cpu</code> derived from the same Chrome <code>trace.json</code> that&#39;s already collected when <code>--cpu</code> is on. <code>scriptCosts</code> produces the per-URL parse / compile / execute / total breakdown that Lighthouse&#39;s bootup-time audit shows, sorted by total descending. <code>forcedReflows</code> walks the main-thread task tree for <code>Layout</code> / <code>UpdateLayoutTree</code> events nested inside JS-driven tasks (<code>EventDispatch</code>, <code>FunctionCall</code>, <code>TimerFire</code>, <code>FireAnimationFrame</code>, …) — every match is a synchronous reflow caused by JavaScript reading a layout-triggering property mid-handler, reported with the script that triggered it. <code>nonCompositedAnimations</code> surfaces <code>Animation</code> events whose <code>compositeFailed</code> bitmask is non-zero, returning the unsupported properties (<code>top</code>, <code>box-shadow</code>, <code>filter</code>, …) so consumers can see what to swap for the GPU-friendly equivalent. Each new analysis is wrapped in its own try / catch so a bug in one can&#39;t poison the existing <code>categories</code> / <code>events</code> / <code>urls</code> payload #PR1.<br>
<br>
<strong>Fixed</strong><br>
- Replace the unmaintained <code>@sitespeed.io/tracium</code> dependency (extracted from Lighthouse circa 2017, last release 0.3.3) with an in-tree ESM port at <code>lib/chrome/trace/</code>. The algorithm is a 1:1 port; output of <code>computeMainThreadTasks</code> is byte-equivalent for any trace, so existing <code>result.cpu.{categories,events,urls}</code> consumers see no change. Pulling the parser inline lets new analyses ship at Browsertime&#39;s release cadence without a second <code>npm publish</code> step in between #PR1.<br>
- Modernise the trace-event classifier. The original list only knew about ~30 event names, so on busy 2026-era pages roughly half the trace fell through to &quot;other&quot; — on a sample cnet run that meant 1.3 s of &quot;other&quot; hiding <code>RunTask</code>, <code>v8.run</code>, <code>IntersectionObserverController::computeIntersections</code>, <code>PrePaint</code>, <code>Commit</code>, <code>Layerize</code>, <code>v8.callFunction</code>, <code>V8.DeserializeContext</code> and friends. The expanded list draws from modern Lighthouse + the WebPageTest-derived map in waterfall-tools + direct sampling of real traces, and a new <code>groupForEvent()</code> lookup adds <code>V8.GC*</code> prefix matching so future V8 GC phases auto-classify #PR1.<br>
- Bump <code>chrome-har</code> to 1.3.0 to pick up the new <code>_renderBlocking</code> field on each entry, lifting Chrome&#39;s CDP <code>renderBlockingStatus</code> (Chrome 108+) so downstream HAR consumers can see which resources blocked first paint without inferring it from the trace.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 27.0.4]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.4</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.4</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Fix Safari iOS video time scale #2457. This make the video and Safari metric match.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[browsertime 27.0.3]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.3</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Fix so INP only is calculated on interactions with an id #2456.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/browsertime.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.2.1]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.2.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.2.1</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Make sure not multiple pages are created for a soft nav #154<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.2.0]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.2.0</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Support for soft navigation coming from Browsertime #153<br>
<br>
<strong>Fixed</strong><br>
- Get Charset from response #152<br>
- Fix to parse postData #150<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[throttle 6.0.0]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#6.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#6.0.0</guid>
            <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Added IPv6 throttling support on macOS #94 and Linux #100.<br>
- Apply packet loss also to the upload interface #69.<br>
<br>
<strong>Fixed</strong><br>
- More robust detection of the default network interface on Linux, falling back to global IP address lookup when the default route is unavailable #104.<br>
- Fixed README profile values for DSL and Edge to match actual code, and fixed Node.js API examples to use named imports.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.1.1]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.1.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.1.1</guid>
            <pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- The option to clean header values was broken, this has been reverted for now.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.1.0]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.1.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.1.0</guid>
            <pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Add option to clean header values #141.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.0.1]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.0.1</guid>
            <pubDate>Fri, 11 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Try/catch broken dates #130.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 1.0.0]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#1.0.0</guid>
            <pubDate>Tue, 08 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Removed dayjs dependency #128.<br>
- Removed uuid dependency #127.<br>
- Updated to tough cookie 5.0.0 #126.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[throttle 5.0.1]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#5.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#5.0.1</guid>
            <pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Smarter ifb0 handling on Linux #93.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 0.13.5]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#0.13.5</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#0.13.5</guid>
            <pubDate>Fri, 12 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Always take care of Network.responseReceivedExtraInfo even if its fired early, thank you ifduyue for PR #120.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[chrome-har 0.13.3]]></title>
            <link>https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#0.13.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/chrome-har/blob/main/CHANGELOG.md#0.13.3</guid>
            <pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Include early hints requests, thank you Ben Schwarz for PR #118.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[pagexray 4.4.4]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.4</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.4</guid>
            <pubDate>Thu, 31 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Added a safer header check #125.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[pagexray 4.4.3]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.3</guid>
            <pubDate>Thu, 31 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- If the meta section from a HAR file from Browsertime was missing, we didn&#39;t catch that. Fixed in #124.<br>
- Update to latest minimist #122.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[throttle 5.0.0]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#5.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#5.0.0</guid>
            <pubDate>Sat, 02 Jul 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Changed</strong><br>
- Dropped support for NodeJS 12 since it&#39;s unmaintaned.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[throttle 4.0.3]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.3</guid>
            <pubDate>Wed, 29 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Fixed <code>--version</code> so it actually shows the version again #75.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[throttle 4.0.2]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.2</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.2</guid>
            <pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- The E6 Module convertion in 4.0 broke version check (<code>--version</code>) making installs failed. PR #74 is a temporaty fix for that.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[throttle 4.0.1]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.1</guid>
            <pubDate>Fri, 17 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Removed the dependecy of route. Using <code>ip route</code> instead and we already have <code>ip</code> as a requirement.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[pagexray 4.4.2]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.2</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.2</guid>
            <pubDate>Thu, 05 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Added missing SSL timings to the time per domain #117<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[throttle 3.1.1]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#3.1.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#3.1.1</guid>
            <pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Updated minimist dependency.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[throttle 4.0.0]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#4.0.0</guid>
            <pubDate>Thu, 14 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Updated dev dependencies to latest versions #68<br>
<br>
<strong>Changed</strong><br>
- Converting the project to ES6 module. If you run Throttle by command line it will work exactly as before except that we dropped support for NodeJS 10 #67. You can read Sindre Sorhus ESM package guide.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[pagexray 4.4.1]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.1</guid>
            <pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Bumped minimist to 1.2.6<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[pagexray 4.4.0]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.4.0</guid>
            <pubDate>Fri, 04 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Fallback if mime types aren&#39;t mapped and use file endings. At the moment we fallback for some of the font types #109.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[throttle 3.1.0]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#3.1.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#3.1.0</guid>
            <pubDate>Sun, 26 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Add support for setting packet loss. Add <code>--packetLoss</code> and set the loss in percentage.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[coach-core 7.0.0]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#7.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#7.0.0</guid>
            <pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Updated to use latest Coach core and Browertime.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 7.0.0]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#7.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#7.0.0</guid>
            <pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Updated to use latest Coach core and Browertime.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 6.4.3]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#6.4.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#6.4.3</guid>
            <pubDate>Fri, 15 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Updated to use latest Browsertime with latest Chromedriver<br>
- Updated Docker container to use latest Chrome/Firefox<br>
- Use Browsertime 11.0.0<br>
- Use Coach-code 6.0<br>
- Use latest Firefox and Chrome<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 6.4.3]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#6.4.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#6.4.3</guid>
            <pubDate>Fri, 15 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Updated to use latest Browsertime with latest Chromedriver<br>
- Updated Docker container to use latest Chrome/Firefox<br>
- Use Browsertime 11.0.0<br>
- Use Coach-code 6.0<br>
- Use latest Firefox and Chrome<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[pagexray 4.3.1]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.3.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.3.1</guid>
            <pubDate>Wed, 21 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Added missing in_body_parser_blocking render blocking info for Chrome.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[pagexray 4.3.0]]></title>
            <link>https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/pagexray/blob/main/CHANGELOG.md#4.3.0</guid>
            <pubDate>Wed, 02 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Include request method per asset #105.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/pagexray.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 5.0.0]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#5.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#5.0.0</guid>
            <pubDate>Wed, 11 Mar 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Changed</strong><br>
- We moved out the core functionality to coach-core. This makes it easy to use the Coach in your own code.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 5.0.0]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#5.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#5.0.0</guid>
            <pubDate>Wed, 11 Mar 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Changed</strong><br>
- We moved out the core functionality to coach-core. This makes it easy to use the Coach in your own code.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 4.5.0]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.5.0</guid>
            <pubDate>Thu, 20 Feb 2020 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 4.5.0]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.5.0</guid>
            <pubDate>Thu, 20 Feb 2020 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 4.4.1]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.4.1</guid>
            <pubDate>Fri, 07 Feb 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Upgraded to Browsertime 8.0.1<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 4.4.1]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.4.1</guid>
            <pubDate>Fri, 07 Feb 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Upgraded to Browsertime 8.0.1<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 4.4.0]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.4.0</guid>
            <pubDate>Wed, 05 Feb 2020 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 4.4.0]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.4.0</guid>
            <pubDate>Wed, 05 Feb 2020 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[humble 0.2.0]]></title>
            <link>https://github.com/sitespeedio/humble/blob/main/CHANGELOG.md#0.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/humble/blob/main/CHANGELOG.md#0.2.0</guid>
            <pubDate>Sat, 11 Jan 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Updated throttle frontend to latest version where you can see throttling profiles set by using the API and with custom throttling support.<br>
]]></description>
            <author>Sitespeed.io</author>
        </item>
        <item>
            <title><![CDATA[coach-core 4.3.1]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.3.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.3.1</guid>
            <pubDate>Fri, 10 Jan 2020 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 4.3.1]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.3.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.3.1</guid>
            <pubDate>Fri, 10 Jan 2020 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 4.3.0]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.3.0</guid>
            <pubDate>Thu, 12 Dec 2019 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 4.3.0]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.3.0</guid>
            <pubDate>Thu, 12 Dec 2019 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach-core 4.2.0]]></title>
            <link>https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach-core/blob/main/CHANGELOG.md#4.2.0</guid>
            <pubDate>Sat, 02 Nov 2019 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[coach 4.2.0]]></title>
            <link>https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/coach/blob/main/CHANGELOG.md#4.2.0</guid>
            <pubDate>Sat, 02 Nov 2019 00:00:00 GMT</pubDate>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/coach.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 1.0.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#1.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#1.0.0</guid>
            <pubDate>Wed, 28 Nov 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Added support for using Github gists see #34.<br>
- Added support for using a config file to configure which HARs to test.<br>
- Added support for copy/paste directly you HAR, configuration file or a gist URL or id.<br>
- Refactor the CSS into Sass, development build process now uses BrowserSync.<br>
- Service worker added for offline support. Workbox is used to achieve this.<br>
- Added support for showing changes in request/responses if you compare the same page #63.<br>
<br>
<strong>Changed</strong><br>
- New internal structure and use the new configuration object all the way.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.6.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.6.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.6.0</guid>
            <pubDate>Wed, 17 Oct 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Sort CPU events by name to make it easier to spot regressions<br>
- Upgraded to latest release of template7<br>
- Added more Visual Metrics.<br>
- Upgrad to PageXray 2.4.0<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.5.1]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.5.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.5.1</guid>
            <pubDate>Fri, 01 Jun 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Layout -&gt; Rendering in latest Browsertime.<br>
- Upgraded to PerfCascade 2.5.2 fixiing Edge tab bug<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.5.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.5.0</guid>
            <pubDate>Thu, 05 Apr 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- CPU metrics are now showed automatically.<br>
- Styled the PageXray info table to make it easier to read.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.4.1]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.4.1</guid>
            <pubDate>Wed, 04 Apr 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Major code refactoring to make it easier to do changes in the future.<br>
- Uploading files failed on Firefox.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.4.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.4.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.4.0</guid>
            <pubDate>Mon, 02 Apr 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Upgraded to PerfCascade 2.4.1<br>
- You can change/upload HAR files when you already compare two HARs.<br>
<br>
<strong>Fixed</strong><br>
- The layout in the PageXray table was dependent of the length of the URL. That could make some pages look really bad.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.3.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.3.0</guid>
            <pubDate>Fri, 30 Mar 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Automatically load the HAR files if both files are given in the URL . Thanks Ivru for the PR #15.<br>
- You can automatically load one HAR file by adding ?har1=URL&amp;compare=1 as the full URL.<br>
- Updated to PageXray 2.2.1<br>
- You can now drag and drop one HAR file with multiple pages and compare the pages with each others #16.<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.2.1]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.2.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.2.1</guid>
            <pubDate>Sat, 03 Feb 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Upgraded to PerfCascade 2.2.2 that makes HAR files from WebPageTest Linux render<br>
- Log errors to the console<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[compare 0.2.0]]></title>
            <link>https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/compare/blob/main/CHANGELOG.md#0.2.0</guid>
            <pubDate>Thu, 01 Feb 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Upgraded to PageXray 2.1.0 and added more CPU metrics<br>
]]></description>
            <author>Sitespeed.io</author>
            <enclosure url="https://www.sitespeed.io/img/logos/compare.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>