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.
Buying accessible software: a procurement playbook
A procurement playbook for accessibility: brief language that binds, evaluating claims beyond the VPAT, acceptance criteria that bite, and keeping standards after launch.
Activity feeds and audit logs: designing the product's memory
Activity feeds and audit logs are the product's memory: event grammar, grouping and noise control, filter architecture, and the enterprise sales case.
Careers pages that filter people in, not out
A careers page is a self-selection device, not a résumé bucket. Real work, honest salary bands, humane application flows — and no ping-pong clichés.
Analytics pipelines you can actually trust
Dashboards nobody trusts get quietly ignored. Event schemas, validation at the edge, QA environments for data, and pruning metrics nobody has read in two quarters.
Pricing pages that convert quietly
A pricing page is a sales conversation at maximum scepticism. How anchoring, plan naming, honest toggles and well-placed proof sell without shouting.
View Transitions in production: the practical bits
The View Transitions API after the hype: same-document and MPA transitions, reduced-motion fallbacks, 2026 browser reality, and where motion aids comprehension.
Handover without the hangover: documentation your team will read
A clean agency-to-client handover in practice: documentation people actually read, runbooks that run, training that sticks, and who owns the keys afterwards.
Loyalty programs people don't resent
Most loyalty programs are bribery with a spreadsheet. Designing points worth earning, tiers without manipulation, and proof the program changes behaviour.
Shipping LLM features: a production checklist
The pre-launch checklist we run before any LLM feature ships: evals, traces, cost ceilings, fallbacks, feedback loops and the metrics that catch quality drift.
Back-in-stock flows: the lifecycle asset nobody funds
Notify-me is a lifecycle asset, not a plugin checkbox: micro-commitment signups, honest timing, restock emails that convert, and waitlists as demand signal.
Rate limits are a UX surface, not just middleware
Rate limiting starts in middleware but ends in the interface. Retry-After contracts, queue positions, backpressure UX and the copy that keeps users calm.
Running a content model workshop before the design starts
A two-hour workshop format that produces a real CMS content model — index cards, cardinality questions, naming rules — before anyone draws a single page.