Why
Why Insights exists
Hosted analytics products ask for two things a careful team should not give: the behaviour of every user, shipped to a third party, and consent handled as an afterthought by a banner that gates a script tag. Insights starts from the opposite premise.
The data stays with you
The server is a Haskell process. Storage is PostgreSQL. The frontend is Grafana. There is no proprietary store in the middle, no query language of its own, and nothing that cannot be read with plain SQL. Migrations are readable files; the reporting schema is views and functions you can inspect and extend.
Consent is the first thing the SDK knows
An SDK cannot be started without a consent policy. Before a purpose is granted it persists nothing to disk and opens no connection. Every batch it sends carries a snapshot of the consent it holds, and the server refuses items whose purpose was not granted. A bug in a client cannot store data that was not consented to.
Configuration is declared, not clicked
Projects, retention, cohorts, funnels, retention analyses and metrics are declared in the NixOS module, next to the products they measure, and ingest keys are generated by the service. Issue triage and erasure are actions in the Grafana dashboards, and the server performs them only for a Grafana Admin, verified from the identity Grafana signs. There is no admin UI of its own and no admin credential of its own to leak.
Small, sharp and yours
Insights does events, funnels, retention, cohorts, profiles, crash tracking and the consent ledger, and stops there. Performance monitoring is a later phase, recorded in the repository's decisions file. It is MIT licensed and easy to leave: your data is already in your database.