A ctlplne studio product
trstctl /docs GitHub ↗ Live demo

Telemetry (opt-in, off by default)

trstctl can send a small amount of anonymized usage data to a collector that you name. It is off by default and never sends anything unless you explicitly turn it on. This is a decided, privacy-first position for a self-hosted product used in regulated environments.

The project operates no public telemetry collector, and trstctl ships no default endpoint. The setting exists so an operator running a fleet can aggregate their own coarse usage counts. If you turn telemetry on you must point it at an https collector you run, and trstctl refuses to start if you do not.

What is sent (only when enabled)

A single JSON document, at most once per interval:

{
  "schema": 1,
  "instance_id": "9f2c…",          // random, generated once, never host-derived
  "version": "v1.2.3",
  "os": "linux",
  "arch": "amd64",
  "credential_buckets": {            // counts BUCKETED into coarse ranges by type
    "x509_certificate": "101-1000",
    "ssh_key": "1-10"
  }
}
  • instance_id — a random 128-bit identifier generated on first use and stored locally. It is not derived from your hostname, IP, MAC, organization, or any credential. The receiver counts distinct IDs to estimate active deployments; that figure is treated as a lower bound.
  • credential_buckets — how many credentials of each type you manage, reported as a coarse range (0, 1-10, 11-100, 101-1000, 1001-10000, 10000+). Exact counts never leave the process.

What is never sent

No credential content or metadata of any kind: no subjects, SANs, serials, fingerprints, public keys, or expiry dates. No owner identities, emails, team names, hostnames, IP addresses, file paths, CA names, or connector targets. No configuration values. If a field could identify you or your credentials, it is not in the payload — by construction, the payload struct has no place to put it.

How to opt in

Telemetry is enabled only when you set it explicitly, and you must supply the collector yourself — there is no default endpoint to fall back on:

# environment
export TRSTCTL_TELEMETRY_ENABLED=true
# required: an https collector you operate
export TRSTCTL_TELEMETRY_ENDPOINT=https://telemetry.internal.example/v1/usage
# optional overrides
export TRSTCTL_TELEMETRY_INTERVAL=24h
export TRSTCTL_TELEMETRY_INSTANCE_ID_FILE=/data/telemetry/instance-id

or in the config file:

{ "telemetry": { "enabled": true, "endpoint": "https://telemetry.internal.example/v1/usage", "interval": "24h" } }

When enabled, the endpoint is required and must be an absolute https:// URL, and the interval a positive Go duration. Enabling telemetry without an endpoint fails validation with telemetry.endpoint is required — a startup error, never a silent no-op that posts into the void. TRSTCTL_TELEMETRY_INSTANCE_ID_FILE must name a writable local file for the random anonymous instance ID. trstctl validates this on boot and refuses to start on a bad telemetry configuration. A typo in TRSTCTL_TELEMETRY_ENABLED (anything that is not a recognized boolean) is ignored and leaves telemetry off.

Air-gapped installs are stricter: when TRSTCTL_AIRGAP_ENABLED=true, trstctl refuses to start with TRSTCTL_TELEMETRY_ENABLED=true. That turns "off by default" into "off by policy" for disconnected environments. See Air-gapped install for the no-phone-home runtime guard and Helm overlay.

Verifying the current setting

trstctl -check-config | grep telemetry
# telemetry.enabled: false

How to opt out

Do nothing — it is already off. If you previously enabled it, set TRSTCTL_TELEMETRY_ENABLED=false (or remove the config key) and restart. You may also delete the stored instance_id file; a new random ID is generated only if you opt in again.

Rendered live from github.com/ctlplne/trstctl — found a mistake? edit this page.