Skip to content

feat(video): allow recording video at a custom fps - #42752

Merged
Pavel Feldman (pavelfeldman) merged 1 commit into
microsoft:mainfrom
pavelfeldman:video-fps
Sep 17, 2026
Merged

Pavel Feldman (pavelfeldman) merged 1 commit into
microsoft:mainfrom
pavelfeldman:video-fps

Conversation

@pavelfeldman

Copy link
Copy Markdown
Member

Summary

  • New fps option for page.screencast.start(), recordVideo (recordVideoFps in other languages), test runner video and CLI/MCP video-start.
  • VP8 bitrate and encoder threads scale with pixel rate relative to 800x450@25fps; default recordings keep -b:v 1M -threads 1.
  • Screencast frames are locked to consecutive output slots, since Chromium timestamps frames on delivery rather than render (https://issues.chromium.org/issues/562567707). Without it, 1080p60 recordings duplicated and skipped ~4% of frames.
  • Firefox and WebKit still capture at most 25 fps.

// 1920x1080 at 60fps -> scale 13.8, bitrate 13824k, 4 threads
const pixelRateScale = Math.max(1, w * h * this._fps / (800 * 450 * kDefaultFps));
const bitrate = Math.round(pixelRateScale * 1000);
const threads = Math.min(8, Math.ceil(pixelRateScale / 4));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's trust ffmpeg's auto mode in case we allow >1 thread?

"-threads 0 or -threads auto means “choose automatically”; the generic codec option defaults to auto. Current ffmpeg also explicitly sets thread_count = 0 when you haven’t supplied a threads option."

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

- `fps` option for `page.screencast.start()`, `recordVideo`, test runner `video` and `video-start`
- scale vp8 bitrate and encoder threads with the pixel rate
- lock screencast frames to consecutive output slots to absorb Chromium timestamp jitter
  (https://issues.chromium.org/issues/562567707)
width: z.number().describe('Video width'),
height: z.number().describe('Video height'),
}).optional().describe('Video size'),
fps: z.number().optional().describe('Video frame rate in frames per second, defaults to 25'),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be z.number().int().positive().optional()?

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [chrome] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-windows-latest-chrome
❌ [firefox] › mcp/annotate.spec.ts:417 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-firefox
❌ [firefox] › mcp/cli-session.spec.ts:54 › idle timeout shuts the session down @mcp-windows-latest-firefox

8587 passed, 1446 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

2 failed
❌ [installation tests] › playwright-cdn.spec.ts:43 › playwright cdn failover should work (https://cdn.playwright.dev/dbazure/download/playwright) @package-installations-macos-latest
❌ [installation tests] › playwright-cdn.spec.ts:43 › playwright cdn failover should work (https://playwright.download.prss.microsoft.com/dbazure/download/playwright) @package-installations-macos-latest

5 flaky ⚠️ [chromium-library] › library/video.spec.ts:725 › screencast › should capture full viewport on hidpi `@chromium-ubuntu-22.04-arm-node20`
⚠️ [firefox-library] › library/browsercontext-cookies-third-party.spec.ts:257 › third party 'Partitioned;' cookies `@firefox-ubuntu-22.04-node20`
⚠️ [firefox-library] › library/browsercontext-cookies-third-party.spec.ts:470 › top level 'Partitioned;' cookie and same origin iframe `@firefox-ubuntu-22.04-node20`
⚠️ [firefox-page] › page/page-emulate-media.spec.ts:144 › should keep reduced motion and color emulation after reload `@firefox-ubuntu-22.04-node20`
⚠️ [firefox-page] › page/page-event-request.spec.ts:181 › should return response body when Cross-Origin-Opener-Policy is set `@firefox-ubuntu-22.04-node20`

51973 passed, 1247 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

🟢 All three failures are pre-existing flakes — the PR is clear

Hi, I'm the Playwright bot and I took a look at the failing CI on this PR.

All three failures are Windows-only MCP tests that each fail with the same error on SHAs and PRs unrelated to this one. Nothing here points at the fps change.

Details

Overall: the PR touches video/screencast encoding (videoRecorder.ts, screencast.ts, protocol fps plumbing). The three failures are MCP annotate/session tests that don't record video, and each has a failure history predating this PR. The only video-adjacent signal in this PR's CI, library/video.spec.ts:690 › screencast › should capture full viewport, was flaky (passed on retry), not failed.

Pre-existing flake / infra

Evidence comes from the aggregated CI results database, topped up through this PR's run.

Triaged by the Playwright bot - agent run

@github-actions

Copy link
Copy Markdown
Contributor

🟢 All five failures are pre-existing flakes — the PR looks clear

Hi, I'm the Playwright bot and I triaged the red CI here. None of the failing tests touch video, screencast, or fps; each one fails with the same error on other PRs and on main, one of them on this PR's own base commit bf9d04f2.

Details

The PR changes video/screencast recording (videoRecorder.ts, browserContext.ts, pageDispatcher.ts, tools/backend/video.ts, cli-daemon/commands.ts) plus docs and generated types. The failures are in MCP annotate, MCP CLI session listing, and the installation CDN suite — none of which record video. Counts below are from the aggregated CI results DB, grouped by (project_name, file, test_title) on the same bot.

Pre-existing flake / infra

Nothing to fix here; a rerun should be green, modulo the cli-session flake's 1-in-3 odds.

Triaged by the Playwright bot - agent run

@pavelfeldman
Pavel Feldman (pavelfeldman) merged commit 8bb2c09 into microsoft:main Sep 17, 2026
43 of 46 checks passed
Pavel Feldman (pavelfeldman) added a commit to microsoft/playwright-cli that referenced this pull request Sep 18, 2026
## ✨ Highlights

- **🎬 Smooth 60 fps, styleable videos** — `video-start --fps=60` records
smooth 60 fps videos instead of the default 25, and `video-start
--cursor` renders an animated mouse cursor that travels to each action
point and stays visible between actions. `video-show-actions` takes
`--point-style`, `--highlight-style` and `--title-style` CSS
declarations; the action point marker and the target highlight are now
only shown when styled.
([microsoft/playwright#42752](microsoft/playwright#42752),
[microsoft/playwright#42758](microsoft/playwright#42758))
- **🧰 WebMCP tools show up in the snapshot** — the tools a page
registers are listed at the top of the page snapshot with their
descriptions and input schemas, so `webmcp-call` can be used without
running `webmcp-list` first. Set `webmcp: false` in the config file (env
`PLAYWRIGHT_MCP_WEBMCP=false`) to stop collecting page-registered tools.
([microsoft/playwright#42671](microsoft/playwright#42671))
- **🌗 Switch between light and dark color scheme**
([microsoft/playwright#42243](microsoft/playwright#42243))
— an agent working on a dark theme had no way to see it mid-session. New
`set-color-scheme`, `set-reduced-motion`, `set-forced-colors`,
`set-contrast` and `set-media` commands emulate media features on the
fly, and the matching `clear-*` commands reset them.
([microsoft/playwright#42668](microsoft/playwright#42668))
- **📁 Absolute paths in results**
([microsoft/playwright#42497](microsoft/playwright#42497))
— links to snapshots, screenshots, console logs and downloads are
relative to the working directory, which a consumer without one cannot
resolve. Set `filePaths: "absolute"` in the config file (env
`PLAYWRIGHT_MCP_FILE_PATHS=absolute`) to get absolute paths instead.
([microsoft/playwright#42673](microsoft/playwright#42673))

## 🐛 Fixes

- `fix(chromium): bypass service workers on the storage state page` —
`state-save` no longer runs the site's own scripts, or fails when they
redirect, for origins with an active service worker
([microsoft/playwright#42656](microsoft/playwright#42656)).
([#42664](microsoft/playwright#42664),
[#42741](microsoft/playwright#42741))
- `fix(mcp): keep upload modal, skip short secrets and bad headers` — a
failed `upload` keeps the file chooser open so it can be retried,
secrets shorter than 4 characters no longer rewrite the whole output
with `<secret>` markers, and `route` ignores header lines that have no
name. ([#42713](microsoft/playwright#42713))

## 📦 Upgrading

```bash
npm install -g @playwright/cli@0.1.21
```
renovate Bot added a commit to soodoh/dotfiles that referenced this pull request Sep 19, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`^26.6.1` →
`^26.6.2`](https://renovatebot.com/diffs/npm/@types%2fnode/26.6.1/26.6.2)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/26.6.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/26.6.1/26.6.2?slim=true)
|
| [npm:@playwright/mcp](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright-mcp)) |
`0.0.81` → `0.0.82` |
![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2fmcp/0.0.82?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2fmcp/0.0.81/0.0.82?slim=true)
|

---

### Release Notes

<details>
<summary>microsoft/playwright-mcp (npm:@&#8203;playwright/mcp)</summary>

###
[`v0.0.82`](https://redirect.github.com/microsoft/playwright-mcp/releases/tag/v0.0.82)

[Compare
Source](https://redirect.github.com/microsoft/playwright-mcp/compare/v0.0.81...v0.0.82)

#### ✨ Highlights

- **🎬 Smooth 60 fps, styleable videos** — `browser_start_video` (opt-in
via `--caps=devtools`) takes `fps`, so `fps: 60` records smooth 60 fps
videos instead of the default 25, and `cursor: true` renders an animated
mouse cursor that travels to each action point and stays visible between
actions. `browser_video_show_actions` takes a `style` with `point`,
`highlight` and `title` CSS declarations; the action point marker and
the target highlight are now only shown when styled.
([microsoft/playwright#42752](https://redirect.github.com/microsoft/playwright/pull/42752),
[microsoft/playwright#42758](https://redirect.github.com/microsoft/playwright/pull/42758))
- **🧰 WebMCP tools become real MCP tools** — the tools a page registers
through the [WebMCP](https://webmachinelearning.github.io/webmcp/) API
now show up right in the tool list as `webmcp_<tool>`, with the page's
own input schema and annotations, so an agent can call them directly and
let the page do the work instead of driving its UI. The list follows the
current tab, and clients get a `tools/list_changed` notification when it
changes. This replaces `browser_webmcp_list` / `browser_webmcp_call`
from v0.0.81, which are no longer exposed over MCP. Tool names,
descriptions, schemas and results come from the page, so treat them as
untrusted input. Pass `--no-webmcp` (config `webmcp: false`, env
`PLAYWRIGHT_MCP_WEBMCP=false`) to opt out. WebMCP is experimental, see
[WebMCP in Chrome](https://developer.chrome.com/docs/ai/webmcp) for how
to enable it.
([microsoft/playwright#42671](https://redirect.github.com/microsoft/playwright/pull/42671))
- **🌗 Switch between light and dark color scheme**
([microsoft/playwright#42243](https://redirect.github.com/microsoft/playwright/issues/42243))
— an agent working on a dark theme had no way to see it mid-session. The
new **`browser_emulate_media`** tool emulates media features on the fly:
`colorScheme`, `reducedMotion`, `forcedColors`, `contrast` and the
`media` type (screen / print). Omitted parameters are left unchanged,
`null` clears an override.
([microsoft/playwright#42668](https://redirect.github.com/microsoft/playwright/pull/42668))
- **📁 Absolute paths in results**
([microsoft/playwright#42497](https://redirect.github.com/microsoft/playwright/issues/42497))
— links to snapshots, screenshots, console logs and downloads are
relative to the workspace root, which a client without one cannot
resolve. Pass `--file-paths=absolute` (config `filePaths: "absolute"`,
env `PLAYWRIGHT_MCP_FILE_PATHS=absolute`) to get absolute paths instead.
([microsoft/playwright#42673](https://redirect.github.com/microsoft/playwright/pull/42673))

#### 🐛 Fixes

- `fix(mcp): keep upload modal and reject bad headers` — a failed
`browser_file_upload` (e.g. a missing file) reports the error and keeps
the file chooser open so it can be retried, and `browser_route` (opt-in
via `--caps=network`) returns an error for a header that is not in the
`Name: Value` form instead of setting a header named `""`.
([microsoft/playwright#42713](https://redirect.github.com/microsoft/playwright/pull/42713))
- `fix(chromium): bypass service workers on the storage state page` —
`browser_storage_state` (opt-in via `--caps=storage`) no longer runs the
site's own scripts, or fails when they redirect, for origins with an
active service worker
([microsoft/playwright#42656](https://redirect.github.com/microsoft/playwright/issues/42656)).
([microsoft/playwright#42664](https://redirect.github.com/microsoft/playwright/pull/42664),
[microsoft/playwright#42741](https://redirect.github.com/microsoft/playwright/pull/42741))

#### 📦 Upgrading

Configs that use `@playwright/mcp@latest` pick this release up on the
next client restart. To pin it:

```bash
npx @playwright/mcp@0.0.82
```

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/soodoh/dotfiles).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMDMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjEwMy4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Paul Sorensen (paulnsorensen) added a commit to paulnsorensen/dotfiles that referenced this pull request Sep 19, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [@playwright/mcp](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright-mcp)) |
`0.0.81` → `0.0.82` |
![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2fmcp/0.0.82?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@playwright%2fmcp/0.0.82?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@playwright%2fmcp/0.0.81/0.0.82?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2fmcp/0.0.81/0.0.82?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the warning logs for
more information.

---

### Release Notes

<details>
<summary>microsoft/playwright-mcp (@&#8203;playwright/mcp)</summary>

###
[`v0.0.82`](https://redirect.github.com/microsoft/playwright-mcp/releases/tag/v0.0.82)

[Compare
Source](https://redirect.github.com/microsoft/playwright-mcp/compare/v0.0.81...v0.0.82)

#### ✨ Highlights

- **🎬 Smooth 60 fps, styleable videos** — `browser_start_video` (opt-in
via `--caps=devtools`) takes `fps`, so `fps: 60` records smooth 60 fps
videos instead of the default 25, and `cursor: true` renders an animated
mouse cursor that travels to each action point and stays visible between
actions. `browser_video_show_actions` takes a `style` with `point`,
`highlight` and `title` CSS declarations; the action point marker and
the target highlight are now only shown when styled.
([microsoft/playwright#42752](https://redirect.github.com/microsoft/playwright/pull/42752),
[microsoft/playwright#42758](https://redirect.github.com/microsoft/playwright/pull/42758))
- **🧰 WebMCP tools become real MCP tools** — the tools a page registers
through the [WebMCP](https://webmachinelearning.github.io/webmcp/) API
now show up right in the tool list as `webmcp_<tool>`, with the page's
own input schema and annotations, so an agent can call them directly and
let the page do the work instead of driving its UI. The list follows the
current tab, and clients get a `tools/list_changed` notification when it
changes. This replaces `browser_webmcp_list` / `browser_webmcp_call`
from v0.0.81, which are no longer exposed over MCP. Tool names,
descriptions, schemas and results come from the page, so treat them as
untrusted input. Pass `--no-webmcp` (config `webmcp: false`, env
`PLAYWRIGHT_MCP_WEBMCP=false`) to opt out. WebMCP is experimental, see
[WebMCP in Chrome](https://developer.chrome.com/docs/ai/webmcp) for how
to enable it.
([microsoft/playwright#42671](https://redirect.github.com/microsoft/playwright/pull/42671))
- **🌗 Switch between light and dark color scheme**
([microsoft/playwright#42243](https://redirect.github.com/microsoft/playwright/issues/42243))
— an agent working on a dark theme had no way to see it mid-session. The
new **`browser_emulate_media`** tool emulates media features on the fly:
`colorScheme`, `reducedMotion`, `forcedColors`, `contrast` and the
`media` type (screen / print). Omitted parameters are left unchanged,
`null` clears an override.
([microsoft/playwright#42668](https://redirect.github.com/microsoft/playwright/pull/42668))
- **📁 Absolute paths in results**
([microsoft/playwright#42497](https://redirect.github.com/microsoft/playwright/issues/42497))
— links to snapshots, screenshots, console logs and downloads are
relative to the workspace root, which a client without one cannot
resolve. Pass `--file-paths=absolute` (config `filePaths: "absolute"`,
env `PLAYWRIGHT_MCP_FILE_PATHS=absolute`) to get absolute paths instead.
([microsoft/playwright#42673](https://redirect.github.com/microsoft/playwright/pull/42673))

#### 🐛 Fixes

- `fix(mcp): keep upload modal and reject bad headers` — a failed
`browser_file_upload` (e.g. a missing file) reports the error and keeps
the file chooser open so it can be retried, and `browser_route` (opt-in
via `--caps=network`) returns an error for a header that is not in the
`Name: Value` form instead of setting a header named `""`.
([microsoft/playwright#42713](https://redirect.github.com/microsoft/playwright/pull/42713))
- `fix(chromium): bypass service workers on the storage state page` —
`browser_storage_state` (opt-in via `--caps=storage`) no longer runs the
site's own scripts, or fails when they redirect, for origins with an
active service worker
([microsoft/playwright#42656](https://redirect.github.com/microsoft/playwright/issues/42656)).
([microsoft/playwright#42664](https://redirect.github.com/microsoft/playwright/pull/42664),
[microsoft/playwright#42741](https://redirect.github.com/microsoft/playwright/pull/42741))

#### 📦 Upgrading

Configs that use `@playwright/mcp@latest` pick this release up on the
next client restart. To pin it:

```bash
npx @playwright/mcp@0.0.82
```

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/paulnsorensen/dotfiles).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMDMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjEwMy4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Chores**
  - Updated the Playwright MCP package to version 0.0.82.
  - Synchronized the package version used by the Codex profile test.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: dep-harvest-bot <paulnsorensen@gmail.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants