Skip to main content
The box browser is a real Chromium, and you can drive it with the tools you already use. cdpUrl() returns an authenticated Chrome DevTools Protocol WebSocket URL that Playwright, Puppeteer, or Stagehand can connect to directly. There is no browser to install and nothing to manage. For a single no-LLM step without wiring up a CDP client, replaying an observed action with act(action) is often enough. Reach for CDP when you want fully scripted, multi-step control.
Like live view URLs, the CDP URL carries its auth token in the URL. Anyone who has it gets full control of the browser, so treat it as a secret.

Playwright

playwright-core is enough here, since you connect to the box’s Chromium instead of launching one locally:

Puppeteer

scrape.ts

Stagehand

Stagehand can use the box browser as its local browser:
agent.ts

Mixing CDP and SDK control

CDP clients and the SDK drive the same browser and the same tabs. A page opened by Playwright shows up in box.browser.listTabs(), and a tab created by the SDK is visible to Playwright. You can script the predictable steps like login and pagination with Playwright, hand the tab to act for the steps that are easier to describe in natural language, and watch either through Live View. As a rule of thumb: replay a cached act(action) for a single no-LLM step, reach for CDP when you want precise, repeatable multi-step scripting with no LLM in the loop, and use AI Actions when describing the task is easier than scripting it.