Open-source cloud browser API

Self-hosted browsers for
AI agents and developers

BrowseFleet runs a fleet of stealthed headless Chrome instances behind a single REST API. Sessions, scrape, screenshot, PDF, profile persistence, human-in-the-loop control. MIT licensed. You host it.

One integration, two patterns

Use the SDK or connect Puppeteer directly

Quick actions for one-shot scrape / screenshot / PDF. Sessions when you need a persistent browser. The session response returns a CDP WebSocket URL, so any automation library that speaks CDP plugs in unchanged.

Sessions start in under a second on a warm host

Stealth defaults pass standard bot-detection fingerprint pages

Cap the pool at any concurrency your host can sustain

example.ts
import { BrowseFleet } from 'browsefleet';
import puppeteer from 'puppeteer-core';

const bf = new BrowseFleet({
  baseUrl: 'http://localhost:3000', // or your self-hosted URL
});

// Quick action: scrape a page (no session bookkeeping)
const { markdown } = await bf.scrape('https://example.com');

// Persistent session: connect Puppeteer over the CDP proxy
const session = await bf.sessions.create({ stealth: 'full' });
const browser = await puppeteer.connect({
  browserWSEndpoint: session.websocketUrl,
});
const page = await browser.newPage();
await page.goto('https://example.com');

await bf.sessions.release(session.id);

Features

Everything in one repo

Sessions API

Launch managed browser sessions over REST. Connect with Puppeteer, Playwright, or Selenium through the CDP WebSocket proxy.

Stealth by default

puppeteer-extra-plugin-stealth baked in plus per-session randomized viewport, user agent, and platform fingerprints.

Quick actions

One-call scrape, screenshot, or PDF. Returns cleaned HTML, markdown, readability text, and link metadata.

Computer API

Click, type, scroll, navigate. Designed for Claude, GPT, and Gemini Computer Use. Every action returns a screenshot.

Operator mode

Sessions can start in human control, let a real person log in, then hand off to an agent via the control state machine.

Profile persistence

Persistent Chrome user-data directories. Logins, cookies, and storage survive across sessions.

Built-in vision agent

Take a natural-language task. The agent screenshots, reasons with Claude or GPT, picks an action, executes, repeats.

Self-hosted, MIT-licensed

One Node process, one SQLite file, one Docker container. Runs on a $4/mo Hetzner box. No external services.

Four repos, all MIT

Server, SDKs, and this site

The full project lives in the open. Server, both SDKs, and the marketing site you are reading are all public on GitHub.

browsefleetTypeScript

Self-hosted cloud browser API. Sessions, scrape, screenshot, PDF, stealth, profile persistence, human-in-the-loop control behind one REST endpoint.

docker run -p 3000:3000 --shm-size=2g ghcr.io/therjmurray/browsefleet:latest

Official Node.js SDK. Sync + dual ESM/CJS. Zero runtime dependencies. Full TypeScript types.

npm install browsefleet

Official Python SDK. Sync + async clients. py.typed. httpx under the hood.

pip install browsefleet
browsefleet-webTypeScript

The marketing site (this site).

Pricing

Free. You host it.

BrowseFleet is MIT licensed. There is no hosted SaaS to subscribe to. You run the Docker image on a $4-per-month VPS, or scale up; that is the entire cost model.

Ready to run a fleet?

One docker command to a working local server. Five minutes to a deployed VPS.