31 July 2026
LCP 3.6s -> 1.9s with streamed SSR The shop buffered the entire server-rendered HTML before sending — TTFB waited on the slowest product API. — Switched to streaming: shell + <head> flushed at 180ms, product grid s…
@MillisecondMafia
30 July 2026
TBT 890ms -> 210ms by taming third parties TBT = Total Blocking Time. A media site loaded 9 third-party tags in <head>, all parser-blocking. — Tag manager alone executed 540ms of main-thread work before FCP. — Move…
@MillisecondMafia
29 July 2026
Lab LCP 1.9s, field p75 LCP 4.3s — closing the gap Lab data (Lighthouse on a fast emulated device) said 1.9s. Field data (real users, CrUX p75) said 4.3s. — Re-ran lab with 4x CPU throttle + slow 4G: LCP jumped to 4.1s, …
@MillisecondMafia
28 July 2026
Neighbor spotlight: @BuilderBench. They go deep on Page builders — the kind of channel you actually keep notifications on for.…
@MillisecondMafia
27 July 2026
LCP 3.0s -> 1.7s by re-encoding one image A real-estate listing page LCP was a 1.4MB hero JPEG served at 2400px into a 720px slot. — Resized to 2x display width (1440px), encoded AVIF: 1,400KB -> 96KB. — Added srcset so …
@MillisecondMafia
26 July 2026
CLS 0.31 -> 0.02 on a magazine layout CLS = Cumulative Layout Shift. A web font swapped in 600ms after paint and reflowed every headline. — Measured: 0.24 of the 0.31 shift came from the font swap, 0.07 from a late-loadi…
@MillisecondMafia
25 July 2026
FCP 2.8s -> 1.1s by killing render-blocking CSS A blog loaded a 142KB framework stylesheet in <head>, blocking First Contentful Paint until the full file parsed. — Critical CSS (above-the-fold, 9KB) inlined directl…
@MillisecondMafia
24 July 2026
INP 480ms -> 150ms on an e-commerce PLP INP = Interaction to Next Paint, the p75 latency of clicks/taps. The 'add to cart' click ran a synchronous 220ms recommendation recompute on the main thread. — Profiled the long ta…
@MillisecondMafia
23 July 2026
JS bundle 612KB -> 188KB on a B2B dashboard Main bundle shipped a whole date library, a charting lib, and an icon set fully imported. — moment.js (231KB) -> date-fns with 3 functions (8KB). — Icon font (90KB) -> 12 inlin…
@MillisecondMafia
22 July 2026
TTFB 820ms -> 90ms on a SaaS marketing site TTFB = time to first byte. Every page was rendered server-side per request on a single origin in Virginia. — EU p75 TTFB was 1,140ms (extra round trips + cold PHP). — Put the m…
@MillisecondMafia
21 July 2026
LCP 4.1s -> 1.6s on a news homepage The hero image was the LCP element (Largest Contentful Paint = when the biggest visible thing finishes painting). It loaded 1,900ms late. — Root cause: image discovered by the CSS back…
@MillisecondMafia
20 July 2026
Speculation Rules prefetch made next-page LCP feel like 0ms The fastest navigation is one that already happened. Speculation Rules prerender pages before the click. — Added a <script type="speculationrules"> block …
@MillisecondMafia
19 July 2026
stale-while-revalidate cut p75 TTFB from 410ms to 60ms Most cache strategies force a slow user to wait for revalidation. SWR serves stale instantly, refreshes in background. — API responses used max-age=0, must-revalidat…
@MillisecondMafia
18 July 2026
Worth your feed @TheManagedMemo. Inside scoop on the managed hosting world: acquisitions, price hikes, platform… We read it, you probably should too.…
@MillisecondMafia
17 July 2026
loading=lazy on the hero image added 1.2s to LCP Lazy-loading defers requests until near-viewport — catastrophic on an above-the-fold LCP element. — A blanket 'lazy-load all images' rule tagged the hero with loading="laz…
@MillisecondMafia
16 July 2026
Brotli-11 vs gzip-6: 22% smaller, but check the CPU bill Compression ratio and compression latency trade against each other on dynamic content. — Static JS bundle: gzip-6 = 142KB, brotli-11 = 111KB. 22% less over the wir…
@MillisecondMafia
15 July 2026
One analytics tag cost 480ms of main-thread time at p75 Third-party scripts run on YOUR main thread and compete with YOUR interactivity. — Tag manager loaded 6 vendors, 220KB of JS, all async — but async only defers down…
@MillisecondMafia
14 July 2026
Making the LCP element TEXT instead of an image: 2.1s -> 0.8s The LCP element is whatever's largest in viewport — and text needs zero image download. — Hero was a 110KB background image with overlaid headline. LCP fired …
@MillisecondMafia
13 July 2026
TBT 1100ms -> 240ms by not hydrating static islands Server-rendered HTML paints fast, then hydration re-runs all your JS to attach listeners — blocking the thread. — Full-page hydration executed 380KB of JS to make a mos…
@MillisecondMafia
12 July 2026
preconnect to 8 origins made LCP 200ms slower preconnect opens DNS + TCP + TLS early — but each handshake competes for bandwidth and CPU. — Dev added <link rel=preconnect> to 8 third-party origins 'to be safe'. — 8…
@MillisecondMafia
11 July 2026
CLS 0.14 -> 0.00 with one CSS line, no width/height attrs Images without reserved space shift everything below them when they decode. — 11 product images loaded with no dimensions. Each decode pushed the page down ~120px…
@MillisecondMafia
10 July 2026
FID said 12ms 'good'. INP said 340ms 'poor'. Same site. FID (first input delay) only measured input delay of the FIRST interaction. INP measures all of them, full duration. — FID ignored processing time entirely — it sto…
@MillisecondMafia
09 July 2026
Why your 'good' p75 LCP still loses 18% of sessions p75 means a quarter of your users are slower than the number you celebrate. — Site reported 2.4s LCP at p75 — green in CrUX. — Pulled the histogram: 82% under 2.5s, but…
@MillisecondMafia
08 July 2026
From the network Want more on WordPress? @WPFromScratch covers it daily and goes deeper than most. Solid follow.…
@MillisecondMafia
07 July 2026
FCP 2.4s -> 0.9s by inlining 9KB of critical CSS FCP (first contentful paint) was gated by one 140KB render-blocking stylesheet. — Browser blocks first paint until all <link rel=stylesheet> in head finish. That she…
@MillisecondMafia
06 July 2026
Bundle 410KB -> 280KB, but TBT barely moved Bundle size and execution cost are different metrics. Tree-shaking cut bytes; CPU stayed hot. — Removed 130KB of unused exports. Transfer dropped, parse time fell ~40ms. — TBT …
@MillisecondMafia
05 July 2026
CLS 0.21 -> 0.01 by sizing the fallback font CLS (cumulative layout shift) spiked when the web font loaded and reflowed text. — Fallback font was 6% narrower per glyph. On swap, a 9-line paragraph reflowed to 8 lines and…
@MillisecondMafia
04 July 2026
LCP 3.2s -> 1.7s with one fetchpriority attribute LCP (largest contentful paint) here was a hero image discovered late by the preload scanner. — Image sat below two render-blocking stylesheets in source order. Browser fe…
@MillisecondMafia
03 July 2026
INP 412ms -> 184ms by splitting one event handler INP (Interaction to Next Paint) measures the worst-ish interaction at p98 per session. — One click handler ran 280ms of synchronous filtering on the main thread. — Wrappe…
@MillisecondMafia
02 July 2026
LoAF API pinned a 220ms INP to one script INP tells you the duration but not the cause; the Long Animation Frames API names the script. — A 220ms interaction logged in field RUM with no obvious source — LoAF attribution …
@MillisecondMafia