Context
NetPulse deliberately has no accounts and no telemetry. That is part of the pitch (self-hosted, no cloud, sovereignty). But it also means there is no way to know how many instances are actually running and updating.
Today the only signals are indirect and weak:
- GitHub release asset downloads (installs/updates) and repo Insights traffic.
- The announcement feed request log (
netpulse.cloudless.club/announcements.json), which is polluted by bursty clients (hundreds of requests in 2-3 minutes from single IPs) and therefore unusable as a census.
Proposal
An anonymous, aggregate per-instance counter:
- Each instance generates a random installation id once (UUID, stored in
kv) and sends a daily ping with only: the random id, the app version and the OS/arch. Nothing else.
- The receiver counts distinct ids per day (aggregate only) so it can report "active instances (daily/weekly)".
- The aggregate can be published on a public stats page, consistent with the project's transparency.
Hard privacy constraints
- No IPs stored (the receiver must not persist the client IP; use it only for the request, no logging).
- No personal or network data: never MACs, hostnames, SSIDs, router counts, device counts, geolocation or usernames.
- No cookies, no fingerprinting; the id is random and local.
- The ping is fire-and-forget and must never affect app behaviour (fail-silent, like the announcements fetch).
- Documented in the README, with a single env switch to disable it (e.g.
NETPULSE_TELEMETRY=0).
- Open question: default on (max data, documented opt-out) vs default off (opt-in, low adoption). Decide explicitly and document the choice.
Acceptance criteria
Notes
This is a product/philosophy decision as much as a technical one; keep the payload minimal and the docs honest. As a lighter alternative, the existing 6h announcement fetch could carry a random id as a query param so the feed host counts unique ids without a new endpoint, but that only counts feed-fetching instances.
Context
NetPulse deliberately has no accounts and no telemetry. That is part of the pitch (self-hosted, no cloud, sovereignty). But it also means there is no way to know how many instances are actually running and updating.
Today the only signals are indirect and weak:
netpulse.cloudless.club/announcements.json), which is polluted by bursty clients (hundreds of requests in 2-3 minutes from single IPs) and therefore unusable as a census.Proposal
An anonymous, aggregate per-instance counter:
kv) and sends a daily ping with only: the random id, the app version and the OS/arch. Nothing else.Hard privacy constraints
NETPULSE_TELEMETRY=0).Acceptance criteria
Notes
This is a product/philosophy decision as much as a technical one; keep the payload minimal and the docs honest. As a lighter alternative, the existing 6h announcement fetch could carry a random id as a query param so the feed host counts unique ids without a new endpoint, but that only counts feed-fetching instances.