Added
- New
rsyncplugin for result uploads. The existingscpplugin 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 torsyncoverssh, 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--rsync.host/--rsync.username/--rsync.privateKey/--rsync.destinationPathetc., sitting alongsidescp,s3andgcs; existing scp users keep their exact behaviour and opt in to rsync only when they want it #4739. - Upload performance on the existing
scpplugin: swappednode-scp(serial uploads, stuck on 0.0.25) forssh2-sftp-client, 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.
Fixed
- 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
_firstVisualChange/_lastVisualChange/_visualComplete85lines silently disappeared with the swap. They're now hoisted into the user-timing-marks bag the renderer does draw, the "Marks & visual metrics" toggle is on by default, and the hover tooltip identifies which metric or user mark the cursor is on #4755. - Browsertime 27.3.0 #4754.
coach-corebumped to 9.2.1 #4750.- Bump
@sitespeed.io/logand the bundled plugin to latest #4746. - Crawler rewrite:
simplecrawler(unmaintained since 2020, ~1000 lines of transitive code) is replaced by an in-treenode:fetch-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 (--crawler.ignoreRobotsTxtstill 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. - Dependency pruning, no behaviour change for users:
lodash.get,lodash.setandlodash.mergeare replaced by small in-tree helpers inlib/support/objectPath.js, with themergereplacement verified byte-for-byte againstlodash.mergeacross 23 edge cases and an A/BparseCommandLine()run.dayjs(plus the utc plugin) is replaced by an ~80-linelib/support/time.js, with every.format()pattern actually used in the codebase pinned in a new test.orais replaced by a ~60-line blinking-dot spinner used only by--api.add/--api.addAndGetResult. The lodash subtree is now gone entirely [#4737, #4741, #4742, #4744, #4740]. - The
markdowntemplate helper exposed to pug templates is removed. It was added in 2018 (#2161) but no shipped.pugtemplate has ever called it, and the underlyingmarkdown@0.5.0package has been unmaintained for over a decade with an open ReDoS advisory. Anyone with a custom pug template that callsmarkdown(...)will need to import their own renderer #4743. - Slimmer main Docker image:
apt-get install --no-install-recommends+/var/lib/apt/listscleanup,npm ci(lockfile-strict) instead ofnpm install, and theselenium-webdriver/bincleanup folded into the install layer so the deleted bytes no longer ship in an earlier layer #4753. - Docker: use
--omit=devinstead of the deprecated--production, and fix theskip edgedrivertypo #4752. - Release tooling: bump
feedto 5.2.1 andmarkedto 18.0.3 (used only byrelease/feed.jswhen refreshing documentation RSS feeds). API usage unchanged, regenerated feeds are content-identical #4751. - Dev tooling: align with eslint 10 and unicorn 64, drop the dead legacy
.eslintrc.jsonand the staleeslint-checkscript, minor bumps to prettier/sass/esbuild #4747.