Bruster

Native webview browser automation for AI agents. Rust-powered, with JSON-lines control and a built-in MCP server. Runs on macOS, Linux, and Windows.

Documentação

"method": "navigate",
"params": { "url": "https://example.com" }
"method": "snapshot",
"params": { "format": "text" }

EXAMPLE SNAPSHOT

e1heading Example Domain

e2textThis domain is for use in…

e3linkLearn more

"method": "click", "params": { "ref": "e3" }

The browser engine
belongs to your platform.

macOS WKWebView

Linux WebKitGTK

Windows WebView2

The browser is native.The workflow is yours.

Automate the everyday work: navigate, inspect, fill, click, and capture. Connect it to the tools you already use.

Speak your language

Send JSON over stdin. Read results on stdout. Python, Rust, Go, or anything that can start a process can drive bruster.

Explore the protocol

Give your agent a browser

One --mcp flag turns browser methods into tools. Get compact snapshots, screenshot images, and page events.

Connect an MCP client

Keep the moving parts small

A compiled Rust controller backed by native browser libraries and helper processes. Install the platform runtime where needed.

See how it compares

Your first automation,without the ceremony.

Install the binary or run the Docker image. Start a session. Send a command. Each request has an ID, so results stay easy to follow alongside page events.

  1. 1 Choose your setup Use a prebuilt release or the Docker Hub image.
  2. 2 Connect your workflow Use the native protocol or your MCP client.
  3. 3 Make the browser do the work Inspect a page, fill a form, capture a screenshot. Read the getting-started guide

Ready when you are.

v0.3.3

Install on macOS or Linux

curl -fsSL https://raw.githubusercontent.com/aliilyas/bruster/main/install.sh | sh

Installs to ~/.local/bin. Read the script

On Windows?Download the release

A note for Linux

Install WebKitGTK 4.1. On machines without a desktop session, install Xvfb too. Platform setup →

$ bruster --hiddenJSON lines

Or run bruster --mcp --quiet from your MCP client.

Docker Hub amd64 & arm64

docker run --rm -i ilyastmn/bruster:latest

Includes WebKitGTK, Xvfb, fonts, and HTTPS certificates. Docker setup · Connect your MCP client

Less guesswork.More measurements.

Compare bruster with Playwright, Puppeteer, and agent-browser. Inspect startup, navigation, screenshots, memory, and installed runtime files.

Idle process-tree memory

218.7 MiB

Total PSS, including the Xvfb display

Installed runtime files

427.9 MB

Lower bound, including native dependencies

Bruster / WebKitGTK · Linux · 29 Oct 2026 · 10 sessions. Memory includes Xvfb; installed size is a lower bound. See all configurations, ranges, versions, and conditions in the full report.

One interface.Plenty of possibilities.

01 /

Browser automation scripts

Extract rendered text, fill forms, and save screenshots from the language you already write.

02 /

Focused smoke tests

Check that your pages load and key interactions work. Use your own assertions around structured responses.

03 /

Agent-driven workflows

Let an MCP-compatible client inspect and interact with pages using the same native controller.

Set up your client

Before you start.

Is bruster a replacement for Playwright?

It is an alternative for workflows that benefit from a native-webview controller and JSON-lines or MCP access. Playwright offers a complete testing ecosystem, cross-browser engines, tracing, and browser-context isolation. Compare the trade-offs for your workload.

Does bruster need Node.js or a browser download?

The bruster executable needs no Node.js. It uses WKWebView on macOS, WebKitGTK on Linux, and WebView2 on Windows. Install the native runtime where required; rendering also uses its libraries and helper processes. WebView2 is Chromium-based.

Can I run it in CI without a display?

On Linux, WebKitGTK needs a display even in hidden mode. Install Xvfb for a virtual display. When DISPLAY is unset, bruster automatically tries xvfb-run. See the CI setup.

Can I use bruster from Python?

Yes. Start the executable with Python’s standard-library subprocess module, write a JSON request to stdin, and read stdout until you receive its matching ID. Try the complete Python example.