TabCrew privacy policy
Effective date: November 2, 2026. Applies to the TabCrew browser extension and the tabcrew command-line tool (the local "daemon", and in hub mode the local "hub" started by tabcrew mcp), version 0.4.0 and later, and to the TabCrew Online relay at https://tabcrew.huynle.com (extension version 0.6.0 and later).
The short version
- In its local modes (daemon and hub), TabCrew has no servers and no accounts, and the developer never receives any of your data.
- Online mode is optional and off unless you choose it. It connects your browser to the TabCrew relay at
tabcrew.huynle.com, run by the developer, so that your agents can reach your browsers from anywhere. You sign in with GitHub or Google. The relay stores a small account record and, if you set them, your model provider settings with your API key, encrypted (see Online mode). It passes agent commands and the content of agent tabs between your agents and your browser, and sends page content to your model provider (and to your Decisions provider, if you set one) when you usebrowse. It does not store page content unless you turn on run recording with full traces in your account (see Online mode, "Run recording"). - There are no analytics, crash reports, ads or tracking, in any mode. Daemon and hub mode have no telemetry and no recording. Online mode has optional run recording, off by default, that you turn on for your own account and only you can see in detail (see Online mode, "Run recording").
- In daemon and hub mode, the extension only talks to the TabCrew daemon or hub running on your own computer (
127.0.0.1). In hub mode, and in Online mode when you choose this browser's own provider, it also talks to the AI model provider you configured in its popup. In Online mode it also talks to the relay. It talks to no one else. - If you use the
browsetool, the content of the agent's page goes to the AI model providers you configured (including a Decisions provider, OpenRouter by default), using your API keys. Screenshots of the agent's tab go too, but only to your Decisions provider and only if you turn them on (they are off by default). In daemon mode the daemon on your computer sends it; in hub mode the extension sends it directly. Nothing else leaves your computer because of TabCrew.
What TabCrew is
TabCrew lets AI agents that you run on your own computer (for example OpenCode or Claude Code) use your browser. It has two parts, both running only on your machine:
The extension, which opens tabs for agents, reads those tabs, and clicks or types in them when an agent asks.
The daemon, installed with
npx tabcrew setup, which your agents connect to. It is free and open source.In hub mode (for browsers where native messaging is blocked), there is no installed daemon. Instead, your agent tool starts
tabcrew mcp, which runs the same software as a "hub" while agents use it. In this mode the extension keeps the model provider settings and makes the model calls itself.In Online mode, the extension connects to the TabCrew relay instead, and your agents connect to the relay's MCP address (
https://tabcrew.huynle.com/mcp). The software that runs on your computer in the other modes runs on the relay for you. See Online mode.
What the extension accesses, and why
| Data | When | Where it goes |
|---|---|---|
| Text, links, buttons and form fields of pages in agent tabs | When an agent calls observe, read_text, act or browse |
Only to the daemon on your computer |
| Screenshots of agent tabs | When an agent calls screenshot, or calls browse while decision screenshots are on (see What the daemon sends off your computer) |
Only to the daemon on your computer; with decision screenshots on, the daemon forwards them to your Decisions provider |
| Console messages and request metadata of agent tabs (method, origin and path, status, type; never headers, cookies, bodies or query strings) | When an agent calls debug_logs |
Only to the daemon on your computer |
| Titles, URLs, windows and tab group membership of tabs | To keep each agent inside its own tabs and show sessions and groups in the popup | Stays in the browser, or goes to the daemon on your computer |
| Which agent session owns which tab, and which tab groups and window are TabCrew's (tab, group and window ids, and session IDs) | When agents open, finish or close tabs | Stored in the extension's local storage on your computer, so agents stay isolated even after the extension reloads. Wiped when the browser restarts. Never sent anywhere else |
| The names of TabCrew tab groups (the default "TabCrew" group, groups you create or rename in the popup, groups agents ask for) | When you or an agent create or rename a group | Stored in the extension's local storage and shown as Chrome tab group titles; group names an agent uses are also kept with its session on the daemon or hub on your computer |
| The daemon's access token | Fetched once from your computer by pairing (or typed by you) | Stored in the extension's local storage on your computer |
| Your settings (tab placement, default group name, what happens to an agent's tabs when it finishes, connection mode, daemon or hub port) | When you change them | Stored in the extension's local storage on your computer |
| Hub mode: the pairing secret ("pin") shared with the hub | Created on first connection | Stored in the extension's local storage and in a private file on your computer (~/Library/Application Support/TabCrew/hub-pin on macOS). Never sent anywhere else |
| Hub mode: model provider settings (base URL, API key, optional headers, model names) | When you click Save under Model provider | Stored in the extension's local storage on your computer, not synced. The key and headers are sent only to that provider, with each model call. The popup never shows the saved key again (only its last 4 characters) |
| Hub mode: unsaved changes to the model provider form, including an API key you typed | While you type, so they survive Chrome closing the popup for its permission prompt | Kept in the extension's session storage (in memory, never synced) until you click Save or Remove, or the browser restarts (also cleared when the extension is reloaded). Never sent anywhere |
| Daemon mode: API keys and model names you enter under Advanced | When you click Save | Sent over the local connection to the daemon on your computer, which stores them in ~/.tabcrew/env or config.toml. The extension never stores them; the daemon shows only a key's last 4 characters back |
Agents can only reach tabs they opened themselves, even when several agents share one tab group. Your own tabs and tab groups are never read or changed unless you give a tab to an agent, which TabCrew does not do on its own; a tab you drag into a TabCrew group stays yours. Password, file and hidden form fields are excluded from what agents observe.
Chrome may show TabCrew's tab groups as saved groups on the bookmarks bar. That is Chrome's own saved tab groups feature, stored by Chrome like any other tab group; TabCrew doesn't create bookmarks.
What the daemon sends off your computer
Daemon mode. Only one thing, and only if you use it: when an agent calls browse, the daemon sends the current agent page's visible text and its list of controls, plus the agent's goal and the steps taken so far, to the model providers you set up:
- The Decisions provider, which picks each step: OpenRouter's Decisions API by default, or any provider of the same Decisions API that you configure (
decisions_urlinconfig.toml, or Advanced → Decisions provider in the popup). - Chat or text model providers: the text model that writes the values
browsetypes (OpenRouter by default), and a chat decision model if you set one.
Screenshots (optional, off by default). If you turn them on (the popup's Attach a screenshot to each browse decision, decision_images in config.toml, or an agent calling browse with screenshot: true), the daemon also sends a screenshot of the visible part of the agent's tab (JPEG, at most 1568 pixels per side) with each request to your Decisions provider. Screenshots go to no other provider, and are never written to the browse result, to logs or anywhere on disk.
The daemon uses your own API keys, which are stored in ~/.tabcrew/env on your computer (whether you entered them during setup or in the extension popup), each sent only to the provider it is for: your OpenRouter key is never sent to a custom Decisions provider, which uses its own key (DECISIONS_API_KEY). Each provider's privacy policy applies to the data it receives. If you do not add a key, browse is disabled and nothing is sent.
tabcrew setup, tabcrew doctor --online and saving an OpenRouter key in the extension popup (or a Decisions key while the Decisions endpoint is OpenRouter's) also make one free request to OpenRouter to check that the key is valid. A key for another Decisions provider is not checked, so nothing is sent to that provider until browse runs.
What the extension sends off your computer in hub mode
In hub mode, the hub on your computer prepares the same browse requests. The extension sends them directly to the provider you saved under Model provider (for example OpenRouter, OpenAI or Anthropic), using your key and headers, and only to that provider's /chat/completions address. Chrome asks you to allow access to that provider's site the first time you click Load models, Test or Save, and nothing goes there until you allow it. Load models asks the same provider for its list of models (with the key and headers in the form). Test makes two small requests to it: it lists the models, and sends a tiny chat message. Once access is granted, opening the popup lists the models again by itself. If you set no provider, browse is disabled and nothing is sent. Hub mode does not use the Decisions API, so it never sends screenshots to a model provider. Nothing else changes: TabCrew still has no servers and no telemetry, and the developer receives nothing.
Online mode (TabCrew relay)
Online mode is for using your browsers from agents on other computers, or through an MCP gateway. You turn it on in the popup (Connection → Online), give the browser a name and sign in. The relay at https://tabcrew.huynle.com is run by the TabCrew developer on their own server.
Signing in. You sign in with GitHub or Google, in a browser window. TabCrew asks GitHub for your public profile and email address (read:user user:email), and Google for your basic profile and email address (openid email profile). It never sees your GitHub or Google password and never asks for access to anything else. The extension uses Chrome's identity permission only to show that sign-in window. Agents (MCP clients) sign in the same way, through the relay's sign-in page.
What the relay stores (in its database):
| Data | Why | How long |
|---|---|---|
| Your account: the sign-in provider (GitHub or Google) and its user ID, your verified email address and display name, if the provider returns them | To know which browsers and agents are yours | Until your account is deleted |
| The names you give your browsers | So agents can pick a browser, and so you can see and revoke them | Until you revoke the browser or your account is deleted |
| The agents (MCP clients) you signed in: their name and the address they return to after sign-in | So they can refresh their sign-in, and so you can see and revoke them | Until revoked or deleted |
| Sign-in tokens, stored only as one-way hashes | To keep the extension and your agents signed in | Until they expire, are replaced or are revoked |
| One-time sign-in steps and codes | To finish a sign-in | 10 minutes and 1 minute |
| Your model settings, if you set them on the Model settings page: provider address, API key, optional extra headers and model names, and the optional Decisions provider (its address, API key and model, and whether to attach screenshots) | So the relay can call your model and Decisions providers for browse from any of your browsers. Encrypted (AES-256-GCM) with a key only the relay server has; the API keys are never shown again (only their last 4 characters) and never sent to your browsers |
Until you click Remove or your account is deleted |
| Run recordings, only if you turn recording on: metrics, and with Full traces also page content per step (see Online mode, "Run recording") | So you can see how your agents and browse perform, and review runs. Traces are encrypted (AES-256-GCM) with a key only the relay server has |
Metrics 90 days by default (30 or 365 to choose from), traces 14 days by default (7, 30 or 90 to choose from), or until you delete them or your account is deleted |
What passes through the relay without being stored. Your agents' tool calls and their answers travel through the relay: the text, links, buttons and form fields of agent tabs, screenshots, console messages and request metadata, page URLs and titles, and the agent sessions themselves (labels, group names, which tabs belong to which session). The relay keeps them in memory only while they are in use. An agent session ends when the agent closes it, when you stop it in the popup, or after 30 minutes without use. The relay never writes screenshots (including those sent with browse decisions) or typed text to its database or its logs. It writes no page content to its database unless you turn on full traces (see Online mode, "Run recording"), and never to its logs. The connections are encrypted (HTTPS), but the relay itself handles this data unencrypted, as any MCP server does. If you add the relay to an MCP gateway, that gateway handles it too.
Model provider and browse. If you set a provider on the relay's Model settings page, the relay itself sends the browse requests (the agent's goal, and the current page's visible text and list of controls) to that provider, with your key and headers, and only to that provider's /models and /chat/completions addresses. Load models and Test on that page ask the same provider for its model list and send a tiny chat message.
If you also set a Decisions provider there (optional; the OpenRouter preset suggests https://openrouter.ai/api/alpha/decisions), the relay sends each step's decision request (the same goal, page text and controls) to that Decisions address instead, with the Decisions key, or with the provider's key only when the Decisions address is on the provider's own host. With Attach screenshots checked, or when an agent calls browse with screenshot: true, each Decisions request also carries a screenshot of the visible part of the agent's tab (JPEG, at most 1568 pixels per side), which the relay holds in memory only for that request. Screenshots go only to the Decisions provider. Save & test Decisions sends it one tiny question with no page content.
The relay only connects to providers, including Decisions providers, on the public internet over HTTPS. That provider's privacy policy applies to what it receives. If a browser uses its own provider instead (popup: Use this browser's own provider), the extension makes those calls directly, as in hub mode (no Decisions requests and no screenshots), and the relay never receives that key. Without either, browse is disabled and nothing is sent.
Run recording (optional). Recording is off by default. You turn it on for your account at https://tabcrew.huynle.com/account/recording. It has two levels:
- Metrics (no page content): tool names, success or error codes and timings; for
browse, its status, steps, the operation and error of each step, the model's confidence and timing, model names, token counts and cost; the agent app's name and version, the extension and relay versions; the hostname a session started on; the optional success or failure verdict an agent gives when it closes a session; and the labels you set on runs. - Full traces (a separate checkbox; needs metrics on): the
browsegoal, and for each step the page URL, title, list of page elements and up to 2,000 characters of visible page text, and the model's one-line reason; and the agent's closing note. Traces are encrypted in the relay's database (AES-256-GCM, with a key only the relay server has). Text that agents type is never stored; it is replaced by its length. Screenshots are never stored, at either level.
You see your recordings at https://tabcrew.huynle.com/account/stats and https://tabcrew.huynle.com/account/runs. The developer, as operator, sees only totals across all accounts that turned recording on, never per-account rows, hostnames or traces. Metrics are kept 90 days by default (you can choose 30 or 365), traces 14 days by default (you can choose 7, 30 or 90). Turning traces off deletes them. The recording page has buttons to delete your traces or all your recordings. Deleting your account deletes them too. Daemon and hub mode have no recording.
Logs. The relay logs sign-in steps (for example "Google sign-in ok"), browser connections and disconnections, refused requests, and errors, with times. Logs never contain page content, typed text, tokens, codes or keys. The web server in front of the relay may log standard request details (IP address, time, address requested). Logs are kept on the developer's server and rotated.
Backups. The relay's database (the stored data above, including any recordings, still encrypted for traces) is backed up every night to storage the developer controls. Deleted data, including recordings, leaves the backups as they rotate.
Your controls. https://tabcrew.huynle.com/account lists your browsers and agents, with Revoke buttons; revoking one disconnects it and deletes its sign-in. https://tabcrew.huynle.com/account/recording turns recording on or off, sets how long it is kept, and deletes it. Sign out in the popup ends the browser's sign-in, and Pause agents in this browser stops agents from using it. To delete your account and everything stored for it, open an issue (see Contact) or use the support email shown on the Google sign-in screen; deletion is done within 30 days, and removed from backups as they rotate.
The developer does not look at the data passing through the relay or your recordings, except to investigate a problem you report, and never shares or sells it.
What is stored on your computer
Daemon mode: in ~/.tabcrew/ (readable only by your user account), the access token, your API key (if you added one), the list of open agent sessions (with their labels and group names), optional configuration, and service logs. Logs contain session IDs, tool names and timings; they never contain page text, screenshots, typed values, tokens or keys. npx tabcrew uninstall --purge deletes all of it.
Hub mode uses no ~/.tabcrew. It keeps the list of open agent sessions, its logs and its runtime files in a private per-user temporary folder, and the pairing pin in ~/Library/Application Support/TabCrew/ (macOS). The provider settings and key stay in the extension's local storage; unsaved changes to them stay in its session storage until you save or remove them, or the browser restarts.
In Online mode the extension keeps the relay address, the browser's name, its sign-in token (v2:online) and whether it uses its own provider in its local storage, and its own provider settings, if you set any, as in hub mode.
In every mode the extension's local storage also holds your settings, the TabCrew group names, and which tabs, groups and window belong to which agent session (ids only, wiped when the browser restarts).
Removing the extension deletes its local storage.
Sharing and selling
TabCrew does not sell, rent or share your data with anyone. In the local modes the developer does not collect it in the first place; in Online mode the relay keeps only the account data, model settings and, if you turn it on, the run recordings described above. Data is used only to do what you or your agents ask TabCrew to do in your browser.
Children
TabCrew is a developer tool and is not directed at children.
Changes
Changes to this policy are published in this file in the TabCrew repository, with a new effective date. The full history is public on GitHub.
Contact
Questions or concerns: open an issue at https://github.com/huynle/tabcrew/issues. For security problems, please use private vulnerability reporting as described in SECURITY.md.
TabCrew is an independent open-source project. It is not affiliated with, endorsed by, or sponsored by Google.