Project · Self-directed · Software · Data · Infrastructure

This site

A portfolio with its own privacy-conscious analytics backend, admin panel, n8n reporting and Google Sheets data feed.

Summary

It's server-rendered from structured JSON by a Node server with no dependencies, and it stores its own interaction events in SQLite. The live admin view streams events as they happen. n8n pulls a daily summary into Google Sheets and emails me a weekly report in plain English that's honest about small numbers.

The problem

I wanted real insight into what visitors look at, without cookies, fingerprinting or a third-party tracker.

Why I built it

A portfolio that only describes things isn't evidence. This one measures itself.

The solution

A small event model, a hashed daily visitor ID that can't be linked across days, coarse country only, rate-limited and validated ingestion, and n8n reading from the site rather than the site depending on n8n.

What it does

  • The home page is about 17 KB gzipped and the JavaScript about 6 KB. Fonts are self-hosted, there is no framework, and nothing is requested from a third party.
  • Structured events: page_view, project_open, case_study_open, architecture_component_click, cv_download and more.
  • Admin panel with a live event stream, sessions, project popularity, referrers, devices and pipeline health.

Technologies, and what they're for

  • Node.js 22 + node:sqliteServer, storage and analytics
  • Vanilla JS + CSSInteractions and motion
  • n8nDaily sync and weekly narrative report
  • Google SheetsReporting data layer

AI involvement

  • Built with Claude Code as a pair engineer

Automation

  • Daily Sheets sync
  • Weekly email report
  • Nightly backup and retention prune

Infrastructure

  • Docker on the Pi behind Cloudflare Tunnel

Outcome

You're looking at it. The privacy page explains exactly what's recorded.