← Back to prehog

Privacy on /prehog

This page is a supplement to benlive.tv's site-wide privacy page. It covers only what's true here in addition to the site-wide page.

Why this page is different

benlive.tv/prehog is a working PostHog implementation, built to demonstrate PostHog competence for a job application. It enables Session Replay with input and marked-text masking, a post-completion survey, feature flags and exception reporting. Its AI chat sends conversation content through a separate service path, described below. Context First uses a similar presentation-specific setup. The shared analytics layer disables replay on other pages; see the site-wide privacy page for the broader disclosures.

What's collected, and why

Page views
PostHog's standard $pageview autocapture, fired once on load. Answers "did anyone open the page."
Slide progress
Eight small events tied to the deck's own nine sections: which section is active (in either view mode, see below), how you navigated (click, arrow key, swipe, dot, Contents panel, scrolling), whether you reached the end, whether the auto-advance timer is playing or paused, whether you opened the "what does this page measure" panel, which evidence links you clicked through to, and whether you switched between the guided and browsable layouts. The eighth is hidden, rewarding close reading: it's left for a visitor to find on their own. Each exists to answer one specific, stated question about whether the presentation itself works, kept narrow and single-purpose by design. The full list, with the exact question each answers, is in this repo's own analytics.md.
Chat engagement (product-level only)
Four more small events for the "Ask about PostHog fit" chat: whether you opened it, which preset starter question you used, recorded only as a fixed label like culture or throughline, whether you actually sent a message (once per session), and whether you reset the conversation. These events always carry only their own name and that label — your message text and the AI's response stay off them entirely. See "AI chat messages" below for where that content actually goes. Documented alongside the slide-progress events in analytics.md.
Session Replay
Turned on for this page only, with maskAllInputs: true. It exists to answer one specific question: is the slide navigation discoverable on a phone? It's meant to come off once that's answered: temporary by design. The entire chat dialog is additionally masked as rendered text (beyond its input field), the same treatment the survey's free-text answer gets: maskAllInputs alone only covers text while it's being typed into an input, so the message bubbles the chat renders afterward need that extra masking to be covered too.
A short survey
Shown once, after you reach the final slide: a 1–5 rating and one optional open-text question, masked in Session Replay even though the response itself is recorded as normal survey data.
AI chat messages
Submitting a question in the "Ask about PostHog fit" chat sends that text to my own Firebase Functions backend, which forwards it to OpenRouter and the model provider serving the request, with relevant conversation context. A fallback model may handle a request if the first choice is unavailable. Provider retention and use of content depend on the service and account settings; this page does not promise zero retention or exclusion from model training. See OpenRouter's provider-logging information. Chat text is excluded from this page's custom analytics events, and the chat dialog is masked in Session Replay. The app itself keeps your questions and the AI's answers only in your own browser tab (refreshing clears the conversation). Firebase Functions records request, model, timing and error details; upstream error responses can enter diagnostic logs. Rate limiting uses a keyed IP hash and counters. Retention depends on service settings, and resetting a chat does not delete provider or infrastructure records. See the site-wide AI data policy for more detail.
One feature flag
Controls whether a live, self-referential event-log panel is visible to a given visitor: a genuine rollout control, exactly the kind of on/off switch feature flags are meant for.
JavaScript errors
Unhandled exceptions and unhandled promise rejections only, so a bug that only shows up on someone's actual phone in production still gets caught. Nothing else in the console is captured.
Two sessionStorage keys
prehog:autoplay remembers whether you paused the auto-advancing slideshow, so it stays paused across navigation within the same tab. bl:prehog-chat-initiated remembers whether you've already sent a chat message this session, so the "chat engagement" event above fires only once. Both stay entirely within your browser.
One localStorage key
prehog:viewmode remembers whether you last chose the guided (present) or browsable (reference) layout, so your choice persists across visits. It uses the same durable-preference pattern the site's own dark/light theme choice already relies on. It stays entirely within your browser.

Identity & message privacy

This presentation does not deliberately attach names or email addresses to analytics. PostHog uses persistent browser identifiers, so visits are pseudonymous rather than fully anonymous. IP-derived location may be more specific than a country. The page does not call identify(), but that does not prevent visits from being linked by a browser identifier. Chat text is excluded from custom analytics events and the chat dialog is masked in replay. Optional written survey answers are submitted to PostHog as survey data.

Where it goes

PostHog events are sent through t.benlive.tv, a first-party reverse-proxy subdomain that forwards ingestion traffic straight to my own PostHog project. See PostHog's own privacy policy for how they handle it on their end once it arrives. Nothing is sold, shared with third parties for advertising, or used for anything beyond understanding whether this presentation works. Persisted via localStorage+cookie, scoped to this site. Chat messages follow a completely separate path (see "AI chat messages" above) through Firebase Functions to OpenRouter, entirely bypassing t.benlive.tv and PostHog.

Want to see it for yourself?

The "what does this page measure?" panel on slide 6 of the deck shows a live log of every event your own session has actually sent, including your pseudonymous distinct_id when enabled. The event taxonomy, the reasoning behind every product turned on or deliberately left off, and the full source are public in the prehog repository.

Last updated: September 7, 2026. This page describes /prehog specifically. See the site-wide privacy page for the rest of the site, and AI Lab's own "Privacy & Data Handling" panel for how that product handles conversation data specifically (chat message content and responses stay off analytics entirely, on this page and site-wide). Questions go to Ben McNulty via Hire Me.