docs/12-telemetry.md

12 — Telemetry

Status at launch: off

Telemetry ingestion is off at launch (GL-36). Nothing is collected or sent:

The rest of this document is the design for a later, opt-in release. None of it ships at launch, and turning it on needs a new release with its own consent flow.

Planned design (post-launch)

Opt-in, fully anonymized, schema-documented. Telemetry is how we would know which features work, which providers are reliable, which ad surfaces convert, and which sessions are failing — without ever knowing what any individual user is doing. The schema would be public, the events inspectable, and the opt-out one command.

The planned first-run flow asks the user and defaults to off:

Picasso can send anonymized usage data to help us improve the product.
We never send your code, your prompts, your file paths, or any identifying
information. The full event schema is published at picassohq.com.

Send anonymized usage data?
  [Y] Yes, help improve Picasso
  [N] No (default)

The choice is stored locally; the user changes it any time with picasso telemetry on|off.

What we collect

When opted in (planned):

What we never collect

Hard rules, enforced by the SDK before any event leaves the user's machine:

Schema

Every event conforms to the published schema. During local development the schema is served from the local docs/API process; after picassohq.com is registered it will live at https://picassohq.com/telemetry/schema/v1.json. New event types require a schema update with versioning.

type TelemetryEvent = {
  schemaVersion: 1;
  eventType: string;
  eventTime: ISO8601;
  deviceFingerprint: string; // rotating per-month, anonymous
  appVersion: string;
  osPlatform: "darwin" | "linux" | "windows";
  // Event-specific payload
  payload: Record<string, number | string | boolean>;
};

No nested objects. No free-form strings. All payload fields are enumerated in the schema.

PII scrubbing

Before any event is queued:

  1. Run a redaction pass on all string fields.
  2. Strip any field matching the secret-detector patterns from 08-sandbox.md.
  3. Replace any path string with <path>.
  4. Replace any URL with its domain only (https://api.github.com not https://api.github.com/repos/me/secret).
  5. Drop the event if any field fails redaction validation.

PII scrubbing is implemented in packages/telemetry and is the same code path on every platform. Audited annually.

Local inspection

Users can see exactly what was sent:

picasso telemetry log                  # show events from this session
picasso telemetry log --limit 50       # show the last 50 events
picasso telemetry export > events.json # full export

The log is the same JSON sent to the server. Nothing additional is sent that the user cannot see locally.

Storage and retention

Public dashboard

A subset of aggregated telemetry is published as a transparency dashboard locally during development and at https://picassohq.com/stats after domain registration:

Per-user data is never published. Aggregated metrics only.

Crash reporting

Crashes ship through a separate channel with stricter rules:

Opt-out semantics

When opted out:

Acceptance criteria

Dependencies

Open questions