← Blog

BLOG

Hermes Remote Browser Download: What You Actually Install

Hermes remote browser download explained: what ships in the repo, what runs remotely, and how to wire a hosted Chromium session over CDP.

October 2, 20269 min readRemote Browser

# Hermes Remote Browser Download: What You Actually Install

Searching for a "Hermes remote browser download" usually means one of two things: you want the Hermes agent runtime on your machine, or you want a browser it can drive. Those are different downloads, and conflating them is the most common reason people end up with a working agent that has no browser to talk to. This guide separates the two, explains what the Hermes side actually ships, and shows how to point it at a hosted Chromium session over CDP instead of a local Chrome binary.

If you only take one thing away: Hermes is the client. The browser is a separate process, and in production it should live somewhere other than your laptop. Remote Browser provides that process as a hosted runtime with CDP access, persistent profiles, and a live viewer, so the "download" step on the browser side becomes a connection string rather than a 150 MB Chromium install.

What "Hermes Remote Browser Download" Actually Refers To

Hermes is an agent framework with a browser tool. When people search for a download, they're usually looking for one of these:

  • The Hermes package itself — installed via your language's package manager (npm, pip, or a git clone of the repo).
  • A browser binary — Chromium or Chrome that the agent drives.
  • A driver — Playwright, Puppeteer, or a raw CDP client that speaks to the browser.
  • A remote endpoint — a WebSocket URL that replaces the local browser entirely.

Only the first item is genuinely a "Hermes download." The other three are runtime concerns, and the fourth is the one that matters once you move past a demo. A local Chromium install works fine for a single script on your machine. It stops working the moment you need concurrency, a stable IP, a session that survives a process restart, or a browser that isn't competing with your IDE for RAM.

The practical framing: download Hermes once, then stop downloading browsers. Connect to one instead.

Local Browser vs Hosted Chromium for Hermes

Before wiring anything, decide where the browser lives. This table covers the trade-offs that actually bite in production.

ConcernLocal Chromium (downloaded)Hosted Chromium (connected)
SetupInstall binary + driver per machineOne connection URL
Version driftEach machine pins its own buildRuntime owns the build
ConcurrencyBounded by local RAM/CPUBounded by your plan, not your laptop
Session persistenceLost on process exit unless you manage a profile dirPersistent profiles handled by the runtime
IP / networkYour office or home IPConfigurable egress and proxy settings
DebuggingAttach a local DevTools windowLive viewer + CDP from anywhere
CI/CDNeeds a browser install step in every jobNo install step; just a URL
Failure isolationOne crash can take down the hostSessions are isolated per run

The local column isn't wrong — it's just optimized for a different problem. If you're writing a one-off scraper, download Chromium and move on. If you're running an agent that has to complete tasks repeatedly, on a schedule, against sites that behave differently from your dev machine, the hosted column is where you want to be.

For a broader treatment of that decision, see Remote Browser for AI Agents.

What You Download vs What You Connect To

This is the distinction that resolves most confusion. Here's the split:

You download (client side):

  • The Hermes agent package and its dependencies
  • A CDP-capable client library — Playwright, Puppeteer, or a raw WebSocket CDP client
  • Your task definitions, prompts, and tool configs

You connect to (runtime side):

  • A hosted Chromium instance
  • A CDP endpoint (WebSocket URL) for that instance
  • Persistent profile storage, if you need logged-in state across runs
  • A live viewer, if you want to watch or debug the session

Nothing in the second list requires a binary on your machine. That's the point. The browser becomes infrastructure you address, not software you maintain.

Why the CDP endpoint is the real interface

Chrome DevTools Protocol is the wire format. Playwright's connectOverCDP, Puppeteer's browserWSEndpoint, and raw CDP clients all speak it. If your runtime exposes a CDP endpoint, any of those clients work without a browser download. Playwright documents this connection path in its BrowserType.connectOverCDP reference, and the protocol itself is specified in the Chrome DevTools Protocol docs.

That's the whole trick: swap the launch call for a connect call.

Wiring Hermes to a Hosted Browser Over CDP

The example below uses Playwright's TypeScript API because it's the most common client for agent frameworks and it maps cleanly onto Hermes-style browser tools. The pattern is the same whether you're driving Hermes, browser-use, or a custom loop.

import { chromium, Browser, BrowserContext, Page } from 'playwright';

// The endpoint comes from your Remote Browser session.
// Treat it like a secret: it grants control of a live browser.
const CDP_ENDPOINT = process.env.REMOTE_BROWSER_CDP_URL!;

async function runHermesTask(): Promise<void> {
  let browser: Browser | undefined;

  try {
    // Instead of chromium.launch(), connect to the hosted instance.
    browser = await chromium.connectOverCDP(CDP_ENDPOINT, {
      timeout: 30_000,
    });

    // A hosted session may already have a context (with a persistent profile).
    // Reuse it if present; otherwise create one.
    const context: BrowserContext =
      browser.contexts()[0] ?? (await browser.newContext());

    const page: Page = context.pages()[0] ?? (await context.newPage());

    await page.goto('https://example.com', {
      waitUntil: 'domcontentloaded',
      timeout: 45_000,
    });

    // Hand `page` to your agent's browser tool here.
    // The agent sees a normal Playwright Page; it doesn't know it's remote.
    const title = await page.title();
    console.log('Page title:', title);

    // Do NOT call browser.close() if the session should persist.
    // Disconnecting leaves the remote browser running for the next step.
    await browser.close();
  } catch (err) {
    console.error('Hermes browser step failed:', err);
    throw err;
  }
}

runHermesTask();

Three details worth internalizing:

  1. `connectOverCDP` replaces `launch`. No browser binary is resolved, no executablePath is needed, and no playwright install step runs.
  2. Reuse the existing context. Hosted sessions often come with a context already attached to a persistent profile. Creating a second one can silently discard your logged-in state.
  3. `close()` disconnects, it doesn't necessarily kill. Whether the remote browser terminates depends on the runtime's session semantics. Check your session controls before assuming cleanup happened.

If you're coming from a local setup and want the migration path, Remote Browser Online walks through running Chromium without a local install.

Production Criteria Before You Commit

A connection string is easy. The harder question is whether the runtime behind it holds up. These are the criteria worth testing before you build on top of any hosted browser:

  • Session isolation. Two concurrent agent runs must not share cookies, storage, or a page. Ask how isolation is enforced, not just whether it's claimed.
  • Persistent profiles. If your agent logs in, the profile has to survive across sessions. Verify what's stored and for how long.
  • Proxy and network controls. Egress IP matters for rate limits and geo-specific content. Confirm what's configurable rather than assuming.
  • Configurable browser settings. Stealth-adjacent settings vary by provider. Prefer runtimes that describe exactly what they expose instead of vague "anti-detection" marketing.
  • Live debugging. When a task fails at step 7, you need to see the DOM, the console, and the network tab. A live viewer plus CDP access covers this.
  • Usage controls. Per-session timeouts, concurrency caps, and spend limits. Without them, a runaway agent is an expensive bug.
  • CDP fidelity. Some providers proxy CDP and drop domains or events. Test the specific CDP domains your agent relies on.

Pricing and plan limits change, so rather than quoting numbers here, check Remote Browser pricing for current browser-hour rates and concurrency details.

A quick smoke test

Before you trust a runtime with a real workflow, run this sequence:

  1. Connect over CDP and confirm browser.version() returns a Chromium build.
  2. Navigate to a page that requires JavaScript and assert on rendered content, not raw HTML.
  3. Open a second session and confirm it cannot see the first session's cookies.
  4. Kill your client process mid-task and reconnect. Does the session survive? Should it?
  5. Capture a screenshot through CDP and confirm it matches what the live viewer shows.

If all five pass, the runtime is doing what it says. If any fail, you've found the constraint before it found you in production.

Where Hermes Fits in the Broader Stack

Hermes is one of several agent frameworks that need a browser. The pattern repeats across browser-use, Claude-based agents, and custom loops: the framework handles reasoning and tool selection, the browser handles the web. Keeping those layers separate is what makes the stack maintainable.

That separation also means you can change models without changing browsers, and change browsers without rewriting agent logic. If you're evaluating alternatives, the comparisons that matter are about runtime behavior — session lifecycle, CDP completeness, isolation — not about which framework has the nicer README. For a look at how remote control of a browser session works end to end, see Remote Control Browser.

A few practical notes for Hermes specifically:

  • Keep the browser tool thin. Let the agent call goto, click, type, and extract. Don't bake retry logic into the tool; put it in the agent loop where it can reason about failures.
  • Log the CDP endpoint per run. When a task fails, you want to correlate the run ID with the session that produced it.
  • Set explicit timeouts. Hosted sessions can outlive your client. A 45-second navigation timeout is safer than an infinite wait.
  • Prefer structured extraction over screenshots when the agent needs data, and screenshots when it needs to verify visual state.

Common Failure Modes and Fixes

Most "remote browser not working" reports trace back to a handful of causes:

  • Connecting to an expired session. CDP URLs are often short-lived. Re-request one rather than retrying the same string.
  • Calling `launch()` out of habit. If your code still resolves a local executable, you're not actually remote.
  • Assuming `close()` kills the session. It may only disconnect. Check session controls.
  • Sharing a profile across concurrent runs. This causes cookie bleed and flaky assertions. One profile per logical user, not per process.
  • Ignoring CDP domain gaps. If a provider proxies CDP, some domains may be unavailable. Test the ones you use.

If you're hitting a specific connection error, Hermes Remote Browser Not Working covers the common cases in more detail.

Summary

The "Hermes remote browser download" is really two decisions: install the agent client, and connect to a browser you don't install. Download Hermes once. Point it at a hosted Chromium session over CDP. Reuse the existing context so persistent profiles work. Set timeouts, isolate sessions, and verify the runtime with a smoke test before you build on it.

The payoff is a stack where the browser is infrastructure — versioned, isolated, observable, and reachable from CI, a server, or your laptop without a 150 MB install on each. Start with the documentation to get a CDP endpoint, then wire it into your Hermes browser tool and run the smoke test above.