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.
Writing
43 write-ups from production, newest first. Each one is a problem hit on a real project and how it was diagnosed and fixed.
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.
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.
Most performance audits are a Lighthouse export with commentary. The format we use instead: field data first, per-metric attribution, prioritised fixes, checks.
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.
Why some hero images start loading a second late: CSS backgrounds, JavaScript-inserted images, lazy loading on the wrong element. See the delay and fix it.
Getting next/image right for LCP: the sizes attribute most sites get wrong, when to use priority, quality and format trade-offs, and the check that proves it.
Time to first byte sets the floor for every metric. Its components from DNS to origin, how to measure each, and what managed hosts and edge platforms get wrong.
How WordPress generates, serves and lazy-loads images, where the defaults hurt Core Web Vitals, and the configuration that gets the hero loading fast.
A method for tracking down layout shift: reproducing it, reading DevTools shift records, the usual suspects from fonts to widgets, and the fix for each.
How to talk about page speed with a business owner without saying LCP: the metrics that mean money, the before-and-after that lands, and a one-page report.
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.
Your laptop is lying about page speed. Why field data is dominated by mid-range phones, how to test on one or emulate it honestly, and what changes.
Third-party scripts are the usual cause of failing INP. How to measure what each tag costs on interaction, which hurt most, and how to load them for less.
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.
First Contentful Paint regressed after turning on reactCompiler in Next.js 16? Here is why the runtime cache pushes paint and the boundary fix that recovers it.
INP score tanked on mobile after adding the Cloudflare Turnstile widget? Here is why the embed script blocks interaction and the lazy-load fix that works.
CLS spiking on iOS Safari only in CrUX? Here is why aspect-ratio falls back to auto on older Safari builds and the width/height pattern that holds layout.
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.
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.
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.
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.
React 19 Activity component spiking INP past 300ms on mobile after a click? Here is the synchronous commit that triggers the long task and the fix that holds.
Your hero background image is the LCP but the browser only finds it after CSSOM parsing? Why fetchpriority does not help, and the preload that does.
Cloudflare Rocket Loader tanking INP on a Next.js site? Here is why it delays React hydration on mobile and the page rule that restores interactivity.
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.
Vercel middleware doing geo redirects spiking TTFB to 800ms? Here is the runtime, header, and edge config fix that cuts it back under 100ms.
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.
Next.js page failing back/forward cache and re-rendering on browser back? Most causes are unload listeners, open WebSockets, or Cache-Control no-store.
Debugging INP regressions in 2026? Wire the Long Animation Frames API to capture the exact slow handler in real users with a working PerformanceObserver.
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.
Cumulative Layout Shift spiking from Suspense skeleton loaders in Next.js 16? Match the skeleton dimensions to real content with a working CSS pattern.
PageSpeed Insights LCP score different from CrUX field data? Fix the lab vs real-user gap with throttling, viewport, and resource priority hints.
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.
Vercel Speed Insights showing no data after Next.js 16 upgrade? Fix the missing beacon, CSP block, and the SpeedInsights component placement with code.
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.
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.
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.
LCP regressed because the browser preloads the wrong image with next/image priority? Fix fetchpriority, srcset, and preload candidate selection with code.
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.
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.
CLS regression spiking from next/font fallback after upgrading to Next.js 16? Here is the root cause and adjustFontFallback fix with working code.
A step-by-step guide to optimizing WordPress performance. Caching, image optimization, CDN setup, and database cleanup that delivered 60% faster load times.
Everything developers need to know about Core Web Vitals in 2026. LCP, INP, CLS explained with real-world fixes and measurement strategies.
Fixed price for a defined scope, on live sites, with a rollback path. Agencies and in-house teams welcome.
Hire me for Core Web Vitals