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.
Sign in to Corp Portal
$ mrbrowser --capabilities
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.
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.
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
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.
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")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.
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"Extract data semantically from heavily obfuscated React/Webpack applications. Hashed class names and shifting DOM structures are irrelevant when you target meaning, not markup.
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
Pick your runtime. The engine ships everywhere.
$docker compose -f docker/docker-compose.yml up -dRead the docs, run your first flow in under five minutes.
Open Documentation