The portfolio is the proof of work.
Most portfolios describe skills. This one performs them. Everything below is running on the page you're reading: the measurement architecture, the live experiment, the segmentation engine, the machine-readable layer. This page is the documentation a future teammate would inherit.
Deliberately boring technology.
Hand-rolled HTML, CSS and vanilla JavaScript. Zero frameworks, zero build dependencies beyond a small Python assembler that wraps shared navigation around each page. Fonts from Google Fonts; everything else ships from this domain. The point isn't minimalism for its own sake. It's that a marketing site should load instantly, be fully crawlable, and have nothing between the visitor and the measurement layer. Total JavaScript: one file. Total third-party scripts: one (GTM).
Every event, documented.
This is the governance artifact I build for every client: a named, versioned event schema. GTM consumes these as custom-event triggers; GA4 and the Meta Pixel map onto them without touching site code.
| Event | Fires when | Parameters | Downstream use |
|---|---|---|---|
| page_view | Every page load | page, path | GA4 config, Meta Pixel base |
| scroll_depth | 25 / 50 / 75 / 100% | percent | Engagement audiences, skimmer exclusions |
| section_view | Section ≥40% visible | section | Content-level engagement analysis |
| time_milestone | 30 / 60 / 120s on page | seconds | Engaged-visitor audiences |
| cta_click | Any tagged CTA | cta | Meta custom conversions, funnel steps |
| resume_intent | Resume download click | format | Primary conversion; lookalike seed |
| outbound_click | Link leaves this domain | to | GA4 engagement signal |
| experiment_assigned | First homepage visit | experiment, variant | A/B analysis dimension |
| utm_captured | Arrival with UTM params | source, medium, campaign | Source attribution |
| segment_update | Rules engine re-scores visitor | segment | On-site personalization, audience sync |
| calc_interaction | CAC model used | roas | Analytics-minded audience flag |
| consent_change | Console toggle used | state | Consent Mode gate for all tags |
| article_read | Blog post: 75% scroll + 30s | slug, seconds | Content performance; feeds the weekly analyst readout |
| poll_view | Roadmap poll block visible | poll | Denominator for poll click-through |
| roadmap_vote_click | Click-through to the live poll | poll | Build-in-public loop conversion |
The live A/B test, pre-registered.
Hypothesis, metric and guardrails were written before launch, the discipline that separates experimentation from decoration. The same template runs my client test logs.
How the console scores you.
A small client-side rules engine re-classifies every visitor as behavior accumulates, mirroring how I'd structure retargeting audiences in a real funnel: Skimmer (low engagement: a holdout, not a spend target), Engaged browser (real reading behavior: one capped soft-touch impression), High-intent evaluator (multiple case studies in depth: custom audience, case-study carousel within 48h), Analytics-minded evaluator (used the CAC model: methodology-led creative), Conversion-ready (case study + contact in one session: stop selling, start scheduling), and Conversion: resume pulled (excluded from prospecting, enters direct outreach). Signals persist for the session only, and the console's tracking toggle kills the whole pipeline. That is the Consent Mode pattern, demonstrated.
Built for AI screeners, on purpose.
Recruiting runs through parsers and language models now, so this site publishes for them explicitly:
llms.txt, a structured plain-text brief of the entire profile following the
emerging convention for LLM crawlers; resume.json, a machine-readable resume
endpoint; JSON-LD Person schema in every page head; a clean sitemap.xml; and semantic HTML
with the full case-study depth in real text, not images. The expandable "full depth" sections on case pages exist for
exactly this dual readership: humans skim the top fold, machines read everything.
Wiring it live.
The site ships GTM-ready with a placeholder container ID. Go-live checklist: create a GTM container and replace
GTM-XXXXXXX in each page head (two places); add GA4 via a configuration tag on All Pages; deploy the Meta
Pixel as a Custom HTML tag with custom events mapped from the schema table above; mark resume_intent and
cta_click as conversions; set the production domain in canonical/OG tags and sitemap.xml;
drop resume.pdf into /assets. The on-page console reads the dataLayer directly, so it works
identically before and after GTM is connected.