- give the daemon health check a second try before restarting it (a restart shows the popup again)
- ignore the remote-debugging toggle from browsers that aren't running
- pass auth headers through in CDP client
Chrome 144+ shows "Allow remote debugging?" for every new CDP connection
- wait on same connection (dying + retrying adds popups)
- tell the user to click Allow while it's there
- skip the chrome://inspect flow when the toggle is already on
- probe a live daemon twice before restarting it
Camera output maps to a 94% stage so backdrop margin stays visible on
every side at any zoom. Card titles back to Helvetica Neue semibold —
the serif experiment read poorly at video sizes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Title cards switch from 800-weight system sans to a serif at regular
weight — Tiempos Headline with Iowan Old Style/Georgia fallbacks —
over the paper backdrop, with the mono subline as a muted eyebrow.
Captions move to Helvetica Neue.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Chips drop the cyan-mono dev styling for a single adaptive palette
(ink on paper over light backdrops, paper on ink over dark). Step chip,
caption, and session badge share one baseline rail; the browser-use
logo moves inside the session badge. Captions grow to 44px. Wide shots
get Screen-Studio margins (PAD 108) and gentler camera moves.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
bg takes one color (flat, default #F0EEE6) or [c1, c2] (gradient).
Cards, logo, and progress bar switch between dark ink and white based
on backdrop luminance; the window shadow softens on light backgrounds.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Zoom targets snap to the window edge when a shot would slice just below
it, so the full Chrome frame (tab, traffic lights, omnibox) stays in
frame at any zoom instead of degrading into a cropped screenshot. Chips
shrink to 15px and dock in the bottom corners clear of the window;
captions drop from 72px billboards to 34px pills; the click-coordinate
debug text is gone; backdrop is a lit gradient instead of a dot grid.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recorder always strips credential-bearing query/fragment params (OAuth
codes, tokens, api keys) from URLs before they land in events.jsonl.
The video template takes redact: {"frame.jpg": [{x,y,w,h}]} and
pixelates those page-px regions wherever the frame is drawn, tracking
zooms and after-swaps. Auto-record is back on by default (BH_RECORD=0
opts out); making a video is a separate, discretionary step.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recording stays off by default; the user asking ("record this") maps to
start_recording(). Setting BH_RECORD=1 auto-records every session into
session-<timestamp> folders that roll over after BH_RECORD_IDLE seconds
(default 180) of no actions, so unrelated tasks never merge into one
recording. Explicit recordings never roll over.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Oversized typing overlay when the camera is wide (typing readable
without a punch-in); zooms become rare emphasis, not the default
- error:true beats: red vignette, shake, ERROR chip, red caption pill
- Hero captions (72px, shrink-to-fit), 22px telemetry chips
- Sequenced motion: camera settles -> cursor glides -> click -> result
swaps in as a near-hard cut; hard cuts by default between beats
- Skill: readability formula, zoom rationing, "frame the reaction" rule
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Record a browser session as a folder of per-action screenshots + an
events.jsonl trace (start_recording/stop_recording helpers, marker file
spans CLI invocations, no daemon changes, no new deps). An agent then
edits the recording into a Screen-Studio-style clip via the make-video
skill: a self-contained HTML compositor renders the frames + a
composition on a canvas (realistic Chrome window, calm zoom camera,
synthetic cursor, telemetry overlay, error treatment) and exports webm
through the browser's own MediaRecorder — no ffmpeg.
- src/browser_harness/recorder.py: capture layer (+ 6 unit tests)
- src/browser_harness/{run,helpers}.py: observe() hook + helper exports
- interaction-skills/video-template.html: the compositor/renderer
- interaction-skills/make-video.md: the editor skill
- SKILL.md: recording section
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- daemon wrote its log with the locale codec
- daemon spawned with stderr=DEVNULL, so pre-log crashes left an empty log. stderr now appends into the daemon log. startup errors show the real traceback.
- profile discovery checked all 28 paths on every OS, so Windows errors led with macOS paths. Split per-OS, resolve via %LOCALAPPDATA%, add Chrome Beta/Dev.
- audited every file read / subprocess decode to utf-8 (+BOM-safe .env); tasklist/ps keep locale codec but get errors="replace".
- WinError 10061 message now explains --remote-debugging-port + firewall hint.