Why acrawl?
Most browser agents stop at navigate and click. acrawl goes further: the agent can also inspect network requests, analyze console errors, measure page performance, audit accessibility, and intercept network calls — the full DevTools surface, available as first-class agent tools.
It ships as a single Rust binary. No Python runtime, no Node runtime, no Docker. Drop it into any server or CI pipeline and describe a goal; the agent figures out what to visit, what to click, what to inspect, and when it's done.
- One binary, zero runtimes.
cargo build --releaseproduces a self-contained executable. No Python, no Node runtime — just Rust and a Chromium download for browser automation. - Acts and observes. The agent has the full DevTools surface as first-class tools: inspect network requests with timing, analyze and deduplicate console logs, stream WebSocket messages, measure page performance (TTFB, resource breakdown), audit cookies and browser storage, measure JS/CSS coverage, run axe-core WCAG accessibility audits, and intercept or mock network calls. No other agent framework exposes this.
- Deterministic where you can, AI where you must. Define loops, conditionals, and parallel branches as JSON scripts — executed without any LLM calls. Fall back to the agent when pages behave unexpectedly. Best of both worlds.
- No code required. Describe the goal in plain English. The agent plans, navigates, and extracts.
- Smart fetching. Static pages are served over HTTP (fast). When JavaScript or interaction is needed, acrawl detects JS framework markers (
__next_data__,__nuxt,__vue,ng-app, React roots), auth redirects, and short<noscript>bodies — then transparently escalates to a headless browser. - Sub-agent parallelism. Fork child agents onto separate browser tabs with independent state and step budgets. A URL-claiming registry prevents siblings from crawling the same page twice.
- MCP client and server. Extend the agent with custom tools via Model Context Protocol servers. Or flip it:
acrawl mcpexposes 38 browser and DevTools tools plusrun_goalto Claude Code, Cursor, VS Code, Zed, and 13 other clients. - 25 LLM providers. Anthropic, OpenAI, Google Gemini, DeepSeek, AWS Bedrock, Azure OpenAI, Vertex AI, GitHub Copilot, Groq, Mistral, xAI, Cohere, Alibaba DashScope, OpenRouter, and more. Or bring your own via any OpenAI-compatible endpoint.
How does it compare?
vs. AI web agents and scraping tools
Notes:
- browser-use (85k+ GitHub stars): Python + Playwright, DOM + screenshots, supports GPT/Claude/Gemini/Ollama via LiteLLM, 89.1% WebVoyager. No single binary — requires Python and
pip install. Every action calls an LLM: 2-5s/step, ~$0.02-0.30/task. Cloud tier adds stealth; self-hosted is bare Playwright. - Stagehand (Browserbase, 21k+ stars): TypeScript + CDP (v3), mixes deterministic Playwright with AI primitives (
act(),extract(),observe()). Action caching reuses successful clicks without re-calling the LLM. Requires Node and, for production, Browserbase cloud hosting. - Skyvern (21k+ stars, Apache 2.0): vision-first (screenshot-only, no DOM), handles legacy portals and government forms that DOM tools struggle with. No-code cloud UI available. Each step costs vision-model tokens — ~$0.10-0.50/task. 85.85% WebVoyager.
- Firecrawl (82k+ stars): managed scraping API. Returns LLM-ready Markdown, JSON extraction, site-wide crawl. Not an agentic tool — minimal multi-step interaction. Ships an official MCP server. Per-page pricing from $19/month.
- Playwright MCP (Microsoft, 29k+ stars): MCP server that exposes browser control via the accessibility tree. Sub-100ms actions, zero vision tokens. Drives an LLM client's browser rather than having its own reasoning — no autonomous goal navigation. Used in GitHub Copilot Agent.
vs. native LLM provider browsing
Most AI providers offer some form of browsing, but it is designed for conversational information retrieval, not programmatic web automation. Key constraints:
Notes:
- ChatGPT Agent (OpenAI, July 2025): runs in a sandboxed cloud virtual machine with its own Chromium instance. Can browse, click, and fill forms but pauses for user confirmation on sensitive actions (purchases, logins). Uses two modes: a fast text browser for research queries and a visual browser for interaction. Cannot run code in the browser, install extensions, or access your local file system. Susceptible to prompt injection. Available to Plus/Pro/Business subscribers.
- ChatGPT Atlas (OpenAI, October 2025): a full Chromium browser with ChatGPT integrated as a sidebar + agent. Agent mode drives the same sandboxed cloud VM as ChatGPT Agent; core limitations are identical.
- Claude Computer Use (Anthropic API, beta since October 2024): screenshot + mouse/keyboard API for any desktop application, not just browsers. Vision-only — no DOM access. Developers must provide and manage the entire computing environment (typically a Docker container with Xvfb + Firefox). Not a ready-to-use binary. Requires significant infrastructure to operate in production.
- Claude in Chrome (Anthropic Chrome extension, beta November 2025+): lets Claude operate within your existing Chrome session using your real cookies and logins. Available to Max plan subscribers. Not an open API — no programmatic control. Good for interactive personal tasks; not suitable for batch automation.
- Gemini / Deep Research (Google): browsing is grounded via Google Search API calls, not a live browser session. Deep Research synthesizes across many searches but cannot interact with pages (click, fill forms, navigate dynamically). Project Mariner (experimental computer use) is a separate, limited research preview.
- Copilot / Edge (Microsoft): Edge's Copilot Mode uses Bing retrieval with some ability to navigate pages. Real-world tests show high latency (6+ minutes for multi-page comparison tasks) and frequent interruptions for user confirmation. Not a developer API.
Quick Start
Install
Linux / macOS (x64 / ARM64):
curl -fsSL https://raw.githubusercontent.com/Mingye-Lu/AgenticCrawler/main/install.sh | bash
Windows (x64, PowerShell):
irm https://raw.githubusercontent.com/Mingye-Lu/AgenticCrawler/main/install.ps1 | iex
This downloads the latest binary, verifies its SHA256 checksum, and sets up CloakBrowser for stealth browser automation. Requires Node.js 20+ for browser features.
acrawl checks for updates on startup and shows a notification when a new version is available.
git clone https://github.com/Mingye-Lu/AgenticCrawler.git
cd AgenticCrawler
cargo build --release
# Install CloakBrowser (required for browser automation — binary auto-downloads on first use)
npm install
Browser Extension (optional)
The acrawl Bridge extension lets acrawl control your real browser (with your sessions, cookies, and existing extensions) instead of a headless CloakBrowser instance.
- Install acrawl Bridge from the Chrome Web Store and click Add to Chrome. The same listing works in Edge, Brave, Arc, Vivaldi, and Opera.
- Run
/extensionin the acrawl REPL to start the bridge and show a pairing code, then type the code into the extension popup. This is a one-time step.
To install without the store (for example, to run an unreleased build), see extension/README.md. It has the full setup details.
Agent Skill (optional)
If you drive acrawl from a coding agent (via acrawl mcp), install the acrawl-mcp skill so the agent knows when to use direct tools, scripts, or run_goal, and how to debug with the network/console/cookie tools:
npx skills add Mingye-Lu/AgenticCrawler
This uses the community skills CLI, which detects your installed agents (Claude Code, Cursor, Codex, Gemini CLI, OpenCode, and many more) and copies the skill into each one's skills directory. Add -g for a global (user-level) install, or -a claude-code to target a single agent.
Prefer to skip Node? acrawl mcp install --client claude-code --skill configures the MCP server and installs the same skill in one step (see Quick install).
Configure
# Set up your LLM provider (interactive prompt)
./target/release/acrawl auth anthropic # or: openai, other
Credentials are stored in ~/.acrawl/credentials.json. Override the config directory with ACRAWL_CONFIG_HOME.
Run
# Interactive REPL
./target/release/acrawl
# One-shot mode
./target/release/acrawl prompt "scrape all book titles and prices from books.toscrape.com"
# Resume a saved session
./target/release/acrawl --resume session.json /status /compact
Examples
Scrape a product catalog:
acrawl > scrape all book titles, prices, and ratings from books.toscrape.com
The agent navigates to the site, reads the page, extracts the data, paginates through all 50 pages, and returns structured JSON.
Fill and submit a form:
acrawl > go to example.com/contact, fill in name "Jane Doe", email "[email protected]",
message "Hello", and submit the form
The agent locates form fields, fills them in, clicks submit, and confirms the result.
Monitor a price:
acrawl > check the current price of "Rust in Action" on books.toscrape.com
Single-page extraction — the agent fetches, reads, and returns the price without unnecessary navigation.
Extract from JS-rendered pages:
acrawl > get all repository names and star counts from github.com/trending
Static HTTP won't work here. acrawl detects React/Next.js markers and automatically escalates to a headless browser to render the JavaScript.
Parallel multi-page crawl:
acrawl > scrape the title, author, and price of every book across all 50 pages on books.toscrape.com.
Fork a sub-agent for each page to speed this up.
The agent spawns up to 5 concurrent sub-agents, each on its own browser tab, to crawl pages in parallel. Results are merged when all sub-agents finish.
Features
43-Tool Toolbox
Navigation
Content Formats
The navigate tool's format parameter controls how the page is returned:
fit_markdown works in two passes:
-
Hard-block removal, elements whose
classoridattribute contains any of these strings are removed immediately:nav,footer,header,sidebar,ads,comment,promo,advert,social,share. -
Score-based pruning, remaining elements are scored; anything below 0.48 is removed. The score is:
0.4 × text_density + 0.2 × (1 − link_density) + 0.2 × tag_weight + 0.1 × class_id_score + 0.1 × ln(text_length + 1)Tag weights:
article= 1.5 ·h1= 1.2 ·h2= 1.1 ·h3/p/section= 1.0 ·h4= 0.9 ·h5/table= 0.8 ·h6= 0.7 ·span= 0.3 ·div/li/ul/ol= 0.5.
Use markdown instead of fit_markdown when: the page has important content inside elements named sidebar, nav, or similar, for example, metadata panels, related-article links, or author info stored in a sidebar div.
If fit_markdown prunes all content (empty result), the tool automatically falls back to plain text.
Interaction
Content Extraction
DevTools & Observation
Agent Control
Script Management
page_state Reference
Interaction tools (click, click_at, fill_form, hover, press_key, go_back, scroll, switch_tab, select_option, set_device, refresh) all return a page_state object. There are two variants:
Full page_state, returned after the first interaction on a URL, or when changes are too extensive to diff:
url: https://example.com/page
title: Page Title
page_map: |
- main "" [ref=e1]:
- navigation "Primary" [ref=e2]:
- link "Docs" [ref=e3]:
/url: https://example.com/docs
- heading "Platform" [level=1] [ref=e4]:
- button "Get Started" [ref=e5]:
- iframe "Demo" [ref=e6]:
- button "Play" [ref=e7]:
Diff page_state, returned on subsequent interactions on the same URL, showing only what changed:
url: https://example.com/page
title: Page Title
changed: true
changes: |
+ [ref=e5] added:
- dialog "Confirm" [ref=e5]:
- button "OK" [ref=e6]:
- button "Cancel" [ref=e7]:
- [ref=e3] removed:
- button "Old Button" [ref=e3]:
~ button "Submit" [ref=e2]: [] → [disabled]
If nothing changed, { "url": "...", "title": "...", "changed": false } is returned. On bridge failure, { "url": "unknown", "title": "unknown", "page_map": null }. Post-action page_state returns YAML tree-diffs showing only what changed. If changes are extensive, a full YAML snapshot is returned instead.
Sub-Agent Parallelism
The agent can fork child agents to crawl multiple pages concurrently. Each child gets its own browser tab, step budget, and independent state.
URL Claiming
Before a child agent is spawned, its scope is registered in a shared claim registry. This prevents two sibling agents from crawling the same URL simultaneously.
Rules:
- First-claimer-wins, if a second agent tries to claim a URL already claimed by a sibling, the fork fails immediately with a conflict message naming the owner agent. The parent LLM sees this conflict and can adjust scope.
- Three scope types:
SinglePage(exact URL),UrlList(all-or-nothing batch),UrlPattern(regex, checked for overlap with all existing claims). - RAII lifetime, a claim is held for the life of the child. When the child finishes, is cancelled, or its parent aborts setup, the claim is released automatically and the URL becomes available again.
- Cross-type checking, an exact URL conflicts with any already-claimed regex that matches it, and a new regex conflicts with any already-claimed exact URL it would match.
- Intra-list deduplication, if the same URL appears twice in a
UrlList, it is silently deduplicated (the LLM sometimes produces duplicates).
Claiming is automatic, it happens inside fork before the child starts, not inside navigate. The agent does not call it explicitly.
Smart Fetch Routing
Every navigate call goes through a two-tier fetch router:
- HTTP first — fast reqwest-based fetch (30s timeout, follows up to 10 redirects).
- Auto-escalation — if any of the following are detected, the request is transparently replayed in a headless browser:
- HTTP 403, 429, or 503 responses
- JS framework markers:
__next_data__,__nuxt,__vue,ng-app,_react,data-reactroot - Auth redirects: URLs containing
/login,/signin,/auth,/oauth,accounts.google.com - Short response body (< 500 chars) with a
<noscript>tag - Empty SPA shell detection (multi-signal scoring): framework asset paths without embedded data (
/_next/static/,/_nuxt/,ng-version=), empty mount-point divs, noscript "enable JavaScript" messages, bundler hash patterns, and structural signals (sparse visible text with no semantic elements). Pages with embedded data blobs (__NEXT_DATA__,window.__NUXT__,data-reactroot) are explicitly excluded — their content is already server-rendered.
When --no-headless / --headed is set, all fetches go directly through the browser.
25 LLM Providers
Custom / Local Providers
To use any OpenAI-compatible endpoint (Ollama, LMStudio, vLLM, a local proxy, etc.):
acrawl auth other
You'll be prompted for a base URL and an optional API key. Examples:
This creates a credentials.json entry with auth_method: "api_key" and your base_url. Leave the API key blank if your server doesn't require one.
Models use the provider/model-id format: anthropic/claude-sonnet-4-6, openai/gpt-4o, amazon-bedrock/anthropic.claude-sonnet-4-6-20250514-v1:0, etc.
Providers With Non-Standard Auth
GitHub Copilot, device code flow:
acrawl auth copilot
- acrawl prints a URL (
https://github.com/login/device) and an 8-character user code, and attempts to open your browser automatically. - Paste the code at the GitHub page and authorize the app.
- acrawl polls GitHub until authorization completes, then exchanges the GitHub token for a short-lived Copilot API token, which is stored in
credentials.json.
No API key is needed, the entire flow is interactive. If authorization succeeds, credentials are stored automatically.
GitLab Duo, API key:
acrawl auth gitlab
Prompts for a GitLab Personal Access Token (PAT). Paste your token and press Enter. No browser redirect required. Note: GitLab Duo does not support tool calling.
Amazon Bedrock, AWS credentials:
acrawl auth amazon-bedrock
Prompts for AWS Access Key ID, AWS Secret Access Key, and region (default: us-east-1). These are stored directly in credentials.json and used to sign requests with AWS SigV4.
Azure OpenAI:
acrawl auth azure
Prompts for Resource Name (e.g. myresource), Deployment Name (e.g. gpt-4o), and API key.
Interactive TUI
The default interface is a full terminal UI with:
- Markdown rendering with syntax highlighting and streaming output
- Slash command overlay — type
/to see all commands with Tab completion - Model picker —
/modelopens a searchable list grouped by provider category - Auth modal —
/authwalks through provider setup interactively - Session header — shows current model, session ID, cost, and context usage in real time
- Debug mode —
/debugtoggles raw tool call input/output in the transcript - Reasoning effort —
Ctrl+Tcycles through high/medium/low for reasoning models (o3, o4-mini)
Keybindings:
Running acrawl without a TTY on stdout (e.g. piped or redirected) exits with an error pointing at acrawl prompt for one-shot use and acrawl --resume for session maintenance.
Session Management
- Auto-save — sessions are saved automatically on exit.
- Resume —
--resume session.jsonreloads a conversation. Resume-safe slash commands (/status,/compact,/cost,/config,/version,/export,/help,/clear) can be appended to the command line. - Export —
/export [file]writes a human-readable markdown transcript. - Auto-compaction, when cumulative input tokens exceed the threshold (default 200K), acrawl compacts the session:
- Preserved verbatim: the most recent ~80K tokens of messages (always at least 2 messages), with tool call pairs kept intact, no
ToolResultis ever left without its matchingToolUse. - Preserved as metadata: message counts, deduplicated tool list, last 3 user requests (160 chars each), pending work items (inferred from messages containing "todo", "next", "pending", "follow up", "remaining"), up to 10 key URLs, and the most recent non-empty message as "current work".
- Tool output pruning: tool outputs older than the innermost 40K-token window are truncated to 2,000 chars with a
[… output truncated from N chars]marker before the preserved window is calculated. - Summary generation: template-based by default (no LLM call). Opt in to LLM summarization via
compaction_llm_summarization: trueinsettings.json, this sends the removed messages to the model and uses its output as the summary, with a fallback to the template if the LLM fails. - Continuation prompt: the compacted session prepends a system message instructing the agent to resume directly without recapping or asking questions.
- Browser state is unaffected, compaction only modifies message history; the current browser tab, URL, cookies, and page state are unchanged.
- Preserved verbatim: the most recent ~80K tokens of messages (always at least 2 messages), with tool call pairs kept intact, no
- Multiple sessions —
/session listto browse,/session switch <id>to switch.
Tool Allowlist
Use --allowedTools to restrict which tools the agent can invoke (comma-separated, flag is repeatable):
acrawl prompt "scrape titles" --allowedTools navigate,read_content,screenshot
Omit --allowedTools to allow all 43 tools. Useful for locking down a crawl to read-only tools or excluding fork/wait_for_subagents when sub-agent parallelism is not desired.
MCP Extensibility
acrawl supports Model Context Protocol servers as a client, allowing you to extend the agent with custom tools. MCP tools are namespaced as server_name__tool_name and available alongside the built-in 43.
Supported transports: stdio, SSE, HTTP, WebSocket.
MCP Server (expose acrawl as a tool)
acrawl mcp starts a built-in MCP server that exposes acrawl's browser automation capabilities to external agents like Claude Code, Cursor, VS Code, Zed, JetBrains, TRAE, Gemini CLI, or any MCP-compatible client.
The server provides 40 tools in three modes:
Direct browser tools (32) — fine-grained control for clients that orchestrate themselves:
navigate, click, click_at, fill_form, page_map, read_content, screenshot, go_back, get_page_info, scroll, wait, select_option, execute_js, hover, press_key, switch_tab, list_resources, save_file, set_device, refresh, list_network_activity, inspect_request, list_page_logs, inspect_log, list_websocket_activity, inspect_websocket, get_page_performance, inspect_cookies, inspect_storage, measure_coverage, audit_accessibility, intercept_network
Script tools (7) — deterministic multi-step automation without per-step LLM calls:
run_script, save_script, list_scripts, read_script, wait_for_scripts, script_status, cancel_script
Autonomous agent (1) — delegate a full crawl task:
run_goal— Execute a high-level crawl goal autonomously. The agent plans, navigates, and extracts data using its own LLM loop. Requires~/.acrawl/credentials.jsonconfigured with a model.
Transport: stdio only (no SSE / HTTP / WebSocket in this release).
Quick install
acrawl mcp install
Interactive installer that auto-detects your IDEs, lets you toggle which to configure (Space to select, Enter to confirm), and writes the correct config for each. Supports global (user-level) and project-level scopes.
Supported clients: Claude Code, Claude Desktop, Cursor, Windsurf, VS Code (Copilot), OpenCode, Zed, TRAE, JetBrains IDEs, Gemini CLI, Qwen Code, Codex CLI, Hermes, OpenClaw, Goose, Crush, Aider.
The installer also offers to install the bundled acrawl-mcp agent skill for clients that load skills (Claude Code, Cursor, OpenCode, Codex CLI, Gemini CLI). Non-interactively, pass --skill: acrawl mcp install --client claude-code --skill. acrawl mcp uninstall --client claude-code --skill removes it again.
Manual configuration
If you prefer to configure manually, add this to your IDE's MCP config file:
{
"mcpServers": {
"acrawl": {
"command": "acrawl",
"args": ["mcp"]
}
}
}
{
"servers": {
"acrawl": {
"command": "acrawl",
"args": ["mcp"]
}
}
}
{
"mcp": {
"acrawl": {
"type": "local",
"command": ["acrawl", "mcp"]
}
}
}
{
"context_servers": {
"acrawl": {
"command": {
"path": "acrawl",
"args": ["mcp"],
"env": {}
},
"settings": {}
}
}
}
Or via the Claude Code CLI directly:
claude mcp add acrawl -- acrawl mcp
The browser tools share a persistent session across calls. run_goal creates its own isolated agent and browser.
Requirements: The 38 browser and script tools work without any configuration. run_goal requires ~/.acrawl/credentials.json (via acrawl auth) for its internal LLM.
Using your real browser from MCP
The MCP server honours browser_backend, so MCP clients can drive your own logged-in browser instead of the bundled headless one:
acrawl config set browser_backend extension # route MCP browser tools through the extension
The bridge server starts on the first browser tool call and waits up to extension_bridge_connect_timeout_secs (default 3) for an already-paired extension to connect. If no extension has paired yet, the call returns the pairing code immediately. If it never connects, the tool call returns an actionable error rather than silently falling back to CloakBrowser — extension mode exists to reuse your authenticated session, so substituting a different browser would be misleading.
The Chrome extension serves one process at a time. If an acrawl REPL already owns the bridge, the MCP server reports the conflicting owner instead of competing for the port. Run acrawl config unset browser_backend to go back to CloakBrowser.
Usage
acrawl [OPTIONS] [COMMAND]
Commands:
prompt <text> Run a single goal non-interactively
mcp Start MCP server (stdio transport)
mcp install Install MCP config into your IDEs interactively
auth [provider] Configure provider credentials
system-prompt Print the system prompt (for debugging)
Options:
--model MODEL Model in provider/id format (e.g. anthropic/claude-sonnet-4-6)
--output-format FORMAT text | json
--resume FILE Resume a saved session (with optional /commands)
--compact Compact history on resume
--headless[=BOOL] Force browser headless on/off
--no-headless, --headed Launch browser in visible mode
--allowedTools TOOLS Restrict available tools (comma-separated, repeatable)
-p TEXT Shorthand for prompt mode
-V, --version Print version
Slash Commands
Non-interactive / Agent use
Configure once
acrawl auth anthropic --api-key sk-ant-... acrawl auth openai --api-key sk-... acrawl auth amazon-bedrock --access-key AKIA... --secret-key ... --region us-east-1 acrawl auth other --base-url http://localhost:11434/v1 # Ollama, no key acrawl config set model anthropic/claude-sonnet-4-6
Verify setup
acrawl auth status --check anthropic # exits 0 if configured, 3 if not acrawl auth status --json # full credential table (secrets masked)
Run
acrawl prompt "scrape all titles from example.com" --output-format json
Settings
acrawl config set headless false acrawl config set optimization.html_diff_mode true acrawl config get model --effective
MCP install
acrawl mcp install --client opencode --scope user acrawl mcp install --all --yes acrawl mcp install --client claude-code --skill # also install the agent skill
Configuration
All config lives in ~/.acrawl/ (override with ACRAWL_CONFIG_HOME).
credentials.json
Managed via acrawl auth. Stores per-provider:
Azure additionally requires resource_name and deployment_name. Bedrock requires aws_access_key_id, aws_secret_access_key, and region. Vertex requires gcp_project_id and gcp_region.
settings.json
Created with defaults on first run.
All fields are optional; omitting a field uses the default. The optimization block accepts a nested object with the following fields (all default to false/0/null, safe to omit entirely):
Environment Variables
Provider-specific env vars (see provider table above) are read as fallbacks when no credentials.json entry exists.
Performance Optimizations
acrawl ships 14 vendor-derived optimizations (sourced from browser-use, Stagehand, crawl4ai, Skyvern, Spider, nanobrowser, and ZeroClaw). All are disabled by default, enable selectively via settings.json.
Example settings.json with a cost-optimized profile:
{
"optimization": {
"html_diff_mode": true,
"action_caching": true,
"page_fingerprinting": true,
"loop_detection": true,
"self_healing": true,
"budget_max_session_cost_usd": 0.50,
"budget_enforcement": "warn"
}
}
Known Limitations
acrawl works well on most public web content, but some situations are outside what the agent can reliably handle:
How It Works
flowchart LR
Goal([Goal\nnatural language]) --> Plan
Plan --> Navigate --> Observe --> Act --> Extract
Extract -->|repeat until done| Plan
Extract --> Output([Output\nJSON / CSV])
- The agent receives a goal and builds a multi-step plan via a 7-section system prompt covering identity, operating procedure, data integrity, constraints, error recovery, completion protocol, and parallel exploration guidance.
- Each turn, it picks from its 43 tools based on what it observes on the page.
navigatehits the FetchRouter, which tries HTTP first and auto-escalates to a headless Chromium browser when JavaScript, auth redirects, or framework markers are detected.- The browser is driven by an embedded Node.js subprocess (the PlaywrightBridge) speaking newline-delimited JSON over stdio — uses CloakBrowser for stealth browsing, not stock Playwright. Alternatively, acrawl can drive the user's real browser via a Chrome extension (
/extensioncommand) using CDP over a local WebSocket bridge. - For multi-page tasks, the agent can
forkchild agents onto separate browser tabs, each with independent state and step budgets.wait_for_subagentscollects results;cancel_subagentaborts a running child;subagent_statuspolls without blocking. - When context grows large, auto-compaction summarizes older messages while preserving recent turns, tool usage, and pending work items.
- The agent stops when the goal is met and all sub-agents have finished, or when the step limit is reached.
Architecture
crates/
core/ Shared types, traits, error hierarchy (acrawl-core)
api/ 25 provider clients (Anthropic, OpenAI, Gemini, DeepSeek, Bedrock, Azure, ...), SSE streaming
browser/ PlaywrightBridge, ExtensionBridge, FetchRouter, BrowserContext, WsBridgeServer
agent/ 43 tools, agent loop, sub-agent fork/join, CrawlState
runtime/ ConversationRuntime, config, sessions, MCP client stack, OAuth PKCE
render/ Markdown rendering, tool output formatting, OutputSink
mcp-server/ Built-in MCP server (JSON-RPC over stdio), IDE installer
tui/ Ratatui terminal UI (acrawl-tui)
ui/ Shared application layer (LiveCli, session management, tool executor, auth)
cli/ Thin binary entry point (main.rs, self_update.rs, uninstall.rs)
commands/ 17 slash commands with resume-safety annotations
11 crates, ~40K lines of Rust, 1,097 tests.
Development
cargo build --release # build
cargo test --workspace # run all tests
cargo clippy --workspace --all-targets -- -D warnings # lint (pedantic)
cargo fmt --check # format check
See CONTRIBUTING.md for the full development guide.
Changelog
See CHANGELOG.md.
Security
See SECURITY.md for the security policy and how to report vulnerabilities.