Thinking, in public
Field notes on design, engineering and growth — written by the people who ship the work. No thought leadership, just lessons with receipts.
A search index built at build time
A build-time search index for static sites: tokenisation, stemming, synonyms, size budgets, sharded delivery, worker-side ranking, and proof it got better.
LLMs in the design process: acceleration with a seatbelt
How we use LLMs in the studio: synthetic drafts, copy pressure-testing, edge-case generation — and the verification rules that keep AI-assisted design honest.
Structured outputs: making LLMs renderable
Free-text LLM output is a compatibility bug waiting to ship. JSON schema modes, constrained decoding, boundary validation, and safely rendering streamed partial objects.
Prototyping with AI: where it speeds design and where it rots it
Field notes on AI-assisted prototyping: real speed in code exploration, hallucinated-component traps, prompt libraries for layout, and a provenance rule for files.
First-party data without the surveillance
First-party data foundations for the cookieless era: consent-mode analytics, an honest take on server-side tagging, what to stop measuring, and labelling estimates.
Referral loops that fit the product — not the pitch deck
Referral mechanics that match the product: incentive design, double-sided rewards, fraud resistance, timing, and why most referral programs launch a year too early.
Bottom sheets that don't fight the user
When a bottom sheet beats a modal on mobile web: drag affordances, scrim honesty, snap-point logic, keyboard and screen-reader behaviour, and anti-patterns.
Roles and permissions: the quiet complexity of team products
Designing roles that match customer org charts, permission matrices people can read, invitation-time clarity, escalation paths and guarding against the accidental admin.
Scrollytelling with restraint: narrative pages that respect the scrollbar
The production playbook for scrollytelling that earns its keep: a one-pin budget, chapter navigation, a designed reduced-motion variant, and a print-test honesty check.
Monorepo or not? A studio's decision framework
Monorepos solve code-sharing and coordination problems most studios don't have, at tooling costs they don't predict. When we say yes, and what we do when we say no.
Personalisation vs privacy: drawing the line deliberately
Draw the personalisation privacy line before legal does: on-device and anonymous patterns, explainable personalisation, and consent UX that actually means something.
Form architecture at scale: schemas, errors and autofills
Schema-first form engineering: shared zod validation, error copy as data, correct autofill tokens, and announcements that don't double-speak.