← Blog

BLOG

Manus Browser Operator: What It Is and How to Run It

Manus browser operator explained: how Manus drives a real browser, where it runs, and how to wire it to hosted Chromium over CDP for production.

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

A Manus browser operator is the part of Manus that drives a real browser to complete a task: it opens pages, clicks, types, scrolls, and reads the DOM on your behalf. If you have used Manus and watched it work through a multi-step web task, you have seen the operator in action. The interesting engineering question is not what it does — it is where it runs and how you connect it to a browser you control. This guide covers both, and shows how to point a Manus-style operator at hosted Chromium over the Chrome DevTools Protocol (CDP) so it runs reliably outside a laptop session.

What "Manus browser operator" actually refers to

Manus is a general-purpose AI agent product. Its browser operator is the execution layer that turns a plan into browser actions. In practice that means three things:

  • A control loop. The model decides the next action, the operator executes it against a live page, and the resulting page state feeds back into the model.
  • A browser session. A real Chromium instance with a profile, cookies, and network access — not a headless HTTP client.
  • A transport. Some channel between the agent process and the browser. In most modern stacks this is CDP, the same protocol Chrome DevTools uses.

People search for "manus browser operator" for a few different reasons. Some want to understand what the feature does. Some want to know whether they can use it against their own browser or a remote one. Some are building something similar and want the runtime architecture. This article answers all three, with the most weight on the third, because that is where production problems actually live.

The short version: the operator logic is the easy part to reason about. The browser runtime underneath it is where sessions die, profiles leak, and tasks fail at 2 a.m. Getting that layer right is the difference between a demo and a workflow you can trust.

How a browser operator differs from a terminal browser

A common confusion: people lump browser operators together with terminal browsers and CLI automation tools. They are different layers.

LayerWhat it isExampleWho drives it
Terminal browserText-mode browser rendering pages as textlynx, w3mA human at a shell
Terminal web browser automationCLI that scripts a real browseragent-browser CLIA developer or agent via commands
Browser operatorAgent loop that decides and executes actionsManus browser operatorAn LLM control loop
Web automation toolLibrary or framework for scripting browsersPlaywright, Puppeteer, SeleniumCode you write
Hosted browser runtimeRemote Chromium with CDP accessRemote BrowserAny of the above, over CDP

A terminal browser is a rendering mode. A browser operator is a decision loop. A hosted runtime is the infrastructure the loop runs against. You can combine them — a Manus-style operator can drive a hosted Chromium session using Playwright or a raw CDP client — but they are not substitutes for one another.

This distinction matters when you evaluate web automation tools. A tool that works well for scripted, deterministic flows (Playwright test suites, for example) is not automatically a good fit for an LLM-driven operator, because the operator needs to observe page state, recover from unexpected modals, and handle ambiguity. The runtime has to support that: fast screenshots, reliable DOM snapshots, stable session state, and a live view so a human can intervene.

Where the operator runs: local vs hosted

The default Manus experience runs the browser in Manus's own environment. That is fine for general tasks. It becomes a constraint when you need any of the following:

  • Your own logged-in sessions. A profile with your accounts, cookies, and saved logins.
  • A specific network location. A proxy or region your target site expects.
  • Auditability. Recordings, session logs, and a live viewer you control.
  • Isolation. One browser per task, not a shared environment.
  • Integration. Your own agent code calling into the same browser the operator uses.

For those cases you want the operator to connect to a browser you provision. That is exactly what a hosted Chromium runtime provides: you create a session via API, get a CDP WebSocket endpoint, and connect whatever drives the browser — Playwright, Puppeteer, Selenium, or a custom CDP client.

If you are new to this pattern, the remote browser for AI agents overview covers the runtime model, and remote browser online explains what "running Chromium without local setup" actually means in practice.

Connecting an operator to hosted Chromium over CDP

The mechanics are straightforward. You request a session, receive a WebSocket debugger URL, and connect. Playwright's `connectOverCDP` is the most common path because it gives you the full Playwright API on top of a remote browser.

import { chromium, Browser, Page } from "playwright";

// Session creation is provider-specific. Remote Browser returns a CDP
// WebSocket endpoint for each hosted Chromium session.
const cdpEndpoint = process.env.REMOTE_BROWSER_CDP_URL!;

async function runOperatorStep(task: string) {
  const browser: Browser = await chromium.connectOverCDP(cdpEndpoint, {
    timeout: 30_000,
  });

  // Reuse the existing context so cookies and storage persist
  // across operator steps within the same session.
  const context = browser.contexts()[0] ?? (await browser.newContext());
  const page: Page = context.pages()[0] ?? (await context.newPage());

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

  // The operator loop: observe, decide, act.
  const snapshot = await page.accessibility.snapshot();
  const nextAction = await decideNextAction(task, snapshot); // your LLM call

  if (nextAction.type === "click") {
    await page.locator(nextAction.selector).click();
  } else if (nextAction.type === "type") {
    await page.locator(nextAction.selector).fill(nextAction.text);
  }

  // Do not close the browser here. The session outlives this step.
  await browser.close(); // closes the CDP connection, not the remote browser
}

async function decideNextAction(task: string, snapshot: unknown) {
  // Replace with your model call. Return a structured action.
  return { type: "click" as const, selector: "#continue" };
}

Two details in that snippet matter more than they look:

  1. `browser.close()` on a CDP connection detaches; it does not necessarily kill the remote browser. That is what you want for a multi-step operator — each step can reconnect without losing state. Confirm the semantics of your provider's session lifecycle before relying on it.
  2. Reuse the context. Creating a new context per step throws away cookies and storage. For an operator working through a login flow, that is fatal.

If you prefer raw CDP without Playwright, the Chrome DevTools Protocol docs cover Target.attachToTarget, Page.navigate, and Runtime.evaluate — the primitives an operator needs. Playwright is usually the faster path because it handles the session plumbing.

Production criteria for a browser operator runtime

Once you move past a single task, the runtime becomes the thing you are really operating. Here is what to evaluate, in rough order of how often it bites teams.

Session isolation and lifecycle

Each operator task should get its own browser. Shared browsers mean shared cookies, shared tabs, and cross-task contamination. Look for explicit session creation and teardown, plus a way to detect and reap orphaned sessions. A session that outlives its task is a bill you did not plan for.

Persistent profiles

Operators that log in need state that survives across sessions. Persistent profiles let you save a browser profile and reattach it to a new session, so the operator does not re-authenticate on every run. This is the difference between a workflow that works and one that gets rate-limited or locked out.

Live viewer and debugging

When an operator fails, you need to see why. A live viewer that streams the remote browser lets a human watch the session in real time and step in. Without it, debugging is guesswork against logs. The remote control browser guide covers the intervention patterns.

Proxy and browser settings

Many real workflows need a specific egress IP or region. Hosted runtimes typically expose configurable browser settings for proxies and related network options. Be precise about what you need: a residential proxy in a target country is a different requirement from generic stealth. Ask providers what they actually support rather than assuming.

Usage controls

Browser time is metered. Understand how sessions are billed, what counts as a browser-hour, and how concurrency is limited. Remote Browser publishes current details on the pricing page; check there rather than relying on secondhand numbers.

Protocol compatibility

If your operator uses Playwright, Puppeteer, or Selenium, confirm the runtime speaks CDP in a way those libraries accept. Most do, but version skew between the client library and the remote Chromium build is a real failure mode. Pin versions and test the connection path early.

Manus operator vs building your own loop

A fair question: if you are going to wire an operator to a hosted runtime anyway, why not use Manus's operator as-is?

ConsiderationManus browser operator (default)Your own operator on hosted Chromium
Setup effortLow — it is a product featureMedium — you build the loop
Control over browserLimited to what the product exposesFull — you own the session
Profile and proxy controlProduct-dependentConfigurable per session
Model choiceFixed by the productAny model you want
DebuggingProduct UILive viewer plus your own logs
Best forGeneral tasks, quick researchRepeatable workflows, integrations

The honest answer is that these serve different needs. If you want a capable agent for ad hoc tasks, the product is the right call. If you are building a workflow that runs on a schedule, touches authenticated systems, or needs to fit into your own stack, you want the operator loop under your control and a runtime you can reason about.

The remote web browser piece goes deeper on the runtime side of that decision.

Common failure modes and how to avoid them

A few patterns show up repeatedly when teams move an operator into production:

  • Reconnecting without reusing context. Each step creates a fresh context, so the operator loses login state. Fix: attach to the existing context, or use a persistent profile.
  • No timeout on CDP connect. A stalled connection hangs the whole task. Fix: set an explicit connect timeout and fail fast.
  • Assuming `browser.close()` kills the session. It may only detach. Fix: read your provider's lifecycle docs and call the session-termination API explicitly.
  • Ignoring the live viewer until something breaks. Fix: watch sessions during development so you learn the failure shapes before they hit production.
  • Treating stealth as a checkbox. Fix: define the actual requirement — region, IP type, session persistence — and verify it against a real target.

None of these are exotic. They are the ordinary edges of running a browser you do not physically control, and they are all cheaper to handle before launch than after.

Getting started

The practical path is short:

  1. Read the documentation to understand session creation and CDP access.
  2. Create a session, grab the WebSocket endpoint, and connect with connectOverCDP.
  3. Run a single operator step against a real page and watch it in the live viewer.
  4. Add a persistent profile and a proxy if your workflow needs them.
  5. Check pricing and set usage controls before you scale concurrency.

A Manus browser operator is a useful mental model for how agent-driven browsing works: observe, decide, act, repeat. The runtime underneath that loop is where reliability is won or lost. Hosted Chromium over CDP gives you a browser you can provision, watch, and tear down on demand — which is what an operator needs once the task stops being a demo.