xelth.com

/T/ — telemetry & complaints intake

One intake on xelth.com for the anonymous usage telemetry and the complaints of every free program of ours that does not run its own: C3 (the Rust consultation bridge), the claude-codex-consult Claude Code plugin (id codex-consult), eckSnapshot, and the tools that follow. It exists so a program can be improved even when someone we never hear from uses it.

What a program sends

  • an app id and its version
  • an instance id — sha256(salt on disk + machine name): stable per installation, meaningless elsewhere
  • an event type, a severity (info / warning / error / crash), a short title
  • details — small structured facts about the run (engine, provider, purpose, outcome class, wall seconds, token counts, OS, runtime)

What never leaves your machine

  • task names, prompts, briefs, file paths, thread ids, finding texts, user names
  • keys and tokens — a details key named like one (key, token, secret, password, authorization, *_key, …) is dropped on arrival, and the reply says how many were
  • your IP address — the server keeps a salted /24 hash in memory for the rate limit and stores none

On by default, off with one line

Installing one of these programs means accepting these terms; each README repeats them next to its own switch (for C3 and the plugin: CODEX_CONSULT_TELEMETRY=off, or -Telemetry off per run). The program prints the notice once on the first run after an install. Sending never blocks a run: events queue in a local spool, go out in the background with a 3 s timeout, are retried on the next run and dropped after 7 days.

Complaints

A complaint holds only what you typed plus the context the program showed you before sending (the last run's summary). The reply carries a public reference like T-7KQ4-M2XZ: quote it in a topic on the forum or in a mail, and the maintainer can find your report without you sending anything else.

Delete my data

DELETE https://xelth.com/T/v2/instances/<instance_id>?public_ref=T-XXXX-XXXX

removes every event and complaint that instance ever sent. The daily counts (per app, version, event type, severity) hold no instance and are kept.

Contract (v2)

GET /T/health{ "status": "ok", "version": "…", "db": true } POST /T/v2/eventsone event or { "events": [ … ] } (≤ 100) → { ok, accepted, event_ids, scrubbed } POST /T/v2/complaints{ app_id, app_version, instance_id, text, context, contact? } → { ok, complaint_id, public_ref } DELETE /T/v2/instances/{id}?public_ref= → everything of that instance is gone GET /T/v2/public/stats?app_id=c3&days=30 — aggregate counts only, what /C3/ shows GET /T/v2/public/usefulness?app_id=codex-consult&days=90 — consultations and ratings per reviewer model, the usefulness table on /C3/

Limits

body ≤ 64 KiB · 60 requests/min per /24 · 10 000 events/day per instance · details ≤ 16 KiB · complaint text ≤ 8 KiB · unknown app_id → 403 (accepted today: c3,codex-consult,ecksnapshot,xelth-kb,xelray) · over a cap → 429 with Retry-After. Events are kept 180 days, complaints and daily counts indefinitely.

A minimal event

curl -s https://xelth.com/T/v2/events -H 'content-type: application/json' -d '{
  "app_id": "c3", "app_version": "0.1.0",
  "instance_id": "3f1c2a9b8d7e6f5a4b3c2d1e0f9a8b7c3f1c2a9b8d7e6f5a4b3c2d1e0f9a8b7c",
  "event_type": "consultation", "severity": "info", "title": "diff-review",
  "details": { "engine": "codex", "provider": "openai", "purpose": "diff-review",
               "outcome": "usable", "wall_seconds": 41.2, "tokens_in": 12000, "tokens_out": 900 },
  "client_time": "2026-09-26T12:00:00Z", "os": "Windows 11", "runtime": "pwsh 7.5"
}'

Client reference (PowerShell, Node, Rust — 30 lines each, spool + background send): docs/t-hub.