๐ OxiBrowser
The headless browser built in pure Rust for AI agents.
Not a Chromium fork. Not a C++ wrapper. A browser engine written from scratch in Rust, designed from day one for automation, web scraping, and AI-driven workflows.
Report Bug ยท Request Feature ยท Read the Docs ยท Discord
โจ Why OxiBrowser?
You're building AI agents that need to browse the web. You don't need a full browser with GPU rendering, audio output, and extension support. You need something fast, small, and programmable.
OxiBrowser is built for exactly that use case:
- ๐ค AI-Agent First โ CLI designed for agents:
--jsonoutput,describefor schema,skillfor prompts,sessionfor multi-step - โก Blazing Fast โ Cold starts in ~50ms, no Chromium overhead, no Node.js required
- ๐ฆ Rust-First โ
boa_engine(JS, no V8),html5ever(HTML) are pure Rust. TLS usesbtls(BoringSSL C binding) for stealth fingerprint emulation. Single static binary. - ๐ CDP Compatible โ Puppeteer, Playwright, and any Chrome DevTools Protocol client works out of the box
- ๐ก๏ธ Secure by Default โ SSRF protection with CIDR blocking,
robots.txtrespect, no sandbox escape surface - ๐ฆ Tiny Footprint โ ~44 MB binary, ~8 MB base memory. Run 100 instances without breaking a sweat
๐ Changelog
See CHANGELOG.md for the full version history and GitHub Releases for release notes.
Recent milestones (v0.17โv0.20): per-frame JS execution contexts (iframe isolation), Shadow DOM (open/closed/declarative/slots), async fetch/XMLHttpRequest/WebSocket, CORS + preflight, cookie PSL/prefixes, multi-tab, PDF export, @font-face webfonts, Blitz/Stylo/Taffy/Parley rendering pipeline, stealth bot-detection, Canvas 2D, custom-element lifecycle, and a 12-domain CDP server.
๐ Quick Start
Install
Fetch a page (human-readable)
# Example Domain
)
Fetch a page (agent mode)
}}}
Extract structured data
}}
Multi-step session (stdin/stdout JSON REPL)
}}
}}
}}
}}
}}
Start CDP server (Puppeteer/Playwright)
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.;
const page = await browser.;
await page.;
console.log;
await browser.;
๐ CLI Reference
oxibrowser <COMMAND>
COMMANDS:
fetch Fetch a URL and return content (markdown default)
extract Extract structured data (links, text, elements)
run Run a YAML automation script
session Interactive stdin/stdout JSON REPL (22 commands)
serve Start CDP WebSocket server
search Web / GitHub / GitHub-issues search (no browser needed)
describe Print CLI schema as JSON (for agents)
skill Print agent skill guide
version Print version information
fetch โ One-shot page fetch
# Human-readable (markdown, default)
# Agent mode
# Click then read
# Quick page summary
# Run JS
# Limit response size
# Select specific fields
extract โ Structured data extraction
# Get all links
# Extract elements by CSS selector
# Title + full text
session โ Multi-step automation
# 22 commands:
describe โ Agent introspection
# Compact (~200 tokens)
# Full command details
search โ Web / GitHub search (no browser needed)
# Web search (DuckDuckGo)
# GitHub search
# GitHub issues for a specific repo
run โ YAML automation
name: example
steps:
- step_type: goto
data:
goto: https://example.com
- step_type: content
data:
format: markdown
JSON Output Format
All --json responses follow the same schema:
On error:
Exit codes: 0=success, 1=runtime, 2=input validation, 3=timeout, 4=network
๐ Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Puppeteer / Playwright / Rust CDP โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CDP WebSocket
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CDP Server (12 domains) โ
โ Browser ยท DOM ยท Emulation ยท Fetch ยท Input โ
โ Log ยท Network ยท OXI ยท Page ยท Runtime โ
โ Target ยท Tracing โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Browser โ Session โ Page โ Frame โ
โโโโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโค
โ WebAPI โ Network โ JS Runtime โ Rendering โ
โ DOM โ HTTP โ boa_engine โ Blitz+Stylo โ
โ Tree โ Cookies โ ES2024+ โ Taffy+Parley โ
โ Storage โ SSRF โ per-frame โ PNG/PDF/font โ
โโโโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโค
โ html5ever ยท encoding_rs ยท reqwest ยท boa ยท blitz-dom โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Crate Structure
| Crate | Lines | Purpose |
|---|---|---|
oxibrowser |
6,103 | Binary + CLI (8 subcommands, session REPL, agent features) |
oxibrowser-core |
35,287 | Browser engine: Session, Page, Frame, JS Runtime, Network |
oxibrowser-cdp |
5,643 | CDP WebSocket server with 12 domain handlers |
oxibrowser-render |
513 | Blitz/Stylo/Taffy/Parley rendering pipeline (PNG/PDF/fonts) |
| Total | ~47,500 |
๐ Features
Agent-First CLI
Designed for AI agent workflows โ no daemon, no socket, single binary:
| Feature | Description |
|---|---|
--json |
Machine-readable output (opt-in, human by default) |
--max-bytes N |
Truncate response to N bytes |
--fields a,b,c |
Select specific output fields |
--summary |
Quick page metadata (title, links, headings) |
describe |
CLI schema as JSON for agent introspection |
skill |
Agent skill guide for prompt injection |
session |
Stdin/stdout JSON REPL with 22 commands |
| Exit codes | 0=success, 1=runtime, 2=input, 3=timeout, 4=network |
JavaScript Runtime (ES2024+)
Powered by boa_engine โ pure Rust, no V8 dependency:
| Web API | Status |
|---|---|
document.querySelector / querySelectorAll |
โ Full |
document.createElement / createTextNode |
โ Full |
element.appendChild / removeChild / insertBefore |
โ Full |
element.getAttribute / setAttribute / removeAttribute |
โ Full |
element.cloneNode / remove() |
โ Full |
element.style (CSSStyleDeclaration) |
โ Property accessor |
element.classList (DOMTokenList) |
โ Property accessor |
element.textContent / innerHTML |
โ Read/Write |
element.addEventListener / dispatchEvent |
โ Full |
element.click() |
โ With event handlers |
fetch() |
โ Full (channel bridge) |
XMLHttpRequest |
โ Full with callbacks |
localStorage |
โ Persistent |
MutationObserver |
โ observe/disconnect/takeRecords |
setTimeout / setInterval |
โ TokioJobQueue |
console.log/warn/error |
โ With formatting |
URL / URLSearchParams |
โ Full |
crypto.getRandomValues |
โ Pseudo-random |
TextEncoder / TextDecoder |
โ UTF-8 |
atob / btoa |
โ Base64 |
requestAnimationFrame |
โ Polyfill |
CDP Protocol (Chrome DevTools Protocol)
12 domain handlers โ Puppeteer and Playwright compatible:
| Domain | Key Methods |
|---|---|
| Browser | getVersion, close |
| DOM | getDocument, describeNode, querySelector, querySelectorAll, getBoxModel, getContentQuads |
| Emulation | setDeviceMetricsOverride, clearDeviceMetricsOverride, setUserAgentOverride |
| Fetch | enable/disable, continueRequest, failRequest, fulfillRequest, getResponseBody |
| Input | dispatchKeyEvent, dispatchMouseEvent, dispatchDragEvent, insertText |
| Log | enable, entryAdded |
| Network | enable/disable, setExtraHTTPHeaders, getResponseBody, JS-fetch/XHR/WS lifecycle events |
| OXI ๐ค | getMarkdown, getPageInfo โ AI-native extensions |
| Page | navigate, captureScreenshot, printToPDF, getFrameTree, getTitle |
| Runtime | evaluate, callFunctionOn, enable, consoleAPICalled, exceptionThrown |
| Target | getTargets, createTarget, attachToTarget, setAutoAttach (multi-tab) |
| Tracing | start, end, getCategories (Playwright tracing compatible) |
OXI Domain โ Built for AI Agents
= await
await
await
# Clean markdown โ perfect for LLM ingestion
await
=
Network Layer
| HTTP Client | reqwest with cookie persistence, redirect following |
| Cookie Jar | Domain-scoped cookies: PSL, __Host-/__Secure- prefixes, expiry, CHIPS partitioning |
| CORS | Preflight (OPTIONS), Access-Control-* validation (Fetch ยง3.2โ3.3) |
| Auth | Basic + Digest (401-challenge retry) |
| Proxy | HTTP / HTTPS / SOCKS proxy via BrowserConfig.proxy |
| SSRF Protection | CIDR blocking for private network ranges, scheme-aware |
| robots.txt | RFC 9309 compliant parser, --obey-robots flag |
| Network Interception | Pause, modify, or block any request via Fetch domain |
| WebSocket | Full browser WebSocket API (ws + wss) |
| Stealth | Chrome JA4+ fingerprint emulation, bot-detection challenge retry |
Rendering Pipeline
Powered by the Blitz rendering stack โ isolated in oxibrowser-render so Stylo/html5ever dependency trees stay out of the core workspace:
- Blitz-dom โ DOM tree representation for layout and paint
- Stylo (Firefox CSS engine) โ CSS cascade, computed styles
- Taffy โ block/inline/flex layout
- Parley โ text shaping with
@font-facewebfont support - PNG screenshots โ shadow-DOM-aware rasterization (flattened tree compose)
- PDF export โ
Page.printToPDF/Tab::print_to_pdfviaprintpdf - HTML โ Markdown โ full conversion with heading, link, and list support
๐งช Testing
# Run all tests
# CLI integration tests (fast, no network)
# E2E CDP tests
# Integration tests (real websites, requires internet)
๐ง Advanced Usage
Rust API
use Browser;
use BrowserConfig;
async
Use as a library
[]
= "0.11"
# Or the CDP server:
= "0.11"
Request Interception
const client = await page..;
await client.;
client.;
๐ค Contributing
See CONTRIBUTING.md for full guidelines.
๐ License
OxiBrowser is licensed under the MIT License.
๐ Acknowledgments
- boa_engine โ Pure Rust JavaScript engine (ES2024+)
- html5ever โ HTML parser from the Servo project
- reqwest โ Ergonomic HTTP client for Rust
- tokio โ Async runtime powering the entire networking stack
Made with ๐ฆ in Rust