README.md
Rama main · réplica de lectura del repositorio original.
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/assets/openbrowse-dark.gif">
<img src=".github/assets/openbrowse-light.gif" alt="OpenBrowse" width="432">
</picture>
</p>
# OpenBrowse
**The open-source Browser Use Cloud alternative.** Self-host AI browser agents on a Raspberry Pi or any VPS, drive them through the same v3 REST API the `browser-use-sdk` already speaks, and watch every run live in a real browser. Built on top of the [Browser Use](https://github.com/browser-use/browser-use) SDK. It's cheaper, faster, and more reliable than BU Cloud.
[openbrowse.co](https://openbrowse.co)
<div align="left">
<a href="https://buildin.london"><img src="https://buildin.london/badge.svg" alt="Built in London" style="width: 200px;"></a>
</div>
---
## Benchmarks
Given the same real-world extraction task (a careers page with 14 records behind an embedded, cross-origin board, requiring full schema output):
| Runtime | Model | Reasoning | Time | Tokens | LLM cost | Records |
| --- | --- | --- | ---: | ---: | ---: | --- |
| BU Cloud | claude-sonnet-5 | high | 2m 36s | 859k | $0.78 | 14/14<sup>1</sup> |
| **OpenBrowse** | **gpt-5.6-terra** | **none** | **1m 47s** | **202k** | **$0.24** | **14/14** |
| **OpenBrowse** | **claude-sonnet-5** | **high** | 4m 02s | **242k** | **$0.40** | **14/14** |
<sub><i><sup>1</sup> Extracted successfully, though some returned fields (e.g. job seniority) were hallucinated when not shown on the page.</i></sub>
<sub>[All runs, every model tried, and the task specification](https://openbrowse.co/benchmarks).</sub>
## Why OpenBrowse over BU Cloud?
| | BU Cloud | OpenBrowse |
| --- | --- | --- |
| Hosting | Managed, per-task pricing | Your hardware, you pay only LLM tokens |
| How it works | Code-first: the agent scripts its way through pages | Visual-first: the agent opens real tabs you can watch live, like a human working |
| Bulk page reads | One page at a time | `read_pages` opens whole listings in parallel tab waves, one step |
| Structured output | Schema-validated | Schema-validated, plus a live answer store with a completeness gate the agent must pass before finishing |
| Anti-hallucination | Often fills fields the page never shows | On-screen data first, enriched from the page's own structured data (JSON-LD, APIs), never guessed: values without evidence are refused at the store boundary |
| Profiles | Cloud profiles | Import your BU Cloud profiles (cookies and localStorage) with one command |
| Live view | Replay | Real-time VNC of the actual browser, a step feed with the model's reasoning, and an IDE-style code tab that streams the agent's sandbox scripts live as they're written |
| API | v3 REST | The same v3 REST surface: point `browser-use-sdk` at your box and change nothing but `baseUrl` and `apiKey` |
<sub>[The full dimension-by-dimension comparison](https://openbrowse.co/vs/browser-use-cloud).</sub>
### ⚡ See it in action
Here's a snippet of our benchmark run, with `claude-opus-5` taking agentic actions across parallel tabs while its code streams into a live IDE.
<https://github.com/user-attachments/assets/c1330d77-67b6-4a7d-bd43-7cdfa230b9d1>
## Model providers
### Recommended models
1. **For most use cases**, `gpt-5.6-terra { "reasoningEffort": "none" }`, `gpt-5.6-sol { "reasoningEffort": "none" }` and `claude-sonnet-5 { "reasoningEffort": "high" }` all strike a great balance of reliability, accuracy, and cost.
2. **For intense workflows**, use `claude-opus-5 { "reasoningEffort": "medium" }` or `gpt-5.6-sol { "reasoningEffort": "none" }` — both are great options, but watch out for token burn.
3. **On a budget?** Use `gpt-5.6-luna { "reasoningEffort": "max" }` with a tightly focused prompt. It might take a while, and it's more prone to hallucinations (especially with broad prompts), but the actual extractions are still great quality.
### Comparisons
The same real-world extraction task (a careers page with 14 records behind an embedded, cross-origin board, full schema output) run against BU Cloud and against OpenBrowse on a Raspberry Pi 5 (16GB) without concurrency, ordered cheapest to most expensive:
| Runtime | Model | Reasoning | Steps | Time | Tokens | LLM cost | Records |
| --- | --- | --- | --- | ---: | ---: | ---: | --- |
| OpenBrowse | **gpt-5.6-luna** | **max** | 36 | 17m 03s | 1.08M | **$0.22** | 14/14 |
| OpenBrowse | **gpt-5.6-terra** | **none** | 11 | **1m 47s** | **202k** | **$0.24** | 14/14 |
| OpenBrowse | **gpt-5.6-sol** | **none** | **8** | **2m 03s** | **136k** | **$0.33** | 14/14 |
| OpenBrowse | **claude-sonnet-5** | **high** | 10 | 4m 02s | **242k** | **$0.40** | 14/14 |
| OpenBrowse | **claude-sonnet-5** | **none** | **9** | 5m 18s | **237k** | **$0.51** | 14/14 |
| OpenBrowse | **gpt-5.6-terra** | **high** | 17 | 5m 05s | **434k** | **$0.66** | 14/14 |
| BU Cloud | claude-sonnet-5 | high | 10 | 2m 36s | 859k | $0.78 | 14/14<sup>1</sup> |
| OpenBrowse | gpt-5.6-sol | medium | 16 | 5m 24s | **339k** | $0.90 | 14/14 |
| OpenBrowse | claude-opus-5 | medium | 15 | 3m 56s | **398k** | $1.32 | 14/14 |
| OpenBrowse | claude-opus-5 | none | 17 | 4m 53s | **480k** | $1.62 | 14/14 |
<sub><i><sup>1</sup> Extracted successfully, though some returned fields (e.g. job seniority) were hallucinated when not shown on the page.</i></sub>
OpenAI and Anthropic models are generally at their best at the opposite ends of the reasoning dial. For example, OpenAI's GPT-5.6-Terra performs better with less reasoning, spending less time planning ahead and more time reacting to the page in front of it, while Anthropic's 5-series Claude models lean towards rabbit holes and need reasoning time to refocus on the goal.
### Common questions
<details>
<summary>What's the difference between "thinking" and "reasoning"?</summary>
> OpenBrowse separates two kinds of reasoning. **Browser thinking** is our way of describing how the platform works in "steps" (the 👁️ see / 🛝 plan / ➡️ next / 💭 thinking cards in the live feed), so it can't be disabled.
>
>**Model reasoning** is different: it's the Chain-of-Thought reasoning provided by LLM providers (e.g. Anthropic's extended thinking, OpenAI's reasoning effort), and can be controlled per session by changing `reasoningEffort` in the API. Values are validated per model at runtime.
</details>
<details>
<summary>See all supported models</summary>
> - OpenAI: `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`
> - Anthropic: `claude-mythos-5`, `claude-fable-5`, `claude-opus-5`, `claude-sonnet-5`, `claude-opus-4.8`, `claude-opus-4.8[1m]`, `claude-opus-4.7`, `claude-opus-4.7[1m]`, `claude-opus-4.6`, `claude-opus-4.6[1m]`, `claude-sonnet-4.6`, `claude-sonnet-4.6[1m]`
> - Google: ⚠️ Coming soon
</details>
## Quick start
Install OpenBrowse with your favorite package manager:
```bash
# uv
uv tool install openbrowse
openbrowse start
# pipx
pipx install openbrowse
openbrowse start
# venv
source <path-to-venv>/bin/activate
pip install openbrowse
openbrowse start
```
To install from source, clone the repo and use uv directly:
```bash
git clone git@github.com:lujstn/openbrowse.git
cd openbrowse
uv sync
uv run openbrowse serve
```
Then, open `http://localhost:8420` in a browser. You'll be guided through everything you need to run OpenBrowse. [View the installation guide](https://openbrowse.co/docs/installation) for more details.
## Exposing it to the web
OpenBrowse runs on plain Python + Chromium and can be easily port forwarded. To reach it from outside that box without opening ports, put it behind [Tailscale](https://tailscale.com/):
```bash
# private access from your own devices
tailscale up
# or expose the API publicly over TLS with Tailscale Funnel
sudo tailscale funnel --bg 8420
```
## Features
- **v3-compatible REST API**: sessions, structured output schemas, cost caps, live URLs.
- **Visual, tab-based browsing**: parallel foreground tab waves for bulk reads; a code tab shows when the agent runs a script; everything visible over VNC.
- **Schema answer store**: every write validated live against your JSON Schema, coverage tracked per field, a completeness gate before `done`, and mark-absent semantics for data a site genuinely does not publish.
- **Grounding guards**: shell-read detection with automatic in-frame retry, evidence-checked enum writes, URL fields validated as absolute http(s) links at the store boundary, honest failure over invented data.
- **Browser-like profiles**: sessions share a profile's logins the way a browser does. Each site's data goes into the browser's own storage before the first page loads, so a page only sees its own site's data; each session merges back only what it changed, even when several share one profile; and the least recently used sites are evicted within fixed limits, so profiles never grow without bound. A site-data page in the dashboard lists and deletes them per site.
- **Profile import**: bring BU Cloud profiles (cookies + localStorage) via CLI or the dashboard.
- **Dashboard**: live session feed with model reasoning, per-step costs, JSON export (full / steps / output-only), profile management.
- **CAPTCHA solving**: optional CapSolver integration.
- **Multi-provider**: Anthropic and OpenAI models behind one API, with per-provider repair layers for each family's failure modes.
## Citation
This project is licensed under the MIT License. If you use OpenBrowse as part of your research or project, please cite:
```bibtex
@software{openbrowse2026,
author = {Johnston Kurilov, Lucas},
title = {{OpenBrowse}: Self-hosted AI browser agents},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.21986248},
url = {https://github.com/lujstn/openbrowse}
}
```
[](https://doi.org/10.5281/zenodo.21986248)
<br><br>
<table align="center">
<tr>
<th colspan="2">built with <з by @lujstn</th>
</tr>
<tr>
<td><img src=".github/assets/IMG_8874.jpg" alt="@lujstn" width="400"></td>
<td valign="middle">
<a href="https://x.com/intent/user?screen_name=lujstn"><img src="https://img.shields.io/twitter/follow/lujstn?style=social" alt="Twitter"></a>
<br>
<a href="https://www.instagram.com/lujstn/"><img src="https://img.shields.io/badge/Instagram-Follow-E4405F?style=social&logo=instagram" alt="Instagram"></a>
<br>
<a href="https://www.tiktok.com/@lujstn"><img src="https://img.shields.io/badge/TikTok-000000?style=flat&logo=tiktok&logoColor=white" alt="TikTok"></a>
<br>
<a href="https://lujstn.com"><img src="https://img.shields.io/badge/%F0%9F%94%97_lujstn.com-1a1a1a" alt="lujstn.com"></a>
</td>
</tr>
</table>