> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://platform.bctrl.ai/llms.txt.
> For full documentation content, see https://platform.bctrl.ai/llms-full.txt.

# Browser Runtimes

> Managed Chromium runtimes with profiles, proxies, CAPTCHA support, extensions, recordings, and CDP access.

Browser runtimes are hosted Chromium environments inside a space. BCTRL runs the browser, manages access, records evidence, and gives your automation code a CDP connection.

Your external automation tools connect over CDP:

* Playwright
* Puppeteer
* Selenium
* Chrome DevTools-compatible debuggers

Hosted AI work uses invocations instead. Use invocations when BCTRL should run Stagehand or browser-use agent work inside the runtime.

## What BCTRL manages

| Capability    | What it does                                                    |
| ------------- | --------------------------------------------------------------- |
| Profiles      | Reuse cookies, local storage, and browser identity across runs. |
| Proxies       | Route browser traffic through custom or managed proxies.        |
| Stealth       | Reduce common automation detection signals.                     |
| CAPTCHA       | Handle supported CAPTCHA challenges.                            |
| Extensions    | Load approved browser extensions.                               |
| Observability | Run events, commands, artifacts, live view, and recording.      |

## Basic flow

```ts
const space = await bctrl.spaces.create({
  name: "invoice-agent",
});

const runtime = await space.runtimes.browser.launch({
  name: "quickbooks",
  config: {
    stealth: "high",
  },
});

const connection = await runtime.connections.create({
  protocol: "cdp",
});
```

Pass `connection.endpoint.url` to your browser framework and run normal automation code.

```ts
const browser = await chromium.connectOverCDP(connection.endpoint.url);
const page = browser.contexts()[0]?.pages()[0] ?? await browser.newPage();

await page.goto("https://example.com");
```

Observe the active run through `currentRun()`.

```ts
const run = await runtime.currentRun();

await run.events.list();
await run.artifacts.list();
```

## Related

* [Browser Quickstart](/sdk/getting-started/browser-quickstart)
* [Connect with CDP](/sdk/browser-runtimes)
* [Runs](/sdk/core-concepts/runs)