<?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>Tue, 09 Jun 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 41.3.3]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.3.3</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.3.3</guid>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Release chain: dispatch <code>building-docker-release.yml</code>, <code>building-docker-autobuild.yml</code> and <code>netlify.yml</code> explicitly from <code>release.yml</code> instead of relying on the tag and main-branch pushes to fire them #4786.<br>
- Docker release images are now signed with cosign and ship with a SLSA provenance attestation and an SPDX SBOM attached as separate OCI artefacts in the same Docker Hub repository. Users can verify an image was built and pushed by this repository&#39;s release workflow with <code>cosign verify --certificate-identity-regexp &#39;https://github\.com/sitespeedio/sitespeed\.io/\.github/workflows/building-docker-release\.yml@refs/tags/v .*&#39; --certificate-oidc-issuer https://token.actions.githubusercontent.com sitespeedio/sitespeed.io:&lt;version&gt;</code>, and inspect the SBOM or provenance with <code>docker buildx imagetools inspect sitespeedio/sitespeed.io:&lt;version&gt; --format &#39;{{ json .SBOM }}&#39;</code>. The <code>-slim</code> and <code>-plus1</code> variants are signed the same way. Signing is keyless via Sigstore OIDC so there&#39;s no long-lived signing key to manage #4783.<br>
- Bump <code>step-security/harden-runner</code> from v2.14.2 to v2.19.4 across every workflow #4782.<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.3.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.3.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.3.1</guid>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- npm releases now ship a Sigstore provenance attestation and SPDX + CycloneDX SBOMs as GitHub Release assets. Releases run from a new <code>.github/workflows/release.yml</code> (triggered with <code>./release.sh patch|minor|major</code>), publish to npm via OIDC Trusted Publishing, and only push the version commit and tag after the publish succeeds — so a failed publish can&#39;t leave an orphan tag firing the Docker release for a never-published version. Users can verify what they install with <code>npm audit signatures</code> a#4780.<br>
- <code>SECURITY.md</code>: a written security policy with a documented channel (GitHub private vulnerability reporting, with email fallback). The file requires reporters to spell out an exploitation chain rather than just citing a finding, and takes an explicit stance on transitive-dependency CVEs that don&#39;t have a reachable code path in sitespeed.io&#39;s actual usage #4778.<br>
- <code>publiccode.yml</code>: machine-readable metadata so sitespeed.io can be listed in EU public-sector software catalogues. <code>release.sh</code>&#39;s replacement workflow keeps <code>softwareVersion</code> and <code>releaseDate</code> fresh automatically on every release #4779.<br>
- Slim Docker image build experiment #4777.<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.3.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.3.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.3.0</guid>
            <pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Docker base image bumped browsers to <code>chrome-149.0-firefox-151.0-edge-149.0</code> #4774, #4775.<br>
<br>
<strong>Fixed</strong><br>
- Browsertime 27.5.0 #4776.<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.5.0]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.5.0</guid>
            <pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><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>
<br>
<strong>Fixed</strong><br>
- Navigation-script failures now include the URL being tested and the iteration number in the error message, so failure logs and <code>markAsFailure</code> output point at the offending page without cross-referencing the surrounding log lines #2489.<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 41.2.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.2.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.2.1</guid>
            <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Unblock the arm64 Docker release build by bumping the QEMU <code>binfmt</code> emulator to a 9.2 build that handles modern systemd, and pinning APT so only the Firefox package is pulled from Debian unstable #4771.<br>
- Move the slim Docker image to Debian trixie (the new stable) and drop the APT pin from #4771, which was too strict to let Firefox&#39;s <code>libc6</code> / <code>libnss3</code> dependencies upgrade from unstable #4772.<br>
- CI: allow Docker Hub&#39;s CloudFront CDN (<code>production.cloudfront.docker.com</code>) through the Linux workflow&#39;s Harden-Runner egress allowlist, so the test job stops flaking when DNS routes the runner to CloudFront instead of Cloudflare #4773.<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.2.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.2.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.2.0</guid>
            <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- JS/CSS coverage in the report. Browsertime 27.4.0 collects per-iteration coverage when you pass <code>--chrome.coverage</code>, and the HTML report now surfaces it as a Coverage section in the per-URL view: median JS/CSS total/unused/percent KPIs, first-party vs third-party split, top-25 worst-offender tables, and a methodology + recommendations panel. <code>--chrome.coverage</code> is declared in sitespeed.io&#39;s own CLI so it shows up in <code>--help</code> and the config reference, and the <code>--enableProfileRun</code> path now collects coverage on the profile run and merges it into the main result #4769, #4767.<br>
<br>
<strong>Fixed</strong><br>
- Visual-change lines (<code>_firstVisualChange</code> / <code>_lastVisualChange</code> / <code>_visualComplete85</code>) are back on the waterfall when the HAR is gzipped on disk (the default). The renderer&#39;s user-timing injection was parsing the raw gzip bytes as JSON and silently falling back to the unannotated HAR; it now sniffs the gzip magic bytes and inflates via <code>DecompressionStream</code> first #4758.<br>
- Per-request detail panel on the waterfall now shows real data again. The panel was reading HAR-shape fields (<code>req.response.content.size</code>, <code>req.response.headers</code>, <code>req.response.status</code>, <code>req.timings</code>, …) but waterfall-tools&#39; click payload is its own flat internal <code>Request</code> object, so Response body always showed <code>0 B</code>, Status was blank, MIME type and Protocol were <code>—</code>, and the response-headers and timing tabs were empty. Look up the matching HAR entry by index and read the rich HAR shape from it, falling back to the waterfall-tools shape only when the HAR is missing.<br>
- Folder path aliases now accept Unicode letters and digits, so non-ASCII URLs no longer collapse to <code>-</code> in result paths (issue #3880) #4759.<br>
- <code>scp</code> plugin: retry the initial SFTP handshake up to 3× with linear backoff. <code>ssh2-sftp-client</code> v12 removed its built-in connect retries, so a single &quot;Connection lost before handshake&quot; blip was failing the whole upload #4760.<br>
- Graphite: retry the post-run annotation POST up to 3× on network errors and 5xx responses. 4xx still fails fast #4761.ß<br>
- <code>waterfall-tools</code> bumped to the first proper npm release, 0.3.0 — no more pinning to a GitHub tarball, and the bundling script drops to ~30 fewer lines now that the published browser bundle has the platform aliases baked in #4764.<br>
- Browsertime 27.4.0 #4767.<br>
- Docker base image rev&#39;d to <code>chrome-148.0-firefox-150.0-edge-147.0-d</code> #4762.<br>
- Slim Docker image cleanup #4757.<br>
- Drop now-unused npm <code>overrides</code> from <code>package.json</code> #4756.<br>
- CI: PR Docker workflow now builds and exercises the image on arm64 in addition to amd64, so arch-specific breakage surfaces pre-merge instead of at release-tag time. Edge step is skipped on arm64 (Linux Edge is amd64-only) #4766.<br>
- CI: pin the Safari workflow to <code>macos-14</code> #4765.<br>
- Drop an unnecessary <code>\.</code> escape inside a character class in <code>pathToFolder</code> that was tripping eslint&#39;s <code>no-useless-escape</code> and failing lint on every PR #4763.<br>
- Docs: remove unused CSS #4768.<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[sitespeed.io 41.1.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.1.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.1.0</guid>
            <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- New <code>rsync</code> plugin for result uploads. The existing <code>scp</code> plugin walks files one at a time over a single SFTP channel, which is the worst case for a result directory of thousands of small files. The new plugin shells out to <code>rsync</code> over <code>ssh</code>, pipelines the wire protocol and reuses the channel — the same upload finishes in a small fraction of the time on a typical Linux host. Exposed as <code>--rsync.host</code> / <code>--rsync.username</code> / <code>--rsync.privateKey</code> / <code>--rsync.destinationPath</code> etc., sitting alongside <code>scp</code>, <code>s3</code> and <code>gcs</code>; existing scp users keep their exact behaviour and opt in to rsync only when they want it #4739.<br>
- Upload performance on the existing <code>scp</code> plugin: swapped <code>node-scp</code> (serial uploads, stuck on 0.0.25) for <code>ssh2-sftp-client</code>, which fans out 16 concurrent uploads on the same ssh2 transport. Same auth, same options, same CLI surface — just faster on result directories with many small files #4738.<br>
<br>
<strong>Fixed</strong><br>
- Bring back the visual-change markers on the waterfall. The renderer that replaced PerfCascade in #4614 only drew vertical lines for a fixed set of page-event names, so the <code>_firstVisualChange</code> / <code>_lastVisualChange</code> / <code>_visualComplete85</code> lines silently disappeared with the swap. They&#39;re now hoisted into the user-timing-marks bag the renderer does draw, the &quot;Marks &amp; visual metrics&quot; toggle is on by default, and the hover tooltip identifies which metric or user mark the cursor is on #4755.<br>
- Browsertime 27.3.0 #4754.<br>
- <code>coach-core</code> bumped to 9.2.1 #4750.<br>
- Bump <code>@sitespeed.io/log</code> and the bundled plugin to latest #4746.<br>
- Crawler rewrite: <code>simplecrawler</code> (unmaintained since 2020, ~1000 lines of transitive code) is replaced by an in-tree <code>node:fetch</code>-based crawler in ~285 lines with no new dependency. Same BFS semantics, same depth/maxPages/include/exclude/content-type/skip-extension rules, same robots.txt handling (<code>--crawler.ignoreRobotsTxt</code> still opts out), same cookies/basicAuth/userAgent passthrough. Parity verified across four real-site runs at different depths and page caps; natural completion is ~6× faster on the sample runs #4745.<br>
- Dependency pruning, no behaviour change for users: <code>lodash.get</code>, <code>lodash.set</code> and <code>lodash.merge</code> are replaced by small in-tree helpers in <code>lib/support/objectPath.js</code>, with the <code>merge</code> replacement verified byte-for-byte against <code>lodash.merge</code> across 23 edge cases and an A/B <code>parseCommandLine()</code> run. <code>dayjs</code> (plus the utc plugin) is replaced by an ~80-line <code>lib/support/time.js</code>, with every <code>.format()</code> pattern actually used in the codebase pinned in a new test. <code>ora</code> is replaced by a ~60-line blinking-dot spinner used only by <code>--api.add</code> / <code>--api.addAndGetResult</code>. The lodash subtree is now gone entirely [#4737, #4741, #4742, #4744, #4740].<br>
- The <code>markdown</code> template helper exposed to pug templates is removed. It was added in 2018 (#2161) but no shipped <code>.pug</code> template has ever called it, and the underlying <code>markdown@0.5.0</code> package has been unmaintained for over a decade with an open ReDoS advisory. Anyone with a custom pug template that calls <code>markdown(...)</code> will need to import their own renderer #4743.<br>
- Slimmer main Docker image: <code>apt-get install --no-install-recommends</code> + <code>/var/lib/apt/lists</code> cleanup, <code>npm ci</code> (lockfile-strict) instead of <code>npm install</code>, and the <code>selenium-webdriver/bin</code> cleanup folded into the install layer so the deleted bytes no longer ship in an earlier layer #4753.<br>
- Docker: use <code>--omit=dev</code> instead of the deprecated <code>--production</code>, and fix the <code>skip edgedriver</code> typo #4752.<br>
- Release tooling: bump <code>feed</code> to 5.2.1 and <code>marked</code> to 18.0.3 (used only by <code>release/feed.js</code> when refreshing documentation RSS feeds). API usage unchanged, regenerated feeds are content-identical #4751.<br>
- Dev tooling: align with eslint 10 and unicorn 64, drop the dead legacy <code>.eslintrc.json</code> and the stale <code>eslint-check</code> script, minor bumps to prettier/sass/esbuild #4747.<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.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[sitespeed.io 41.0.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.0.1</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Drop unused fast-crc32c dependency #4735<br>
- Fix visual-progress curve and scrubber to match the data&#39;s semantics<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.0.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#41.0.0</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- HTTP/3 / HTTP/3.0 connections are now classified as <code>h3</code> instead of falling through to <code>h1</code>, so the HTTP-version breakdown is correct on HTTP/3 traffic.<br>
- <code>Cache-Control</code> is parsed case-insensitively (RFC 7234), so <code>Max-Age=42</code> is read as 42 instead of 0 and <code>No-Cache</code> / <code>No-Store</code> are honoured — caching advice and <code>expireStats</code> no longer over-report problems on origins that capitalise the directive.<br>
- <code>missingCompression</code> no longer flags already-gzipped assets (the encoding check was comparing a flattened header array against a string), accepts compound encodings like <code>br, gzip</code>, and recognises <code>zstd</code>. <code>xml</code> is now also considered for compression reporting.<br>
- The <code>Domain=</code> cookie attribute is matched case-insensitively (RFC 6265), so third-party cookies set with lowercase <code>domain=</code> are detected.<br>
- <code>getMainDomain</code> recognises common two-label public suffixes (<code>.co.jp</code>, <code>.com.br</code>, <code>.com.au</code>, …), so the auto-generated first-party regex stops misclassifying same-site requests on non-<code>.co.uk</code> country domains.<br>
- <code>defaultContentTypes</code> now includes <code>favicon</code>, so every page has a consistent shape in the content-type breakdown.<br>
- <code>getDocumentRequests</code> returns an empty array for pages with no matching entries instead of throwing.<br>
<br>
<strong>Changed</strong><br>
- <code>coach-core</code> bumped to 9.1.0, which pulls in <code>pagexray</code> 5.0.0 #4731.<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[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[sitespeed.io 40.5.0]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#40.5.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#40.5.0</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Added</strong><br>
- Scripts are now auto-detected on the command line, so <code>--multi</code> is no longer required to run them. Any positional argument that looks like a script — <code>.js</code> / <code>.cjs</code> / <code>.mjs</code>, or any file whose first non-empty line doesn&#39;t start with <code>http</code> — flips multi mode on automatically, and mixed inputs like <code>login.js https://example.com logout.js</code> just work. <code>--multi</code> is kept as an explicit override for the one case auto-detection can&#39;t cover: sharing a single browser session across a list of plain URLs. All existing invocations behave exactly as before #4725.<br>
<br>
<strong>Fixed</strong><br>
- Gzipped HAR files are now written by piping JSON through <code>createGzip</code> straight to disk instead of materialising the JSON string, a <code>Buffer</code> copy of it, and the full gzipped <code>Buffer</code> all at once. For a 200 MB HAR that removes several hundred MB of avoidable peak RSS, multiplied when multiple pages finish around the same time. The storage layer now accepts a <code>Readable</code> in addition to strings and Buffers; existing callers are unaffected #4728.<br>
- Gzipped JSON result files (Chrome traces, console logs, etc.) are read by streaming through <code>createGunzip</code> and collecting utf-8 chunks rather than buffering the whole gzipped payload, gunzipping it into another Buffer, then stringifying. The parsed object still has to fit in memory, but the throwaway gzipped and unzipped buffer copies are gone — meaningful on 50+ MB traces #4726.<br>
- The sustainable plugin and the S3 plugin pick up the same streaming treatment: the sustainable plugin now uses the shared streaming gzipped-JSON helper instead of its own buffer-everything copy, and the S3 plugin streams uploads via <code>createReadStream</code> with an explicit <code>ContentLength</code> instead of loading each file fully into memory before <code>PutObject</code>. With 20 concurrent S3 uploads, RSS no longer spikes to ~20× the size of the largest file in the result bundle #4727.<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[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[sitespeed.io 40.4.1]]></title>
            <link>https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#40.4.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/sitespeed.io/blob/main/CHANGELOG.md#40.4.1</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- Stop parsing scripting files as URL-alias lists in <code>getAliases</code> #4724.<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[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[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[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.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[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.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[browsertime 27.0.2]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.2</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.2</guid>
            <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- SPA scripts no longer drop a HAR page when Chrome&#39;s soft-navigation <code>PerformanceObserver</code> entry doesn&#39;t fire. #2438 gated HAR-page creation on Chrome detecting all three soft-navigation criteria (interaction + URL change + visible paint within a short window), but real SPAs like Grafana sometimes paint too late and Chrome never emits the entry — chrome-har then sees only <code>Network.*</code> events for that measurement and emits zero pages, breaking downstream per-iteration page indexing in sitespeed.io. When the measurement was started without a URL (<code>commands.measure.start(alias)</code> form) and no soft-nav entry was detected, fall back to a synthetic page anchored at the current <code>location.href</code> so each <code>measure.start</code> produces exactly one HAR page.<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.1]]></title>
            <link>https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.1</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md#27.0.1</guid>
            <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Fixed</strong><br>
- <code>commands.click</code> now falls back to a JavaScript click when the Actions API can&#39;t reach the element. Hidden elements have a zero-size bounding box, so the Actions API click that became the default in #2381 silently moved the pointer to (0,0) and clicked nothing instead of triggering the handler. The click command now pre-checks <code>isDisplayed()</code> and uses a JS click when the element isn&#39;t displayed, and otherwise catches any Actions API failure and retries with a JS click. Each fallback is logged at info level so it&#39;s visible without <code>--verbose</code>. Restores the documented &quot;hide everything before clicking&quot; pattern used by visual-metric scripts #2452.<br>
- <code>engineDelegate.afterBrowserStopped()</code> is no longer called twice per iteration on the happy path. #2432 added a safety-net cleanup call in the iteration <code>finally</code> block so failure paths still release long-lived helpers, but in the happy path <code>_stopBrowser</code> had already invoked the cleanup, so it ran twice. The visible symptom on Chrome was a spurious <code>ENOENT</code> error from the second <code>cleanUserDataDir</code> (the first call had already removed the directory). It could also double-terminate the iOS simulator&#39;s Safari and the <code>ios-capture</code> server. The safety-net now runs only when <code>_stopBrowser</code> didn&#39;t already reach the cleanup #2453.<br>
- <code>cleanUserDataDir</code> cleanup now uses <code>rm(..., { recursive: true, force: true })</code> so a missing directory is treated as already-cleaned. Defense in depth alongside #2453: if anything in the future double-calls the Chrome cleanup, or if Chrome failed to create the directory in the first place, the cleanup stays quiet instead of logging a spurious <code>ENOENT</code> #2454.<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[throttle 3.0.0]]></title>
            <link>https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#3.0.0</link>
            <guid isPermaLink="false">https://github.com/sitespeedio/throttle/blob/main/CHANGELOG.md#3.0.0</guid>
            <pubDate>Mon, 09 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[<strong>Changed</strong><br>
- When you run on Mac OS we changed so localhost traffic is not throttled by default. To throttle on localhost use <code>--localhost</code>. This makes sence if you use WebDriver to drive your browser on your local machine. And Mac OS now works the same as Linux.<br>
]]></description>
            <author>Sitespeed.io</author>
        </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>