-
Remote control — share one tab of your browser with a remote agent or person, no local install needed. Click the light-blue Remote control cloud button in the toolbar and confirm the disclosure. The extension opens a secret tunnel (128-bit random id) and copies a ready-to-paste agent prompt to your clipboard. A remote agent connects from any machine with just the share id:
playwriter session new --remote abc123 playwriter -s 1 -e "console.log(await page.title())"The same share is also a live view: open
https://playwriter.dev/remote-control#<id>in any browser to watch the tab streamed frame by frame, with a URL bar and a Take control button for clicking, scrolling, and typing. Neither side needs an install. Every host lives under playwriter.dev, shares run on Playwriter's own Durable Objects,context.newPage()is rejected, whole-profile cookie APIs and destructive clears are blocked, frames are relayed in memory only, and only a real click (from Chrome's isolated world) can start a share. -
Per-session tab groups — tabs created by a session join a Chrome tab group named after
--tab-group(defaultplaywriter), so multiple agents sharing one browser keep their tabs separate:playwriter session new --tab-group docs --tab-group-color blue playwriter session update 1 --tab-group research
Colors:
grey, blue, red, yellow, green, pink, purple, cyan, orange.session listshows a newGROUPcolumn. Popups and child tabs inherit the opener's group. Old extensions safely ignore the group name. -
cloudhelper in CLI execution sessions — list active cloud browsers and send the current page's cookies into one without printing or saving values:const browsers = await cloud.browsers.list() await cloud.sendCookies({ from: state.page, to: browsers[0] })
-
Toolbar moved into Chrome's isolated extension world — websites can no longer trigger Record Skill or Remote control via forged
window.postMessage. Privileged buttons require a real user gesture from the top frame, clipboard writes go through an offscreen document, and the host refuses clicks when a page hides, covers, or moves it. The toolbar looks exactly the same. -
Relay metadata and MCP logs now require the configured relay token — profile details, tab titles, and tab URLs are no longer returned without the token.
-
Secrets redacted from action recordings — URL credentials, credential-like query parameters, structured network fields, and all form fill values are redacted; unsafe-bounds response bodies are omitted instead of loaded into memory.
-
Screen recordings stream to disk — chunks are written to a temporary file instead of retained in memory, partial output is cleaned up on failure, and capture cancels if the send buffer grows too large.
-
Record Skill toolbar button reliability — shows Starting… while attaching, keeps a stable width, stays clickable during start (a click then stops), shows an error toast on failure, and no longer starts extra recordings on repeated clicks. New lock-on start sound.
-
Quieter, faster CDP handling on chatty sites — the extension no longer sends a debug log for every Network and page-lifecycle CDP event. On Vite HMR pages those flooded the relay and caused
page.screenshot()/context.newPage()timeouts and CPU spikes. Related to #96. -
session newno longer kills a busy but healthy relay — the/versionprobe now waits up to 10 seconds, so a relay busy attaching many tabs is no longer mistaken for dead and killed. -
Reconnect no longer wipes attached tabs — handshake failures close with browser-safe codes
4005/4006instead of1011, and a stale ungroup event after reconnect no longer detaches tabs already back in the group. -
Snapshot correctness — references and diff baselines are invalidated after main-frame navigation, and role locators resolve accessible names changed by CSS text transforms.
-
Fail closed on stale CDP routing — a client requesting a stale target or session gets an error instead of an unrelated tab.
-
Serialized session operations — commands from one session run in order; reset/deletion wait for active work.
-
Stable error codes when no extension is connected. Closes #121.
-
listScripts()waits for parsed scripts — no longer returns an empty list on an already-loaded page. -
Ghost Browser support — the Playwriter extension installed by Ghost Browser can connect to the local relay.
-
Better CLI hints — unknown commands print
Run "playwriter --help"on stderr, andsession newreminds you to runplaywriter skill. -
Toolbar polish — toasts match the dark toolbar surface and appear where you look, the drop shadow is no longer clipped, trailing spacing is fixed, and controls sit at a balanced size.
-
Updated vulnerable dependencies — runtime dependencies moved to patched releases; vulnerable HTML formatting dependencies removed while preserving readable clean-HTML output.
Closes #121