Analytics
Every project comes with traffic and audience analytics measured at the edge — nothing to install, nothing running in your visitors' browsers. No script tag, no cookies, no consent banner. The CDN's request logs are the only source: if a request reached your site, it's counted, and nothing about the visitor is stored.
Two views, both per project:
| View | Answers | Backed by |
|---|---|---|
| Traffic | Requests, bandwidth, cache hit rate, errors, per-hostname split, top paths | Live CDN logs (up to 72 h) and hourly rollups (up to 365 days) |
| Audience | Pageviews, unique visitors per day, top pages, referrers, countries | Hourly rollups, swept from the same logs |
Where to look
- Console — the Traffic tab on every project at app.slew.cloud: live request/bandwidth/cache charts over 6 h–72 h windows or 30/90-day history, plus the audience section over 7/30/90 days.
- CLI —
slew statsprints the live picture for the last 1–72 hours, sparkline included. - API — three endpoints under
/projects/:name/stats, same data as the console.
Members of an organization can read stats on all of the org's projects.
What counts as a pageview
A pageview is a successful HTML document fetched by something that identifies as a browser:
- status
2xxor304; - an extensionless or
.htmlpath — asset requests (CSS, images, JS) are traffic, not pageviews; - a non-bot user agent — crawlers, uptime monitors, and HTTP tooling (
curl,python-requests, headless browsers, …) are filtered out.
Paths are normalized before counting: query strings are dropped and /docs/index.html counts as /docs/. Navigation between your own hostnames (the slew.cloud subdomain and your custom domains) is never a referral; any other referring host is.
Unique visitors, without cookies
Visitors are counted the Plausible way. During each hourly sweep, a visitor is a SHA-256 hash of (that day's random salt, project, IP address, user agent) — computed in memory, counted, and discarded. The database stores bare counts only, never IPs, user agents, or the hashes themselves. Each day gets a fresh random salt, and salts are deleted as soon as their day can no longer be re-swept, which severs the visitor-to-hash linkage for good.
Two consequences worth knowing:
- Daily uniques don't sum. The same person on Monday and Tuesday is one visitor each day, so visitors are always a per-day series — the console shows visitors / day, never a range total.
- A returning visitor is a new visitor tomorrow. Cross-day return tracking is exactly the linkage the salt rotation destroys, by design.
Live vs. history
The last 72 hours are aggregated live from the CDN's raw request logs on every request — that's where the status-class, cache-status, and per-hostname breakdowns come from. Raw logs expire at the CDN after about three days.
Before they expire, an hourly sweep rolls them up into per-project, per-hour counters — requests, bytes, cache hits, pageviews — plus the top pages, referrers, and countries per hour. The rollups are what serve the 30/90-day console windows, the history and audience API endpoints, and anything up to 365 days back. Analytics start collecting from your first deploy; there is no backfill beyond the CDN's raw-log retention.
The per-hour top lists are capped at the 50 busiest entries, so on a very busy project the long tail of a "top pages" table is approximate — the request, bandwidth, and pageview totals are always exact.
Privacy
- Nothing client-side. No script, no cookie, no localStorage, no fingerprinting — your pages are byte-for-byte what you deployed.
- Nothing personal stored. slew's analytics tables contain counts per project, hour, path, referrer hostname, and country code — no IPs, no user agents, no identifiers.
- EU-resident, end to end. The CDN (Bunny, Slovenia) writes the logs, the platform (Hetzner, Germany) stores the rollups. Traffic data never leaves European infrastructure — see the overview for the full sovereignty picture.