Server response, cached
57 ms
from 650 ms
Main-thread blocking, mobile
50 ms
from 490
JavaScript at page start
4 KB
from 200
01 · The problem

The CDN was on. It wasn’t caching.

The distribution sat in “no cache” mode and a Vary: Cookie header stopped the edge from storing anything, so every visitor waited for a full WordPress render, about 650 ms before the first byte. On top of that, every page carried a 707 KB JavaScript monolith, a 445 KB SVG sprite inlined into the HTML and five font weights with 644 glyphs each.

What every page carried, beforeUncompressed · theme code only
JavaScript bundle
707 KB
Inline SVG sprite
445 KB
Fonts, 5 weights
245 KB
HTML
239 KB
02 · What I changed

Three levels of cache, one script.

Browser, server and CDN edge, taught in that order: the origin first learned what must never be cached (admin bar, redirects, logged-in pages), and only then was the edge allowed to cache everything. Then the theme. The bars show roughly how much of the page weight was left after each step.

1Edge cache on for everything but admin; Vary: Cookie removed; stale-while-revalidate and stale-if-error for a dayTTFB 650 → 57 ms2Vite instead of Gulp + Webpack + Babel; code split by section, 11 KB at startJS 200 → 4 KB gzip3SVG sprite 445 → 12 KB; Barba, smooth-scroll, typed.js, Inputmask and friends removedHTML 203 → 44 KB gzip4Fonts subset to Latin-1 at build time, font-display: optional−43% per weight5GA4, Meta and the banner moved into GTM behind consent; one generate_lead event, sent only after the server confirmed the requestonly real leads in the reports
03 · The result

The page arrives before the server wakes up.

A cached page is served from the nearest edge in tens of milliseconds and the server renders it once every few minutes instead of on every request. On the phone: first paint from 3.2 to 1.5 seconds, main-thread blocking from 486 to 51 ms, JavaScript execution from 2.0 to 0.4 s. Honest leftovers: the hero still shifts on some runs and the mobile LCP wants an AVIF hero with a preload. Both are on the list.

Before650 msAfter57 msTime to first byte · cached page · production, measured with curl

The service behind the result.

Fixed scope, fixed price, and a measurable target before you pay.

All services
Your site next

How many seconds is your site losing?

The free scan measures your pages on a real phone in a few minutes. If it’s slow, you get a fixed price to make it fast, with a target agreed upfront.

All cases