A real browser for AI agents.

REL is a native macOS browser for visible, persistent Chromium sessions. An agent works in the same window you do, not in a separate headless fleet. Every tab is an isolated browser session.

01 Isolated by default
Cookies, site data, private cache, storage, and routing stay with the tab.
02 Visible agent control
People and models work through the same persistent Chromium window.
03 Native, not scripted
Clicks and keystrokes use Chromium input, never caller-supplied JavaScript.
04 Six page representations
Choose rendered HTML, Markdown, semantics, pixels, or synchronized combinations.
REL on macOS with an isolated Hacker News session and an agent summarizing comments from the top three stories in Chat
Session1 IsolatedDirect RoutePrivate CacheVisible Chromium

Every tab is its own browser session.

One native app owns CEF. Every persistent session receives an isolated request context, storage directory, private cache, and optional direct or authenticated network route. A tab is a session, and a session remains independent of the profile that created it.

The agent works in the window you are looking at. REL reads the rendered page to locate a target, then dispatches ordinary Chromium mouse and keyboard input. The site receives the same event path it expects from a person; REL does not modify the page to make it actable.

Read the page. Resolve a bounded target. Act through Chromium.

Observe
A read-only CEF renderer snapshot describes rendered content, element roles and states, viewport geometry, and actionable bounds.
Resolve
Observation-scoped references bind actions to the page and session that produced them; model-supplied identifiers cannot reach another tab.
Act
REL dispatches clicks, keystrokes, scrolling, hovering, and selection as native Chromium input, including the ordinary DOM events a site expects.
Boundaries
No DevTools Protocol, caller-supplied JavaScript, DOM rewriting, accessibility-action shortcut, or hidden browser fallback is part of the control path.

Give the visible browser to a model.

REL exposes bounded browser operations through its native Chat panel and MCP. Chat stays attached to the visible tab; MCP uses the same public RPC v1 path and adds external session management.

ToolAvailable inOperation
rel_statusChat and MCPReturn RPC v1 readiness and diagnostics.
rel_notificationsChatList browser notifications the user chose to share.
rel_current_pageChat and MCPRead visible-page metadata and optional bounded HTML.
rel_captureChat and MCPLoad a URL in visible Chromium and return rendered HTML.
rel_readChat and MCPRead a URL or the current page as query-directed Markdown and links.
rel_observeChat and MCPReturn semantics, typed references, viewport data, and optional pixels.
rel_navigateChat and MCPNavigate by URL or history and return a fresh observation.
rel_findChat and MCPSearch a retained observation without reading the browser again.
rel_actionChat and MCPRun up to 32 ordered native actions and return a fresh observation.
rel_page_attachMCPAttach an external client to a visible browser page.
rel_page_actionMCPPerform structured actions against an attached page.
rel_take_screenshotMCPSave a viewport or full-page PNG, JPEG, or WebP image.
rel_list_sessionsMCPList persistent browser sessions available to the client.
rel_close_session_groupMCPClose a bounded group of persistent sessions.
rel_list_proxiesMCPList configured proxy aliases without exposing credentials.

Choose what the model receives.

REL does not force every model and task through one universal page format. Provider-aware auto begins with compact semantics and adds a synchronized viewport image only when the renderer reports visually incomplete content and the selected model accepts it.

Rendered HTML remains available as an explicit diagnostic rather than the default payload. Observation references are bounded to the chat and session that created them, so an identifier supplied by a model cannot reach another tab.

RepresentationWhat the model receivesBest for
HTMLRendered HTMLRendered markup, bounded in Chat or saved as an HTML file resource through MCP.Markup inspection and diagnostics.
MDSemantic MarkdownQuery-directed sections and links without action references or pixels.Research, excerpts, and broad reading.
SEMSemantic observationCompact content, element roles and states, bounds, viewport geometry, and typed references.Reading, extraction, and low-cost interaction.
SEM + PNGHybrid observationA semantic observation plus a synchronized current-viewport image.Reference-based interaction with visual grounding.
PNGVisual observationMinimal page semantics plus a synchronized current-viewport image.Canvas, charts, maps, and spatial inspection.
PNG / JPEG / WEBPStandalone screenshotA viewport or full-page image returned inline or saved through MCP.Pixel inspection and saved visual evidence.

The browser layer, handled.

Each session combines an isolated Chromium context with its own network policy and durable workspace. Profiles establish starting defaults; the resulting tab remains independently addressable from Chat, MCP, the bundled CLI, RPC v1, and the typed Rust client.

  1. One browser session per tab

    Every tab keeps its own request context, cookies, site data, service workers, private HTTP cache, storage directory, and network route.

  2. Pause / Play

    Pause cancels the current load and blocks every later request from that session. Play lifts the network gate and reloads.

  3. Image filtering

    Allow images, block every image, or block only images over a chosen size. The standalone default is 100 kB.

  4. Brave AdBlock

    Apply EasyList, EasyPrivacy, Brave Specific, and Brave Unbreak as network rules, per tab and globally.

  5. Per-session proxies

    Give every tab its own direct or authenticated route while credentials remain in Rust and macOS Keychain, outside Chromium.

  6. Profiles for every run

    Start from Direct, AdBlock, or BandwidthSaver. Once created, a session is independent of its source profile.

  7. Safe shared caching

    Reuse eligible public assets across tabs, partitioned by network route and never mixed with cookies, site storage, or private cache.

  8. Coherent browser identity

    Keep native Chromium defaults or configure one app-wide user agent, platform, locale, timezone, seed, and network profile.

  9. A terminal for every session

    Open Ghostty inside any tab with REL_SESSION_ID and REL_SESSION_URL already exported for the bundled CLI.

  10. Viewport presets

    Fit the REL window or pin desktop and mobile CSS bounds that stay exact in visible and background tabs.

  11. Per-session logs

    Inspect native session activity backed by append-only NDJSON files without turning logs into another public API surface.

Using the CLI: From simple capture to persistent sessions

The bundled CLI follows curl's stream model: page data goes to standard output and progress events go to standard error. A single URL is enough for capture, so the result can be redirected or piped without parsing terminal status text.

Stateful commands address the same visible session by ID. Create a session once, navigate it, dispatch ordered structured actions, and capture the resulting page without moving work to another browser process.

01

Simple capture

Load a URL in visible Chromium and write its rendered page to a file.

rel https://example.com > example.html
02

Navigate, perform, capture

Create a persistent session, act in it, and capture the same visible tab.

session_id="$(rel session create --name Research --id-only)"

rel navigate https://rel.me --session-id="$session_id"
rel perform '[{"action":"wait-for","selector":"body"}]' --session-id="$session_id"
rel capture --session-id="$session_id" > rel.html

Join the waitlist. Download with a code.

Leave your email for release updates. If you already have an access code, use it to download the private macOS DMG.

01

Join the waitlist

Get a note when REL is ready for broader access.

Product updates only. No spam.

 

02

Download REL

Already have an access code? Use it to unlock the macOS DMG.