Simple capture
Load a URL in visible Chromium and write its rendered page to a file.
rel https://example.com > example.htmlREL 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.

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.
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.
| Tool | Available in | Operation |
|---|---|---|
rel_status | Chat and MCP | Return RPC v1 readiness and diagnostics. |
rel_notifications | Chat | List browser notifications the user chose to share. |
rel_current_page | Chat and MCP | Read visible-page metadata and optional bounded HTML. |
rel_capture | Chat and MCP | Load a URL in visible Chromium and return rendered HTML. |
rel_read | Chat and MCP | Read a URL or the current page as query-directed Markdown and links. |
rel_observe | Chat and MCP | Return semantics, typed references, viewport data, and optional pixels. |
rel_navigate | Chat and MCP | Navigate by URL or history and return a fresh observation. |
rel_find | Chat and MCP | Search a retained observation without reading the browser again. |
rel_action | Chat and MCP | Run up to 32 ordered native actions and return a fresh observation. |
rel_page_attach | MCP | Attach an external client to a visible browser page. |
rel_page_action | MCP | Perform structured actions against an attached page. |
rel_take_screenshot | MCP | Save a viewport or full-page PNG, JPEG, or WebP image. |
rel_list_sessions | MCP | List persistent browser sessions available to the client. |
rel_close_session_group | MCP | Close a bounded group of persistent sessions. |
rel_list_proxies | MCP | List configured proxy aliases without exposing credentials. |
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.
| Representation | What the model receives | Best for |
|---|---|---|
HTMLRendered HTML | Rendered markup, bounded in Chat or saved as an HTML file resource through MCP. | Markup inspection and diagnostics. |
MDSemantic Markdown | Query-directed sections and links without action references or pixels. | Research, excerpts, and broad reading. |
SEMSemantic observation | Compact content, element roles and states, bounds, viewport geometry, and typed references. | Reading, extraction, and low-cost interaction. |
SEM + PNGHybrid observation | A semantic observation plus a synchronized current-viewport image. | Reference-based interaction with visual grounding. |
PNGVisual observation | Minimal page semantics plus a synchronized current-viewport image. | Canvas, charts, maps, and spatial inspection. |
PNG / JPEG / WEBPStandalone screenshot | A viewport or full-page image returned inline or saved through MCP. | Pixel inspection and saved visual evidence. |
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.
Every tab keeps its own request context, cookies, site data, service workers, private HTTP cache, storage directory, and network route.
Pause cancels the current load and blocks every later request from that session. Play lifts the network gate and reloads.
Allow images, block every image, or block only images over a chosen size. The standalone default is 100 kB.
Apply EasyList, EasyPrivacy, Brave Specific, and Brave Unbreak as network rules, per tab and globally.
Give every tab its own direct or authenticated route while credentials remain in Rust and macOS Keychain, outside Chromium.
Start from Direct, AdBlock, or BandwidthSaver. Once created, a session is independent of its source profile.
Reuse eligible public assets across tabs, partitioned by network route and never mixed with cookies, site storage, or private cache.
Keep native Chromium defaults or configure one app-wide user agent, platform, locale, timezone, seed, and network profile.
Open Ghostty inside any tab with REL_SESSION_ID and REL_SESSION_URL already exported for the bundled CLI.
Fit the REL window or pin desktop and mobile CSS bounds that stay exact in visible and background tabs.
Inspect native session activity backed by append-only NDJSON files without turning logs into another public API surface.
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.
Load a URL in visible Chromium and write its rendered page to a file.
rel https://example.com > example.htmlCreate 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.htmlLeave your email for release updates. If you already have an access code, use it to download the private macOS DMG.
Get a note when REL is ready for broader access.
Already have an access code? Use it to unlock the macOS DMG.