colophon · how this site works

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.

stack

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).

measurement · dataLayer event schema

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.

EventFires whenParametersDownstream use
page_viewEvery page loadpage, pathGA4 config, Meta Pixel base
scroll_depth25 / 50 / 75 / 100%percentEngagement audiences, skimmer exclusions
section_viewSection ≥40% visiblesectionContent-level engagement analysis
time_milestone30 / 60 / 120s on pagesecondsEngaged-visitor audiences
cta_clickAny tagged CTActaMeta custom conversions, funnel steps
resume_intentResume download clickformatPrimary conversion; lookalike seed
outbound_clickLink leaves this domaintoGA4 engagement signal
experiment_assignedFirst homepage visitexperiment, variantA/B analysis dimension
utm_capturedArrival with UTM paramssource, medium, campaignSource attribution
segment_updateRules engine re-scores visitorsegmentOn-site personalization, audience sync
calc_interactionCAC model usedroasAnalytics-minded audience flag
consent_changeConsole toggle usedstateConsent Mode gate for all tags
article_readBlog post: 75% scroll + 30sslug, secondsContent performance; feeds the weekly analyst readout
poll_viewRoadmap poll block visiblepollDenominator for poll click-through
roadmap_vote_clickClick-through to the live pollpollBuild-in-public loop conversion
experimentation

The live A/B test, pre-registered.

running now
ID
hero_headline_v1
Assignment
50/50 random, persisted in localStorage
Variant A · control
"Marketing that proves its own math."
Variant B · challenger
"I turn ad spend into revenue systems."
Hypothesis
Outcome framing (B) beats credibility framing (A) on engagement
Primary metric
scroll_depth ≥ 25 within 15s of page_view
Guardrails
hero CTA click rate, resume_intent rate
Analysis
GA4 exploration segmented by experiment_assigned.variant

Hypothesis, metric and guardrails were written before launch, the discipline that separates experimentation from decoration. The same template runs my client test logs.

segmentation engine

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.

machine-readable layer

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.

deployment notes

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.

convinced?

This level of documentation is the default, not the demo.

Get in touch →