@1Orbis by Memora · the agent-native headless browser
It doesn’t render pixels.It distills meaning.
Orbis loads a page and runs its JavaScript without drawing anything. Your agent gets clean Markdown and a numbered action map — @1, @2, @3 — to click and type into, instead of a wall of markup or a screenshot to squint at.
npx memora-orbis --port 9222- CDP for Playwright & Puppeteer
- W3C WebDriver for Selenium
- 15-tool MCP server
- Free for evaluation
=== INTERACTIVE ACTION MAP (15 elements) ===
- [@1] [link] "Documentation" href="/docs" (selector: html:nth-of-type(1) > body:nth-of-type(1) > header:nth-of-type(1) > nav:nth-of-type(1) > a:nth-of-type(1))
- [@2] [link] "Help Center" href="/support" (selector: html:nth-of-type(1) > body:nth-of-type(1) > header:nth-of-type(1) > nav:nth-of-type(1) > a:nth-of-type(2))
- [@3] [select] "Language Selector" type="select" (selector: #locale-picker)
- [@4] [input] "alex@memora.company" type="email" placeholder="alex@memora.company" (selector: #username)
- [@5] [link] "Forgot password?" href="/auth/forgot-password" (selector: a.forgot-link)
- [@6] [input] "Enter at least 12 characters" type="password" placeholder="Enter at least 12 characters" (selector: #password)
- [@7] [button] "Toggle password visibility" type="button" (selector: #toggle-password)
- [@8] [input] "[Untitled input]" type="checkbox" (selector: #remember)
- [@9] [button] "Sign In with Credentials" type="submit" (selector: #btn-submit)
- [@10] [button] "Sign In with Google Workspace" type="button" (selector: #btn-sso-google)
- [@11] [button] "Sign In with GitHub Enterprise" type="button" (selector: #btn-sso-github)
- [@12] [button] "Sign In with Okta / SAML 2.0" type="button" (selector: #btn-sso-okta)
- [@13] [link] "Privacy Policy" href="/legal/privacy" (selector: html:nth-of-type(1) > body:nth-of-type(1) > footer:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(1) > a:nth-of-type(1))
- [@14] [link] "Terms of Service" href="/legal/terms" (selector: html:nth-of-type(1) > body:nth-of-type(1) > footer:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(2) > a:nth-of-type(1))
- [@15] [link] "SOC-2 Type II Compliance" href="/security/compliance" (selector: html:nth-of-type(1) > body:nth-of-type(1) > footer:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(3) > a:nth-of-type(1))
Measured, not promised
Against headless Chrome, on the same machine.
200 local test pages, Windows 11 laptop, median of three runs, October 2026. Timed after each browser had started. Chrome is Playwright’s headless shell.
Method and full results11x faster
Time to load 200 pages
11x less memory
Memory with 10 tabs open
Why Orbis
Browsers were built for eyes. Agents don’t have any.
Traditional headless browsers were designed for people looking at screens. When an agent drives them, most of the work is wasted — and what’s left is the wrong shape for a language model.
- 01
Pixels nobody looks at
Headless Chrome, Firefox and WebKit still lay out, rasterize, anti-alias and composite every page. An agent never sees any of it, but you pay for it in CPU, memory and start-up time.
- 02
HTML is the wrong interface
The few controls an agent actually needs are buried in nested markup, inline scripts and styling. Sending raw HTML to a model spends context and tokens on noise.
- 03
Screenshots are slow and fragile
Vision-based agents wait on a multimodal call for every step, then guess where to click. Dynamic forms and shifting layouts break them.
Orbis starts from the other end. What does an agent actually need from a page? The content, the things it can do, and a reliable way to do them.
How it works
Five stages. No renderer.
The Memora Browser Engine keeps the parts of a browser an agent depends on — networking, a real DOM and a JavaScript runtime — and replaces layout, painting and compositing with a distiller.
- Fetch
Network CoreAdaptive TLS Fingerprint & Wire Emulation
Outgoing network requests emulate authentic browser client hints, cipher suites, isolated cookie jars, and custom header policies with automated anti-detect safeguards.
- Parse
DOM EngineHigh-Speed Spec DOM without Layout Overhead
HTML streams directly into Orbis' proprietary DOM tree with zero GPU rasterization. CSS selectors and XPath queries resolve in sub-millisecond evaluate passes.
- Execute
V8 RuntimeDynamic Client JavaScript in an Isolated V8 Sandbox
Client scripts execute within high-security V8 runtime isolates with full DOM API shims, storage emulation, and in-memory module bundling for modern web applications.
- Distill
Distillation CoreSemantic Tokenizer & Numbered Action Map
Every interactable control is mapped to a deterministic anchor ID —
@1,@2,@3— alongside its accessibility role and label. Content is distilled to clean, token-efficient Markdown. - Act
Action EngineDeterministic Actions, State Diffs & Instant Forking
Agents act by anchor IDs, submit multi-field forms in a single turn, inspect state diffs between turns, and fork page memory into parallel execution branches.
See the output
Every page, reduced to what you can do on it.
Pick a page and a format. This is exactly what the Orbis CLI prints for the four test pages in its benchmark suite — nothing retouched.
Test page
- Raw HTML
- 3,350 bytes
- Interactive elements
- 15
- Snapshot estimate
- ~630 tokens
The four pages from the Orbis benchmark suite, run through the real CLI. The token figure is Orbis’ own estimate (characters ÷ 4) for the action map plus Markdown.
# Title: Enterprise Cloud - Sign In to Workspace
URL: http://127.0.0.1:8765/login_page_html
Tokens: ~630 | Actions: 15
=== INTERACTIVE ACTION MAP (15 elements) ===
[@1] [link] "Documentation" href="/docs" (selector: html:nth-of-type(1) > body:nth-of-type(1) > header:nth-of-type(1) > nav:nth-of-type(1) > a:nth-of-type(1))
[@2] [link] "Help Center" href="/support" (selector: html:nth-of-type(1) > body:nth-of-type(1) > header:nth-of-type(1) > nav:nth-of-type(1) > a:nth-of-type(2))
[@3] [select] "Language Selector" type="select" (selector: #locale-picker)
[@4] [input] "alex@memora.company" type="email" placeholder="alex@memora.company" (selector: #username)
[@5] [link] "Forgot password?" href="/auth/forgot-password" (selector: a.forgot-link)
[@6] [input] "Enter at least 12 characters" type="password" placeholder="Enter at least 12 characters" (selector: #password)
[@7] [button] "Toggle password visibility" type="button" (selector: #toggle-password)
[@8] [input] "[Untitled input]" type="checkbox" (selector: #remember)
[@9] [button] "Sign In with Credentials" type="submit" (selector: #btn-submit)
[@10] [button] "Sign In with Google Workspace" type="button" (selector: #btn-sso-google)
[@11] [button] "Sign In with GitHub Enterprise" type="button" (selector: #btn-sso-github)
[@12] [button] "Sign In with Okta / SAML 2.0" type="button" (selector: #btn-sso-okta)
[@13] [link] "Privacy Policy" href="/legal/privacy" (selector: html:nth-of-type(1) > body:nth-of-type(1) > footer:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(1) > a:nth-of-type(1))
[@14] [link] "Terms of Service" href="/legal/terms" (selector: html:nth-of-type(1) > body:nth-of-type(1) > footer:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(2) > a:nth-of-type(1))
[@15] [link] "SOC-2 Type II Compliance" href="/security/compliance" (selector: html:nth-of-type(1) > body:nth-of-type(1) > footer:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(3) > a:nth-of-type(1))
npx memora-orbis fetch https://your-site.example --dump action_mapAgent primitives
Built for the loop: read, act, check.
OrbisAgent wraps the engine in the handful of calls an LLM loop needs. Each one is designed to keep the model’s turns few and its context small.
Agents stop inventing XPath that breaks on the next deploy. Two identical “Add to cart” buttons get two different IDs, and every ID also carries the CSS selector it resolved to.
- Click or type with an action ID or a normal CSS selector
- Hidden and aria-hidden elements are left out of the map
- Take a fresh snapshot after the page changes so IDs match what is there
const snapshot = await agent.goto('https://app.example.com/login');
agent.act('@4', 'alex@memora.company'); // type
agent.act('@9'); // click "Sign In"[@4] [input] "alex@memora.company" type="email" (selector: #username)
[@9] [button] "Sign In with Credentials" type="submit" (selector: #btn-submit)
Integrations
Keep your scripts. Change one line.
Orbis speaks the Chrome DevTools Protocol and W3C WebDriver, so existing Playwright, Puppeteer and Selenium code connects to it instead of launching Chrome. Navigation, scripting, DOM access and input go through the calls you already use.
Works with
- Playwright
- Puppeteer
- Selenium
- Browser-Use
- Stagehand
- LangChain
- Claude Code
- Cursor
- Windsurf
Browser-Use, Stagehand and LangChain helpers ship in the package. No pixels means no screenshots or PDFs — see limitations.
import { chromium } from 'playwright';
// Before: const browser = await chromium.launch();
const browser = await chromium.connectOverCDP('http://127.0.0.1:9222');
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
await page.goto('https://example.com');
console.log(await page.title());MCP server
A browser for your AI coding tools.
Run Orbis with --mcp and Claude Code, Claude Desktop, Cursor or Windsurf can open your local app, click through the feature it just built, read the console and pull data — all by action ID.
{
"mcpServers": {
"orbis": {
"command": "npx",
"args": ["-y", "memora-orbis", "--mcp"]
}
}
}memora_browseLoad a URL; return Markdown, the action map and a token estimatememora_actClick or type using an action ID or CSS selectormemora_fill_formFill several fields at once and optionally submitmemora_diffSummarise what changed since the previous turnmemora_forkCopy the current page to explore another pathmemora_sessionSave or load cookies and web storagememora_inspectList the title and current interactive elementsmemora_extractPull text or attributes from matching elementsmemora_metadataRead OpenGraph, Twitter card, canonical and JSON-LDmemora_consoleRead console logs, warnings and errorsmemora_storageRead or write localStorage and sessionStoragememora_cookiesList, set or clear cookiesmemora_evalRun JavaScript in the pagememora_htmlGet raw HTML for the page or one elementmemora_reloadReload the page and refresh the action map
Network & stealth
Looks like a browser. Behaves like a good citizen.
Orbis presents one consistent browser profile, follows robots.txt when you ask it to, and gives you the network controls production crawlers need.
One coherent browser profile
Stealth is on by default. Requests carry Chrome 130 headers and client hints, and before page scripts run, navigator, screen and hardware values are set to match — with navigator.webdriver set to false. Turn it off with --no-stealth when you test your own sites.
navigator.webdriver // false
navigator.platform // "Win32"
navigator.hardwareConcurrency // 8
Sec-Ch-Ua: "Chromium";v="130", "Google Chrome";v="130"robots.txt, when you ask for it
With --obey-robots, Orbis fetches robots.txt once per origin (cached for 24 hours) and checks the main navigation, every redirect hop, sub-resources and page fetch() calls against it. Blocked navigations fail with net::ERR_BLOCKED_BY_CLIENT over CDP.
npx memora-orbis fetch https://example.com \
--obey-robots --robots-agent MyCrawlerNetwork controls you expect
Add headers to every request, override the User-Agent, set navigation timeouts, inherit HTTP_PROXY / NO_PROXY from the environment, and list hosts that skip the proxy. A managed proxy network is planned for Orbis Cloud.
npx memora-orbis --port 9222 \
--http-header "X-Team: research" \
--http-timeout 15000 --use-env-proxyBenchmarks
What we measured, and how.
Results from the benchmark suite in the Orbis repository, run on a Windows 11 laptop with Node 22 in October 2026. Every number here can be reproduced with one command.
Fewer tokens per page
Estimated tokens (characters ÷ 4) in the raw HTML versus Orbis’ action map and Markdown. Savings on your pages depend on how much markup they carry.
Memory in one process
- Engine at start
- 79.6 MB
- With 10 pages open
- 84.4 MB
- Each extra page
- ~0.5 MB
Resident memory of the Node.js process after loading the engine
Same process with ten test pages loaded
Average increase per additional page
page.fork()
Test page with 400 interactive elements, 20 runs.
- Median
- 4.9 ms
- Fastest
- 2.5 ms
- Slowest
- 28.4 ms
Time grows with page size.
Reproduce it
From a checkout of the Orbis repository:
# tokens, distill time, memory, fork
npm run benchmark
# 200 local pages vs headless Chrome
npm run benchmark:chromeOrbis Cloud · planned
Run it yourself today. Hand it off later.
Orbis runs on your own machine or server now. Orbis Cloud is the managed version we’re building for teams that would rather not operate browsers at all.
- Zero-install fleet. Connect to a hosted Orbis over a WebSocket instead of running the engine yourself.
- Managed proxy network. Residential proxies built in, so you don’t bring and rotate your own.
- Cloud session vault. Saved sessions synced across servers instead of local JSON files.
- Shareable live inspector. A web URL to watch an agent’s session as it runs.
- Autoscaled concurrency. Many concurrent pages without sizing machines for RAM and CPU.
Licensing
Free to evaluate. Licensed for production.
Community & evaluation
Free
Personal development, learning, testing and evaluation, including with local agents built on LangChain, Browser-Use or Stagehand.
Commercial
Talk to us
Required for production deployments and for organisations using Orbis to generate revenue.
enterprise@memora.companyFAQ
Straight answers.
Does Orbis need Chrome installed?
No. The CDP server, fetch and --eval always use the native Orbis engine. In MCP mode the default engine setting (auto) uses a system Chrome or Edge if it finds one; pass --engine native to keep MCP on the Orbis engine, or --engine chrome for pages that need a full renderer.
Why @1 and @2 instead of CSS selectors?
Long CSS and XPath strings cost tokens and models get them wrong. Short numbered IDs are easy to read and easy to repeat back. Selectors still work everywhere an ID does, and each action in the map shows the selector it resolved to.
Can it take screenshots or print PDFs?
No. Orbis doesn’t render pixels, so anything that needs them — screenshots, PDFs, visual comparison — isn’t available. Navigation, scripting, DOM access and input are supported over CDP and WebDriver.
Will stealth mode get past every bot check?
No tool can promise that. Stealth mode removes common headless giveaways and keeps the profile consistent. It does not solve CAPTCHAs. Use it only where automated access is allowed, and pair it with --obey-robots for crawling.
Is Orbis open source?
No. Orbis is distributed under the Orbis Commercial & Community Evaluation License: free for personal development, learning, testing and evaluation. Production and commercial use need a commercial licence from Memora.
Does it phone home?
When the server starts it checks orbis.memora.company for a newer version. Set ORBIS_NO_TELEMETRY=1 to skip the check.
Give your agents a browser built for them.
Start the server, point your agent at it, and read the first page back as an action map.
npx memora-orbis --port 9222