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 address✕User-agent string✕Email in URL✕Cookies — 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
Live right nowClick any row to filterChange vs. previous period- Change vs. previous period — KPI strip badges
- Live right now — realtime visitors tile
- Click any row to filter — Sources table
Every midnight, every visitor becomes a stranger.
Mon
00:00Tue
00:00Wed
a3f9c1
Same person, three unrelated IDs. noomers can count visits, not people.
Every byte stays in your account
Your Cloudflare account
- Trackersends pageviews
- Workercollects + APIs
- Durable Objectrealtime + buffer
- PipelineBasin ingest
- R2 / Icebergyour warehouse
- Basin SQLhistorical queries
- Dashboardreads SQL + DO
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 AlchemyOne tag, about 3 KB gzipped, no cookies.
<script defer
src="https://analytics.example.com/tracker.js"
data-site-id="example.com"></script>A subset of Plausible's Stats API. Parity doc.
curl https://analytics.example.com/api/v2/query \
-H "Authorization: Bearer $STATS_API_TOKEN" \
-d '{"site_id":"example.com","metrics":["visitors","pageviews"],"date_range":"7d"}'Your analytics. Your account. Forgotten by morning.
From the blog
Introducing noomers: privacy-first self-hosted analytics
Self-hosted web analytics on Cloudflare — a tiny tracker, realtime Durable Objects, and durable history in Basin SQL.