Measurement · Collecting since 8 September 2026
What this site measures, and what it leaves alone.
A portfolio has small traffic, so the numbers are not the point. The point is choosing what to measure, saying what was left out, and being honest about what the data cannot tell you.
What is tracked, and the question each event answers
Seven events, no more. Each exists to answer one product question; an event without a question is noise that costs quota.
- Page Viewed
Which pages are reached at all, and from where, so the landing page can be judged against the pages behind it. Carries the path, the title, and the referring domain.
- Product Card Clicked
Which build draws interest, and whether that is the build or the slot: if position one always wins, the grid order is doing the work, not the card. Carries the product and its position, one to six.
- Case Study Opened
Whether readers arrive through the grid or land directly from a shared link, which changes what the page's opening has to do. Carries the product and the entry point.
- Case Study Depth Reached
Whether case studies are read or skimmed. A card click is interest and a full scroll is attention, and those should not be conflated. Fires at 25, 50, 75, and 100 percent, once each per page load, four at most.
- Resume Downloaded
Which page turns a reader into someone who wants the résumé, the closest thing this site has to a conversion. Carries the page it was clicked from.
- Outbound Link Clicked
Whether readers go on to the code or the live product, which is the difference between reading a claim and checking it. Carries the destination and whether it is GitHub, a live demo, LinkedIn, or other.
- Contact Initiated
Whether anyone reaches out, and by which channel, so the contact options are shaped by use rather than habit. Carries the method: email or LinkedIn.
What is deliberately not tracked
This list is the part that took judgment. Every item was available with a checkbox and was turned off on purpose.
- No session recording. It would capture the contact form as a visitor types it, and a portfolio has no use for a replay of someone reading.
- No form field capture. Nothing on a form here is analytically useful and everything on it is potentially personal.
- No click-everything autocapture. Recording every click and its text would swamp the seven named events without answering a question they do not already answer.
- No user identification. Anonymous device IDs only. No user ID, no email matching, no enrichment from any other source. There is no logged-in user on a portfolio, and knowing who is reading is unnecessary and hostile.
- No cookies. Identity is held in localStorage, so the site sets no cookies and needs no consent banner under most readings.
- No time on page. It cannot distinguish a reader from an abandoned tab, and reporting it as engagement would be a number that is wrong more often than right.
- No location finer than country. Country answers whether anyone in the markets I am applying in is reading. City would not answer anything more.
- No data from 2 to 7 September 2026. The instrumentation was live before the author exclusions were, so that window carries my own traffic and is excluded from any count published here.
What the numbers cannot answer
- Who is reading. A recruiter, a hiring manager, a peer, and the author checking a deploy all look the same. The referring domain hints at the channel, not the reader.
- Whether a read led to anything. A phone screen, an interview, or an offer cannot be attributed to a session. The only downstream signal is a contact click, which measures a click, not a conversation.
- What a depth milestone means. Full depth on a long case study is strong evidence of attention. On a short page it is the default.
- Repeat readers. The same person on a phone and a laptop counts twice, and a cleared browser counts as new.
- How much is missing. Content blockers and fast navigations both undercount, and the size of the undercount is not measurable from inside the data.
The counts
Collection began on 8 September 2026. Counts will be published here on or after 22 September 2026, once there are two weeks of data, rendered at build time from Amplitude's API rather than fetched in the browser. Until then there is nothing honest to show, so nothing is shown.
The full taxonomy, including property names and the implementation notes behind each decision, is kept in the site's repository alongside the code that fires the events.