Repository navigation
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: points to the hosted player alongside
show-trace(marked not deployed yet until the domain is live, Stop presenting trace.webdriver.io as live until it is deployed #538). - Docs, docs site (
website/docs/devtools/**, e.g.wdio/TraceMode.md): to be mirrored once the open PRs below merge.
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.
Follow-ups
| Issue | State | PR |
|---|---|---|
| #495 Stop storing each action screenshot twice | Closed | merged |
| #496 Fail CI when a trace exceeds its size budget | Closed | merged |
| #497 Parse the trace in a Web Worker, with progress | Closed | merged |
| #501 Open several traces or a whole run at once | Closed | merged |
#504 bg-sideBarBackground is never generated |
Closed | merged |
#505 PNG screenshots saved with a .jpeg name |
Closed | merged |
| #511 Scheduled check that trace.webdriver.io opens a trace | Closed | merged |
| #528 Remove duplicated code | Closed | merged |
| #503 Redact sensitive values (password fields masked in the replay) | Open | #530 |
| #529 Conformance wait flake | Open | #532 |
| #499 Store page resources and replay from the archive | Open | #533 |
| #500 Open a trace from a URL, and deep-link into it | Open | #534 |
| #498 Read zip entries on demand | Open | #537 (draft, rebases once #533 and #534 merge) |
| #502 Compare two traces side by side | Open | parked: built locally, not planned for now |
| #510 Test the reader against every released trace format | Open | kept open as the ongoing fixture set |
| #516 Measure where per-action capture time goes | Open | step 2 measurements pending |
Also open: #536 (keep traces opened in show-trace out of the live cache) and #538 (stop presenting trace.webdriver.io as live until it is deployed).
#533 and #534 change the hosted CSP in vercel.json and the same CLAUDE.md paragraph, so whichever merges second needs both changes combined.
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
vishnuv688 commentedon Nov 6, 2026
Docs site sync for what has merged here: webdriverio/webdriverio#16377 (merge after the next devtools release). Drafts for the open PRs: webdriverio/webdriverio#16378 (#530), webdriverio/webdriverio#16379 (#532), webdriverio/webdriverio#16380 (#533).