Blog
Thoughts, updates, and deep-dives into high-performance web engineering standards.

Stop Faking Personalisation: Edge Rewrites Instead of Client-Side Flicker
Client-side A/B frameworks write their assignment cookie with document.cookie — which Safari caps at seven days, silently re-bucketing returning visitors and corrupting any test that runs longer than a week. That, plus the layout shift. Both fix at the edge.
Architecture
First-Party Server Tagging: The Case That Survived Google's Cookie Reversal
Google cancelled third-party cookie deprecation in April 2025. The argument for server-side tagging did not depend on it — ITP's seven-day cookie cap, ad-blocker loss, and main-thread cost are the real drivers, and all three still apply.
Architecture
Fluid Type Systems: The Parts the Calculators Don't Generate
Utopia and the clamp() generators solve the interpolation. What they don't give you: a ratio that scales with the viewport, vertical rhythm that survives fluid sizing, and the viewport-height unit that quietly reflows on every scroll.
CSS
Why Your SPA Is Invisible in the Answer Engine Era
AI crawlers do not execute JavaScript. Vercel's analysis of 500M+ GPTBot fetches found zero JS execution. If your content lives in the rendered DOM, you do not exist to ChatGPT, Claude, or Perplexity — regardless of your Google rankings.
Architecture
Data Table Serialization: Engineering HTML for LLM Ingestion
AI crawlers read raw HTML with no CSS and no JavaScript. A CSS Grid 'table' serialises to an undifferentiated list of strings, and every row-column relationship in your data is destroyed before the model sees it.
AEO
Zero-Jank Scroll: Getting Animation Off the Main Thread
Binding animation to a scroll event listener is an engineering failure with a known fix. Scroll-driven animations run on the compositor, off the main thread, in pure CSS — and the syntax is not the one most tutorials still teach.
Performance