Self-hosted analytics for Cloudflare

Analytics that know less, not more.

Privacy-first web analytics that run in your own Cloudflare account.

POST/collect
ip
203.0.113.42
country DE · city Berlin
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) Firefox/131.0
Firefox · macOS · desktop
url
/pricing?utm_source=newsletter&email=ana@example.com
pathname
/pricing
utm_source
newsletter
referrer
https://www.google.com/search?q=privacy+analytics
google.com
visitor_id
a3f9c1… salted hash · resets 00:00 UTC
StoredVisitors today 1,284
IP addressUser-agent stringEmail in URLCookies — none set

An incoming collect request carries an IP, full user agent, a URL with an email parameter and a Google referrer. noomers keeps only the country and city, the browser family, the path and campaign source, the referring hostname, and a salted visitor ID that resets daily. It stores nothing else.

One screen answers three questions

noomers dashboard: KPI strip, chart and breakdown panelsLive right nowClick any row to filterChange vs. previous period
Dashboard shown with demo data.
What noomers forgets

Every midnight, every visitor becomes a stranger.

Same person, three unrelated IDs. noomers can count visits, not people.

Every byte stays in your account

Running in an afternoon

Fork, add secrets, merge. GitHub Actions deploys with Alchemy.

git clone https://github.com/harshil1712/noomers
cp .env.example .env  # fill in the values
# merge a PR → GitHub Actions deploys with Alchemy

Your analytics. Your account. Forgotten by morning.

From the blog