Ed25519-signed site configs
The collector accepts only signed configs for allowlisted domains. An unsigned snippet, or the same code pasted on any other site, is refused at the edge with a 403.
Architecture
Everything runs on machines you control. The collector is the only internet-facing component; ClickHouse and the API sit behind it. One boundary, one place where the outside world meets your deployment.
The flow
The recorder path (session replay, Tier 2) enters through the same collector and stays inside the same boundary: chunks upload to the collector, store for 30 days, and inputs are masked at source — values never leave the browser.
Why it holds
The collector accepts only signed configs for allowlisted domains. An unsigned snippet, or the same code pasted on any other site, is refused at the edge with a 403.
The control plane is JSON files today, with a Postgres adapter behind the same interface. Scaling the control plane is a config swap — not a migration project.
Collector, API, SDK, dashboard and MCP server carry no npm packages. The serving path is code you can read end to end — on your own hardware.
Identity, precisely
Identity is an anonymized device-day pseudonym: a daily-rotated HMAC-SHA256 (HKDF key, midnight UTC) over what the browser already sends, namespaced per site. Yesterday's hash cannot be joined to today's; your sites cannot join each other's visitors. The raw IP lives for milliseconds in collector memory — used for geo and the daily HMAC input — and is never persisted, marshaled or logged.
Four components, one internet-facing listener, zero third-party endpoints. Deployed with your DevOps, verified at deploy time, boring ever after.