Summary
Leg 2 (leg2_pyodide_chromium) is misnamed — it loads Pyodide directly in Node.js via loadPyodide() and never uses Puppeteer or Chromium. The puppeteer dependency in package.json is unused.
This issue tracks making Leg 2 honest and progressively exploring Chromium as a real WASM runtime driver.
Tasks
Phase 1: Fix Leg 2 — True Puppeteer-driven Pyodide
Phase 2: Playwright experiment
Phase 3: Chrome as a sandbox
Hypotheses to add
| # |
Hypothesis |
| H8 |
Pyodide-in-Chrome has higher cold start and memory than Pyodide-in-Node due to browser overhead |
| H9 |
Warm request latency comparable — Chrome's V8 and Node's V8 run WASM at similar speed |
| H10 |
Browser context isolation adds measurable per-request overhead but provides security guarantees |
| H11 |
Playwright and Puppeteer have comparable performance for this use case |
Learning goals
- Understand Puppeteer/Playwright APIs for headless browser automation
- Learn CDP (Chrome DevTools Protocol) concepts under the hood
- Explore the browser as a compute sandbox (not just a rendering engine)
- Compare Node.js-as-WASM-host vs Chrome-as-WASM-host patterns
🤖 Analysis by Claude
Summary
Leg 2 (
leg2_pyodide_chromium) is misnamed — it loads Pyodide directly in Node.js vialoadPyodide()and never uses Puppeteer or Chromium. Thepuppeteerdependency inpackage.jsonis unused.This issue tracks making Leg 2 honest and progressively exploring Chromium as a real WASM runtime driver.
Tasks
Phase 1: Fix Leg 2 — True Puppeteer-driven Pyodide
harness.jsto actually launch headless Chrome via Puppeteerpage.evaluate()into the browser's Pyodideleg2a(rename) for comparisonleg2bPhase 2: Playwright experiment
Phase 3: Chrome as a sandbox
BrowserContextper request, or context pooling)Hypotheses to add
Learning goals
🤖 Analysis by Claude