TRANSPARENCY MODE: ALL DATA ON THIS PAGE IS PUBLIC

open-stats — public — 120x40
>

Full Data Disclosure

Here is the exact database schema we use. Every field, every column — nothing hidden. This is the complete picture of what we store per page view.

TABLE: page_views

COLUMNTYPEWHAT IT IS
idINTEGERAuto-increment primary key
pathTEXTURL pathname only — query params & fragments stripped via new URL().pathname
referrerTEXT?Referring hostname only (e.g. “google.com”) — full URL discarded, self-referrals filtered
browserTEXT?One of 6 families: Chrome, Firefox, Safari, Edge, Opera, Other — raw user-agent never stored
visitor_hashTEXTSHA-256 of (IP + daily-rotating salt), truncated to 16 chars — rotates every 24h, not reversible
created_atTEXTUTC timestamp of the visit

HOW WE PROCESS

  • IP address → hashed with SHA-256 using a server secret + today's date as salt → first 16 hex chars stored as visitor_hash → raw IP immediately discarded
  • User-Agent → regex-classified into one of 6 browser families → raw string never touches the database
  • Path → parsed through new URL(path).pathname → query params like ?token=secret are stripped
  • Referrer → only new URL(ref).hostname is kept → full URLs discarded → visits from our own domain filtered out
  • Bots → detected via user-agent regex, excluded from all data

WHAT WE NEVER STORE

  • • Raw IP addresses
  • • Raw user-agent strings
  • • Cookies, localStorage, or sessionStorage
  • • Screen size, resolution, or viewport
  • • Device model, OS version, or GPU info
  • • Canvas/WebGL/audio fingerprints
  • • Mouse movements, scroll depth, or click maps
  • • Form inputs or page content
  • • Any cross-site or cross-session identifier
  • • Any PII whatsoever

API ENDPOINTS

POST /api/track — records a page view. Rate limited to 60/min per visitor. Always returns {ok:true} regardless of success or failure — zero information leakage.

GET /api/analytics?range=1m — returns only aggregated counts (COUNT, COUNT DISTINCT, GROUP BY). No individual page_view rows ever leave the database. Cached for 60 seconds. Rate limited to 120/min globally.

All analytics are self-hosted in our own Turso/SQLite database. No data leaves our infrastructure. No Google Analytics, no Plausible, no Fathom, no Vercel Analytics — nothing. We wrote the tracking code ourselves and you're looking at every byte we collect. The “unique visitors” count overcounts because the hash rotates daily — we consider that a privacy feature, not a bug. All source code is public.