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.