| Tracking script | - p.js: 6,808 bytes, 2,512 gzipped, measured on 10/29/2026, with no dependencies
- Sends with sendBeacon, falling back to fetch with credentials omitted; no cookie, no local or session storage
- Follows single-page apps by watching history changes and the back button
- Does nothing in a browser under automation, and honors Do Not Track on sites that set the attribute
- A pixel address is served too, but it records nothing
|
|---|
| Backend | - FastAPI on Python 3.12, with async SQLAlchemy 2 and Alembic migrations (6 so far)
- PostgreSQL in its own schema; Valkey for the live feed and caching
- A write buffer batches inserts, and a worker writes hourly snapshots every five minutes
- Per-address rate limit on the dashboard API (100 requests a minute by default); collection is exempt
|
|---|
| Dashboard | - React 19, Vite, and TypeScript, with Tailwind and the Renkara design system
- Recharts for charts, light and dark themes, and a skip link on every page
- Twelve pages: sites, dashboard, realtime, live visitors, web vitals, heatmap, goals, funnels, A/B tests, reports, settings, and a public page
|
|---|
| Location and devices | - Country, region, and city from the free DB-IP City Lite database, looked up inside Pulse; no address is sent to DB-IP or anyone else
- Browser, operating system, and device type read from the user agent, which is not stored
|
|---|
| Agents and API | - 62 agent tools over stdio, relayed through Roost
- A REST API under /api/v1 with filters on every stats endpoint (is, is not, contains, does not contain, matches)
- Server-side event ingest, and webhook ingestion for Stripe, SendGrid, Google Ads, and Meta
|
|---|
| Quality | - 384 backend test functions, counted by search on 10/29/2026
- A vitest-axe test of the app and eight routes, and an axe-core run on 14 captured views (see Accessibility)
|
|---|
| Stands in for | Google Analytics, Plausible |
|---|