How our analytics works
Last updated: June 20, 2026
What makes it different
No cookies, no banner
We count visits without setting a single cookie or touching localStorage. That's why there's no annoying cookie banner — we don't need consent for storage we never use.
Zero third parties
No Google Analytics, no Meta Pixel, no PostHog, no Plausible. Not a single byte about your visit leaves our servers. The analytics run in the same backend that serves the app.
Provably anonymous
We never store your IP or user-agent. We hash them with a secret salt that is rotated every day and then destroyed — so by nightfall the hash is mathematically irreversible and the same visitor tomorrow is a different number.
We respect Do-Not-Track
Turned on Do-Not-Track or Global Privacy Control in your browser? We honor it — literally, on the first line of the script. The beacon never even initializes.
1. What we measure
We measure aggregate page traffic so we know which content is useful: how many visits a page got, roughly how many distinct visitors a day, the country-agnostic referrer host (e.g. news.ycombinator.com), and the campaign tags on inbound links (utm_source / utm_campaign / utm_content). That's it — enough to run a marketing funnel, not enough to profile a person.
2. What we never collect
We do not collect or store any of the following:
- Cookies or localStorage identifiers of any kind
- Browser fingerprints
- Your IP address (used in RAM for a fraction of a second, then discarded)
- Your user-agent string (same: in-memory only)
- Your name, email, or any account identifier linked to a page view
- Mouse movements, scroll heatmaps, session recordings
3. How the cookieless visitor count works
Instead of a tracking cookie, we derive a one-way visitor hash on the server: sha256(daily_salt + ip + user_agent + host). The IP and user-agent only ever live in memory for the duration of the request and are never written to the database, the logs, or our error tracker. What lands in Postgres is an opaque hex string that cannot be reversed and is not joined to any user account.
4. The salt is rotated every day
The secret salt is generated with cryptographic randomness, kept only in Redis, and rotated every 24 hours — the old one is destroyed. Because the salt is gone, the hash becomes mathematically irreversible: by the end of the day there is no way to take an IP and recompute the hash. The same visitor on the next day produces a completely different number, so a cross-day profile of you is impossible by design.
5. Do-Not-Track and Global Privacy Control
If your browser sends a Do-Not-Track (DNT) or Global Privacy Control (GPC) signal, the analytics beacon never runs — that check is the first line of the client script — and the server independently drops the request as well. We also skip known bots and crawlers.
6. Retention
Raw events are kept for a short window (60 days) and then permanently deleted. We roll them up into a tiny daily summary table — pure aggregate counts with no visitor hashes — which is what the dashboard reads for past periods.
7. Why this is GDPR-clean without a consent banner
Because we set no cookies and store no personal data, ePrivacy/PECR consent rules for storage do not apply, and there is no PII to process. This is privacy by architecture, not by promise — see also our Privacy Policy and Cookie Policy.