Let AI agents browse the web. An autonomous toolkit for browser-based AI agents.
Open Browser
AI-powered autonomous web browsing framework for TypeScript.

Give an AI agent a browser. It clicks, types, navigates, and extracts data โ autonomously completing tasks on any website. Built on Playwright with first-class support for OpenAI, Anthropic, and Google models.
Production-ready since v1.0. Contributions welcome.
Why Open Browser?
- Autonomous agents: Describe a task in natural language, and an AI agent navigates the web to complete it โ clicking, typing, scrolling, and extracting data without manual scripting
- Multi-model support: Works with OpenAI, Anthropic, and Google out of the box via the Vercel AI SDK โ swap models with a single flag
- Interactive REPL: Drop into a live browser session and issue commands interactively โ great for debugging, prototyping, and exploration
- Sandboxed execution: Run agents in resource-limited environments with CPU/memory monitoring, timeouts, and domain restrictions
- Production-ready: Stall detection, cost tracking, session management, replay recording, and comprehensive error handling
- Open source: MIT licensed, fully extensible, bring your own API keys
Quick Start
# Install dependencies
bun install
Set up your API keys
cp .env.example .env
Edit .env with your API keys
Run an agent
bun run open-browser run "Find the top story on Hacker News and summarize it"
Or open a browser interactively
bun run open-browser interactive
Architecture
Open Browser is a monorepo with three packages:
| Package | Description | | --------------------------- | -------------------------------------------------------------------------- | | open-browser | Core library โ agent logic, browser control, DOM analysis, LLM integration | | @open-browser/cli | Command-line interface for running agents and browser commands | | @open-browser/sandbox | Sandboxed execution with resource limits and monitoring |
CLI Commands
Run an AI Agent
open-browser run <task> [options]
Describe what you want done. The agent figures out the rest.
# Search and extract information
open-browser run "Find the price of the MacBook Pro on apple.com"
Fill out forms
open-browser run "Sign up for the newsletter on example.com with test@email.com"
Multi-step workflows
open-browser run "Go to GitHub, find the open-browser repo, and star it"
| Option | Description | | ---------------------------- | ----------------------------------------- | | -m, --model <model> | Model to use (default: gpt-4o) | | -p, --provider <provider> | Provider: openai, anthropic, google | | --headless / --no-headless | Show or hide the browser window | | --max-steps <n> | Max agent steps (default: 25) | | -v, --verbose | Show detailed step info | | --no-cost | Hide cost tracking |
Browser Commands
open-browser open <url> # Open a URL
open-browser click <selector> # Click an element
open-browser type <selector> <text> # Type into an input
open-browser screenshot [output] # Capture a screenshot
open-browser eval <expression> # Run JavaScript on the page
open-browser extract <goal> # Extract content as markdown
open-browser state # Show current URL, title, and tabs
open-browser sessions # List active browser sessions
Interactive REPL
open-browser interactive
Drop into a live browser> prompt with full control:
browser> open https://news.ycombinator.com
browser> extract "top 5 stories with titles and points"
browser> click .morelink
browser> screenshot front-page.png
browser> help
Using as a Library
import { Agent, createViewport, createModel } from 'open-browser'
const viewport = await createViewport({ headless: true }) const model = createModel('openai', 'gpt-4o')
const agent = new Agent({ viewport, model, task: 'Go to example.com and extract the main heading', settings: { stepLimit: 50, enableScreenshots: true, }, })
const result = await agent.run() console.log(result)
Sandboxed Execution
Run agents with resource limits and monitoring:
import { Sandbox } from '@open-browser/sandbox'
const sandbox = new Sandbox({ timeout: 300_000, // 5 minute timeout maxMemoryMB: 512, // Memory limit allowedDomains: ['example.com'], stepLimit: 100, captureOutput: true, })
const result = await sandbox.run({ task: 'Complete the checkout form', model: languageModel, })
console.log(result.metrics) // steps, URLs visited, CPU time
Configuration
Environment Variables
# LLM Provider Keys (at least one required)
OPENAIAPIKEY=sk-...
ANTHROPICAPIKEY=sk-ant-...
GOOGLEGENERATIVEAIAPIKEY=...
Browser
BROWSER_HEADLESS=true
BROWSERDISABLESECURITY=false
Recording & Debugging
OPENBROWSERTRACE_PATH=./traces
OPENBROWSERSAVERECORDINGPATH=./recordings
Agent Configuration
| Setting | Default | Description | | ------------------- | -------- | ----------------------------------------- | | stepLimit | 100 | Maximum agent iterations | | commandsPerStep | 10 | Actions per agent step | | failureThreshold | 5 | Consecutive failures before stopping | | enableScreenshots | true | Include page screenshots in agent context | | contextWindowSize | 128000 | Token budget for conversation | | allowedUrls | [] | Restrict navigation to specific URLs | | blockedUrls | [] | Block navigation to specific URLs |
Viewport Configuration
| Setting | Default | Description | | ------------------ | --------------- | ------------------------------------------- | | headless | true | Run browser without visible window | | width / height | 1280 / 1100 | Browser window dimensions | | relaxedSecurity | false | Disable browser security features | | proxy | โ | Proxy server configuration | | cookieFile | โ | Path to cookie file for persistent sessions |
How It Works
โโโโโโโโโโโโโโโ
"Book a flight" โ โ
โโโโโโโโโโโโโโโโบ โ Agent โ โโโ LLM (OpenAI / Anthropic / Google)
โ โ
โโโโโโโโฌโโโโโโโ
โ
โโโโโโโโผโโโโโโโ
โ Commands โ click, type, scroll, extract, navigate...
โโโโโโโโฌโโโโโโโ
โ
โโโโโโโโผโโโโโโโ
โ Viewport โ Playwright browser instance
โโโโโโโโฌโโโโโโโ
โ
โโโโโโโโผโโโโโโโ
โ DOM / Page โ Snapshot, interactive elements, content
โโโโโโโโโโโโโโโ
- You describe a task in natural language
- The Agent sends the current page state + task to an LLM
- The LLM decides what commands to execute (click, type, navigate, extract...)
- Commands execute against the Viewport (Playwright browser)
- The agent observes the result, detects stalls, and loops until the task is complete
Model Support
| Provider | Example Models | Flag | | ------------- | ----------------------------------------------- | -------------- | | OpenAI | gpt-4o, gpt-4o-mini, o1 | -p openai | | Anthropic | claude-sonnet-4-5-20250929, claude-opus-4-6 | -p anthropic | | Google | gemini-2.0-flash, gemini-2.5-pro | -p google |
Project Structure
packages/
โโโ core/ # Core library (open-browser)
โ โโโ src/
โ โโโ agent/ # Agent logic, conversation, stall detection
โ โโโ commands/ # Action schemas and executor (25+ commands)
โ โโโ viewport/ # Browser control, events, guards
โ โโโ page/ # DOM analysis, content extraction
โ โโโ model/ # LLM adapter and message formatting
โ โโโ metering/ # Cost tracking
โ โโโ bridge/ # IPC server/client
โ โโโ config/ # Configuration types
โโโ cli/ # CLI (@open-browser/cli)
โ โโโ src/
โ โโโ commands/ # CLI command implementations
โ โโโ index.ts # Entry point
โโโ sandbox/ # Sandbox (@open-browser/sandbox)
โโโ src/
โโโ sandbox.ts # Resource-limited execution
Development
# Install dependencies
bun install
Type check
bun run build
Run tests
bun run test
Lint
bun run lint
Format
bun run format
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.