This portfolio is built in public — that includes what we track. Here's a live view of every event we collect. Learn more about our data policy ↓
Every event is documented above. Expand a section to read the full policy.
This portfolio is built in public — that includes being transparent about what data we collect and why.
All analytics are powered by PostHog, an open-source analytics platform. We collect seven event types (listed above), all documented in this file and visible in the live dashboard. Every event captured is either interaction data (what you clicked, what pages you visited) or AI conversation metadata (how long your messages are, which conversation starters you used).
No names, email addresses, or personal identifiers. No IP addresses stored in our analytics (PostHog anonymises these). No payment or contact information — this site has none. No cross-site tracking, no third-party ad networks, and no session recordings or heatmaps.
Messages sent to the AI chat are scanned for severe profanity and prompt injection attempts before the analytics event is sent. If flagged, the actual message text is never stored in our analytics — the event records message_text as "[REDACTED]" and a count of flagged events is shown in the dashboard so we can monitor for misuse. The message is still sent to Claude, which handles inappropriate content gracefully on its own.
Analytics only initialise after you accept cookies via the consent banner. If you choose "Continue without", PostHog is never initialised — no cookies are set, no events are captured. You can reset your choice at any time by clearing localStorage for this domain.
PostHog retains event data for 1 year on the free plan. We do not have custom retention settings configured.
This file is the source of truth for analytics on this site. Every time a new PostHog event is added to the codebase, add it here under events in the frontmatter. The analytics dashboard reads this file and automatically renders a widget for each event with dashboard: true.