Skip to main content
Skip to content

@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
$ orbis fetch /login --dump action_mapdistilling…

# Title: Enterprise Cloud - Sign In to WorkspaceTokens: ~630 | Actions: 15

=== INTERACTIVE ACTION MAP (15 elements) ===

  1. [@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. [@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. [@3] [select] "Language Selector" type="select" (selector: #locale-picker)
  4. [@4] [input] "alex@memora.company" type="email" placeholder="alex@memora.company" (selector: #username)
  5. [@5] [link] "Forgot password?" href="/auth/forgot-password" (selector: a.forgot-link)
  6. [@6] [input] "Enter at least 12 characters" type="password" placeholder="Enter at least 12 characters" (selector: #password)
  7. [@7] [button] "Toggle password visibility" type="button" (selector: #toggle-password)
  8. [@8] [input] "[Untitled input]" type="checkbox" (selector: #remember)
  9. [@9] [button] "Sign In with Credentials" type="submit" (selector: #btn-submit)
  10. [@10] [button] "Sign In with Google Workspace" type="button" (selector: #btn-sso-google)
  11. [@11] [button] "Sign In with GitHub Enterprise" type="button" (selector: #btn-sso-github)
  12. [@12] [button] "Sign In with Okta / SAML 2.0" type="button" (selector: #btn-sso-okta)
  13. [@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. [@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. [@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))
Real CLI output for the login page in the Orbis benchmark suite. Hover a line or an element to match them.

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 results

11x faster

Time to load 200 pages

Headless Chrome3.4 s
Orbis0.31 s

11x less memory

Memory with 10 tabs open

Headless Chrome1,154 MB
Orbis107 MB

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.

  1. 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.

  2. 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.

  3. 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.

  1. FetchNetwork Core

    Adaptive 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.

  2. ParseDOM Engine

    High-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.

  3. ExecuteV8 Runtime

    Dynamic 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.

  4. DistillDistillation Core

    Semantic 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.

  5. ActAction Engine

    Deterministic 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.

--dump action_map
# 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))
Try it on your own pagenpx memora-orbis fetch https://your-site.example --dump action_map

Agent 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
agent.ts
const snapshot = await agent.goto('https://app.example.com/login');

agent.act('@4', 'alex@memora.company');  // type
agent.act('@9');                                 // click "Sign In"
output
[@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.

playwright.tsConnect over CDP instead of launching Chrome.
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.

mcp.json
{
  "mcpServers": {
    "orbis": {
      "command": "npx",
      "args": ["-y", "memora-orbis", "--mcp"]
    }
  }
}
tools/list15 tools
  • memora_browseLoad a URL; return Markdown, the action map and a token estimate
  • memora_actClick or type using an action ID or CSS selector
  • memora_fill_formFill several fields at once and optionally submit
  • memora_diffSummarise what changed since the previous turn
  • memora_forkCopy the current page to explore another path
  • memora_sessionSave or load cookies and web storage
  • memora_inspectList the title and current interactive elements
  • memora_extractPull text or attributes from matching elements
  • memora_metadataRead OpenGraph, Twitter card, canonical and JSON-LD
  • memora_consoleRead console logs, warnings and errors
  • memora_storageRead or write localStorage and sessionStorage
  • memora_cookiesList, set or clear cookies
  • memora_evalRun JavaScript in the page
  • memora_htmlGet raw HTML for the page or one element
  • memora_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 MyCrawler

Network 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-proxy

Benchmarks

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.

Login portal
836502 −40%
16 actions · 9.79 ms
Product grid
1,494941 −37%
32 actions · 3.85 ms
Financial data table
1,155697 −39.7%
20 actions · 4.25 ms
Settings form
910609 −33.1%
18 actions · 2.25 ms

Memory in one process

Engine at start
79.6 MB

Resident memory of the Node.js process after loading the engine

With 10 pages open
84.4 MB

Same process with ten test pages loaded

Each extra page
~0.5 MB

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:chrome

Orbis 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.
About Orbis Cloud

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.company

FAQ

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
Read the docs