open-source · v2.4.0 · MIT

Mr. Browser is an automation engine that abandons fragile CSS selectors. Describe what you want in plain English — a local NLP algorithm and the DOM Accessibility Tree do the rest. When the UI changes, scripts heal themselves.

~/flows/login.yaml — mrbrowser run
corp-portal.internal/login

Sign in to Corp Portal

$ mrbrowser --capabilities

Built different. On purpose.

Intent-Driven Resolution

No CSS selectors. No XPath. Describe the element in plain English — "the submit button", "the email field" — and a local NLP algorithm resolves it against the DOM Accessibility Tree.

Memory Engine: Self-Healing

Every resolved element leaves a structural fingerprint. When the UI changes, the Memory Engine compares historical fingerprints to find where the element moved — and your script keeps running.

Zero Mandatory AI

The core resolution engine is 100% local and deterministic. No API keys, no cloud calls, no data leaving your machine. LLM assistance is strictly opt-in.

$ mrbrowser --use-cases

One engine. Three weapons.

// qa_e2e

QA & E2E Testing

Write tests that survive UI redesigns. Stop fixing broken selectors. When the frontend team ships a rewrite, the Memory Engine re-resolves every element by structural fingerprint — your suite stays green.

test_checkout.py
python
import mrbrowser

def test_checkout_survives_redesign(browser):
    browser.goto("https://shop.example.com")
    browser.click("the first product card")
    browser.click("Add to cart")
    browser.click("the checkout button")
    assert browser.sees("Order summary")
// rpa

Robotic Process Automation

Automate legacy enterprise web apps with simple YAML workflows. No coding required. Schedule flows, chain steps, and let intent resolution deal with the 2009-era markup.

invoice_export.yaml
yaml
flow: invoice_export
schedule: "0 6 * * MON"
steps:
  - goto: "https://legacy-erp.corp/invoices"
  - select: { target: "Status filter", value: "Unpaid" }
  - click: "Export to CSV"
  - wait_for: "Download complete"
// scraping

Intelligent Web Scraping

Extract data semantically from heavily obfuscated React/Webpack applications. Hashed class names and shifting DOM structures are irrelevant when you target meaning, not markup.

scrape.ts
typescript
const rows = await browser.extract({
  intent: "every product row in the results table",
  fields: {
    name: "the product title",
    price: "the listed price",
    stock: "availability status",
  },
}); // works on minified class names like .x9f2a

$ init

Deploy in seconds

Pick your runtime. The engine ships everywhere.

$docker compose -f docker/docker-compose.yml up -d

> Ready to stop fixing selectors?

Read the docs, run your first flow in under five minutes.

Open Documentation