Skip to content
TP Social

Telemetry

Three fields.
No install ID.

The desktop client phones home in release builds. Here’s the exact shape of what it says — pinned by a snapshot test on the sending side so it can’t silently grow.

Wire format

What it sends.

POST /telemetry/ingest
Content-Type: application/json

{ "event": "side_created", "version": "0.4.1", "channel": "stable" }

That’s the entire body. No headers we add. No cookies. The server reads the request IP once to look up the country, then discards it before the row is written.

app_started
The desktop client just finished starting up.
side_created
A new side was created and a node identity was generated.
verse_created
The node bound to a new network address for the first time.

Equally important

What it doesn’t send.

  • No install ID. No device ID.
  • No side addresses. No public keys.
  • No IP retention. The address is discarded after the country lookup.
  • No locale. No timezone. No user agent we record.
  • Nothing at all from dev builds. Nothing from cargo test.
  • No telemetry from this website. Only from the desktop client.

Geography

Country, not address.

When the server receives an event, Cloudflare gives it a two-letter country code derived from the request’s IP. We store the code and drop the address. We never log the IP, and we never write it to disk. The country is the only geography in the table.

Opt-out

There isn’t one.

Release builds always send. Not because we’d like to know more, but because the opt-out you’d want already happened on the design side. The body is three fields. Nothing in it identifies you, your installation, or your node. A snapshot test in the client fails the build if any new field creeps in — the wire format can’t be silently widened.

If you can’t make peace with a count of app starts, run a debug build. Debug builds send nothing. Tests send nothing. The gate is a single cfg!(debug_assertions) check inside the telemetry module itself.

Quiet by default.
Three fields.