Skip to content

Begin typing to search this documentation.

Browser collection

Browser collection fills the gap between occasional account exports. The extension observes only the conversation currently rendered in a ChatGPT tab, normalizes bounded semantic message blocks, and forwards the observation to the local native host.

It does not read cookies, access tokens, local storage, passwords, or undocumented ChatGPT APIs.

ChatGPT tab
→ content script
→ extension background context
→ native messaging
→ historia-collect-host
→ Git source ref
→ SQLite projection
  1. Install the browser bridge.
  2. Read the privacy and data-handling disclosure.
  3. Open a ChatGPT conversation.
  4. Open the Historia Collect popup.
  5. Choose Collect this conversation.
  6. Confirm that the popup reports the archive commit and refreshed index.

The host commits browser observations to a source ref beneath:

refs/historia/sources/openai-browser/<source-key-digest>

The private source key is configured in the extension options and hashed before it appears in refs or tree paths.

Manual collection is the default. It creates an explicit user action for each captured conversation, and the popup states that the rendered conversation is sent to a native host on the same computer.

Automatic collection can be enabled in extension settings. It is opt-in, debounced after rendered-message changes, and still captures only tabs matching the permitted ChatGPT origins. The settings page repeats the local-transfer disclosure before the preference is saved.

Exact content duplicates are idempotent. Observing the same normalized conversation later does not create a duplicate transaction merely because the observation timestamp changed.

Firefox 140 or newer is required. The extension uses Firefox’s built-in consent model and declares:

browsingActivity
personalCommunications
websiteContent

These categories represent the current ChatGPT page identity, rendered chat messages, and visible page content transferred to ai.greenways.historia_collect on the same computer. They do not mean that Greenways receives the data.

The same Manifest V3 source remains compatible with Chromium-family browsers: Chromium uses background.service_worker, while Firefox uses background.scripts.

The browser observation format is a graph rather than a flat transcript. Each message has a stable local identity, parent relationships, semantic blocks, and an optional position on the active path.

Historia rejects:

  • cyclic parent relationships;
  • dangling parents;
  • duplicate message IDs;
  • over-sized messages, blocks, strings, nesting, or total payloads;
  • unsupported page origins;
  • credential-shaped metadata fields.

Alternate branches visible in the rendered page can therefore survive as graph structure instead of being flattened into one lossy transcript.

Browser records are stored as:

browser-observed

This means “rendered content observed by Historia at this time.” It does not mean that Historia cryptographically proved provider authorship, captured the entire account, or observed branches the browser did not render.

The extension page and content script are treated as untrusted inputs. The host:

  • accepts only bounded length-prefixed JSON frames;
  • validates protocol version, request ID, and operation;
  • validates and canonicalizes the complete observation;
  • strips query strings and fragments from captured page URLs;
  • accepts only configured ChatGPT HTTPS origins;
  • checks the extension caller against the native-manifest identity;
  • uses atomic compare-and-swap Git ref updates;
  • writes no network remote unless the user separately configures one.

The extension requests only nativeMessaging, storage, and tabs, plus content-script access to the declared ChatGPT origins. It does not request cookies, history, proxy, debugger, management, web-request interception, geolocation, downloads, or unlimited storage.

Use Check connection in the popup to send a native ping. For filesystem and manifest diagnostics, run:

Terminal window
historia-collect doctor --browser chrome

A local observation document can also be tested without loading the extension:

Terminal window
historia collect capture-json browser-observation.json

The file must conform to historia.collect.browser-observation/v1.