Telemetry
OpenTabs collects completely anonymous telemetry data to help improve the platform. This page explains what is collected, why, and how to disable it.
Telemetry is enabled by default. You can opt out at any time with a single command.
Why is telemetry collected?
Telemetry helps us understand how OpenTabs is used in practice — what platforms people run it on, how many plugins are loaded, and whether the server starts in dev or production mode. This data guides decisions about which Node.js versions to support, when to optimize startup time, and where to focus testing.
We do not collect any personally identifiable information, plugin names, tool calls, or anything about what you do with OpenTabs.
What is collected?
Events are grouped into categories. Each event includes only anonymous metadata — no plugin names, no search queries, no error messages, no version numbers beyond the server itself.
Server lifecycle
server_started
Sent each time the MCP server starts.
| Property | Example | Description |
|---|---|---|
version | 0.0.82 | OpenTabs server version. |
os | darwin | Operating system (process.platform). |
arch | arm64 | Processor architecture (process.arch). |
nodeVersion | v22.11.0 | Node.js version. |
pluginCount | 12 | Number of loaded plugins (count only, not names). |
mode | production | dev or production. |
server_stopped
Sent when the MCP server shuts down.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
uptime_seconds | 3621 | How long the server ran, in seconds. |
tool_calls_total | 47 | Total number of tool calls during the session. |
tool_errors_total | 2 | Total number of tool errors during the session. |
tool_error_rate_bucket | 0-5% | Error rate range (bucketed, not exact). |
extension_was_connected | true | Whether the browser extension connected during the session. |
peak_concurrent_dispatches | 3 | Maximum concurrent tool dispatches observed. |
plugin_load_failures | 0 | Number of plugins that failed to load. |
extension_connected
Sent when the browser extension establishes a WebSocket connection.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
time_to_connect_bucket | 1-5s | Time from server start to extension connection (bucketed). |
profile_count | 1 | Number of Chrome profiles connected. |
dispatch_timed_out
Sent when a tool dispatch exceeds the timeout threshold.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
had_progress_updates | true | Whether the dispatch sent progress updates before timing out. |
duration_bucket | 30-60s | How long the dispatch ran before timeout (bucketed). |
Plugin lifecycle
plugin_installed
Sent when a plugin is installed.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
source | side_panel | Where the action was triggered from. |
plugin_removed
Sent when a plugin is removed.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
source | side_panel | Where the action was triggered from. |
was_failed | false | Whether the plugin was in a failed state when removed. |
plugin_source | npm | How the plugin was installed (npm or local). |
plugin_updated
Sent when a plugin is updated to a new version.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
source | side_panel | Where the action was triggered from. |
plugin_reviewed
Sent when a plugin passes the review process.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
permission_set | auto | Permission level assigned after review. |
review_source | agent | Who performed the review (agent or user). |
plugin_install_failed
Sent when a plugin installation fails.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
source | side_panel | Where the action was triggered from. |
error_category | npm_failure | Category of the failure (not the full error message). |
Permissions
permission_changed
Sent when a plugin or tool permission is changed.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
target | plugin | What was changed (plugin or tool). |
new_permission | auto | The new permission level. |
skip_permissions_changed
Sent when the global skip-permissions setting is toggled.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
enabled | true | Whether skip-permissions is now enabled. |
Search
plugin_search
Sent when a plugin search is performed.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
source | side_panel | Where the search was triggered from. |
result_count_bucket | 6+ | Number of results found (bucketed, not exact). |
Settings
plugin_configured
Sent when plugin settings are saved.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
source | side_panel | Where the settings were changed from. |
had_required_fields | true | Whether the plugin had required configuration fields. |
Updates
server_update_available
Sent when a newer version of OpenTabs is available.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
server_update_applied
Sent when a server update is applied.
| Property | Example | Description |
|---|---|---|
session_id | a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Random session identifier (UUIDv4). |
That's everything. No plugin names, no tool calls, no file paths, no environment variables, no error messages, no browsing data. All counts and durations are bucketed into ranges to prevent fingerprinting individual sessions.
How is identity handled?
Each installation is assigned a random UUID (v4), stored at ~/.opentabs/telemetry-id. This ID contains no personal information — it is a random string used solely to count unique installations. It is never correlated with any other identifier.
You can view your anonymous ID:
opentabs telemetry statusHow to opt out
CLI command (recommended)
opentabs telemetry disableTo re-enable later:
opentabs telemetry enableCheck the current status:
opentabs telemetry statusEnvironment variable
export OPENTABS_TELEMETRY_DISABLED=1Or use the community-standard DO_NOT_TRACK:
export DO_NOT_TRACK=1Config file
Set telemetry to false in ~/.opentabs/config.json:
{
"telemetry": false
}The check order is: OPENTABS_TELEMETRY_DISABLED → DO_NOT_TRACK → config file. The first match wins.
Verifying what is sent
Set the debug environment variable to print telemetry events to stderr instead of sending them:
OPENTABS_TELEMETRY_DEBUG=1 opentabs startEvents are printed to stderr in the format [telemetry] event_name {"key":"value"}. Nothing is sent to the network in debug mode.
Data handling
Telemetry is sent to PostHog (US region). Events are fire-and-forget — telemetry errors are caught silently and never affect server operation. The telemetry module has a 2-second shutdown timeout so it cannot delay process exit.
We do not sell telemetry data. Aggregated, de-identified data may be used to report on platform adoption.
Last Updated: 13 Apr, 2026