analysisstorer is not in the default plugin set, so pageSummary JSON
files were never written. This plugin writes all message data to disk
(browsertime.pageSummary.json, coach.pageSummary.json, etc.) which
our parser reads to extract metrics.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- runner.js: console.log outputFolder, sitespeed INFO lines, and
find output after test so everything appears in docker logs
- parser.js: switch walker from withFileTypes to stat (more reliable
on Docker volumes); log every directory visited
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The ln -sf /data/reports /app/reports was creating the symlink INSIDE
/app/reports/ (since that dir already existed from COPY) instead of
replacing it. Result: sitespeed.io wrote to /app/reports/<id> and the
parser looked there too, but the volume was at /data/reports.
Fix: set REPORTS_DIR=/data/reports in Docker ENV and use it in both
runner.js (outputFolder) and app.js (static serving). No symlink needed.
Also add .dockerignore to exclude reports/, node_modules/, .git/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
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>
- 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>
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>