vercel-labs/agent-browserPublic

Browser automation CLI for AI agents

AI summary: A headless browser environment specifically optimized for AI agents to navigate, scrape, and interact with the web.

Stars
43.5K
+79 today
Forks
2.9K
Watchers
109
Open issues
401
Open PRs
422
Contributors
~115
Commits
685
Branches
413

RustApache-2.0Created Jan 11, 2026Last push 1d agoLatest release v0.38.1+316 stars this week+1.6K this month

Quick answers

What is agent-browser?
A headless browser environment specifically optimized for AI agents to navigate, scrape, and interact with the web.
What does agent-browser do?
Agent Browser provides a specialized, headless web browsing environment tailored for AI agents rather than human users. It strips away unnecessary visual rendering overhead, focusing instead on exposing a clean, structured DOM representation that language models can easily parse and manipulate. The tool translates complex JavaScript interactions and dynamic content into standardized tool calls, allowing agents to reliably click, type, and scroll. It handles CAPTCHAs, authentication states, and dynamic loading autonomously, ensuring robust scraping and automated interaction. This enables developers to build web-fluent agents without fighting brittle traditional testing frameworks.
Who is agent-browser for?
AI developers and data engineers building agents that require robust, autonomous web interaction capabilities. It replaces brittle, traditional scraping tools with an intelligent, LLM-native browsing environment.
How do I get started with agent-browser?
npm install @vercel/agent-browser
How popular is agent-browser on GitHub?
vercel-labs/agent-browser has 43,477 stars and 2,931 forks on GitHub, and gained 316 stars in the last 7 days.
What license does agent-browser use?
vercel-labs/agent-browser is released under the Apache-2.0 license.

Star history

since Jul 29, 2026
020K40KJul 2026Aug 2026Sep 2026Oct 2026
43.5K stars as of Oct 3, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 20 commits2026-01-11: 36 commits2026-01-12: 14 commits2026-01-13: 9 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 5 commits2026-01-17: 4 commits2026-01-18: 15 commits2026-01-19: 1 commit2026-01-20: 0 commits2026-01-21: 2 commits2026-01-22: 13 commits2026-01-23: 20 commits2026-01-24: 0 commits2026-01-25: 6 commits2026-01-26: 16 commits2026-01-27: 8 commits2026-01-28: 0 commits2026-01-29: 3 commits2026-01-30: 0 commits2026-01-31: 3 commits2026-02-01: 0 commits2026-02-02: 13 commits2026-02-03: 3 commits2026-02-04: 2 commits2026-02-05: 3 commits2026-02-06: 1 commit2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 2 commits2026-02-10: 5 commits2026-02-11: 2 commits2026-02-12: 7 commits2026-02-13: 7 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 4 commits2026-02-17: 6 commits2026-02-18: 6 commits2026-02-19: 1 commit2026-02-20: 3 commits2026-02-21: 0 commits2026-02-22: 1 commit2026-02-23: 7 commits2026-02-24: 4 commits2026-02-25: 3 commits2026-02-26: 3 commits2026-02-27: 0 commits2026-02-28: 1 commit2026-03-01: 3 commits2026-03-02: 4 commits2026-03-03: 15 commits2026-03-04: 4 commits2026-03-05: 2 commits2026-03-06: 7 commits2026-03-07: 3 commits2026-03-08: 3 commits2026-03-09: 12 commits2026-03-10: 2 commits2026-03-11: 4 commits2026-03-12: 10 commits2026-03-13: 23 commits2026-03-14: 27 commits2026-03-15: 26 commits2026-03-16: 9 commits2026-03-17: 14 commits2026-03-18: 9 commits2026-03-19: 6 commits2026-03-20: 6 commits2026-03-21: 1 commit2026-03-22: 2 commits2026-03-23: 13 commits2026-03-24: 9 commits2026-03-25: 8 commits2026-03-26: 3 commits2026-03-27: 4 commits2026-03-28: 0 commits2026-03-29: 3 commits2026-03-30: 12 commits2026-03-31: 3 commits2026-04-01: 0 commits2026-04-02: 3 commits2026-04-03: 1 commit2026-04-04: 8 commits2026-04-05: 6 commits2026-04-06: 13 commits2026-04-07: 4 commits2026-04-08: 0 commits2026-04-09: 1 commit2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 3 commits2026-04-13: 1 commit2026-04-14: 2 commits2026-04-15: 0 commits2026-04-16: 14 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 2 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 1 commit2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 1 commit2026-05-06: 1 commit2026-05-07: 3 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 1 commit2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 1 commit2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 1 commit2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 3 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 1 commit2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 3 commits2026-06-11: 0 commits2026-06-12: 1 commit2026-06-13: 1 commit2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 3 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 6 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 3 commits2026-06-25: 3 commits2026-06-26: 0 commits2026-06-27: 2 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 1 commit2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 2 commits2026-07-14: 1 commit2026-07-15: 4 commits2026-07-16: 2 commits2026-07-17: 2 commits2026-07-18: 0 commits2026-07-19: 2 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 3 commits2026-07-23: 4 commits2026-07-24: 2 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 1 commit2026-07-29: 0 commits2026-07-30: 1 commit2026-07-31: 3 commits2026-08-01: 0 commits2026-08-02: 2 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 1 commit2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 2 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 1 commit2026-08-21: 0 commits2026-08-22: 1 commit2026-08-23: 1 commit2026-08-24: 1 commit2026-08-25: 5 commits2026-08-26: 2 commits2026-08-27: 0 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 3 commits2026-08-31: 5 commits2026-09-01: 0 commits2026-09-02: 0 commits2026-09-03: 1 commit2026-09-04: 0 commits2026-09-05: 0 commits2026-09-06: 1 commit2026-09-07: 4 commits2026-09-08: 3 commits2026-09-09: 3 commits2026-09-10: 1 commit2026-09-11: 0 commits2026-09-12: 0 commits2026-09-13: 0 commits2026-09-14: 1 commit2026-09-15: 8 commits2026-09-16: 5 commits2026-09-17: 0 commits2026-09-18: 1 commit2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 2 commits2026-09-22: 1 commit2026-09-23: 0 commits2026-09-24: 0 commits2026-09-25: 0 commits2026-09-26: 0 commits2026-09-27: 0 commits2026-09-28: 0 commits2026-09-29: 0 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
682 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Widely adopted

    43,477 stars

  • Very active

    682 commits in 52 weeks

  • Community-driven

    ~115 contributors

  • Permissive license

    Apache-2.0

  • Repeat trending

    9 trending appearances

What agent-browser does

Agent Browser provides a specialized, headless web browsing environment tailored for AI agents rather than human users. It strips away unnecessary visual rendering overhead, focusing instead on exposing a clean, structured DOM representation that language models can easily parse and manipulate. The tool translates complex JavaScript interactions and dynamic content into standardized tool calls, allowing agents to reliably click, type, and scroll. It handles CAPTCHAs, authentication states, and dynamic loading autonomously, ensuring robust scraping and automated interaction. This enables developers to build web-fluent agents without fighting brittle traditional testing frameworks.

AI developers and data engineers building agents that require robust, autonomous web interaction capabilities. It replaces brittle, traditional scraping tools with an intelligent, LLM-native browsing environment.

  • AI-optimized DOM parser: Converts complex, dynamic web pages into a simplified, semantic representation easily digestible by LLMs.
  • Autonomous state management: Automatically handles session cookies, authentication flows, and anti-bot mechanisms like CAPTCHAs.
  • Action translation engine: Maps natural language agent commands into precise, reliable browser interactions like clicking and typing.
  • Headless execution environment: Runs efficiently without a GUI, minimizing resource consumption during large-scale automated scraping.
  • Dynamic content resolution: Waits for asynchronous JavaScript execution and network requests to settle before feeding data back to the agent.
  • Extensible middleware system: Allows developers to inject custom logic for specific site scraping or specialized interaction patterns.

Where teams use it

Automated data extraction

Deploy an agent to navigate complex, dynamically loaded e-commerce sites to extract pricing and product details reliably.

End-to-end workflow automation

Instruct an agent to log into a SaaS platform, navigate specific dashboards, and export data reports without human intervention.

Intelligent web testing

Use LLMs to autonomously explore a web application, identifying broken flows and UI inconsistencies dynamically.

Research and summarization

Have an agent search the web, click through multiple pagination links, and synthesize the collected information into a single report.

Getting started: npm install @vercel/agent-browser

README

main branch

agent-browser

Browser automation CLI for AI agents. Fast native Rust CLI.

Vercel Labs Product npm version: agent-browser License: Apache-2.0 npm downloads per month: agent-browser skills.sh

Installation

Global Installation (recommended)

Installs the native Rust binary:

npm install -g agent-browser
agent-browser install  # Download Chrome from Chrome for Testing (first time only)

Project Installation (local dependency)

For projects that want to pin the version in package.json:

npm install agent-browser
agent-browser install

Then use via package.json scripts or by invoking agent-browser directly.

Homebrew (macOS)

brew install agent-browser
agent-browser install  # Download Chrome from Chrome for Testing (first time only)

Cargo (Rust)

cargo install agent-browser
agent-browser install  # Download Chrome from Chrome for Testing (first time only)

From Source

Requires Node.js 24+, pnpm 11+, and Rust.

git clone https://github.com/vercel-labs/agent-browser
cd agent-browser
pnpm install
pnpm build
pnpm build:native   # Requires Rust (https://rustup.rs)
pnpm link --global  # Makes agent-browser available globally
agent-browser install

Linux Dependencies

On Linux, install system dependencies:

agent-browser install --with-deps

This exits nonzero if the package manager cannot install every required browser library.

Updating

Upgrade to the latest version:

agent-browser upgrade

Detects your installation method (npm, Homebrew, or Cargo) and runs the appropriate update command automatically.

Requirements

  • Chrome - Run agent-browser install to download Chrome from Chrome for Testing (Google's official automation channel). Existing Chrome, Brave, Playwright, and Puppeteer installations are detected automatically. No Playwright or Node.js required for the daemon.
  • Node.js 24+ and pnpm 11+ - Only needed when building from source.
  • Rust - Only needed when building from source (see From Source above).

Quick Start

agent-browser open example.com
agent-browser snapshot                    # Get accessibility tree with refs
agent-browser click @e2                   # Click by ref from snapshot
agent-browser fill @e3 "[email protected]" # Fill by ref
agent-browser get text @e1                # Get text by ref
agent-browser screenshot page.png
agent-browser close

Clicks fail early when another element covers the target's click point, for example a consent banner or modal. Dismiss or interact with the reported covering element, then take a fresh snapshot before retrying the original ref.

Headless Chromium screenshots hide native scrollbars for consistent image output. Pass --hide-scrollbars false when launching to keep native scrollbars visible.

Traditional Selectors (also supported)

agent-browser click "#submit"
agent-browser fill "#email" "[email protected]"
agent-browser find role button click --name "Submit"

Commands

Core Commands

agent-browser open                    # Launch browser (no navigation); stays on about:blank
agent-browser open <url>              # Launch + navigate to URL (aliases: goto, navigate)
agent-browser read [url]              # Fetch agent-readable text, or read rendered active-tab DOM
agent-browser click <sel>             # Click element (--new-tab to open in new tab)
agent-browser dblclick <sel>          # Double-click element
agent-browser focus <sel>             # Focus element
agent-browser type <sel> <text>       # Type into element
agent-browser fill <sel> <text>       # Clear and fill
agent-browser press <key>             # Press key (Enter, Tab, Control+a) (alias: key)
agent-browser keyboard type <text>    # Type with real keystrokes (no selector, current focus)
agent-browser keyboard inserttext <text>  # Insert text without key events (no selector)
agent-browser keydown <key>           # Hold key down
agent-browser keyup <key>             # Release key
agent-browser hover <sel>             # Hover element
agent-browser select <sel> <val>      # Select dropdown by value or visible label
agent-browser check <sel>             # Check checkbox
agent-browser uncheck <sel>           # Uncheck checkbox
agent-browser scroll <dir> [px]       # Scroll (up/down/left/right, --selector <sel>)
agent-browser scrollintoview <sel>    # Scroll element into view (alias: scrollinto)
agent-browser drag <src> <tgt>        # Drag and drop
agent-browser upload <sel> <files>    # Upload files
agent-browser screenshot [path]       # Take screenshot (--full for full page, saves to a temporary directory if no path)
agent-browser screenshot --annotate   # Annotated screenshot with numbered element labels
agent-browser screenshot --if-changed # Recommended: skip unchanged images to save tokens
agent-browser screenshot --threshold 0.01 # Ignore changes affecting at most 1% of pixels
agent-browser screenshot --screenshot-dir ./shots    # Save to custom directory
agent-browser screenshot --screenshot-format jpeg --screenshot-quality 80
agent-browser pdf <path>              # Save as PDF
agent-browser snapshot                # Accessibility tree with refs (best for AI)
agent-browser eval <js>               # Run JavaScript (-b for base64, --stdin for piped input)
agent-browser connect <port>          # Connect to browser via CDP
agent-browser stream enable [--port <port>]  # Start runtime WebSocket streaming
agent-browser webmcp list                     # List experimental page tools
agent-browser webmcp invoke <tool> --params @input.json
agent-browser stream status           # Show runtime streaming state and bound port
agent-browser stream disable          # Stop runtime WebSocket streaming
agent-browser close                   # Close browser (aliases: quit, exit)
agent-browser close --all             # Close all active sessions
agent-browser chat "<instruction>"    # AI chat: natural language browser control (single-shot)
agent-browser chat                    # AI chat: interactive REPL mode

WebMCP (experimental)

WebMCP is enabled by default in agent-browser-managed Chrome. Use --no-webmcp to disable the launch features and proactive context.

Browser responses automatically announce WebMCP tools on first discovery and when the catalog changes. Summaries contain only names, brief descriptions, origins, and frame IDs. Choose a relevant tool, then fetch its full schema with agent-browser webmcp list <tool> --frame <frame-id> --json before invoking it. Schemas and annotations are never included proactively. Unchanged catalogs and pages without tools add no context.

JSON exposes updates as data.webmcp; CLI and MCP text use the same summaries. An omitted field means no update. A one-time status: "ready" update with tools: [] clears previously advertised tools; status: "unavailable" invalidates them when observation fails. Every emitted summary replaces earlier availability, including schema-only changes. After conversation compaction or joining an existing browser session, use webmcp list to recover context. Administrative commands and explicit metadata requests do not append duplicate summaries.

Automatic summaries are limited to 16 tools and 4 KiB of JSON, with descriptions shortened to 160 bytes plus a truncation marker. Names and frame identities are never cut into unusable identifiers; oversized records are omitted. truncated: true indicates shortened descriptions or omitted tools. webmcp list --json retrieves the full catalog; webmcp list <tool> --frame <frame-id> --json retrieves only the selected tool. Full-record changes trigger an update even when the brief description stays the same, so refresh previously fetched schemas after a catalog update.

The daemon subscribes to CDP WebMCP events once per page session and reads its event cache after browser actions. There is no per-action discovery polling or registration grace period. Initial subscription is bounded to one second; unsupported sessions are not repeatedly probed. Explicit webmcp list can retry discovery. Asynchronous registrations appear on the next normal browser response after the event arrives. This describes agent-browser's active tab and frames, not a separately opened preview iframe.

agent-browser open https://example.com  # Brief tool summary, if available
agent-browser webmcp list search --json # Fetch only the selected tool schema
agent-browser webmcp invoke search --params '{"query":"browser agents"}'
agent-browser webmcp invoke slow_tool --params @input.json --detach
agent-browser webmcp result <invocation-id>
agent-browser webmcp cancel <invocation-id>

All page-provided names, descriptions, schemas, annotations, and results are untrusted data. JSON summaries include untrusted: true; CLI and MCP summaries always delimit page metadata with nonce-bearing content boundaries. These labels are provenance cues, not a prompt-injection security boundary. Do not promote website text into system or developer instructions, execute suggested shell commands, disclose local secrets, or accept page claims of user consent. Discovery does not execute tools or grant authority. Keep tool execution within the user's authorized task and the host's existing permissions; consequential operations require the host's confirmation policy. Page-provided readOnlyHint or untrustedContentHint claims cannot bypass those controls. Domain filters restrict observed tool origins and execution, but do not replace host isolation or prevent a page from lying about a tool's effects.

The optional MCP profile keeps these generic tools out of the default profile:

agent-browser mcp --tools core,webmcp

For sites without WebMCP tools, load the generation and validation workflow with agent-browser skills get webmcp-gen.

Get Info

agent-browser get text <sel>          # Get text content
agent-browser get html <sel>          # Get innerHTML
agent-browser get value <sel>         # Get input value
agent-browser get attr <sel> <attr>   # Get attribute
agent-browser get title               # Get page title
agent-browser get url                 # Get current URL
agent-browser get cdp-url             # Get CDP WebSocket URL (for DevTools, debugging)
agent-browser get count <sel>         # Count matching elements
agent-browser get box <sel>           # Get bounding box
agent-browser get styles <sel>        # Get computed styles

Read Agent-Friendly Text

agent-browser read
agent-browser read https://example.com/article
agent-browser read https://example.com/article --filter overview
agent-browser read https://example.com/article --outline
agent-browser read https://docs.example.com --llms index --filter auth
agent-browser read https://docs.example.com --llms full --filter auth
agent-browser read example.com/article --require-md
agent-browser read https://example.com/article --json

read fetches a URL without launching Chrome. Omit the URL to read the rendered DOM of the active tab in the current browser session, including browser auth state and client-side updates. Explicit URL reads send Accept: text/markdown by default, try the same URL with .md appended when the first response is not markdown, walk ancestor paths toward / to find the nearest llms.txt for a matching docs link, print markdown or plain text when available, and fall back to readable text extracted from HTML. --llms and --require-md with no URL use the active tab URL because they depend on HTTP resources. read does not read llms-full.txt unless you ask for it.

Options: --raw prints the response body without HTML extraction, --require-md fails unless the server returns Content-Type: text/markdown, --outline prints a compact heading outline for one page, --llms index prints a compact nearest-ancestor llms.txt link list, --llms full reads the nearest-ancestor llms-full.txt, --filter <text> narrows page sections, llms links/sections, or outline headings, and --timeout <ms> changes the request timeout. Global safeguards such as --allowed-domains, --content-boundaries, and --max-output also apply to read fetches and output.

Check State

agent-browser is visible <sel>        # Check if visible
agent-browser is enabled <sel>        # Check if enabled
agent-browser is checked <sel>        # Check if checked

Find Elements (Semantic Locators)

agent-browser find role <role> <action> [value]       # By ARIA role
agent-browser find text <text> <action> [value]       # By text content
agent-browser find label <label> <action> [value]     # By label
agent-browser find placeholder <ph> <action> [value]  # By placeholder
agent-browser find alt <text> <action> [value]        # By alt text
agent-browser find title <text> <action> [value]      # By title attr
agent-browser find testid <id> <action> [value]       # By data-testid
agent-browser find first <sel> <action> [value]       # First match
agent-browser find last <sel> <action> [value]        # Last match
agent-browser find nth <n> <sel> <action> [value]     # Nth match

Actions: click, fill, check, hover, text

Options: --name <name> (filter role by accessible name), --exact (exact, case-sensitive match; for role it applies to the accessible name, whose default is a case-insensitive substring)

Examples:

agent-browser find role button click --name "Submit"
agent-browser find role heading text --name "Skills"     # implicit roles work: <h2>=heading, <ul>=list, top-level <header>=banner
agent-browser find text "Sign In" click
agent-browser find label "Email" fill "[email protected]"
agent-browser find first ".item" click
agent-browser find nth 2 "a" text

Wait

agent-browser wait <selector>         # Wait for element to be visible
agent-browser wait <ms>               # Wait for time (milliseconds)
agent-browser wait --text "Welcome"   # Wait for text to appear (substring match)
agent-browser wait --url "**/dash"    # Wait for URL pattern
agent-browser wait --load domcontentloaded # Wait for the DOM lifecycle event
agent-browser wait --load load        # Wait for the page load event
agent-browser wait --fn "window.ready === true"  # Wait for JS condition

# Use networkidle only when the page is known to become quiet
agent-browser wait --load networkidle

# Wait for text/element to disappear
agent-browser wait --fn "!document.body.innerText.includes('Loading...')"
agent-browser wait "#spinner" --state hidden

Load states: load, domcontentloaded, networkidle

After a page change, prefer a selector, text, URL, or JavaScript condition that represents the state you need. Use load or domcontentloaded when the lifecycle event is the milestone. networkidle is supported for pages known to become quiet, but SSE, WebSockets, polling, and long-polling can keep it from resolving.

Batch Execution

Execute multiple commands in a single invocation. Commands can be passed as quoted arguments or piped as JSON via stdin. This avoids per-command process startup overhead when running multi-step workflows.

# Argument mode: each quoted argument is a full command
agent-browser batch "open https://example.com" "snapshot -i" "screenshot"

# With --bail to stop on first error
agent-browser batch --bail "open https://example.com" "click @e1" "screenshot"

# Stdin mode: pipe commands as JSON
echo '[
  ["open", "https://example.com"],
  ["snapshot", "-i"],
  ["click", "@e1"],
  ["screenshot", "result.png"]
]' | agent-browser batch --json

Clipboard

agent-browser clipboard read                      # Read text from clipboard
agent-browser clipboard write "Hello, World!"     # Write text to clipboard
agent-browser clipboard copy                      # Copy current selection (Ctrl+C)
agent-browser clipboard paste                     # Paste from clipboard (Ctrl+V)

Mouse Control

agent-browser mouse move <x> <y>      # Move mouse instantly
agent-browser mouse move 600 400 --duration 250 --steps 24 # Smooth movement
agent-browser mouse move 600 400 --human --seed 42 # Reproducible curved movement
agent-browser mouse down [button]     # Press button (left/right/middle)
agent-browser mouse up [button]       # Release button
agent-browser mouse wheel <dy> [dx]   # Scroll wheel

Add --human to click or drag for curved, eased movement from the current cursor position. For timed mouse moves, --duration is the target total duration, including browser response time; a slow browser can still extend it.

Browser Settings

agent-browser set viewport <w> <h> [scale]  # Set viewport size (scale for retina, e.g. 2)
agent-browser set device <name>       # Emulate device ("iPhone 14")
agent-browser set geo <lat> <lng>     # Set geolocation
agent-browser set offline [on|off]    # Toggle offline mode
agent-browser set headers <json>      # Extra HTTP headers
agent-browser set credentials <u> <p> # HTTP basic auth for current and future tabs
agent-browser set media [dark|light]  # Emulate color scheme

set credentials applies HTTP Basic Authentication to the current tab and tabs opened later. set offline off and set headers '{}' restore the default setup for future tabs.

Cookies & Storage

agent-browser cookies                 # Get all cookies
agent-browser cookies set <name> <val> # Set cookie
agent-browser cookies set --curl <file> # Import cookies from a Copy-as-cURL dump,
                                        # JSON array, or bare Cookie header (auto-detected)
agent-browser cookies clear           # Clear cookies

agent-browser storage local           # Get all localStorage
agent-browser storage local <key>     # Get specific key
agent-browser storage local set <k> <v>  # Set value
agent-browser storage local clear     # Clear all

agent-browser storage session         # Same for sessionStorage

Network

agent-browser network route <url>              # Intercept requests
agent-browser network route <url> --abort      # Block requests
agent-browser network route <url> --body <json>  # Mock response
agent-browser network route '*' --abort --resource-type script  # Block scripts only
agent-browser network unroute [url]            # Remove routes
agent-browser network requests                 # View tracked requests
agent-browser network requests --filter api    # Filter requests
agent-browser network requests --type xhr,fetch  # Filter by resource type
agent-browser network requests --method POST   # Filter by HTTP method
agent-browser network requests --status 2xx    # Filter by status (200, 2xx, 400-499)
agent-browser network request <requestId>      # View full request/response detail
agent-browser network har start                # Start HAR recording (embeds text response bodies)
agent-browser network har start --content all  # Embed all response bodies (binary as base64)
agent-browser network har start --content none # Metadata only, no bodies
agent-browser network har stop [output.har]    # Stop and save HAR (temp path if omitted)

Tabs & Windows

agent-browser tab                              # List tabs (shows `tabId` and optional label)
agent-browser tab new [url]                    # New tab (optionally with URL)
agent-browser tab new --label docs [url]       # New tab with a user-assigned label
agent-browser tab <t<N>|label>                 # Switch to a tab by id or label
agent-browser tab close [t<N>|label]           # Close a tab (defaults to active)
agent-browser window new                       # New window

Tab ids are stable strings of the form t1, t2, t3. They're never reused within a session, so scripts and agents can keep referring to the same tab even after other tabs are opened or closed. Positional integers like tab 2 are not accepted; the t prefix disambiguates handles from indices and mirrors the @e1 convention used for element refs.

You can also assign a memorable label (docs, app, admin) and use it interchangeably with the id. Labels are never auto-generated and never rewritten on navigation — they're yours to name and keep:

agent-browser tab new --label docs https://docs.example.com
agent-browser tab docs               # switch to the docs tab
agent-browser snapshot               # populate refs for docs
agent-browser click @e3              # click uses docs's refs
agent-browser tab close docs         # close by label

Tabs opened through tab new or click --new-tab inherit the session's user agent, headers, HTTP credentials, init scripts, routes, and emulation overrides before their first document loads.

tab list --json also reports each tab's CDP targetId, and target ids are accepted anywhere a tab ref is accepted (tab <targetId>, tab close <targetId>). Unlike t<N> ids, which are per-daemon counters, target ids stay stable across daemon restarts, so they're the right handle for scripts coordinating multiple sessions on one browser.

Switching to a tab discarded by Chrome's Memory Saver reactivates it, since a discarded tab has no renderer to drive. Reactivation reloads the discarded page and resets its unsaved state, and the switch result reports "revived": true. A tab whose page is paused by a JavaScript dialog is alive rather than discarded, so the switch leaves it untouched and reports "dialogBlocked": true; resolve the dialog with dialog accept or dialog dismiss before interacting. Closing the active tab onto a discarded successor revives it the same way and reports "activeTabRevived": true.

Frames

agent-browser frame <sel>             # Switch to iframe
agent-browser frame main              # Back to main frame

Dialogs

agent-browser dialog accept [text]    # Accept (with optional prompt text)
agent-browser dialog dismiss          # Dismiss
agent-browser dialog status           # Check if a dialog is currently open

By default, alert and beforeunload dialogs are automatically accepted so they never block the agent. confirm and prompt dialogs still require explicit handling. Use --no-auto-dialog (or AGENT_BROWSER_NO_AUTO_DIALOG=1) to disable automatic handling.

When a JavaScript dialog is pending, all command responses include a warning field with the dialog type and message.

Diff

agent-browser diff snapshot                              # Compare current vs last snapshot
agent-browser diff snapshot --baseline before.txt        # Compare current vs saved snapshot file
agent-browser diff snapshot --selector "#main" --compact # Scoped snapshot diff
agent-browser diff screenshot --baseline before.png      # Visual pixel diff against baseline
agent-browser diff screenshot --baseline b.png -o d.png  # Save diff image to custom path
agent-browser diff screenshot --baseline b.png -t 0.2    # Adjust color threshold (0-1)
agent-browser diff url https://v1.com https://v2.com     # Compare two URLs (snapshot diff)
agent-browser diff url https://v1.com https://v2.com --screenshot  # Also visual diff
agent-browser diff url https://v1.com https://v2.com --wait-until load  # Custom wait strategy
agent-browser diff url https://v1.com https://v2.com --selector "#main"  # Scope to element

Debug

agent-browser trace start             # Start recording trace
agent-browser trace stop [path]       # Stop and save trace
agent-browser profiler start          # Start Chrome DevTools profiling
agent-browser profiler stop [path]    # Stop and save profile (.json)
agent-browser record start ./demo.webm           # Start video recording at 30 fps (.webm or .mp4; needs ffmpeg on PATH)
agent-browser record start ./demo.webm --fps 60  # 60 fps for motion-heavy takes (1-60 allowed)
agent-browser record start ./demo.webm --cursor  # Include an animated pointer
agent-browser record start ./demo.webm --contact-sheet # Save a PNG with distinct changed areas
agent-browser record stop                        # Stop and save the video
agent-browser record restart ./take2.webm        # Stop the current recording, start a new one
agent-browser console                 # View console messages (log, error, warn, info)
agent-browser console --json          # JSON output with raw CDP args for programmatic access
agent-browser console --clear         # Clear console
agent-browser errors                  # View page errors (uncaught JavaScript exceptions)
agent-browser errors --clear          # Clear errors
agent-browser highlight <sel>         # Highlight element
agent-browser inspect                 # Open Chrome DevTools for the active page
agent-browser state save <path>       # Save auth state
agent-browser state load <path>       # Load auth state
agent-browser state list              # List saved state files
agent-browser state show <file>       # Show state summary
agent-browser state rename <old> <new> # Rename state file
agent-browser state clear [name]      # Clear states for session
agent-browser state clear --all       # Clear all saved states
agent-browser state clean --older-than <days>  # Delete old states

With recording --cursor, the pointer and click ripple render with the page, keeping drags synchronized in every captured frame. The temporary overlay is inert, hidden from accessibility snapshots, and removed when recording stops. Screenshots taken during the recording include it.

Navigation

agent-browser back                    # Go back
agent-browser forward                 # Go forward
agent-browser reload                  # Reload page
agent-browser pushstate <url>         # SPA client-side nav; auto-detects window.next.router.push,
                                      # falls back to history.pushState + popstate

Pre-navigation setup

Some flows (SSR debug, auth cookies for protected origins, init scripts) need state set up before the first navigation. Use open with no URL to launch the browser, then stage cookies / routes / init scripts, then navigate. batch sends it all in one CLI call:

agent-browser batch \
  '["open"]' \
  '["network","route","*","--abort","--resource-type","script"]' \
  '["cookies","set","--curl","cookies.curl","--domain","localhost"]' \
  '["navigate","http://localhost:3000/target"]'

Without batch the same sequence is three commands that all reuse the same daemon (fast, but not one turn).

React / Web Vitals

Agent-browser ships with first-class React introspection and universal Web Vitals metrics. The React commands need the React DevTools hook installed at launch; Web Vitals and pushstate are framework-agnostic.

agent-browser open --enable react-devtools <url>   # Launch with React hook installed
agent-browser react tree                           # Full component tree
agent-browser react inspect <fiberId>              # props, hooks, state, source
agent-browser react renders start                  # Begin fiber render recording
agent-browser react renders stop [--json]          # Stop and print profile (--json for raw data)
agent-browser react suspense [--only-dynamic] [--json]  # Suspense boundaries + classifier
                                                         # --only-dynamic hides the "static" list
agent-browser vitals [url] [--json]                # LCP/CLS/TTFB/FCP/INP + hydration summary

Each react ... subcommand requires --enable react-devtools to have been passed at launch (the React DevTools installHook.js is embedded in the binary). Without it the commands error with `React DevTools hook not installed

  • relaunch with --enable react-devtools`.

Works on any React app — Next.js, Remix, Vite+React, CRA, TanStack Start, React Native Web, etc. vitals and pushstate are framework-agnostic. vitals prints a summary by default; pass --json for the full structured payload.

Accessibility audits

Run an axe-core accessibility audit against the current page or a URL. The axe-core engine is embedded in the binary, so it works offline and under strict CSP. It runs private partial audits across the page's frame tree and merges serialized results without page messaging, so page-provided window.axe values remain intact and iframe violations retain their frame selector paths. Accessibility audits require a CDP browser and are not available with Safari or iOS WebDriver sessions.

agent-browser a11y                                 # Audit the current page
agent-browser a11y https://example.com             # Navigate, then audit
agent-browser a11y --tags wcag2a,wcag2aa           # Only rules with these axe tags
agent-browser a11y --selector "#main"              # Scope the audit to a subtree
agent-browser a11y example.com --json              # Full structured results

The default output lists each violation with its impact, rule id, fix guidance URL, and the CSS selectors of failing nodes:

url: https://example.com/
axe-core: 4.12.1  violations: 2  incomplete: 0  passes: 24

[critical] image-alt: Images must have alternative text (3 nodes)
  https://dequeuniversity.com/rules/axe/4.12/image-alt
  - img.hero
  - #logo > img
  - footer img
[serious] color-contrast: Elements must meet minimum color contrast ratio thresholds (1 node)
  https://dequeuniversity.com/rules/axe/4.12/color-contrast
  - .nav a.muted

--json returns the same data structured for automation (counts, violations, incomplete, each violation's nodes with target, html, and failureSummary). Each target preserves axe's selector path arrays, including nested arrays for shadow DOM boundaries. Rules that axe could not evaluate automatically are reported under incomplete for manual review.

Init scripts

agent-browser open --init-script <path>           # Register page init script before first navigation
                                                  # (repeatable; also AGENT_BROWSER_INIT_SCRIPTS env)
agent-browser addinitscript <js>                  # Register at runtime (returns identifier)
agent-browser removeinitscript <identifier>       # Remove from every tab in the session

Runtime init-script identifiers are session-wide. removeinitscript removes the script from every open tab where it was registered and prevents it from being replayed into tabs opened later.

Setup

agent-browser install                 # Download Chrome from Chrome for Testing (Google's official automation channel)
agent-browser install --with-deps     # Also install system deps (Linux)
agent-browser upgrade                 # Upgrade agent-browser to the latest version
agent-browser doctor                  # Diagnose the install and auto-clean stale daemon files
agent-browser doctor --fix            # Also run destructive repairs (reinstall Chrome, purge old state, ...)
agent-browser doctor --offline --quick  # Skip network probes and the live launch test
agent-browser mcp                     # Start an MCP stdio server

doctor checks your environment, Chrome install, daemon state, config files, encryption key, providers, network reachability, and runs a live headless browser launch test. Stale socket/pid sidecar files are auto-cleaned. Output is also available as --json for agents.

Skills

agent-browser skills                  # List available skills
agent-browser skills list             # Same as above
agent-browser skills get <name>       # Output a skill's full content
agent-browser skills get <name> --full  # Include references and templates
agent-browser skills get protected-vercel-deployments  # Access protected Vercel deployments
agent-browser skills get --all        # Output every skill
agent-browser skills path [name]      # Print skill directory path

Serves bundled skill content that always matches the installed CLI version. AI agents use this to get current instructions rather than relying on cached copies. Set AGENT_BROWSER_SKILLS_DIR to override the skills directory path.

MCP Server

agent-browser mcp
agent-browser mcp --tools all
agent-browser mcp --tools core,network,react

Starts a Model Context Protocol server over stdio. MCP clients launch this command as a subprocess and exchange newline-delimited JSON-RPC on stdin and stdout. The server defaults to MCP protocol 2025-11-25 and accepts older supported client protocol versions during initialization.

The default tools profile is core, which keeps MCP context small for everyday browser automation. Use --tools all for the full typed CLI parity surface, or combine profiles with commas, such as --tools core,network,react.

Profiles:

  • core — Default. Navigation, snapshots, interaction, waits, reads, screenshots, JavaScript eval, close, tab basics, and profile discovery
  • network — Network routes, request inspection, HAR, headers, credentials, offline
  • state — Cookies, storage, auth, saved state, sessions, profiles, skills
  • debug — Console/errors, tracing, profiling, recording, a11y audit, clipboard, plugins, doctor, dashboard, install, upgrade, chat, diff, batch, confirm/deny
  • tabs — Back/forward/reload, tabs, windows, frames, dialogs
  • react — React tree/inspect/renders/suspense, vitals, pushstate
  • mobile — Viewport/device/geolocation/media, touch, swipe, mouse, keyboard
  • all — Every MCP tool, including the full typed CLI parity surface

Common tools include:

  • agent_browser_tools_profiles
  • agent_browser_open
  • agent_browser_snapshot
  • agent_browser_click
  • agent_browser_fill
  • agent_browser_type
  • agent_browser_press
  • agent_browser_wait_for_selector
  • agent_browser_screenshot
  • agent_browser_get_url
  • agent_browser_eval
  • agent_browser_close

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

110 total
  1. v0.38.1v0.38.1Sep 16, 20269.6K downloads

    ### Bug Fixes - Fixed **recording cursor and mouse movement timing** so cursor rendering stays synchronized with page content during drags and timed mouse moves (#1869) ### Documentation - Added Vercel Labs product and project status badges to the README (#1868) ### Contributors - @ctate - @Railly

  2. v0.38.0v0.38.0Sep 16, 2026525 downloads

    ### New Features - Added **conditional screenshots** with `screenshot --if-changed` to skip unchanged captures and `--threshold <0-1>` to tolerate small pixel differences. Screenshot history is scoped to each tab and capture mode, and unchanged captures omit the image path to save tokens (#1813) - Added **automatic snapshot deltas** with `snapshot --delta`, which returns a full baseline followed by an unchanged revision or compact structural changes. Use `--full` to refresh the baseline (#1811) - Added **persistent snapshot refs** for surviving DOM elements across same-document changes. Replaced elements and navigated pages or iframes invalidate their refs without recycling identifiers (#1812) - Added **human-like pointer movement** with session `--input-mode`, per-action `--human` for clicks and drags, and reproducible curved `mouse move` paths (#1810) - Added **recording presentation tools**: `--cursor` renders an animated pointer and click ripple, while `--contact-sheet` saves a timestamped PNG summary of visual changes (#1807, #1808) - Added **stateful auth vault login** with `auth login --no-navigate`, which fills an already prepared login page after verifying its origin agai

  3. v0.37.1v0.37.1Sep 8, 202612.2K downloads

    ### Bug Fixes - Fixed **Windows headless Chrome desktop artifacts** by isolating owned headless Chrome on a private desktop and ensuring its process tree is cleaned up when the daemon exits or is forcibly terminated. Headed and externally connected browsers retain their existing desktop behavior (#1498, #1820) ### Contributors - @ctate

  4. v0.37.0v0.37.0Sep 8, 202611.6K downloads

    ### New Features - Added **higher-quality video recording**: `record start` and `record restart` now capture the current active page at 30 fps by default, support `--fps 1-60`, use `Page.startScreencast` for smoother motion, and preserve wall-clock timing. WebM and MP4 output are documented, and `doctor` reports the ffmpeg recording dependencies (#1763, #1776, #1778) - Added **WebMCP availability output** so navigation responses advertise when a page exposes allowed WebMCP tools, including availability metadata for CLI, JSON, and MCP clients (#1760) - Added **session setup inheritance for new tabs**. Tabs opened with `tab new` or through page clicks now inherit the active session's headers, credentials, user agent, locale, timezone, geolocation, offline mode, routes, color scheme, and init scripts before their first navigation (#1777) ### Bug Fixes - Fixed **recording startup validation** so missing ffmpeg, extensionless output paths, and invalid recording options fail before browser or recording state changes. Failed replacements preserve the active take, and ffmpeg errors now include useful diagnostics (#1778) - Fixed **recording navigation state** so URL navigation during rec

  5. v0.36.0v0.36.0Sep 1, 20266.2K downloads

    ### New Features - Added experimental **WebMCP support** for discovering and invoking tools provided by the current page, including frame-aware tool selection, detached results, cancellation, bounded metadata and output handling, and an opt-in MCP tool profile. WebMCP is enabled by default for locally managed Chrome and can be disabled with `--no-webmcp` or `AGENT_BROWSER_NO_WEBMCP`. - Added a **WebMCP generation skill** that helps agents expose existing page workflows as validated page tools while recording safety constraints, deterministic checks, and fallback behavior. ### Improvements - Updated the **eve integration** to 0.47.3 and raised its compatibility floor to 0.39.1. - Updated **brace-expansion dependency resolutions** across the project lockfiles. ### Bug Fixes - Removed the obsolete **Lightpanda session timeout** argument so launches use the current supported server options. ### Contributors - @ctate - @Railly - @anupamme - @arrufat

Code frequency

additions and deletions
+60.6K-60.6KWeek of 2026-01-04: +8,918 linesWeek of 2026-01-04: -2,416 linesWeek of 2026-01-11: +19,486 linesWeek of 2026-01-11: -4,394 linesWeek of 2026-01-18: +5,624 linesWeek of 2026-01-18: -983 linesWeek of 2026-01-25: +2,049 linesWeek of 2026-01-25: -384 linesWeek of 2026-02-01: +7,014 linesWeek of 2026-02-01: -684 linesWeek of 2026-02-08: +11,624 linesWeek of 2026-02-08: -3,832 linesWeek of 2026-02-15: +5,618 linesWeek of 2026-02-15: -315 linesWeek of 2026-02-22: +6,680 linesWeek of 2026-02-22: -665 linesWeek of 2026-03-01: +60,614 linesWeek of 2026-03-01: -2,707 linesWeek of 2026-03-08: +21,355 linesWeek of 2026-03-08: -33,498 linesWeek of 2026-03-15: +10,011 linesWeek of 2026-03-15: -1,953 linesWeek of 2026-03-22: +21,617 linesWeek of 2026-03-22: -1,380 linesWeek of 2026-03-29: +4,646 linesWeek of 2026-03-29: -1,328 linesWeek of 2026-04-05: +8,180 linesWeek of 2026-04-05: -2,735 linesWeek of 2026-04-12: +11,631 linesWeek of 2026-04-12: -5,410 linesWeek of 2026-04-19: +3,444 linesWeek of 2026-04-19: -25 linesWeek of 2026-04-26: +4 linesWeek of 2026-04-26: -0 linesWeek of 2026-05-03: +855 linesWeek of 2026-05-03: -65 linesWeek of 2026-05-10: +553 linesWeek of 2026-05-10: -6 linesWeek of 2026-05-17: +31 linesWeek of 2026-05-17: -11 linesWeek of 2026-05-24: +238 linesWeek of 2026-05-24: -7 linesWeek of 2026-05-31: +1,329 linesWeek of 2026-05-31: -384 linesWeek of 2026-06-07: +1,184 linesWeek of 2026-06-07: -163 linesWeek of 2026-06-14: +21,958 linesWeek of 2026-06-14: -962 linesWeek of 2026-06-21: +6,678 linesWeek of 2026-06-21: -514 linesWeek of 2026-06-28: +0 linesWeek of 2026-06-28: -0 linesWeek of 2026-07-05: +366 linesWeek of 2026-07-05: -4 linesWeek of 2026-07-12: +26,834 linesWeek of 2026-07-12: -19,436 linesWeek of 2026-07-19: +6,116 linesWeek of 2026-07-19: -339 linesWeek of 2026-07-26: +1,935 linesWeek of 2026-07-26: -115 linesWeek of 2026-08-02: +254 linesWeek of 2026-08-02: -7 linesWeek of 2026-08-09: +2,776 linesWeek of 2026-08-09: -81 linesWeek of 2026-08-16: +1,589 linesWeek of 2026-08-16: -130 linesWeek of 2026-08-23: +2,355 linesWeek of 2026-08-23: -101 linesWeek of 2026-08-30: +6,079 linesWeek of 2026-08-30: -444 linesWeek of 2026-09-06: +5,822 linesWeek of 2026-09-06: -614 linesWeek of 2026-09-13: +7,718 linesWeek of 2026-09-13: -1,394 linesWeek of 2026-09-20: +1,201 linesWeek of 2026-09-20: -890 linesWeek of 2026-09-27: +0 linesWeek of 2026-09-27: -0 linesJan 4, 2026Sep 27, 2026
+304.4K lines added, -88.4K removed over the last year.

Commits per week

last 52 weeks
810Week of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 20 commitsWeek of 2026-01-11: 68 commitsWeek of 2026-01-18: 51 commitsWeek of 2026-01-25: 36 commitsWeek of 2026-02-01: 22 commitsWeek of 2026-02-08: 23 commitsWeek of 2026-02-15: 20 commitsWeek of 2026-02-22: 19 commitsWeek of 2026-03-01: 38 commitsWeek of 2026-03-08: 81 commitsWeek of 2026-03-15: 71 commitsWeek of 2026-03-22: 39 commitsWeek of 2026-03-29: 30 commitsWeek of 2026-04-05: 24 commitsWeek of 2026-04-12: 20 commitsWeek of 2026-04-19: 2 commitsWeek of 2026-04-26: 1 commitsWeek of 2026-05-03: 5 commitsWeek of 2026-05-10: 1 commitsWeek of 2026-05-17: 1 commitsWeek of 2026-05-24: 1 commitsWeek of 2026-05-31: 4 commitsWeek of 2026-06-07: 5 commitsWeek of 2026-06-14: 9 commitsWeek of 2026-06-21: 8 commitsWeek of 2026-06-28: 0 commitsWeek of 2026-07-05: 1 commitsWeek of 2026-07-12: 11 commitsWeek of 2026-07-19: 11 commitsWeek of 2026-07-26: 5 commitsWeek of 2026-08-02: 3 commitsWeek of 2026-08-09: 2 commitsWeek of 2026-08-16: 2 commitsWeek of 2026-08-23: 9 commitsWeek of 2026-08-30: 9 commitsWeek of 2026-09-06: 12 commitsWeek of 2026-09-13: 15 commitsWeek of 2026-09-20: 3 commitsWeek of 2026-09-27: 0 commitsOct 4, 2025Sep 27, 2026
682 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 7 commitsSun 1:00 — 6 commitsSun 2:00 — 5 commitsSun 3:00 — 11 commitsSun 4:00 — 8 commitsSun 5:00 — 2 commitsSun 6:00 — 1 commitsSun 7:00 — 1 commitsSun 8:00 — 4 commitsSun 9:00 — 11 commitsSun 10:00 — 12 commitsSun 11:00 — 9 commitsSun 12:00 — 2 commitsSun 13:00 — 7 commitsSun 14:00 — 3 commitsSun 15:00 — 1 commitsSun 16:00 — 2 commitsSun 17:00 — 2 commitsSun 18:00 — 0 commitsSun 19:00 — 2 commitsSun 20:00 — 6 commitsSun 21:00 — 2 commitsSun 22:00 — 3 commitsSun 23:00 — 7 commitsMon 0:00 — 13 commitsMon 1:00 — 5 commitsMon 2:00 — 2 commitsMon 3:00 — 1 commitsMon 4:00 — 0 commitsMon 5:00 — 1 commitsMon 6:00 — 0 commitsMon 7:00 — 1 commitsMon 8:00 — 1 commitsMon 9:00 — 5 commitsMon 10:00 — 10 commitsMon 11:00 — 8 commitsMon 12:00 — 12 commitsMon 13:00 — 5 commitsMon 14:00 — 5 commitsMon 15:00 — 6 commitsMon 16:00 — 5 commitsMon 17:00 — 15 commitsMon 18:00 — 16 commitsMon 19:00 — 8 commitsMon 20:00 — 7 commitsMon 21:00 — 5 commitsMon 22:00 — 6 commitsMon 23:00 — 6 commitsTue 0:00 — 5 commitsTue 1:00 — 5 commitsTue 2:00 — 4 commitsTue 3:00 — 2 commitsTue 4:00 — 0 commitsTue 5:00 — 1 commitsTue 6:00 — 1 commitsTue 7:00 — 3 commitsTue 8:00 — 4 commitsTue 9:00 — 10 commitsTue 10:00 — 5 commitsTue 11:00 — 4 commitsTue 12:00 — 4 commitsTue 13:00 — 5 commitsTue 14:00 — 7 commitsTue 15:00 — 9 commitsTue 16:00 — 5 commitsTue 17:00 — 14 commitsTue 18:00 — 0 commitsTue 19:00 — 0 commitsTue 20:00 — 1 commitsTue 21:00 — 4 commitsTue 22:00 — 5 commitsTue 23:00 — 9 commitsWed 0:00 — 4 commitsWed 1:00 — 5 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 4 commitsWed 9:00 — 1 commitsWed 10:00 — 4 commitsWed 11:00 — 4 commitsWed 12:00 — 4 commitsWed 13:00 — 1 commitsWed 14:00 — 7 commitsWed 15:00 — 6 commitsWed 16:00 — 3 commitsWed 17:00 — 5 commitsWed 18:00 — 4 commitsWed 19:00 — 6 commitsWed 20:00 — 2 commitsWed 21:00 — 1 commitsWed 22:00 — 4 commitsWed 23:00 — 6 commitsThu 0:00 — 9 commitsThu 1:00 — 3 commitsThu 2:00 — 2 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 2 commitsThu 7:00 — 2 commitsThu 8:00 — 2 commitsThu 9:00 — 1 commitsThu 10:00 — 8 commitsThu 11:00 — 7 commitsThu 12:00 — 3 commitsThu 13:00 — 4 commitsThu 14:00 — 11 commitsThu 15:00 — 3 commitsThu 16:00 — 4 commitsThu 17:00 — 6 commitsThu 18:00 — 6 commitsThu 19:00 — 3 commitsThu 20:00 — 5 commitsThu 21:00 — 2 commitsThu 22:00 — 1 commitsThu 23:00 — 1 commitsFri 0:00 — 4 commitsFri 1:00 — 4 commitsFri 2:00 — 6 commitsFri 3:00 — 5 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 1 commitsFri 8:00 — 4 commitsFri 9:00 — 6 commitsFri 10:00 — 3 commitsFri 11:00 — 3 commitsFri 12:00 — 6 commitsFri 13:00 — 8 commitsFri 14:00 — 3 commitsFri 15:00 — 11 commitsFri 16:00 — 2 commitsFri 17:00 — 2 commitsFri 18:00 — 4 commitsFri 19:00 — 2 commitsFri 20:00 — 6 commitsFri 21:00 — 0 commitsFri 22:00 — 3 commitsFri 23:00 — 4 commitsSat 0:00 — 2 commitsSat 1:00 — 2 commitsSat 2:00 — 0 commitsSat 3:00 — 1 commitsSat 4:00 — 1 commitsSat 5:00 — 0 commitsSat 6:00 — 2 commitsSat 7:00 — 1 commitsSat 8:00 — 0 commitsSat 9:00 — 2 commitsSat 10:00 — 2 commitsSat 11:00 — 7 commitsSat 12:00 — 7 commitsSat 13:00 — 7 commitsSat 14:00 — 3 commitsSat 15:00 — 4 commitsSat 16:00 — 5 commitsSat 17:00 — 2 commitsSat 18:00 — 8 commitsSat 19:00 — 3 commitsSat 20:00 — 3 commitsSat 21:00 — 3 commitsSat 22:00 — 1 commitsSat 23:00 — 12 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Mar 3, 2026daily#14+222
Jan 21, 2026daily#19+159
Jan 20, 2026daily#17+180
Jan 19, 2026daily#17+209
Jan 16, 2026daily#11+239
Jan 15, 2026daily#5+458
Jan 14, 2026daily#4+476
Jan 13, 2026daily#4+529
Jan 12, 2026daily#3+541
  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    195.2K stars · Rust

  • farion1231/cc-switch

    A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

    140K stars · Rust

  • openai/codex

    Lightweight coding agent that runs in your terminal

    127.8K stars · Rust

  • denoland/deno

    A modern runtime for JavaScript and TypeScript.

    108.6K stars · Rust

  • ruvnet/RuView

    π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.

    96.4K stars · Rust

  • oven-sh/bun

    Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one

    96.1K stars · Rust