# Browser

> Preview pages in a browser tab, leave notes on elements and send them to an agent.

The browser is a center tab that renders pages with the system WebKit engine, the same one Safari uses. You can open local dev servers and live sites in it, inspect them, and send notes about page elements to an agent. Agents can also drive a browser tab of their own with [`rexa web`](/docs/reference/rexa-web).

## Open a browser

- **Launch picker:** press <Kbd>⌘</Kbd> <Kbd>N</Kbd> and pick **Browser**. The tab opens in the focused pane.
- **New tab default:** set **Settings → Launch new tab** to Browser, and <Kbd>⌘</Kbd> <Kbd>T</Kbd> and the `+` button open a browser instead of a console.
- **Links that open a new window** (`target="_blank"`, `window.open`) open a new browser tab.

A browser tab keeps its page URL across a relaunch. The tab title shows the page host, such as `localhost:3000`.

## Toolbar

| Control             | What it does                                                         |
| ------------------- | -------------------------------------------------------------------- |
| Back, Forward       | Move through history. Dimmed when there is nowhere to go.            |
| Reload              | Reload the page.                                                     |
| URL field           | Enter loads the address and moves focus to the page.                 |
| Note picker         | Turn on the element picker to leave notes.                           |
| Rexa box            | Open the box that messages the linked agent.                         |
| `…` More actions    | Open devtools, open in default browser, hard reload, reset or import cookies. |

The URL field keeps a scheme you type (`file://`, `about:` and `data:` work). Local addresses (`localhost`, `*.localhost`, `127.*`, `0.0.0.0`, `[::1]`) get `http://`; everything else gets `https://`. The field does not search the web.

## Pages

A browser holds several pages. A page strip appears when there is more than one; click a page to show it, or `x` to close it. Open a new page from the palette with **browser: new page**.

## Keys

These work while the browser tab is active:

| Action             | Shortcut                                             |
| ------------------ | ---------------------------------------------------- |
| Focus the URL      | <Kbd>⌘</Kbd> <Kbd>L</Kbd>                            |
| Back / forward     | <Kbd>⌘</Kbd> <Kbd>[</Kbd> / <Kbd>⌘</Kbd> <Kbd>]</Kbd> |
| Reload             | <Kbd>⌘</Kbd> <Kbd>R</Kbd>                            |
| Toggle the Rexa box | <Kbd>⌘</Kbd> <Kbd>I</Kbd>                           |
| Find in page       | <Kbd>⌘</Kbd> <Kbd>F</Kbd>                            |
| Next / previous match | <Kbd>⌘</Kbd> <Kbd>G</Kbd> / <Kbd>⌘</Kbd> <Kbd>⇧</Kbd> <Kbd>G</Kbd> |

Zoom with <Kbd>⌘</Kbd> <Kbd>=</Kbd>, <Kbd>⌘</Kbd> <Kbd>-</Kbd> and <Kbd>⌘</Kbd> <Kbd>0</Kbd> while the page itself has focus. Zoom steps run from 50% to 300% and change the page only, not Rexa's font size.

## Web Inspector

Open WebKit's inspector with right-click → **Inspect Element**, `…` → **Open devtools**, or the palette command **browser: open devtools**. It docks inside the browser tab.

## Notes on page elements

Point at an element, write what should change, and send it to an agent.

<Steps>

### Turn on the picker

Click the pointer button in the toolbar, or run **browser: toggle picker** from the palette. The element under the cursor is outlined with its role, name and size.

### Write the note

Click the element. A note box asks what should change.

### Send or keep it

Press <Kbd>↵</Kbd> to send the note to the agent now, or <Kbd>⌘</Kbd> <Kbd>↵</Kbd> to add it to the tray. <Kbd>⇧</Kbd> <Kbd>↵</Kbd> adds a line break.

</Steps>

Each note records the page URL, the element's text, a target the agent can pass back to `rexa web`, and a screenshot of the element. Notes get numbered pins on the page. The tray at the bottom right lists them with Send and Delete per row, and **Send all** in its header. You can also drag a pin onto a terminal.

A note goes to the browser's linked agent. Without a link, it goes to the worktree's only agent; with several agents, Rexa asks which one.

<Callout type="note">
  Notes do not survive a relaunch, and the picker does not reach into iframes.
</Callout>

## Rexa box

The Rexa box messages an agent from the browser and shows its replies.

- **Open it** with <Kbd>⌘</Kbd> <Kbd>I</Kbd> or the Rexa mark in the toolbar. Drag it to move it; drag its corner to resize.
- **Pick the agent** from the header. It lists the worktree's agents and their status. **Start new agent…** opens the launch picker, and the new agent links to this browser when it starts.
- **Send** with <Kbd>↵</Kbd>. The message is typed at the agent's prompt, prefixed with the browser and page it came from. An agent that has finished is resumed with it.
- **Busy agents queue one message.** Cancel puts it back in the input.
- **Replies stream** into the box as the agent writes them. Tool calls are left out.

## Agents in the browser

When an agent runs `rexa web` from a Rexa terminal, its first command opens a browser tab linked to that agent, in a pane beside its terminal. Later commands drive the same tab. Every agent action shows on the page: a glowing border, a moving pointer, and a ripple on clicks.

Rexa installs a browser skill that teaches agents this loop. See [Skills](/docs/agents/skills) and the [`rexa web` reference](/docs/reference/rexa-web).

## Cookies and sign-in

- **Sign-in popups work.** A page that opens a sized popup gets a native window with `window.opener`, so OAuth flows complete.
- **Paste cookies** from `…` → **Import cookie**. Paste a `Cookie` header; each cookie is set on the current host.
- **Import from a local browser** with `rexa web import-cookie <url> --from firefox|chrome`. Firefox asks for confirmation in the app; Chrome asks in the terminal and may show a Keychain prompt.
- **Reset cookies** for the current site from `…` → **Reset cookie**.

All browser tabs share one cookie store. There is no private mode.

## Page size

`rexa web resize 390x844` pins the page to a device size, capped by the pane. A size chip in the toolbar shows the pin; click it to fill the pane again.

## Dialogs

Page `alert`, `confirm` and `prompt` dialogs are not shown. They are dismissed unless an agent armed an answer with `rexa web dialog accept|dismiss`.

## Limits

- Cross-origin iframes cannot be inspected or driven.
- Agents cannot open native context menus or native `<select>` popups.
- `rexa web requests` records fetch and XHR only.
- No network or CPU throttling, and no geolocation.
- A page covered by another window is throttled by WebKit.
