Quickstart
Enroll a project and see your first page view in about 15 minutes.
How it works
Two ingest paths, one store, and the checks every event passes on the way.
Website analytics
One pinned script tag. No consent banner for your visitors.
API analytics
Add a second OpenTelemetry exporter. Your own APM keeps the traces.
Why it exists
SCF funds projects in tranches, and reviewers need usage numbers they can rely on. Most analytics tools answer a different question: they are built to help one team understand its own visitors, with whatever tracking that team is comfortable with, and they count whatever arrives at the collect endpoint. A number from one of them cannot be compared with a number from another, and a script can inflate either. Lumenstat is built for the comparison. Three properties make that work:Private by construction
Private by construction
Visitor IP addresses are used in memory for a country lookup and a daily visitor hash, then discarded. The hash uses a random salt that is deleted after 48 hours, after which no one, including the operator, can link a stored record to a person. Query strings are stripped except
utm_* tags. See Privacy.Hard to inflate
Hard to inflate
Every event passes four checks: it must come from a browser on the site’s own domain, carry a proof of work computed by the tracker, come from outside known data-center ranges, and come from a network that is not sending an implausible number of new visitors. Events that fail are stored as flagged and never counted, so projects and operators can see attempts instead of absorbing them. See Bot and inflation defense.
Verifiable
Verifiable
The tracker you embed lives at an immutable, versioned URL with a published integrity hash, and it rebuilds byte for byte from source. The code, the infrastructure and these docs are MIT licensed. See Tracker supply chain.