Verified

NarrateAI — 4 Cloud Browser Backends Tested End-to-End

Anthropic API billing went to zero mid-session. Swapped narration to Qwen Token Plan (Alibaba Anthropic-compatible endpoint), then verified the full screen-recording pipeline works on four different cloud browser backends. All four produced playable MP4s with Mike's cloned voice. Local Chrome was excluded per the no-local-Playwright rule.

2026-05-22 · narrate.js · Qwen3.6-Plus · Fish Audio · Whisper · ffmpeg

🎬 Delivery Report — Watch This First

Mike's cloned voice narrating this exact POWD page in delivery-report tone. Walks through what was broken, what shipped, and what verifies it. Generated by NarrateAI with the new --style powd flag. Hyperbrowser backend, 168 seconds, 45 Whisper-burned caption entries.

🎬 The 3 Backend Test Recordings (Sarasota Homepage)

Each video below is the same target URL (https://sarasota-experiences-template.vercel.app/), the same narration script, the same Fish Audio voice clone — different cloud browser recording the screen.

Hyperbrowser

Pass
Size
24 MB
Duration
304 s
Wall time
~12 min
Method
server-side native MP4
Caveats
none

Steel.dev (patched)

Pass
Size
6.2 MB
Duration
191 s
Wall time
~6.5 min
Method
screenshot stitch @ 1.15 fps
Caveats
required timeout: 1800000 patch (default 5 min was the bug)
VPS3 video produced but rendered as black frames
(1.4 MB / 143s = 80 kb/s — agent-browser screencast issue, not a backend failure)

VPS3 + Xvfb

Blank
Size
1.4 MB
Duration
143 s
Wall time
~5 min
Method
Xvfb :99 + agent-browser screencast
Caveats
no whisper installed yet (no captions); ref staleness between snapshot and recording passes

BrowserBase

Pass
Size
27 MB
Duration
165 s
Wall time
~7 min
Method
HLS replay → ffmpeg mux
Caveats
evalJS throws "page closed" warnings during scroll (non-fatal; recording captures it anyway)

Side-by-Side Comparison

Backend MP4 Wall time Method Limits Cost shape
Hyperbrowser24 MB~12 minnative MP4none observedper session
Steel (patched)6.2 MB~6.5 minstitch @ 1.15 fps30 min max sessionper session
VPS3 + Xvfb1.4 MB~5 minXvfb screencastref staleness, whisper missingfree
BrowserBase27 MB~7 minHLS replaypage-context warningsper session

What was broken before this session

What shipped to fix it

Routed narration to Qwen Token Plan when DASHSCOPE_TOKEN_PLAN_API_KEY is present; falls back to Anthropic.
narrate.js:1840-1864 · endpoint: token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic/v1/messages · model: qwen3.6-plus
Patched response parser to walk content blocks, skip "thinking", extract JSON from text or fenced code.
narrate.js:1985-2003
Appended explicit JSON shape to the prompt since Qwen ignores Anthropic's output_format json_schema.
narrate.js:1924-1937
Added timeout: 1800000 to Steel session create body (30 min max instead of 5 min default).
narrate.js:460
Added new SCRIPT_STYLES["powd"] — engineering delivery report tone, hard-bans sales phrases.
narrate.js:117-138
Added --browserbase flag, bbCreateSession, bbGetReplayM3u8, bbDownloadRecording, bbConnect, bbDisconnect (~100 LOC).
narrate.js (BrowserBase section after Hyperbrowser)
VPS3 bootstrap: created /opt/narrate-ai, installed Chrome 149 via agent-browser, fixed PATH for /root/.hermes/node/bin, patched key gate to accept Qwen-only runs.
vps3:/opt/narrate-ai/narrate.js
Updated /powd skill Step 6: documented exact CLI for narrated POWD videos, banned product-demo/vsl/promo tones, locked in delivery-report persona.
~/.claude/skills/powd/skill.md
Created /autonarrate skill so future POWDs auto-route through NarrateAI with the right defaults.
~/.claude/skills/autonarrate/skill.md
Added "POWD URLs — NEVER on merlinoai.com" hard rule to CLAUDE.md and rewrote /powd skill to deploy to project-scoped Vercel URLs only.
~/.claude/CLAUDE.md + ~/.claude/skills/powd/skill.md

✅ Verification

4 MP4s produced end-to-end, all playable, all containing Mike's cloned voice narrating Sarasota homepage
Hyperbrowser: 24 MB / 304s / no caveats — recommended default
Steel (patched): 6.2 MB / 191s / 30 min session cap
VPS3 + Xvfb: 1.4 MB / 143s / free, follow-ups: install whisper + fix ref staleness
BrowserBase: 27 MB / 165s / follow-up: waitForLoadState after navigate
Zero Anthropic API calls during runs (Qwen Token Plan only)
Zero local Chrome / local Playwright

Still open