GitHub

Rotunda Logo

Giving your agents the power to browse the web is like giving them superpowers. You can automate almost anything. Rotunda is a browser built for agents from the ground up. Sick of seeing more captchas in Claude than when you open Chrome and do it yourself? Try Rotunda.

Rotunda Amazon demo
Check out the demo!

Getting started

Install Rotunda into your Python project with uv, then fetch the latest Rotunda browser build:

uv add rotunda
uv run rotunda fetch

rotunda fetch syncs the available browser releases and installs the latest build for the active channel.

Then use Rotunda from Playwright by swapping in the Rotunda launch helper and creating contexts with NewContext:

from playwright.sync_api import sync_playwright
from rotunda import NewBrowser, NewContext
with sync_playwright() as playwright:
    browser = NewBrowser(playwright, headless=False)
    context = NewContext(browser)
    page = context.new_page()
    page.goto("https://pierce.dev", wait_until="domcontentloaded")
    first_article_text = page.locator("main article article").first.inner_text()
    print(first_article_text)
    browser.close()

Default add-ons are opt-in because they are a page-dependent tradeoff. uBlock takes extra processing time, but it can still be net faster on pages with lots of ads or trackers. For SaaS sites with minimal or no ads, keep default add-ons off so Rotunda does not spend time processing unnecessary extension rules. Pass NewBrowser(playwright, default_addons=True) when that tradeoff is useful.

Isolated eval

For custom DOM reads that should avoid page monkeypatches, Rotunda exposes Playwright's isolated utility context:

from rotunda import evaluate_in_utility
title = evaluate_in_utility(page, "() => document.title")

Async code can use async_evaluate_in_utility(page, expression, arg=None). Import rotunda before starting Playwright so Rotunda can install the driver preload; Rotunda(...) / AsyncRotunda(...) do this automatically.

Agent

You can also drive Rotunda directly from the command line with uvx, without adding it to a project first. The agent commands keep browser profiles, daemon sessions, and short resource indexes under ~/.rotunda, so later uvx rotunda ... calls can attach to the same profile.

For the daemon, resource-index, heartbeat, and singleton process model behind these commands, see Agent CLI Architecture.

For agent clients that support installable skills, see the Rotunda skill for a compact operating guide.

First install the active browser build and create a profile:

uvx rotunda fetch
uvx rotunda agent new-profile --name agent-demo

Create a browser context by passing the profile name to new-context, then navigate the printed page index. The page number below is an example; use the index printed by your commands:

uvx rotunda agent new-context agent-demo
uvx rotunda agent navigate 3 https://pierce.dev

Describe the page to get element refs:

uvx rotunda agent describe 3

Use those refs directly for actions. You do not need to pass the page index once a ref has been described:

"uvx rotunda agent click uvx rotunda agent hover uvx rotunda agent info

Read the original on github.com ↗