66
77<p align =" center " >
88 <a href =" https://github.com/ntegrals/openbrowser/blob/main/LICENSE " ><img src =" https://img.shields.io/badge/license-MIT-blue.svg " alt =" License " ></a >
9- <a href =" https://www.npmjs.com/package/open-browser " ><img src =" https://img.shields.io/npm/v/open-browser.svg " alt =" npm version " ></a >
109 <a href =" https://github.com/ntegrals/openbrowser " ><img src =" https://img.shields.io/github/stars/ntegrals/openbrowser?style=social " alt =" GitHub stars " ></a >
1110</p >
1211
12+ <img src =" ./media/header.png " alt =" Header " ></a >
13+
1314---
1415
1516Give 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.
@@ -46,11 +47,11 @@ bun run open-browser interactive
4647
4748Open Browser is a monorepo with three packages:
4849
49- | Package | Description |
50- | ---| ---|
51- | ** ` open-browser ` ** | Core library — agent logic, browser control, DOM analysis, LLM integration |
52- | ** ` @open-browser/cli ` ** | Command-line interface for running agents and browser commands |
53- | ** ` @open-browser/sandbox ` ** | Sandboxed execution with resource limits and monitoring |
50+ | Package | Description |
51+ | --------------------------- | -------------------------------------------------------------------------- |
52+ | ** ` open-browser ` ** | Core library — agent logic, browser control, DOM analysis, LLM integration |
53+ | ** ` @open-browser/cli ` ** | Command-line interface for running agents and browser commands |
54+ | ** ` @open-browser/sandbox ` ** | Sandboxed execution with resource limits and monitoring |
5455
5556## CLI Commands
5657
@@ -73,14 +74,14 @@ open-browser run "Sign up for the newsletter on example.com with test@email.com"
7374open-browser run " Go to GitHub, find the open-browser repo, and star it"
7475```
7576
76- | Option | Description |
77- | ---| ---|
78- | ` -m, --model <model> ` | Model to use (default: ` gpt-4o ` ) |
79- | ` -p, --provider <provider> ` | Provider: ` openai ` , ` anthropic ` , ` google ` |
80- | ` --headless / --no-headless ` | Show or hide the browser window |
81- | ` --max-steps <n> ` | Max agent steps (default: ` 25 ` ) |
82- | ` -v, --verbose ` | Show detailed step info |
83- | ` --no-cost ` | Hide cost tracking |
77+ | Option | Description |
78+ | ---------------------------- | ----------------------------------------- |
79+ | ` -m, --model <model> ` | Model to use (default: ` gpt-4o ` ) |
80+ | ` -p, --provider <provider> ` | Provider: ` openai ` , ` anthropic ` , ` google ` |
81+ | ` --headless / --no-headless ` | Show or hide the browser window |
82+ | ` --max-steps <n> ` | Max agent steps (default: ` 25 ` ) |
83+ | ` -v, --verbose ` | Show detailed step info |
84+ | ` --no-cost ` | Hide cost tracking |
8485
8586### Browser Commands
8687
@@ -114,46 +115,46 @@ browser> help
114115## Using as a Library
115116
116117``` typescript
117- import { Agent , createViewport , createModel } from " open-browser" ;
118+ import { Agent , createViewport , createModel } from ' open-browser'
118119
119- const viewport = await createViewport ({ headless: true });
120- const model = createModel (" openai" , " gpt-4o" );
120+ const viewport = await createViewport ({ headless: true })
121+ const model = createModel (' openai' , ' gpt-4o' )
121122
122123const agent = new Agent ({
123124 viewport ,
124125 model ,
125- task: " Go to example.com and extract the main heading" ,
126+ task: ' Go to example.com and extract the main heading' ,
126127 settings: {
127128 stepLimit: 50 ,
128129 enableScreenshots: true ,
129130 },
130- });
131+ })
131132
132- const result = await agent .run ();
133- console .log (result );
133+ const result = await agent .run ()
134+ console .log (result )
134135```
135136
136137### Sandboxed Execution
137138
138139Run agents with resource limits and monitoring:
139140
140141``` typescript
141- import { Sandbox } from " @open-browser/sandbox" ;
142+ import { Sandbox } from ' @open-browser/sandbox'
142143
143144const sandbox = new Sandbox ({
144- timeout: 300_000 , // 5 minute timeout
145- maxMemoryMB: 512 , // Memory limit
146- allowedDomains: [" example.com" ],
145+ timeout: 300_000 , // 5 minute timeout
146+ maxMemoryMB: 512 , // Memory limit
147+ allowedDomains: [' example.com' ],
147148 stepLimit: 100 ,
148149 captureOutput: true ,
149- });
150+ })
150151
151152const result = await sandbox .run ({
152- task: " Complete the checkout form" ,
153+ task: ' Complete the checkout form' ,
153154 model: languageModel ,
154- });
155+ })
155156
156- console .log (result .metrics ); // steps, URLs visited, CPU time
157+ console .log (result .metrics ) // steps, URLs visited, CPU time
157158```
158159
159160## Configuration
@@ -177,25 +178,25 @@ OPEN_BROWSER_SAVE_RECORDING_PATH=./recordings
177178
178179### Agent Configuration
179180
180- | Setting | Default | Description |
181- | ---| ---| ---|
182- | ` stepLimit ` | ` 100 ` | Maximum agent iterations |
183- | ` commandsPerStep ` | ` 10 ` | Actions per agent step |
184- | ` failureThreshold ` | ` 5 ` | Consecutive failures before stopping |
185- | ` enableScreenshots ` | ` true ` | Include page screenshots in agent context |
186- | ` contextWindowSize ` | ` 128000 ` | Token budget for conversation |
187- | ` allowedUrls ` | ` [] ` | Restrict navigation to specific URLs |
188- | ` blockedUrls ` | ` [] ` | Block navigation to specific URLs |
181+ | Setting | Default | Description |
182+ | ------------------- | -------- | ----------------------------------------- |
183+ | ` stepLimit ` | ` 100 ` | Maximum agent iterations |
184+ | ` commandsPerStep ` | ` 10 ` | Actions per agent step |
185+ | ` failureThreshold ` | ` 5 ` | Consecutive failures before stopping |
186+ | ` enableScreenshots ` | ` true ` | Include page screenshots in agent context |
187+ | ` contextWindowSize ` | ` 128000 ` | Token budget for conversation |
188+ | ` allowedUrls ` | ` [] ` | Restrict navigation to specific URLs |
189+ | ` blockedUrls ` | ` [] ` | Block navigation to specific URLs |
189190
190191### Viewport Configuration
191192
192- | Setting | Default | Description |
193- | ---| ---| ---|
194- | ` headless ` | ` true ` | Run browser without visible window |
195- | ` width ` / ` height ` | ` 1280 ` / ` 1100 ` | Browser window dimensions |
196- | ` relaxedSecurity ` | ` false ` | Disable browser security features |
197- | ` proxy ` | — | Proxy server configuration |
198- | ` cookieFile ` | — | Path to cookie file for persistent sessions |
193+ | Setting | Default | Description |
194+ | ------------------ | --------------- | ------------------------------------------- |
195+ | ` headless ` | ` true ` | Run browser without visible window |
196+ | ` width ` / ` height ` | ` 1280 ` / ` 1100 ` | Browser window dimensions |
197+ | ` relaxedSecurity ` | ` false ` | Disable browser security features |
198+ | ` proxy ` | — | Proxy server configuration |
199+ | ` cookieFile ` | — | Path to cookie file for persistent sessions |
199200
200201## How It Works
201202
@@ -227,11 +228,11 @@ OPEN_BROWSER_SAVE_RECORDING_PATH=./recordings
227228
228229## Model Support
229230
230- | Provider | Example Models | Flag |
231- | ---| ---| ---|
232- | ** OpenAI** | ` gpt-4o ` , ` gpt-4o-mini ` , ` o1 ` | ` -p openai ` |
231+ | Provider | Example Models | Flag |
232+ | ------------- | ----------------------------------------------- | -------------- |
233+ | ** OpenAI** | ` gpt-4o ` , ` gpt-4o-mini ` , ` o1 ` | ` -p openai ` |
233234| ** Anthropic** | ` claude-sonnet-4-5-20250929 ` , ` claude-opus-4-6 ` | ` -p anthropic ` |
234- | ** Google** | ` gemini-2.0-flash ` , ` gemini-2.5-pro ` | ` -p google ` |
235+ | ** Google** | ` gemini-2.0-flash ` , ` gemini-2.5-pro ` | ` -p google ` |
235236
236237## Project Structure
237238
0 commit comments