A 1 KB script, no cookies, no consent banner, and reports that answer the question before you finish asking it.
Start collecting →<script defer src="https://your-worker.workers.dev/k.js" data-site="abc123"></script>
Custom events, when you want them:
kestrel('signup', { plan: 'pro' })
Ship it something that looks personal — an email, a phone number, a token — and it is refused at the door and reported back to you, rather than quietly retained.
| Script | Gzipped | Requests / pageview |
|---|---|---|
| Kestrel | 0.97 KB | 1–2 |
| Plausible | 1.26 KB | 1 |
| Fathom | 2.04 KB | 1 |
| Umami | 2.25 KB | 1 |
| Google Analytics 4 | 143 KB* | 2+ |
* gtag.js alone, before the second-stage payload it fetches at runtime, so the real gap is wider than shown. Every figure here was measured on 26 Aug 2026 by pulling each vendor's script from their own CDN and gzipping the delivered bytes — not quoted from documentation. Re-measure before reusing these: vendors ship new builds.
Raw events are short-lived. A cron folds them into pre-aggregated rollups, and every report above "the last 30 minutes" reads those instead — so a dashboard load costs a few dozen row reads whether the site did a thousand pageviews last month or ten million. Unique-visitor counts are kept in HyperLogLog sketches, which means a date range reports the real distinct count instead of summing per-day uniques and double-counting everyone who came back.