Description
Problem
Opening a trace zip today needs the DevTools package installed locally and show-trace <trace.zip> run against it. Anyone the zip is handed to (a reviewer, a QA engineer, someone triaging a CI failure) has to set up a Node project first just to look at it.
Proposal
Host the trace player at https://trace.webdriver.io, next to https://benchmark.webdriver.io. The user opens the page, drops a trace zip on it (or picks one), and the player opens it. show-trace stays for offline and air-gapped use.
The zip never leaves the browser
A trace records everything the run showed or typed, credentials included (there is no redaction in capture). The hosted player therefore parses the zip entirely client-side: no upload, no server-side processing, no analytics. The landing page states this.
How it works today
show-tracereads the zip from disk (packages/backend/src/show-trace.ts).parseTraceZip()inpackages/backend/src/trace-reader.tsturns it into aTracePlayerDatapayload.- The backend serves that payload at
TRACE_API.get; the app'sDataManagerfetches it and callsloadPlayerData().
parseTraceZip already takes a Uint8Array and uses fflate, which runs in browsers. The only Node dependency on its path is packages/trace/src/sha1.ts (node:crypto), reached through sourceResourceName. The disk read lives only in the readTraceZip wrapper.
Work
- Move the reader into
packages/trace. It is the read side of the trace format, which both the backend and the app need. The backend keeps a thinreadTraceZipthat reads the file and delegates. - Make
sha1Hexbrowser-safe, either a small pure-JS SHA-1 or Web Crypto (async, so its callers change). - Hosted mode in the app. When nothing answers at
TRACE_API.get, show a landing screen with drag-and-drop and a file picker, parse withFile.arrayBuffer(), and call the existingloadPlayerData(). Optional:?trace=<url>to load a zip served with CORS. - Hide live-only controls (Run all, Rerun, Preserve & Rerun, Stop) in hosted mode, as player mode already does.
- Static build + Vercel config. A root
vercel.json(build command, output directory, headers) following https://github.com/webdriverio/benchmark: Vercel's Git integration deploysmainand gives every PR a preview URL. Headers:X-Robots-Tag: noindexand a strict Content-Security-Policy (connect-srclimited so the page cannot send trace data anywhere). - Tests for the moved reader running without Node built-ins, and for the hosted-mode load path.
- Docs: README and the docs site (
website/docs/devtools/**, e.g.wdio/TraceMode.md) point to the hosted player alongsideshow-trace.
Needs a maintainer with access to the webdriverio Vercel team
- Import
webdriverio/devtoolsas a Vercel project (same setup as benchmark). - Add
trace.webdriver.ioas its domain, plus the DNS record.
The code can land and be tested on a PR preview deploy before the domain goes live.
Activity
vishnuv688 commentedon Oct 29, 2026
PRs for this issue, in merge order. Each is stacked on the one before it; when a base merges and its branch is deleted, GitHub retargets the next PR to
main, and itsCloses #Nlink takes effect then.This issue stays open after #507 until its remaining sub-issues and the hosting setup (Vercel project and the
trace.webdriver.iodomain) are done.Cache the hosted player's hashed assets for a year
Fail the examples smoke job when an example's traces outgrow a budget
Host the trace player as a static page with no backend