What a CDN fixes, and what it hides A CDN removes distance. It does not make your database faster, and it will happily hide a slow application behind a fast-looking front page. 5 min read Measuring Core Web Vitals honestly Three numbers describe how a page feels: how fast the main thing appears, whether it answers a tap, and whether it moves. What each really measures. 5 min read Compression: what to compress and what not to Text compresses by two thirds. Images do not compress at all, and compressing them wastes CPU on every request. 4 min read Cache headers that are safe to set A long cache on a file whose name never changes is a file you cannot update. Version the name, then cache it forever. 5 min read HTTP/2 and HTTP/3 - what actually changes Many small files stop being a problem, which makes some old advice actively wrong. 4 min read Images that are heavier than the whole page Usually most of the bytes and the easiest thing to halve. Three changes, in the order of what they save. 5 min read Keep-alive and connection reuse Every new HTTPS connection costs two round trips before a byte of your page moves. Reusing one is free speed you may already have turned off. 3 min read Lazy loading without breaking the layout Lazy loading saves real bytes and causes the jump that makes people tap the wrong thing. Two attributes prevent it. 4 min read Measure before you optimise Most performance work is spent on the part that was already fast. Four measurements, in order, tell you which third of the request to look at. 4 min read The page that runs four hundred queries Each one is fast. Together they are the page. How to see the count, and the one change that collapses it. 5 min read Nginx workers and connections Nginx is almost never the bottleneck, and raising these numbers almost never helps. What they mean, and the one setting worth changing. 4 min read opcache: what it caches and what it does not The single largest PHP speed-up, what it will not fix, and the setting that makes a deploy look like it did not happen. 4 min read Page caching, and when it lies to you A full-page cache is the biggest speed win available and the easiest way to show one customer another customer's basket. Where to draw the line. 5 min read Sizing a PHP-FPM pool max_children copied from a tutorial is the most common cause of a server that swaps. Work it out from your own numbers instead. 5 min read Reading a network waterfall The shape of the chart names the problem before you read a single row. Four shapes and what each one means. 5 min read Object caching with Redis It removes repeated database work, not slow queries. When it helps a great deal, when it helps nothing, and the setting that makes it dangerous. 5 min read The site is slow - where to look first Measure before you change anything. One number tells you whether the problem is the server, the network or your own code. 6 min read TTFB: the one number worth measuring first It splits every slow-page problem in half before you change anything, and it is one command. 4 min read When more RAM is not the answer Upgrading the plan is the easiest fix to buy and the most common one to waste. How to tell whether memory is actually your limit. 4 min read