Usage Stats
Harbor's anonymous usage statistics, collected fields, and opt-out controls.
Harbor collects minimal anonymous usage statistics to understand how the CLI is used, which execution paths are reliable, and where development work should be prioritized.
Usage stats are enabled by default. You can opt out at any time:
HARBOR_TELEMETRY=off harbor run ...Identity
Harbor generates a random installation ID on first use and stores it in the user config directory as telemetry_id. This ID is used as the analytics distinct_id so Harbor can group events from the same local installation across sessions.
The installation ID is not derived from your IP address, username, email, GitHub account, job name, task name, or file paths.
Delivery
Events are handed to a short-lived detached helper process that sends them after the command returns, so telemetry never delays a command. The helper makes a single delivery attempt and exits; events that cannot be delivered, for example while offline, are dropped.
Events
Harbor sends two lifecycle events:
harbor.command_finishedharbor.job_finished
harbor.command_finished
This event describes a completed Harbor CLI invocation. It is emitted from the CLI boundary after a command returns, errors, or is interrupted.
Collected fields include:
- Harbor version, install source, Python version, operating system, architecture, and whether the process appears to run in CI
- launch source:
cli,viewer, orunknown - the AI coding agent driving the invocation, when a known agent environment marker is present: a fixed label such as
claude-code, orunknown-ai-agentfor the generic marker convention; environment variable values are never collected - sanitized command and command path, such as
run,view, orjob start - command flag names, such as
--task,--config, or-t; only flag names registered on the invoked command are recorded, and flag values and positional arguments are never collected - status:
completed,errored, orinterrupted - duration in seconds
- exit code
- exception type only, when available
- job IDs of the Harbor jobs the command runs, so multi-job commands such as sweeps stay linked to their invocation
harbor.job_finished
This event describes the resolved job configuration, final job result, and aggregate runtime measurements. It is emitted when the job lifecycle ends, including normal completion, handled errors, and keyboard interruption when Harbor can run cleanup.
Collected fields include:
- Harbor version, install source, Python version, operating system, architecture, and whether the process appears to run in CI
- job ID, which is the runtime UUID already used by Harbor's
JobResult.id - launch source:
cli,viewer,programmatic, orunknown - the AI coding agent driving the invocation, when a known agent environment marker is present (same fixed labels as
harbor.command_finished) - whether the job is a resumed job
- task count, total planned trials, attempts, concurrency, retry settings, install-only mode, and verification-disabled mode
- environment type and resource override counts
- whether GPU or TPU resources are requested
- agent names, agent count, model providers, and model names
- whether custom agents, custom environments, custom verifiers, custom metrics, MCP, skills, artifacts, or extra instructions are used
- dataset source types such as local, package, registry, repo, or git
- Harbor-owned registry/package dataset refs and package task refs
- whether custom registry URLs or registry paths are used
- aggregate task-shape fields such as multi-step task count, separate-verifier task count, and network modes
- status
- duration in seconds
- completed, errored, cancelled, pending, and running trial counts
- retry count
- exception types only
- aggregate input tokens, cache tokens, output tokens, and cost in USD when agents report them
- aggregate trial duration statistics: min, mean, p50, p95, and max
- average standard reward for the conventional
rewardkey
What Harbor Does Not Collect
Harbor does not intentionally collect:
- raw command arguments
- raw job configuration
- local dataset or task paths
- repo URLs, repo org/name values, or repo subdirectories
- custom registry URLs or registry file paths
- dataset include/exclude task-name filters
- job names or trial names
- local file paths
- repository URLs
- task instructions or prompts
- task names for local/private tasks
- environment variable names or values
- agent or environment kwargs
- MCP server names or URLs
- artifact paths
- exception messages or tracebacks
- usernames, emails, or organization names
- IP address or GeoIP-derived location
Telemetry events are sent with PostHog person profile processing disabled and GeoIP disabled.
Launch Source
Harbor records launch source as runtime metadata, not as part of the replayable job configuration:
- normal terminal commands are marked as
cli - jobs started from the viewer run launcher are marked as
viewer - direct Python use of
Job.create(...).run()is marked asprogrammatic
If HARBOR_LAUNCH_SOURCE is set to an unrecognized value, Harbor records unknown.