> ## Documentation Index
> Fetch the complete documentation index at: https://docs.asymptotelabs.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Browser Extension

> Asymptote support details for Claude.ai and ChatGPT browser chat telemetry

## Runtime overview

Asymptote supports browser chat on Claude.ai and ChatGPT through an optional Chrome MV3 extension that relays conversation telemetry into the same local pipeline as agent activity.

The extension is in beta. It is not published on the Chrome Web Store and installs unpacked. It also reads the chat streams of two sites whose APIs are private and undocumented, so a change on either site can interrupt capture until the adapter is updated.

Browser chat resolves to two harness names, `claude_web` and `chatgpt_web`, so browser activity is attributed separately from CLI agents in the runtime log and the dashboard.

## Prerequisites

Before enabling browser chat telemetry, make sure:

* The Beacon endpoint is [installed](/cli/install) and running. The extension posts to the local collector on `http://127.0.0.1:4318/v1/logs`, which a default endpoint install already listens on, so no collector configuration is needed.
* Chrome, or another Chromium browser that can load an unpacked MV3 extension. Firefox and Safari are not supported.
* Node 22 or newer, if you are building from source rather than using a release archive.
* You have reviewed what the extension retains. It captures full prompt and response text by default.
* The people whose browsers it runs in know it is there, since it reads their Claude.ai and ChatGPT conversations.

Confirm the endpoint is up before installing the extension:

```bash theme={null}
beacon endpoint status
```

## Collection path

A content script running in the page's main world tees the streamed chat response, a per-site adapter parses it into a normalized turn, and the extension's service worker posts OTLP GenAI logs to the local collector. The `beaconjson` exporter converts those into endpoint events and writes them to the runtime JSONL log, alongside every other source.

The extension never writes files and never contacts a remote endpoint. Delivery is queued in local extension storage and retried with backoff, so a turn survives the service worker being suspended mid-stream.

Events collected this way carry `harness.collection_method` of `otlp`.

## Discovery and status

Asymptote treats the browser extension as a user-installed source. It is not configured by `beacon endpoint install`, has no hook or plugin file on disk, and does not appear in `beacon endpoint status`, which reports on the endpoint service rather than on browser extensions.

Its presence is therefore observed rather than declared: the evidence that it is working is `claude_web` or `chatgpt_web` events arriving in the runtime log. See [Confirm it is working](#confirm-it-is-working).

## Install or configuration support

<Note>
  The browser extension is in beta and is not published on the Chrome Web Store. It installs unpacked through Chrome's developer mode, so Chrome will not auto-update it: to move to a new version, download it again and reload. The published archive is unsigned, and its `.sha256` is the only integrity check it has.
</Note>

### Build it

No prebuilt archive is published yet, so building from source is currently the only way to get the extension. It needs Node 22 or newer and takes a few seconds:

```bash theme={null}
git clone https://github.com/Asymptote-Labs/agent-beacon.git
cd agent-beacon/browser-extension
npm ci
npm run build
```

That writes the loadable extension to `browser-extension/dist`. Note the full path, because Chrome asks for it in the next step:

```bash theme={null}
pwd -P  # then append /dist
```

### From a release archive

Once an `ext-v*` release is published, you will be able to skip the build and download `agent-beacon-browser-extension-<version>-chrome.zip` with its `.sha256` from the [releases page](https://github.com/Asymptote-Labs/agent-beacon/releases), then verify and unzip it:

```bash theme={null}
shasum -a 256 -c agent-beacon-browser-extension-<version>-chrome.zip.sha256
unzip agent-beacon-browser-extension-<version>-chrome.zip -d agent-beacon-extension
```

The unzipped folder is what you load, in place of `dist`.

### Load it in Chrome

1. Open `chrome://extensions`.
2. Turn on **Developer mode**, top right.
3. Choose **Load unpacked**, then select the `dist` folder you built (or the unzipped release folder).
4. Confirm "Agent Beacon — Browser Collector" now appears in the list and is enabled.
5. Click the extension's toolbar icon to check its status and, if you want, change the retention mode before capturing anything.

### Configuration

The extension is configured in its own UI, not by `beacon`. There is no CLI command and no config file on disk. Settings are split across two surfaces:

| Surface      | How to open it                                                                                                      | Settings                                                                                                          |
| ------------ | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Popup        | Click the extension's toolbar icon                                                                                  | Capture on/off, content retention (`full`, `redacted`, `metadata`), plus live queue depth and active stream count |
| Options page | Right-click the icon and choose **Options**, or use **Details** then **Extension options** in `chrome://extensions` | OTLP logs endpoint, and per-site checkboxes for claude.ai and chatgpt.com                                         |

Review the retention mode in the popup before capturing anything on a machine where the same browser profile is used for personal conversations. The default retains full chat text.

## Confirm it is working

Send one message on claude.ai or chatgpt.com, then look for the event:

```bash theme={null}
grep -c '"claude_web"\|"chatgpt_web"' ~/.beacon/endpoint/logs/runtime.jsonl
```

A count of one or more means the whole path worked: the extension parsed the stream, the collector accepted the OTLP payload, and the exporter wrote a normalized event. To read one:

```bash theme={null}
grep '"claude_web"\|"chatgpt_web"' ~/.beacon/endpoint/logs/runtime.jsonl | tail -1 | jq '{action: .event.action, harness: .harness.name, method: .harness.collection_method, model, session: .session.id}'
```

On a system-mode install the log lives at `/var/log/beacon-agent/runtime.jsonl` instead, and reading it needs `sudo`.

Or browse them in the [local dashboard](/cli/dashboard):

```bash theme={null}
beacon endpoint dashboard
```

If nothing arrives, work through it in this order:

* **The extension's toolbar popup** shows the queue depth and active streams. A growing queue means it captured the turn but cannot deliver it, which points at the collector rather than the adapter.
* **`beacon endpoint status`** confirms the collector is running and listening on `4318`.
* **The service worker console**, reachable from `chrome://extensions` by clicking "service worker" under the extension, shows delivery errors.
* **A hard reload of the chat tab.** The interceptor installs at document start, so a tab opened before the extension was loaded is not instrumented until it reloads.
* **Capture may be off, or off for that site.** Check the popup and the options page.

Chrome also disables unpacked extensions on restart in some managed configurations. If capture stops after a browser restart, check that it is still enabled in `chrome://extensions`.

## Retained content

Retention defaults to `full`. Browser chat telemetry has little investigative value without content, so the default keeps it, and the tradeoff is documented rather than defaulted away.

| Mode             | What is retained                                                               |
| ---------------- | ------------------------------------------------------------------------------ |
| `full` (default) | Complete prompt text, full assistant response, tool call arguments and results |
| `redacted`       | The same text with emails and API-key-shaped tokens scrubbed in the browser    |
| `metadata`       | No chat text. Actions, models, token counts, and tool names only               |

Retention is enforced in the browser before anything is sent, so under `metadata` the text never leaves the page. Endpoint-side redaction, sanitization, truncation, and event-size limits apply to whatever is sent.

Change the mode in the extension's popup before enabling it on a machine where the same browser profile is used for personal conversations.

## Telemetry coverage

| Area                         | Support                                                                                       |
| ---------------------------- | --------------------------------------------------------------------------------------------- |
| Prompt telemetry             | Supported, with full prompt text under `full` and `redacted` retention                        |
| Assistant response telemetry | Supported, including the response text and model                                              |
| Tool telemetry               | Supported where the chat stream exposes tool calls, including call id, arguments, and results |
| Token usage                  | Supported for Claude.ai. ChatGPT web does not report usage in its stream                      |
| Command and file telemetry   | Not applicable. Browser chat performs no local commands or file edits                         |
| Approval telemetry           | Not available. Neither site exposes approval decisions to a page script                       |
| Session lifecycle            | Partial. Turns are correlated by conversation id; there is no session start or stop signal    |
| Local JSONL and dashboard    | Supported after events reach the collector                                                    |
| MDM deployment               | Not covered by Beacon's MDM assets. Distribute through browser policy instead                 |
