Writing

Performance: what we have had to fix

65 write-ups from production, newest first. Each one is a problem hit on a real project and how it was diagnosed and fixed.

65 articles
5 min read

Bfcache: The Free Speed You Lose With One Header

The back/forward cache makes back navigation instant and lifts field metrics for free, unless something blocks it. Blockers from no-store to unload handlers.

Core Web VitalsCaching
6 min read

Cookie Consent Banners Without CLS or INP Cost

The consent banner is often the worst thing on a page for Core Web Vitals: it shifts layout, blocks the thread and fires every tag on Accept. Making one fast.

Core Web VitalsPrivacy
5 min read

INP: Finding the Slow Interaction in Field Data

INP fails in Search Console and the lab shows nothing. How to instrument real users to find which element, event and script is slow, and report it usefully.

Core Web VitalsINP
5 min read

Critical CSS and Render-Blocking Resources, Explained

Why a page stays blank while stylesheets and scripts load, what the render-blocking audit means, and the fixes in order of return, from fewer files to inlining.

Core Web VitalsCSS
6 min read

Lighthouse Green, Search Console Red: Which CWV to Trust

Why PageSpeed says your site is fast while Search Console fails it on Core Web Vitals, which data Google uses, and how to audit against the numbers that count.

Core Web VitalsPerformance
7 min read

Intercom Widget INP Regression on Mobile: The Fix

Intercom widget tanking INP on mobile after the May launcher update? Here is why the script blocks the main thread and the lazy-mount fix that holds up.

PerformanceINP
5 min read

React Compiler INP Regression in Production: Fix

React Compiler enabled on Next.js 16 and field INP regressed past 200ms? Here is why auto-memoisation pushes work post-commit and the scoped fix that lands.

PerformanceCore Web Vitals
6 min read

CLS From Trustpilot Widget Late Load on Product Pages

Trustpilot widget pushing CLS over 0.1 on product pages? Here is the reserved-space pattern and lazy load fix that stops the layout shift on mobile devices.

Core Web VitalsCLS
5 min read

LCP Regression After CSS Container Queries Migration

Migrated to CSS container queries and watched LCP jump 800ms in field data. Here is why the hero image stops being a priority paint and how to fix it.

PerformanceCore Web Vitals
6 min read

INP Regression After React 19.2 useTransition Migration

INP field data spiking after wrapping filter handlers in useTransition? Here is why React 19.2 transitions can make INP worse and the pattern that fixes it.

PerformanceCore Web Vitals
6 min read

next/script afterInteractive Blocking INP on Mobile

next/script strategy='afterInteractive' still pushing INP past 500ms on mobile? Here is the lazyOnload, worker, and onLoad fix that drops it back under 200ms.

PerformanceCore Web Vitals
6 min read

INP Regression From Sentry Session Replay 9 on Mobile

Sentry Session Replay 9 tanking INP on mobile after the upgrade? See what changed in the rrweb sampler and the config fix that pulls INP back under 200ms.

PerformanceCore Web Vitals
6 min read

INP Field Data Worse Than Lighthouse Lab Score Fix

Lighthouse INP score is green but CrUX field data is failing pages in Search Console? Close the lab-vs-real-user INP gap with focused attribution fixes.

INPCore Web Vitals
6 min read

CLS From Skeleton Loaders in Suspense Fallback Fix

Cumulative Layout Shift spiking from Suspense skeleton loaders in Next.js 16? Match the skeleton dimensions to real content with a working CSS pattern.

PerformanceCore Web Vitals
5 min read

PageSpeed LCP Different From Field Data Fix Guide

PageSpeed Insights LCP score different from CrUX field data? Fix the lab vs real-user gap with throttling, viewport, and resource priority hints.

Core Web VitalsPerformance
5 min read

next/image priority Not Preloading Hero: LCP Fix

next/image with priority not generating a preload link and tanking your hero LCP score? Fix the missing preload hint and PPR boundary issue with code.

PerformanceCore Web Vitals
5 min read

Vercel Speed Insights No Data After Next.js 16: Fix

Vercel Speed Insights showing no data after Next.js 16 upgrade? Fix the missing beacon, CSP block, and the SpeedInsights component placement with code.

PerformanceCore Web Vitals
6 min read

Cookie Consent Banner CLS Fix: Stop the Layout Shift

Cookie consent banner tanking your CLS score and Core Web Vitals on first paint? Fix the late-injected banner, reserved space, and animation timing in code.

PerformanceCore Web Vitals
6 min read

Next.js 16 Image priority Deprecated: Real LCP Fix

Next.js 16 deprecated the priority prop on next/image. Migrate to preload, fix the LCP regression, and stop accidentally preloading every product hero image.

PerformanceCore Web Vitals
5 min read

INP Mobile Regression from React Hydration Delay Fix

INP score worse on mobile than desktop after a React deploy? Hydration is blocking the main thread. Fix it with code splitting and Suspense streaming.

PerformanceCore Web Vitals
6 min read

LCP Preload Hint Picking the Wrong Image: Real Fix

LCP regressed because the browser preloads the wrong image with next/image priority? Fix fetchpriority, srcset, and preload candidate selection with code.

PerformanceCore Web Vitals
6 min read

next/font CLS Layout Shift in Next.js 16: Real Fix

next/font causing CLS layout shift in Next.js 16 after the upgrade? Fix font fallback metrics, size-adjust, and display swap settings with working code.

PerformanceCore Web Vitals
6 min read

Technical SEO Audit Checklist for 2026

A practical technical SEO audit checklist for 2026 covering crawlability, indexation, rendering, internal links, structured data, and Core Web Vitals.

SEOTechnical SEO
6 min read

Next.js App Router Render-Blocking CSS Fix

Next.js App Router render-blocking CSS can crush LCP when globals and library styles leak into initial chunks. Here is the fix I use on production builds.

Next.jsPerformance
6 min read

INP Regression from GTM Third-Party Tags in 2026

INP score regressing above 200ms after adding Google Tag Manager tags? Here is how to diagnose the blocking tag and fix it with working code.

PerformanceCore Web Vitals
3 min read

WordPress Performance: How I Cut Load Times by 60%

A step-by-step guide to optimizing WordPress performance. Caching, image optimization, CDN setup, and database cleanup that delivered 60% faster load times.

WordPressPerformance
Need this done, not read about?

We take Performance work on subcontract and direct.

Fixed price for a defined scope, on live sites, with a rollback path. Agencies and in-house teams welcome.

Hire me for Performance