← Projects

This site

2026

A 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.