-
Skill Recorder — record a workflow once in your real Chrome and let an agent turn it into a reusable skill. Click Record Skill on the in-page toolbar, or run:
playwriter recorder start # reuse the only session, or create one playwriter recorder start -s 1 # attach to an existing session # ... perform the workflow in the browser ... playwriter recorder stop # stop the only active recording playwriter recorder events # thin timeline of the latest recording playwriter recorder events 4 7 # full details of events 4 and 7 playwriter recorder events -r 3 # events of recording 3 playwriter recorder status # active recordings + current page urls
Every click, fill, press, select, and file pick is recorded with Playwright locator code plus structured fields (
text,key,options,files,button,modifiers). Mutating xhr/fetch (POST/PUT/PATCH/DELETE) is captured with request and response bodies so the agent can reverse-engineer a site API into an in-page SDK. Analytics collector hosts are dropped. WebSockets are not recorded.Events live at
~/.playwriter/recordings/<id>.json. A jpeg is saved for each visual change in~/.playwriter/recordings/<id>/frames/<ms>.jpg. Every event has anmstimestamp so you can pick the frame just before a click. Recording runs in the relay daemon, survives CLI exit, and auto-stops after 20 minutes. At most 10 recordings can be active; a new start stops the oldest one.recorder startprints instructions for writing aSKILL.mdplus a named helper (submit.js,sdk.js). The agent skill now installs from https://playwriter.dev:npx -y skills add https://playwriter.dev
The toolbar Record button creates a session when none exists and no longer fails when many sessions are open. Websites cannot start or stop recordings: CORS on those routes allows only the Playwriter extension origin.
-
Live RTMP streaming — stream a browser tab to X Live, Twitch, YouTube, or any RTMP endpoint via ffmpeg. Uses the same
chrome.tabCapturepipeline as video recording, so the stream survives page navigation. ffmpeg runs inside the relay, so the stream keeps running after the CLI exits.playwriter stream start -s 1 --rtmp rtmp://va.pscp.tv:80/x/<stream-key> playwriter stream status -s 1 playwriter stream stop -s 1
Repeat
--rtmpto fan out to several destinations with one encode. Defaults match X Live (1080p, 9000 kbps, 30 fps, 3s keyframes). For Twitch use--video-bitrate 6000 --keyframe-interval 2. Same API inside execute:await stream.start({ rtmpUrls: ['rtmp://va.pscp.tv:80/x/KEY'] }) await stream.status() await stream.stop()
Stream keys are never logged. Status output only shows redacted destinations like
rtmp://host/…. -
Native ESM imports in execute —
import()now works inside-e/ MCP execute. Relative modules resolve from the session working directory and run with normal Node.js permissions:const { inspectPage } = await import('./scripts/inspect-page.mjs') console.log(await inspectPage({ page }))
Sandboxed
require()andimportModule()remain available for restricted access to allowlisted built-ins. -
Daemon tutorial on idle icon click — clicking the extension icon while the local daemon is down now opens a short tutorial tab instead of sitting on a gray or orange badge. A second click focuses the existing tutorial tab.
-
PLAYWRITER_EXEC_TIMEOUTenv var — set the default execution timeout (ms) for CLI-e/-fand the MCPexecutetool. Explicit--timeoutor the MCPtimeoutargument still wins:export PLAYWRITER_EXEC_TIMEOUT=30000 playwriter -s 1 -e 'await page.goto("https://slow.example")'
-
Hide Playwriter UI during screenshots — toolbar, overlay, ghost cursor, scrollbars, and the blinking caret are hidden for
Page.captureScreenshot, so captured frames stay clean. -
Show tracked page errors in execution output — uncaught exceptions from pages assigned to the current session now appear automatically:
[PAGE ERROR] Uncaught TypeError: Cannot read properties of undefined -
Drop noisy CDP events — high-frequency events such as
Network.dataReceived,*ExtraInfo, andwebSocketFrame*are no longer forwarded to Playwright clients. Relay and CDP logs also flush in 500ms batches, so heavy pages no longer flood the relay. -
Ghost cursor works on strict CSP pages — the cursor is now an inline
<svg>instead of adata:background image, so sites like Hacker News no longer block it. -
Fix long-running CLI executions —
-e/-fnow follow the configured--timeoutinstead of failing at Node's fixed 300-second response-header timeout. -
Fix cross-OS session cwd — a Windows CLI talking to a WSL relay no longer mangles
C:\Users\...into a POSIX path. Windows paths are translated to/mnt/c/.... -
Fix remote relay auth — MCP startup against token-protected remote relays, including Docker and devcontainer hosts, now sends the bearer token on the health check.
playwriter --host host.docker.internal --token MY_SECRET_TOKEN
-
Harden the execute sandbox —
process.getBuiltinModule()andimport()no longer bypass the built-in allowlist. -
Fix stale snapshots after navigation —
snapshot()waits for the accessibility cache to update after a full-page or client-side navigation. -
Fix
Cannot find module 'ajv'onnpx playwriter—ajvis now a direct dependency so npx can resolve it. -
Document extension-mode keyboard focus — skill docs now say agents should click a field before filling it, because Chrome routes OS key events to the focused Chrome window.
Thanks @Ylandolsi for #103 and @tylergibbs1 for #101.
Fixes #114
Fixes #108
Fixes #105
Fixes #107
Fixes #102
Fixes #99
Fixes #96
Fixes #95
Fixes #74