← Blog

BLOG

Auto Browser: What It Is and How to Run One

An auto browser is a hosted Chromium runtime that AI agents drive over CDP. Learn how it works, where it fits, and how to run one in production.

9 min readRemote Browser
Ivory computer towers connected across terracotta platforms in a quiet desert landscape
The infrastructure behind your browserREMOTE BROWSER / ILLUSTRATION

An auto browser is a browser instance that runs on remote infrastructure and is driven programmatically rather than by a human at a keyboard. In practice, that means a real Chromium process hosted on a server, exposed over the Chrome DevTools Protocol (CDP), and controlled by an AI agent, a Playwright script, or a terminal client. The "auto" part is the whole point: no local Chrome install, no desktop session, no manual clicking.

This guide covers what an auto browser actually is, how it differs from a local browser and from a headless-only setup, and how to run one in production with a hosted runtime like Remote Browser. If you want the broader context first, see Remote browsers for AI agents.

What an auto browser actually is

Strip away the marketing and an auto browser is three things stacked together:

  1. A real browser engine. Chromium, with a full rendering pipeline, JavaScript execution, network stack, and storage. Not a DOM parser, not an HTTP client, not a screenshot service.
  2. A remote control surface. CDP exposes the browser over a WebSocket endpoint. Playwright, Puppeteer, Selenium, and most agent frameworks speak this protocol or wrap it.
  3. A lifecycle manager. Something creates the session, assigns it a profile and proxy, keeps it alive, streams a live view, and tears it down when the work is done.

When people say "auto browser" they usually mean all three delivered as a service. You call an API, get a CDP endpoint back, connect your agent, and the provider handles the machine underneath.

That last layer is where most of the operational pain lives. Running Chromium on your own laptop is trivial. Running many isolated Chromium sessions with persistent logins, residential egress, and a live viewer is a systems problem.

Auto browser vs. local browser vs. headless-only

These three get conflated constantly. They are not the same thing.

DimensionLocal browserHeadless-only runnerAuto browser (hosted)
Where Chromium runsYour machineYour CI box or containerProvider infrastructure
Human can watchYes, by defaultNo, unless you add toolingYes, via live viewer
Session isolationWeak, shared profilePer-container, if you build itPer-session by default
Persistent loginsManualFragile, container-localProfiles you can reuse
Proxy / egress controlOS-level, manualPer-container configConfigurable per session
Scaling modelOne at a timeAdd containersAPI calls, metered
DebuggingDevTools on your screenLogs and tracesLive view plus CDP
Best fitDevelopmentSimple batch jobsAgents and production automation

The headless-only column is the one that trips people up. A headless Chromium in a Docker container is technically an auto browser, but you own the container orchestration, the profile persistence, the proxy configuration, and the crash recovery. That is fine for a cron job that scrapes one page. It falls apart when an AI agent needs to log in, hold state across steps, and recover from a mid-task failure.

A hosted auto browser moves that infrastructure off your plate. You still write the automation logic; you just don't run the fleet.

Why AI agents need an auto browser

A cursor browser agent, a Manus-style browser operator, or any agent that uses a web engine to complete tasks has the same core requirement: it needs to see and act on a real page, repeatedly, without a human in the loop.

That creates four constraints that a local browser handles badly:

  • Concurrency. An agent fleet runs many tasks at once. One laptop cannot host dozens of isolated browser sessions with separate cookies and proxies.
  • Persistence. Agents log in, get past onboarding, and expect to resume later. That requires saved profiles tied to a stable identity, not a fresh incognito window every run.
  • Observability. When an agent fails at step 14 of 20, you need to see what the page looked like. A live viewer and session recordings turn a black box into a debuggable trace.
  • Isolation. One agent's cookies, local storage, and proxy must never leak into another's. Session isolation is a correctness requirement, not a nice-to-have.

A hosted auto browser addresses all four by design. The agent code stays the same; the runtime underneath changes.

How the control path works

The control path is CDP over WebSocket. Your agent or script connects to a ws:// or wss:// endpoint, and from that point the browser behaves like any Chromium instance. Playwright's `connectOverCDP` is the most common entry point for TypeScript and Python.

Here is a minimal TypeScript example that connects to a hosted auto browser, navigates, and extracts structured data:

import { chromium } from "playwright";

type Session = { cdpUrl: string; sessionId: string };

// Your runtime provider returns a CDP endpoint for a new session.
async function createSession(): Promise<Session> {
  const res = await fetch(`${process.env.BROWSER_API}/sessions`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.BROWSER_API_KEY}`,
    },
    body: JSON.stringify({
      // Configurable browser settings: profile, proxy, viewport.
      profileId: "agent-checkout",
      proxy: { country: "us" },
      viewport: { width: 1440, height: 900 },
    }),
  });
  if (!res.ok) throw new Error(`session create failed: ${res.status}`);
  return res.json();
}

async function run() {
  const { cdpUrl, sessionId } = await createSession();
  const browser = await chromium.connectOverCDP(cdpUrl);

  try {
    const context = browser.contexts()[0];
    const page = context.pages()[0] ?? (await context.newPage());

    await page.goto("https://example.com/orders", {
      waitUntil: "domcontentloaded",
    });

    // Wait for the app to hydrate before reading state.
    await page.waitForSelector("[data-testid=order-row]");

    const orders = await page.$$eval("[data-testid=order-row]", (rows) =>
      rows.map((r) => ({
        id: r.getAttribute("data-order-id"),
        status: r.querySelector(".status")?.textContent?.trim() ?? null,
      })),
    );

    console.log({ sessionId, orders });
  } finally {
    await browser.close(); // detaches; the runtime ends the session
  }
}

run().catch((err) => {
  console.error(err);
  process.exit(1);
});

Two details matter here. First, browser.close() on a CDP connection detaches your client; whether the session itself terminates is a runtime policy you should check. Second, the profileId and proxy fields are what make the session reproducible. Without them, every run starts from zero.

For a deeper walkthrough of the connection layer, see the documentation.

Auto browser vs. terminal browser vs. agent framework

The keyword space around this is messy, so it helps to separate the layers.

  • A terminal browser (like lynx or w3m) renders text only and has no JavaScript engine. It is not an auto browser in the sense used here.
  • A terminal web browser driven by an agent is closer, but still limited by the absence of a real rendering engine.
  • An agent framework (browser-use, Stagehand, a custom loop) is the decision-making layer. It decides what to click.
  • An auto browser is the execution layer. It is the thing that actually clicks.

You need both. The framework without a runtime is a plan with no hands. The runtime without a framework is a browser nobody is driving.

This is why "web automation tools" and "website automation tools" lists are often confusing: they mix frameworks, protocols, and runtimes into one bucket. When you evaluate them, ask which layer each tool occupies.

Production criteria for an auto browser

If you are choosing a runtime for agents, these are the criteria that actually separate options.

Session isolation

Each session should have its own browser context, storage, and network identity. Shared state between sessions is a data-leak bug waiting to happen. Verify that cookies and local storage do not cross session boundaries.

Persistent profiles

Agents that log in need profiles that survive session restarts. A profile should carry cookies, local storage, and IndexedDB, and should be attachable to a new session by ID. This is the difference between an agent that re-authenticates every run and one that just works.

CDP compatibility

The endpoint should speak standard CDP so Playwright, Puppeteer, and Selenium all connect without a custom shim. If a provider only exposes a proprietary API, you are locked into their client library.

Live viewer and recordings

You need to see what the agent saw. A live viewer helps during development; recordings help during incident review. Both should be available without extra instrumentation.

Configurable browser settings

Proxy region, viewport, user agent, locale, and timezone should be settable per session. Prefer providers that describe these as configurable settings rather than making vague claims about detection evasion.

Usage controls

Metering should be transparent. You want to know how browser-hours are counted, how concurrency is limited, and what happens when a session idles. Check /pricing for current rates and limits rather than relying on secondhand numbers.

Failure handling

Sessions crash. Networks flake. A production runtime should surface session health over the API and let you reconnect or recreate without losing the profile.

Common workloads

Auto browsers show up in a handful of recurring patterns:

  • Agent task execution. A cursor browser agent or Manus-style operator completes a multi-step workflow: search, compare, fill a form, confirm.
  • Authenticated data extraction. Log in once, persist the profile, and pull structured data on a schedule.
  • Regression testing. Run a Playwright suite against hosted Chromium so CI does not need a browser matrix.
  • Human-in-the-loop review. An agent does the work; a human watches the live viewer and intervenes when needed.
  • Cross-region verification. Check what a page looks like from a specific country using a configured proxy.

Each of these stresses a different part of the runtime. Testing cares about parallelism and determinism. Agent execution cares about persistence and recovery. Cross-region work cares about proxy configuration. Pick a runtime that is strong on the axis you actually use.

Where local still wins

Hosted auto browsers are not universally better. Local Chromium is the right call when:

  • You are developing the automation and need fast iteration with DevTools open.
  • The task is a one-off and the setup cost of a remote session exceeds the task.
  • You need to inspect something that requires a real desktop session, like a native file picker.

The usual pattern is local for development, hosted for production. The automation code should be identical in both cases if you are using CDP, which is one reason to standardize on it early.

Getting started

The shortest path to a working auto browser is:

  1. Pick a runtime and get an API key.
  2. Create a session with a profile and proxy config.
  3. Connect with chromium.connectOverCDP(cdpUrl).
  4. Drive the page with your agent or script.
  5. Watch the live viewer while you debug.
  6. Move the same code to a worker once it is stable.

If you want to try the connection layer without writing a full agent, run a remote browser online is a good next read. For the control-plane details, including how sessions, profiles, and proxies fit together, see the documentation.

The important thing is to treat the browser as infrastructure, not as a dependency you install. Once the runtime is a service, the agent code becomes portable, the debugging story becomes visible, and scaling becomes a matter of API calls rather than machines.