Skip to content

Browser use

Agents on dbb-server open a preview in headless Chromium, capture it, and check the capture before handing work over.

bootstrap/playwright.sh at the root of dbb-platform is idempotent. It installs, for the user who runs it:

  • libatomic1, with sudo
  • Playwright’s Chromium system libraries, with sudo (pnpm dlx playwright install-deps chromium)
  • Chromium, the headless shell, and ffmpeg under ~/.cache/ms-playwright

The pin is PLAYWRIGHT_VERSION in that script. The current pin is Playwright 1.65.0-alpha-2026-10-30, which is Chromium revision 1252 (Chrome for Testing 157.0.8103.15). Node comes from fnm. The package manager is pnpm.

.cursor/mcp.json starts a playwright MCP server with pnpm dlx @playwright/mcp@0.0.84, headless, one browser profile in memory per server (--isolated). That package launches the Playwright version above. fnm exec is the command so pnpm resolves when the worker’s PATH only has ~/.local/bin. The server sets TMPDIR to /home/daz/.cache/dbb-tmp, which the bootstrap script creates.

Before handing work over, open the preview and look at a capture.

  1. Call browser_navigate with the preview URL.
  2. Call browser_take_screenshot for a still of the page.
  3. Call browser_start_video, walk the flow, then browser_stop_video when the change is motion or more than one step.

Read the capture and fix the preview before the handoff. The same browser is available without the MCP server:

Terminal window
pnpm dlx playwright@1.65.0-alpha-2026-10-30 screenshot https://dbb-os.server.daz.dev _artifacts/<agent>/home.png

Save screenshots and video under <repo>/_artifacts/<agent>/. Automatic names from the MCP server land in <repo>/_artifacts/. _artifacts/ is gitignored. Never write captures to /tmp.

Each agent runs its own MCP server process, and that process starts its own Chromium. dbb-server has 125 GB of RAM and 24 cores, so several headless browsers can run at once. --isolated keeps each profile in memory, so those browsers do not share a profile directory. Give each agent its own directory under _artifacts/ so files stay apart.

In a pull request, bump PLAYWRIGHT_VERSION in bootstrap/playwright.sh and the @playwright/mcp pin in .cursor/mcp.json. The Playwright version has to be the one that @playwright/mcp release depends on, so both launch the same Chromium build. Then run bootstrap/playwright.sh.