inferrail

The usage/presence beacon

This page exists so you never have to take Inferrail’s word for what the usage beacon sends. Everything below is also checkable yourself, on your own machine, with:

inferrail telemetry preview

which prints the exact payload for every event this install would ever send, built from your real install id, without sending anything.

On by default, but inert until an endpoint is configured

As of this release, the usage beacon is on by default (a deliberate reversal of this project’s original “opt-in, off by default” design — see ADR-0020, which also records why).

It is still inert with no collection endpoint configured, regardless of the on/off toggle. Inferrail does not ship with a default endpoint baked in; an operator has to explicitly set usage_ping.endpoint in inferrail.yaml before anything can ever be sent, from anyone’s install. If you see “Not yet active” in the Settings screen or inferrail telemetry status, that’s why — the overwhelming majority of installs, which never configure an endpoint, send nothing at all, ever.

Turning it off

Any one of these, and no event is ever sent again:

inferrail telemetry disable

or uncheck the toggle in the dashboard’s Settings screen, or:

It’s also off automatically under common CI environment variables and under this project’s own test suite — no configuration needed for either.

Exactly what is sent

One small JSON object per event, over HTTPS, to the endpoint configured in inferrail.yaml:

{
  "install_id": "a1b2c3d4e5f6...",
  "event": "install",
  "version": "0.4.1",
  "os": "macos",
  "python_version": "3.12"
}

There is no timestamp field in the payload itself — the collector stamps seen_at/last_seen_at on arrival and never trusts a client clock.

What is never sent

Never, under any circumstance, in this or any future version of this payload without a new, separately-documented decision:

If the ping fails, or you’re offline

It fails silently. A network error, a timeout, an unreachable endpoint, or being fully offline never blocks, slows, or errors the gateway or any request going through it — the send happens on a background thread the gateway never waits on, and any failure there is swallowed. Startup itself never waits on the network either, even with the beacon enabled and an endpoint configured.

The receiver

The reference collector (hosted/usage_ping/ in this repository) is a small, open-source FastAPI service: one endpoint, a per-IP rate limit, a request-size cap, a kill switch, and it does not log or persist the connecting IP address. It stores two small tables — one row per install (with a reached_first_receipt_at timestamp, set once, so the operator can tell installs apart from activated installs) and an append-only log of individual events. You can read its full source, or run your own instance and point usage_ping.endpoint at it instead of Inferrail’s. scripts/owner_stats.py reads that same database directly for a human summary (total installs, activation rate, active in the last 7/30 days, new installs per week) — see its own docstring.

Source

Everything above is implemented in src/inferrail/usage_ping/ — see ADR-0020 for the full design decision and its reasoning, and ADR-0019 for the original design this one builds on (superseded only on the on/off default, nothing else).