This site
2026A personal portfolio with a hand-rolled, privacy-first analytics pipeline instead of a third-party tracking script.
- Next.js
- TypeScript
- Tailwind CSS
- Supabase
- Postgres
Built on Next.js App Router with the public pages statically rendered from local content — no database on the read path. Visits are recorded through a single edge API route that hashes the visitor's IP and user agent with a server-side salt (SHA-256), so returning-visitor recognition works without cookies, client-side storage, or a consent banner.
A Supabase Postgres table with row-level security stores events; the owner-only dashboard reads aggregates directly through RLS with no hand-written authorization code. Sessions are derived at query time with a window-function query rather than stored, keeping the write path a single unconditional insert.