Compression is the oldest performance lever and still among the most misconfigured: estates ship uncompressed JSON to this day because a header didn’t match. The 2026 menu, gzip, Brotli, Zstandard, adds genuinely better options and a few new ways to hold them wrong.
The codec landscape
Gzip remains the universal floor. Brotli beats it meaningfully on text at equivalent speed classes, and at its high settings (great for static precompression) produces the smallest payloads at CPU costs you pay once at build time. Zstandard’s superpower is speed, dramatic compression throughput at strong ratios, plus first-class dictionary support; its browser support arrived recently enough that gzip fallback still matters. The edge negotiates per Accept-Encoding, so all three coexist; your job is ensuring the negotiation actually happens.
Static versus dynamic strategy
Precompress static assets at maximum settings in the build (brotli -11 class), serve the precompressed variant, and never spend edge CPU recompressing immutable bytes. Dynamic responses compress on the fly at moderate settings where the ratio-per-CPU curve is steep; the edge is usually the right place (compress once, serve many via cache), but confirm your CDN compresses on your behalf versus merely passing origin encoding through, vendor defaults differ and silently disagree with assumptions.
The dictionary frontier deserves a forward-looking paragraph: shared and delta dictionaries, where client and server compress against previously delivered content or a negotiated corpus, push text payloads far below what any codec achieves cold, think framework bundles diffed against their previous version rather than re-shipped. Standards and edge support have been assembling around compression dictionary transport, and delivery platforms are natural dictionary custodians: they hold both versions and both connections. Estates shipping large recurring text payloads, SPA bundles, config blobs, catalogs, should track this capability in vendor roadmaps, because when it lands in your stack the bandwidth line does not shrink, it steps.
The misconfiguration bestiary
Vary: Accept-Encoding missing, so caches serve gzip to Brotli clients or vice versa. Content types outside the compressible allowlist (SVG, JSON API responses, streaming manifests are the classic omissions). Compression disabled on error pages and redirects, small individually, large at volume. Double compression of already-compressed media wasting CPU for negative gains. And the champion: origin compressing while the CDN decompresses-recompresses per its own policy, burning cycles to change nothing. One afternoon with curl and Accept-Encoding permutations across your top URLs finds most of it.
In practice
Audit the top hundred URLs for negotiated encoding versus best-available per content type; precompress the static pipeline; enable Brotli (and Zstandard where supported) at the edge for dynamic text; verify Vary correctness in cache behavior, not just headers; and put bytes-saved-by-compression on the dashboard next to transfer, because the receipt on this very site prints that number for a reason: it is the cheapest bandwidth you will never buy.
Compression audits ship with our performance engagements: encoding matrix, misconfig list, projected savings in your currency.
