Case study · 01 / 05 · 20266 min read
  • Next.js 16
  • TypeScript
  • PostHog
  • Vercel

This website

What does a portfolio look like when the designer instruments it like a product?

Where
Built alone, from the type scale to the analytics. You are on it.
Role
Design, code, copy, tracking plan, QA
The home page of this site: the name in large type, the paper with the dot-matrix face and the numbers, and the featured case
Every figure printed with what it cost, and a funnel that reports whether anyone read it

01What it is

The site you are reading. Next.js 16 and React 19, Tailwind 4 with a numeric type and spacing ruleset, three fonts, one accent colour. A dark ground of drifting glyphs with paper objects on it, and a hard orange offset under every piece of paper.

It runs the conversion tactics it talks about and names them: a tab win-back that changes the title while you are gone and says so when you are back, a social-proof card that explains itself when asked, an exit-intent modal, a 404 page that is a paywall with a decoy plan. Each one is the tactic and the annotation at once.

02The home page

Three screens and a dock, one gesture apart. The rule is that a gesture moves a whole unit, never a partial scroll: a wheel flick from the hero lands on the reel, a flick from the reel's last print lands on the references. The hero is the name, the thesis, the strongest public figure with its counter-metric, and a paper with a dot-matrix face, line items with their red caveats, and a total of overclaims at $0.00. The reel is a pinned snap track of paper prints, one per study, with a two-line headline on the left that rolls when the print changes. The references are eight public LinkedIn recommendations as stubs; four private ones are left out because a visitor has to be able to open the page and find every word.

The tactics are the point of the page, not decoration. When the tab goes into the background the title reads 'the designer to hire' and the favicon blinks between the stub and its orange inverse once a second, the fastest honest rate a hidden tab allows. Come back and the title says 'Back from the other nine tabs?' for four seconds; on the first return of a session a slip drops in with the note and stays until it is dismissed. The social-proof card fires once the reel enters the viewport, never in the first ten seconds, and the button under it says 'No they are not', with the honest explanation. The exit-intent sheet names the tactic and gives both numbers, and its decline is 'No thanks'. The confirmshaming version of any of these will not ship.

03Analytics without a banner

One vendor, PostHog, loaded through a first-party path so ad blockers, which recruiters run more than most, do not see it. Persistence is memory only: nothing is written to the visitor's device, no identify, no cross-visit user, so a reload is a new visitor and the visitor count runs high on purpose. US visitors only; the site exists to get me hired in the US, and a country check runs before the SDK starts. Session replay stays on with inputs masked, because replay was the point and the first attempt, PostHog's cookieless mode, switched it off silently. That reversal is in the decisions log.

The tracking plan came before the tracking code. Forty-seven event names, object then action, and one rule for adding one: when this fires, what do we do about it? Six of them decide anything, a contact click, a deep read of a study, a study opened from the reel, a reference opened, the hero button, a study page view. Everything else explains a number on the dashboard. Engaged time counts only while the tab is visible, the window is in front, and the last scroll or key was under five seconds ago, and every study visit ends as deep, skim, partial or bounce.

What it deliberately does not do: no privacy notice, no do-not-record control, no surveys, nothing on the page that could put a hiring manager off. Browsers sending Global Privacy Control get no vendor at all. The one real exposure in the setup, session replay under the California wiretapping suits, is written down in the analytics doc with the one-line switch that turns replay off.

04The ruleset

  1. 01Two type ratios: about 1.2 through the text range and 1.25 to 1.333 through the display range, fluid between 320 and 1440, no two steps closer than 25 percent
  2. 02A 4px base with an 8px layout rhythm: every value divisible by four, layout values by eight, so the Tailwind camp and the Material camp are both satisfied
  3. 03Within-section spacing two to three times tighter than between-section spacing, and proximity by halving gaps: 32, 16, 8
  4. 04No interactive target under 24 by 24, which is the WCAG 2.2 floor and a legal floor rather than a target; primary and mobile controls at 44 to 48
  5. 05Contrast computed, never eyeballed. The pre-ship checklist has twenty items and that is the last one

05The content model

A study is data: a slug, a question, a three-line summary, a cover, and sections of typed blocks. The block kinds encode the storytelling rules so they are hard to skip: an impact block reports each metric on its own line with the counter-metrics beside the ones that went my way, an attribution block follows every impact and says what the design can and cannot claim, a withheld block says a number exists and why it is not here. A draft renders in development and is a 404 in production. An ask block is a question for me, drawn as an orange note, and the build refuses to publish a study that still carries one, so nothing goes live half-answered.

Two more kinds arrived after a review pass: the dropped block strikes each cut idea through with the reason in my hand, and the dials block is an empty instrument panel for the metrics I never got to read. Both exist because two sections on every study were paragraphs that felt flat, and the fix was a form, not an image.

06Decisions, and what was cut

  1. 01The About page was chosen from four treatments built and compared live on the site; the other three are in git. The family page came from five. The labs index from four
  2. 02Page transitions: twelve mocks built (shared print, paper feed, stamp, ink settle, tear and pin, tear-off, scan, fold, print head, roll, ink flood, curl) and none kept. The flatness was the page appearing in one frame; a 180ms fade fixed that without becoming a thing
  3. 03Two studies and the Work index were cut in one sitting. A portfolio presents the strongest work, not filler. Their content is in git at a named commit
  4. 04Microsoft Clarity was in the analytics plan and was dropped: it sets cookies, duplicates the replay, and is the tool named in the lead US replay lawsuit
  5. 05The reel's snap area is an unscaled slot around each print, because the print's own scale used to move the snap point after landing. That was the bounce

07How it was built

There is no test suite. Verification is a real browser against the dev server at 1900 and 390 wide, with a real mouse wheel for the reel because a synthetic wheel does not scroll it, and a screenshot of every touched screen before anything is called done. Some things a headless browser cannot see at all: a tab going hidden, which the favicon blink depends on, was verified by driving plain Chrome and photographing the window.

Eight deep research runs fed the decisions, each with a few hundred sources and an applied line tying what it found to what changed: the type ruleset, the analytics stack, how case studies are read, replay consent law, general product analytics practice. The dashboard was built through the PostHog MCP from the tracking plan. A live punch list with persistent checkboxes tracked the last pass before the DNS switch, and the decisions log, thirteen entries and counting, is the file a new session reads first.

Things that went wrong and are written down so they do not happen twice: a CSS syntax error mid-edit leaves the dev server serving 500 after the fix; unlayered CSS silently beats the utility layer and did it to nav colours and hero tracking; the dev server adds a second pair of icon links after mount, so the favicon swap has to look them up every time and re-insert them.

08By the numbers

  • 47

    event names in the tracking plan, six of which decide anything

  • 37

    components, twelve content files, one accent colour

  • 13

    logged decisions, four of them reversals

It is also the proof of the thesis at the top of the home page: design the moment, then build the tooling that says whether it worked. The tooling here is the site's own analytics, and the number it reports is whether you got in touch.