- parser.js: log found files, top-level JSON keys, and extracted
metric values to stdout (visible via docker logs speedboard)
- runner.js: add --sustainable.useGreenWebHostingAPI flag
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All metric paths were wrong. Corrected based on browsertimeAggregator.js
and axeAggregator.js source:
- pageTimings (load, FE/BE, DOM) live at statistics.pageTimings.* not
statistics.timings.pageTimings.*
- FCP is statistics.paintTiming['first-contentful-paint'].median
- CLS is statistics.pageinfo.cumulativeLayoutShift.median
- TBT/FID/tasks are under statistics.cpu.longTasks.*
- Axe data is in axe.pageSummary.json (violations.*.median), not
in the browsertime file under accessibility.summary.*
- sustainable pageSummary has co2PerPageView/FirstParty/ThirdParty.median
(no totalCO2 at per-URL level)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Our start.sh was starting Xvfb on :99, then sitespeed.io tried to start
its own on :99, failed with exit code 1, and Chrome couldn't get a
working display. sitespeed.io is designed to manage Xvfb per test run.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sitespeed.io is not on PATH in the container -- the base image uses a
full absolute path for its ENTRYPOINT. We now run 'find' during the
Docker build, write the path to /sitespeed_env, and source it in
start.sh so SITESPEED_BIN is set before node app.js starts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
execSync/which inside Node.js doesn't see the full container PATH.
Switching to spawn('sh', ['-c', shellCmd]) so the shell resolves
sitespeed.io exactly as the original image entrypoint does.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The path /usr/local/lib/node_modules/... does not exist in the image.
runner.js already falls back to `which sitespeed.io` automatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- runner.js: auto-detects sitespeed.io via which/candidates instead of
hardcoded path; collects all stderr and appends last 20 lines to the
error so the real failure is visible in the UI log
- running.pug: render multi-line error messages line-by-line
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Without Xvfb running, Chrome exits immediately with code 1.
The base sitespeedio image normally handles this via its own
entrypoint script; we now replicate that with start.sh.
Also drop --headless (breaks visual metrics) and add --disable-gpu
for stable Chrome rendering inside Docker.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Base image sitespeedio/sitespeed.io sets ENTRYPOINT=["sitespeed.io"],
causing our CMD ["node","app.js"] to be passed as args to sitespeed.io
which treated "node" as a URL to test.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sitespeed.io web UI with Express/Pug/SQLite — port 3132.
Includes job queue, SSE live log, full metrics dashboard,
site history, CO2/axe/CWV sections, and Docker support.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>