Skip to content

Web analytics · API analytics · Bot defense

Proof of usage for the Stellar ecosystem.

Privacy-first web and API analytics for Stellar projects. No cookies, no consent banner, and bot traffic is flagged, not counted.

Hosted in the EU.

FIG 01 · FOUR CHECKS
Simulated traffic, not real data. Events that fail a check are flagged, not counted.

Bot and inflation defense

Four checks before a visit counts. The rest are flagged, not counted.

Anyone can script fake page views. Lumenstat checks every event four ways and keeps the failures, labelled, where you can see them.

  1. 01

    Real browser

    Origin and Fetch Metadata checks confirm the event came from a browser on your site.

    origin · fetch metadata

  2. 02

    Proof of JavaScript

    The tracker solves a small proof-of-work on the page. Scripts that skip it are flagged.

    proof-of-work in l.js

  3. 03

    Data-center ranges

    About 8,900 IP ranges from AWS, Google Cloud, Oracle, DigitalOcean, Akamai, Hetzner, OVH, Contabo, Vultr and others.

    ~8,900 ranges

  4. 04

    Per-network limit

    One network can only add so many visitors.

    per-network cap

Flagged, not counted

Failed events are stored with the reason and kept out of your totals. Your project sees them on its Website page, and program operators see them too.

  • No browser origin
  • Not a browser request
  • Sent from another domain
  • No proof of JavaScript
  • Invalid proof of JavaScript
  • Data-center IP
  • Too many visitors from one network

Privacy

No cookies. No consent banner.

Lumenstat runs Umami v3.5.0 with four small, documented patches. Two keep less data. Two keep the counts honest.

Country, not city
Location stops at the country. IP addresses are cut before the location lookup.
/24 or /48
A new salt every day
Visitor hashes use a random daily salt. The salt is deleted after 48 hours.
deleted after 48h
Clean URLs
Query strings are stripped. Campaign tags stay.
except utm_*
Nothing in the browser
The tracker sets no cookies, so there is no banner to show.
0 cookies

This page runs the same tracker. Open your browser's storage and check.

API analytics

API analytics without traces or logs. Every route, measured.

Add a second OpenTelemetry exporter with your project's ingest key. The collector turns spans into per-route counts and latency, then drops traces and logs.

FIG 02 · ROUTE NORMALIZATION
Simulated requests. Addresses are generated for this page and belong to no one.
Stellar-aware routes
G, C and M addresses, ids and hashes become placeholders, so one route is one row.
{account} {contract} {hash}
Latency that adds up
p50, p95 and p99 for every route.
p50 · p95 · p99
Keys per project
Each project issues its own ingest key. Keys are hashed at rest.
hashed at rest

Supply chain

Check the script before you trust it. The bytes are pinned.

Every snippet pins the tracker by version and by hash. If the file ever changes, the browser refuses to run it.

FIG 03 · VERIFY THE TRACKER
Snippet
Terminal
$ curl -s https://t.lumenstat.com/v/1.0.0/l.js | openssl dgst -sha384 -binary | openssl base64 -A
cBzCCJcHCWSGbuy/f+zavGm/HjUWv77eni4DyLfq+FfKigpin1mul1ekLXILze/3

Match

Tracker 1.0.0 · 10,447 bytes · released 2026-11-13

A replay of the command below. Run it yourself and compare.
  • Versioned, immutable URLs.

    /v/1.0.0/l.js

  • Subresource Integrity in every snippet.

    sha384

  • A reproducible build, checked byte for byte in CI and on every deploy.

    10,447 bytes

  • Published to npm with provenance.

    @lumenstat/tracker

index.html
<script defer src="https://t.lumenstat.com/v/1.0.0/l.js"
  integrity="sha384-cBzCCJcHCWSGbuy/f+zavGm/HjUWv77eni4DyLfq+FfKigpin1mul1ekLXILze/3"
  crossorigin="anonymous" data-website-id="YOUR-WEBSITE-ID"></script>
Terminal
curl -s https://t.lumenstat.com/v/1.0.0/l.js | openssl dgst -sha384 -binary | openssl base64 -A

Get started

Enroll with a Stellar link.

Three steps. The third is optional.

  1. Sign up

    Add your domain and one Stellar link: your SCF project page, a stellar.expert page, or a Stellar account. Accounts are checked on Horizon mainnet.

  2. Add the snippet

    Paste the pinned snippet from your Setup page into your site.

  3. Measure your API

    Optional. Add an OpenTelemetry exporter with your ingest key.

Enroll your project (opens app.lumenstat.com)

Programs can run sign-up open or with approval.

For programs

One pipeline. The same rules for every project.

Every project is measured by the same pipeline with the same bot rules, so operators can compare them on equal terms.

Projects see

  • Overview
  • Website
  • API
  • Setup

Operators see

  • All projects
  • Compare
  • Traffic quality
  • Enrollment
Schematic of the operator view.

The dashboard is built with the Stellar Design System.

How it runs

Small and easy to reason about.

One Docker host in the EU, with no published ports.
eu · docker
Reached through Cloudflare Tunnel.
cloudflare tunnel
DNSSEC on the domain.
dnssec
The whole setup is described as code, with OpenTofu and Ansible.
opentofu · ansible

FAQ

Frequently asked questions

What is Lumenstat?

Lumenstat is privacy-first web and API analytics for Stellar ecosystem projects. It counts website visits and API requests, and it flags bot and inflated traffic instead of counting it.

Does Lumenstat use cookies?

No. The tracker sets no cookies, and there is no consent banner.

What does Lumenstat keep about visitors?

Location stops at the country, and IP addresses are cut to /24 or /48. Visitor hashes use a random daily salt that is deleted after 48 hours. Query strings are stripped, except utm_* tags.

How does Lumenstat stop fake traffic?

Every event passes four checks: real-browser origin and Fetch Metadata, proof of JavaScript, about 8,900 data-center IP ranges, and a per-network visitor limit. Events that fail are stored as flagged, not counted.

Can I see what was flagged?

Yes. Each flagged event is stored with its reason, such as "No proof of JavaScript" or "Data-center IP". Your project sees them on its Website page, and program operators see them too.

How does API analytics work?

You add a second OpenTelemetry exporter with your project's ingest key. The collector turns spans into per-route counts with p50, p95 and p99 latency, then drops traces and logs. Stellar addresses, ids and hashes in paths become placeholders.

How do I know the tracker has not changed?

Each version has its own URL that never changes, and the snippet pins it with a sha384 integrity hash. The build is reproducible byte for byte and is checked in CI and on every deploy. You can hash the file yourself with one command.

Who can enroll?

Projects in the Stellar ecosystem. You sign up with your domain and one Stellar link: your SCF project page, a stellar.expert page, or a Stellar account, which is checked on Horizon mainnet.

Where does Lumenstat run?

On one Docker host in the EU, with no published ports, reached through Cloudflare Tunnel. The domain uses DNSSEC, and the whole setup is described as code with OpenTofu and Ansible.

Is Lumenstat affiliated with the Stellar Development Foundation?

No. Lumenstat is an independent project built by Boundless. It is not affiliated with, sponsored or endorsed by the Stellar Development Foundation.

Start measuring your Stellar project.

Enroll with your domain and one Stellar link.