Building privacy-first analytics in the open. Short product notes twice a week, and the occasional deep dive into how things work under the hood.
The in-progress migration of Tracely's dashboard reads from SQL rollup tables to a ClickHouse warehouse, and the query-writing rules it forced on me.
I'm building a Cloudflare Worker tier that accepts tracker payloads at the edge, validates them against Workers KV, and forwards them to Tracely through a queue.
One command brings up the full stack — Octane on FrankenPHP, a dedicated queue worker, Postgres, and Redis — and a second command tries to knock it over.
Tracely's Bearer-token read API, the Management API for automation, and external data sources like GA4 that sit beside your first-party data.
The collaboration and enterprise layer in Tracely — team roles, invitations, SAML and OIDC sign-in, SCIM provisioning, and WebAuthn passkeys.
Tracely's Campaigns dashboard now computes first-click, last-click, linear, position-based, and time-decay attribution from campaign touches within sessions.
How Tracely shows page-to-page movement and return rates without individual-level tracking, and where the visitor profile fits into that.
How Tracely's performance dashboard works, from the Web Vitals the tracker collects to path-level hourly rollups and third-party timing aggregation.
Tracely now reports dark mode and reduced motion preferences as aggregate shares, plus a new hourly rollup for keyboard and pointer activity that shipped today.
Scheduled email digests, dated notes on your traffic, and a weekly team health line — the parts of analytics that fight forgetting.
Site export and import bundles, the account data export, a nightly warehouse push, and why no-lock-in is a design constraint rather than a slogan.
Four small tools in Tracely for catching the gaps — expected URL coverage, edge config lint, an embed security scorecard, and a CI event contract.
Three ways to show Tracely data to people who don't have accounts — public dashboards, expiring magic links, and an embeddable trust badge.
How Tracely's anomaly engine works under the hood — weekday-aware baselines, ratio spikes, root-cause attribution, and the alerting layer that decides when to actually tell you.
How Tracely does click heatmaps as pure aggregates — a 40 by 40 grid of counts, bounded retention, and a server-side page snapshot for the backdrop.
Grouping pages into content groups for rollup reporting, and decay alerts that flag pages whose traffic is sliding against their own recent baseline.
The Campaigns dashboard groups traffic by UTM parameters and includes a hygiene report that flags inconsistent tagging before it quietly ruins your reports.
The aggregation architecture under Tracely's dashboards — raw fact tables, hourly and daily rollups, and the commands that can rebuild every aggregate from raw data.
How conversion tracking works in Tracely — goals on named events, multi-step funnels over sessions, and experiment readouts, all computed from aggregates.
A command palette, two-key go-to sequences, and print styles that make save-as-PDF work — small interface investments that compound daily.
Why Tracely's privacy posture lives in what the product refuses to build — cookieless by design, explicit non-goals, and masking for sparse cohorts.
How Tracely answers "what's happening right now" — a live dashboard with a tunable window, a chrome-free TV mode, and a rotating kiosk for office screens.
A deep dive into how Tracely turns beacon POSTs into stored pageviews — rate limiters, queued jobs, the batch endpoint, and one deliberate foot-gun.
How the Tracely tracker is delivered — a per-site script served from your analytics origin, posting to same-origin endpoints, with optional SRI pinning.
Privacy-first, first-party web analytics you can drop into any site with one snippet — cookieless, aggregate-first, and built to sit beside your existing stack.
Short product notes twice a week plus the occasional deep dive. No tracking pixels in the emails, and you can unsubscribe anytime.
Your address is used only to send new posts. No open tracking.