<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ModPageSpeed Blog</title><description>Technical insights on web performance, automatic optimization, and the engineering behind ModPageSpeed.</description><link>https://modpagespeed.com/</link><language>en-us</language><lastBuildDate>Sat, 04 Jul 2026 00:00:00 GMT</lastBuildDate><atom:link href="https://modpagespeed.com/blog/rss.xml" rel="self" type="application/rss+xml"/><item><title>Cyclone vs. the file cache: benchmarking a memory-mapped page cache</title><link>https://modpagespeed.com/blog/cyclone-cache-vs-file-cache-benchmark/</link><guid isPermaLink="true">https://modpagespeed.com/blog/cyclone-cache-vs-file-cache-benchmark/</guid><description>Head-to-head cache benchmark: Cyclone (memory-mapped, in-process RAM tier) vs. the classic file-per-entry cache, across concurrency, realistic traffic, latency tails, and eviction, on fast and realistic storage.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>The agentic web hits your origin, not a proxy</title><link>https://modpagespeed.com/blog/agentic-web-at-the-origin/</link><guid isPermaLink="true">https://modpagespeed.com/blog/agentic-web-at-the-origin/</guid><description>The agentic web creates four origin problems: identity, economics, what to serve, provenance. Where to solve them, and why on your own servers.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Pay-per-crawl at the origin: an experimental RSL-CAP access gate</title><link>https://modpagespeed.com/blog/pay-per-crawl-at-the-origin/</link><guid isPermaLink="true">https://modpagespeed.com/blog/pay-per-crawl-at-the-origin/</guid><description>mod_pagespeed 1.15 ships an experimental, off-by-default RSL-CAP gate for nginx: validate Authorization: License capability tokens and refuse unauthorized AI-crawler access at your origin. Preview, not GA.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Stop image optimization from stripping C2PA content credentials</title><link>https://modpagespeed.com/blog/preserve-content-credentials-c2pa/</link><guid isPermaLink="true">https://modpagespeed.com/blog/preserve-content-credentials-c2pa/</guid><description>ModPageSpeed detects C2PA / Content Credentials manifests and preserves image provenance instead of stripping it during optimization — on by default in both engines.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Serve markdown and llms.txt to AI agents from your origin</title><link>https://modpagespeed.com/blog/serve-markdown-to-ai-agents/</link><guid isPermaLink="true">https://modpagespeed.com/blog/serve-markdown-to-ai-agents/</guid><description>ModPageSpeed 2.0 serves a clean markdown variant on Accept: text/markdown and synthesizes an /llms.txt index from your sitemap, generated at your own origin. Experimental, 2.0-only, license-gated, off by default.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Web Bot Auth: verify AI crawlers at your origin</title><link>https://modpagespeed.com/blog/verify-ai-crawlers-web-bot-auth/</link><guid isPermaLink="true">https://modpagespeed.com/blog/verify-ai-crawlers-web-bot-auth/</guid><description>mod_pagespeed 1.15 ships an nginx Web Bot Auth verifier that checks RFC 9421 signatures and labels each request in $x_verified_bot. Observe-only, default off.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Air-gapped headless rendering: SSRF protection with pinned, out-of-process fetches</title><link>https://modpagespeed.com/blog/air-gapped-headless-fetch-ssrf-pinning/</link><guid isPermaLink="true">https://modpagespeed.com/blog/air-gapped-headless-fetch-ssrf-pinning/</guid><description>SSRF protection for headless browser rendering: ModPageSpeed 2.0 forces Chrome offline, routing subresources through an IP-pinned fetch re-checked per redirect.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Stopping cache fragmentation: stripping tracking params and normalizing URLs</title><link>https://modpagespeed.com/blog/cache-key-url-normalization-tracking-params/</link><guid isPermaLink="true">https://modpagespeed.com/blog/cache-key-url-normalization-tracking-params/</guid><description>Strip tracking parameters to stop cache fragmentation: ModPageSpeed normalizes the URL before keying, dropping UTM params, sorting the query, aliasing hosts.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Default cache TTL: heuristic freshness when the origin sends no Cache-Control</title><link>https://modpagespeed.com/blog/default-cache-ttl-heuristic-freshness/</link><guid isPermaLink="true">https://modpagespeed.com/blog/default-cache-ttl-heuristic-freshness/</guid><description>Default cache TTL when no Cache-Control: per-content-type heuristic TTLs, RFC 9111 Age adjustment, and the shared-vs-private cache split in ModPageSpeed 2.0.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Measuring LCP and CLS in a headless browser to drive optimization</title><link>https://modpagespeed.com/blog/headless-lcp-cls-measurement/</link><guid isPermaLink="true">https://modpagespeed.com/blog/headless-lcp-cls-measurement/</guid><description>Headless LCP and CLS measurement in ModPageSpeed 2.0: injected PerformanceObservers capture the real LCP element and layout shifts to drive preload hints.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Proactive variant generation: warming the cache for hot URLs</title><link>https://modpagespeed.com/blog/proactive-variant-generation-cache-warmup/</link><guid isPermaLink="true">https://modpagespeed.com/blog/proactive-variant-generation-cache-warmup/</guid><description>How ModPageSpeed 2.0 warms hot-URL caches: nginx flags a hot URL and the worker pre-builds the whole image variant matrix — format, viewport, density, Save-Data — instead of encoding one variant per request.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Remove unused JavaScript with Chrome&apos;s coverage instrumentation</title><link>https://modpagespeed.com/blog/remove-unused-javascript-chrome-coverage/</link><guid isPermaLink="true">https://modpagespeed.com/blog/remove-unused-javascript-chrome-coverage/</guid><description>How a headless Chrome V8 coverage pass measures which JavaScript actually executes before first paint, so ModPageSpeed 2.0 can safely defer the scripts that never run on load.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Safe JavaScript minification: automatic semicolon insertion and the fail-safe</title><link>https://modpagespeed.com/blog/safe-javascript-minification-semicolon-insertion/</link><guid isPermaLink="true">https://modpagespeed.com/blog/safe-javascript-minification-semicolon-insertion/</guid><description>To minify JavaScript safely you have to parse it, not strip whitespace. How ModPageSpeed 2.0&apos;s tokenizer handles automatic semicolon insertion, regex-vs-divide, and a parse-error fail-safe that ships the original untouched.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Serving markdown to AI crawlers, and synthesizing /llms.txt</title><link>https://modpagespeed.com/blog/serve-markdown-to-ai-crawlers-llms-txt/</link><guid isPermaLink="true">https://modpagespeed.com/blog/serve-markdown-to-ai-crawlers-llms-txt/</guid><description>How to serve markdown to AI crawlers on the same URL via Accept: text/markdown, synthesize /llms.txt from the sitemap, and honor AI opt-out directives.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Server-injected resource hints: Speculation Rules and preconnect from real traffic</title><link>https://modpagespeed.com/blog/server-injected-resource-hints-speculation-rules/</link><guid isPermaLink="true">https://modpagespeed.com/blog/server-injected-resource-hints-speculation-rules/</guid><description>How a proxy generates server-injected resource hints: speculation-rules prefetch derived from real traffic, priority-bucketed preconnect, font preload.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>SSIMULACRA2 image quality: verify the encode, then re-encode until it passes</title><link>https://modpagespeed.com/blog/ssimulacra2-image-quality-verification/</link><guid isPermaLink="true">https://modpagespeed.com/blog/ssimulacra2-image-quality-verification/</guid><description>How ModPageSpeed 2.0 scores encoded images against a SSIMULACRA2 image quality target and re-encodes until the result clears tolerance, not a quality knob.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Cache key derivation in ModPageSpeed 2.0: host-scoped keys and single-pass variant fallback</title><link>https://modpagespeed.com/blog/cache-key-derivation-and-alternate-fallback/</link><guid isPermaLink="true">https://modpagespeed.com/blog/cache-key-derivation-and-alternate-fallback/</guid><description>How cache key derivation in ModPageSpeed 2.0 hashes host plus URL into one key and scores stored variants in one selector pass instead of probing many keys.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Cache mode safety math: must-revalidate vs aggressive TTL and stale-if-error</title><link>https://modpagespeed.com/blog/cache-mode-safety-must-revalidate-vs-aggressive/</link><guid isPermaLink="true">https://modpagespeed.com/blog/cache-mode-safety-must-revalidate-vs-aggressive/</guid><description>Cache-Control safety in ModPageSpeed 2.0: why must-revalidate, not max-age, is the real safety net, and when aggressive TTLs with stale-if-error and stale-while-revalidate are the right call.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>304 conditional revalidation vs PURGE: when revalidation is the cheaper invalidation</title><link>https://modpagespeed.com/blog/conditional-revalidation-304-vs-active-purge/</link><guid isPermaLink="true">https://modpagespeed.com/blog/conditional-revalidation-304-vs-active-purge/</guid><description>Conditional revalidation vs purge: when a 304 ETag round-trip beats PURGE and preserves optimized AVIF/WebP variants on an HTML-only deploy with no rebuild.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>How critical CSS extraction works: beacons to headless</title><link>https://modpagespeed.com/blog/critical-css-beacon-to-headless-history/</link><guid isPermaLink="true">https://modpagespeed.com/blog/critical-css-beacon-to-headless-history/</guid><description>How critical CSS extraction works without a build step: the original beacon model, why CDNs broke it, and how 2.0 moved to heuristics + headless Chrome.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Feeding Chrome&apos;s Coverage API: inlining cached CSS for accurate critical CSS</title><link>https://modpagespeed.com/blog/css-cache-inlining-for-coverage-api/</link><guid isPermaLink="true">https://modpagespeed.com/blog/css-cache-inlining-for-coverage-api/</guid><description>How ModPageSpeed 2.0 feeds the Chrome Coverage API critical CSS: inline cached stylesheets into a network-blocked sandbox so it reports real used vs unused CSS.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fire-and-forget IPC: decoupling request latency from optimization work</title><link>https://modpagespeed.com/blog/fire-and-forget-worker-ipc/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fire-and-forget-worker-ipc/</guid><description>ModPageSpeed 2.0 keeps optimization work off the nginx request path with fire-and-forget IPC to the worker: a small notification, no reply, so a cache miss stays cheap and requests never wait on an encode.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Flattening CSS @imports: harder than concat</title><link>https://modpagespeed.com/blog/flatten-css-imports-edge-cases/</link><guid isPermaLink="true">https://modpagespeed.com/blog/flatten-css-imports-edge-cases/</guid><description>Why flattening CSS @import rules is harder than concatenation: media intersection, @charset aborts, url() rebasing, and the CssFlattenMaxBytes cap.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Classify, denoise, then encode: content-aware image optimization before the codec</title><link>https://modpagespeed.com/blog/image-content-classification-and-denoise/</link><guid isPermaLink="true">https://modpagespeed.com/blog/image-content-classification-and-denoise/</guid><description>Content-aware image optimization classifies decoded images and denoises noisy sources before encoding, so photos, screenshots, and logos get the right codec.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>The memory-mapped cache: zero-copy serving between nginx and the worker</title><link>https://modpagespeed.com/blog/memory-mapped-cache-zero-copy-serving/</link><guid isPermaLink="true">https://modpagespeed.com/blog/memory-mapped-cache-zero-copy-serving/</guid><description>How ModPageSpeed 2.0 shares one memory-mapped cache between nginx and the worker, serving large cache hits zero-copy with kernel sendfile and small ones with a single copy, while staying correct under concurrent writes.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>mod_pagespeed and Content-Security-Policy (CSP)</title><link>https://modpagespeed.com/blog/mod-pagespeed-content-security-policy/</link><guid isPermaLink="true">https://modpagespeed.com/blog/mod-pagespeed-content-security-policy/</guid><description>Does mod_pagespeed break a strict Content-Security-Policy? Where automatic rewriting collides with a CSP, feature by feature, and how the HonorCsp directive keeps optimized pages policy-compliant.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Sentinel cache keys: reserving alternate IDs for 103 Early Hints</title><link>https://modpagespeed.com/blog/sentinel-cache-keys-and-103-early-hints/</link><guid isPermaLink="true">https://modpagespeed.com/blog/sentinel-cache-keys-and-103-early-hints/</guid><description>How ModPageSpeed 2.0 precomputes 103 Early Hints preloads and lets nginx serve them from cache, using sentinel cache keys — the reserved Viewport=3 trick — to store them alongside per-URL content variants.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Cache purge in an optimizing proxy: what one URL really touches</title><link>https://modpagespeed.com/blog/single-url-cache-purge-optimizing-proxy/</link><guid isPermaLink="true">https://modpagespeed.com/blog/single-url-cache-purge-optimizing-proxy/</guid><description>Purging one URL in ModPageSpeed touches more than one cache entry. The fan-out problem, the lookup-time design 1.x used, and why 2.0 deletes immediately.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Auto-vectorizing raster images to SVG: one variant for every resolution</title><link>https://modpagespeed.com/blog/svg-auto-vectorization/</link><guid isPermaLink="true">https://modpagespeed.com/blog/svg-auto-vectorization/</guid><description>Raster to SVG auto-vectorization in ModPageSpeed 2.0 traces qualifying logos and icons with VTracer, collapsing the @1x/@2x/viewport matrix into one variant.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Template hashing: compute critical CSS once, reuse it across every matching URL</title><link>https://modpagespeed.com/blog/template-hashing-critical-css-reuse/</link><guid isPermaLink="true">https://modpagespeed.com/blog/template-hashing-critical-css-reuse/</guid><description>How ModPageSpeed 2.0 hashes a page template so critical CSS is computed once and reused across every URL sharing that template, with analysis-queue dedup to skip redundant renders.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Visual-regression gating for critical CSS: reject any optimization that changes the pixels</title><link>https://modpagespeed.com/blog/visual-regression-gating-optimizations/</link><guid isPermaLink="true">https://modpagespeed.com/blog/visual-regression-gating-optimizations/</guid><description>ModPageSpeed 2.0 pixel-diffs the rendered above-fold before caching a headless critical-CSS variant. If the optimized page looks different, the gate discards it and keeps the heuristic version.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>A WordPress server-side page cache plugin: control plane, not cache</title><link>https://modpagespeed.com/blog/wordpress-server-side-page-cache-plugin/</link><guid isPermaLink="true">https://modpagespeed.com/blog/wordpress-server-side-page-cache-plugin/</guid><description>How a WordPress server-side page cache plugin sets Cache-Control on anonymous pages and purges the ModPageSpeed cache on publish, instead of caching in PHP.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Search Console&apos;s new AI performance report is not about page speed</title><link>https://modpagespeed.com/blog/search-console-ai-performance-report-vs-page-speed/</link><guid isPermaLink="true">https://modpagespeed.com/blog/search-console-ai-performance-report-vs-page-speed/</guid><description>Google&apos;s new Search Console AI performance report measures your visibility in AI Overviews and AI Mode, not how fast your pages load. The difference, explained.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>AVIF vs WebP in 2026: which to serve, and how to serve both</title><link>https://modpagespeed.com/blog/avif-vs-webp-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/avif-vs-webp-2026/</guid><description>AVIF beats WebP on size but is slower to encode. In 2026, serve AVIF, WebP, or the original per request off the Accept header instead of picking one format for everyone.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Set how good it should look: a model predicts image encoding parameters</title><link>https://modpagespeed.com/blog/learned-quality-prediction/</link><guid isPermaLink="true">https://modpagespeed.com/blog/learned-quality-prediction/</guid><description>One perception-based quality knob; a trained model predicts the right JPEG, WebP, and AVIF encoding parameters per image in microseconds. No per-codec tuning, self-hosted.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>The nginx image optimization module: automatic WebP without a build step</title><link>https://modpagespeed.com/blog/nginx-image-optimization-module/</link><guid isPermaLink="true">https://modpagespeed.com/blog/nginx-image-optimization-module/</guid><description>A native nginx module that transcodes images to WebP on serve, content-negotiates on Accept, and caches the variant. Install from signed apt/yum, no compiling.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>ngx_pagespeed won&apos;t build on modern nginx: the cause, and the prebuilt fix</title><link>https://modpagespeed.com/blog/ngx-pagespeed-wont-build-modern-nginx/</link><guid isPermaLink="true">https://modpagespeed.com/blog/ngx-pagespeed-wont-build-modern-nginx/</guid><description>Why upstream ngx_pagespeed won&apos;t compile on nginx 1.25+ (sys_siglist, glibc, OpenSSL 3, toolchain drift) — and the prebuilt module to install instead.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>How to reduce TTFB: server-layer wins before you reach for a CDN</title><link>https://modpagespeed.com/blog/reduce-ttfb-server-layer-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/reduce-ttfb-server-layer-2026/</guid><description>Reduce TTFB on nginx: split origin compute, network, and cache, then fix keep-alive, HTTP/2 or HTTP/3, TLS resumption, and variant-aware caching.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Self-hosted image optimization: keep images on your origin and skip the egress bill</title><link>https://modpagespeed.com/blog/self-hosted-image-optimization/</link><guid isPermaLink="true">https://modpagespeed.com/blog/self-hosted-image-optimization/</guid><description>Image SaaS bills per transformation and per GB of egress. Self-hosted optimization transcodes WebP/AVIF on your servers at a flat per-site cost — no third party.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Why optimized URLs carry a content hash, and why the web caught up</title><link>https://modpagespeed.com/blog/content-hash-urls/</link><guid isPermaLink="true">https://modpagespeed.com/blog/content-hash-urls/</guid><description>A content hash in a .pagespeed. URL gives mod_pagespeed year-long caching with automatic cache busting — the same idea webpack contenthash and Cache-Control: immutable landed on later. Plus what data-pagespeed-url-hash actually is.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Can AI read your website? We tested the top 1,000 sites</title><link>https://modpagespeed.com/blog/can-ai-read-your-website/</link><guid isPermaLink="true">https://modpagespeed.com/blog/can-ai-read-your-website/</guid><description>40% of the top 1,000 sites serve almost nothing to non-JavaScript AI crawlers — ChatGPT, Perplexity, and Claude see an empty page. The data, and how to fix it.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>ASP.NET Core image optimization in C#: WebP and AVIF</title><link>https://modpagespeed.com/blog/aspnet-core-image-optimization-c-sharp/</link><guid isPermaLink="true">https://modpagespeed.com/blog/aspnet-core-image-optimization-c-sharp/</guid><description>Serve WebP and AVIF from ASP.NET Core with no controller or Razor changes. WeAmp.PageSpeed middleware does Accept-header content negotiation, viewport sizing, and LCP preload.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix INP on ASP.NET Core: Razor vs Blazor</title><link>https://modpagespeed.com/blog/fix-inp-aspnet-core-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-inp-aspnet-core-2026/</guid><description>How to fix INP on ASP.NET Core: Razor + jQuery responds well to bundling and the WeAmp.PageSpeed middleware; Blazor Server INP is architectural and needs WASM.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>mod_pagespeed download: dl-ssl.google.com is frozen</title><link>https://modpagespeed.com/blog/google-dl-ssl-mod-pagespeed-download/</link><guid isPermaLink="true">https://modpagespeed.com/blog/google-dl-ssl-mod-pagespeed-download/</guid><description>The dl-ssl.google.com mod_pagespeed .deb is Google&apos;s last stable build, 1.13.35.2 (2018), with years of unpatched CVEs. Get the maintained download for Apache, nginx, and IIS instead.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Is mod_pagespeed deprecated? (2026)</title><link>https://modpagespeed.com/blog/mod-pagespeed-deprecated-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/mod-pagespeed-deprecated-2026/</guid><description>Yes, mod_pagespeed is deprecated: the 1.13.35.2 binaries run but haven&apos;t had security updates in years. What to use instead on Apache, nginx, IIS, and ASP.NET Core.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Run ModPageSpeed 2.0 with Docker Compose</title><link>https://modpagespeed.com/blog/run-with-docker-compose/</link><guid isPermaLink="true">https://modpagespeed.com/blog/run-with-docker-compose/</guid><description>A working docker-compose.yml for ModPageSpeed 2.0 on nginx: worker + interceptor + shared Cyclone cache volume. Verify with curl, apply a license, done.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Server-side critical CSS for nginx — any backend, no headless browser</title><link>https://modpagespeed.com/blog/server-side-critical-css-nginx/</link><guid isPermaLink="true">https://modpagespeed.com/blog/server-side-critical-css-nginx/</guid><description>Extract and inline critical CSS at the nginx layer for any backend (PHP, Rails, Django, ASP.NET, Go). No WordPress plugin. No headless browser. No Node build step.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix CLS on ASP.NET Core: pre-size async holes</title><link>https://modpagespeed.com/blog/fix-cls-aspnet-core-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-cls-aspnet-core-2026/</guid><description>How to fix CLS on ASP.NET Core: pre-size async view components, persist image dimensions, reserve banner space, rewrite img tags via middleware.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix LCP on ASP.NET Core: Razor vs Blazor</title><link>https://modpagespeed.com/blog/fix-lcp-aspnet-core-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-lcp-aspnet-core-2026/</guid><description>Fix Largest Contentful Paint on ASP.NET Core: async view components, immutable cache headers, deferred JS, and the WeAmp.PageSpeed middleware — for Razor Pages, MVC, and Blazor Server.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>mod_pagespeed 1.15: what six years of stewardship look like</title><link>https://modpagespeed.com/blog/mod-pagespeed-1-1-release/</link><guid isPermaLink="true">https://modpagespeed.com/blog/mod-pagespeed-1-1-release/</guid><description>mod_pagespeed 1.15 ships 765 merges since 1.13.35.2: image-decoder hardening, a full sanitizer matrix, a current dependency graph, and the IIS port in the C++ tree.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix INP on nginx: a CMS-agnostic plan</title><link>https://modpagespeed.com/blog/fix-inp-nginx-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-inp-nginx-2026/</guid><description>How to fix INP on nginx: a CMS-agnostic guide. Server-layer JS minification helps if your JS is bloated; if your stack is already lean, the wins are upstream.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix CLS on nginx with mod_pagespeed (insert_image_dimensions)</title><link>https://modpagespeed.com/blog/fix-cls-nginx-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-cls-nginx-2026/</guid><description>Fix Cumulative Layout Shift on nginx-served sites: rewrite img tags to add width/height with ngx_pagespeed (mod_pagespeed 1.15), add a CSS aspect-ratio backstop, and ship dimensions at build time.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix LCP on nginx: transport, not content</title><link>https://modpagespeed.com/blog/fix-lcp-nginx-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-lcp-nginx-2026/</guid><description>How to fix LCP on nginx: HTTP/2, gzip_static, TLS resumption, and the mod_pagespeed rewriter. Stack-agnostic LCP fixes that work behind any backend in 2026.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix INP on Magento 2: why Hyvä beats a JS rewriter</title><link>https://modpagespeed.com/blog/fix-inp-magento-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-inp-magento-2026/</guid><description>Fixing INP on Magento 2: the interaction cost lives in KnockoutJS and RequireJS, so theme architecture (Hyvä) moves it, not a server rewriter — plus exactly what mod_pagespeed can and cannot do.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix CLS on Magento 2: start with the Fotorama gallery</title><link>https://modpagespeed.com/blog/fix-cls-magento-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-cls-magento-2026/</guid><description>Fix Cumulative Layout Shift on Magento 2 product pages: stop Fotorama gallery jumps, pre-size the mini-cart and private-content blocks, and write img dimensions at the server layer.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix LCP on Magento without breaking RequireJS</title><link>https://modpagespeed.com/blog/fix-lcp-magento-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-lcp-magento-2026/</guid><description>How to fix LCP on Magento: tame the RequireJS waterfall, regenerate catalog images, inline critical CSS at the server. Step-by-step for Magento 2 in 2026.</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix INP on WooCommerce: where the cost lives</title><link>https://modpagespeed.com/blog/fix-inp-woocommerce-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-inp-woocommerce-2026/</guid><description>How to fix INP on WooCommerce: server-layer JS minification reduces the parse cost, but cart and variation handlers are architectural.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix CLS on WooCommerce: lock the gallery</title><link>https://modpagespeed.com/blog/fix-cls-woocommerce-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-cls-woocommerce-2026/</guid><description>How to fix CLS on WooCommerce: stop the gallery shift, lock variation swap dimensions, reserve cross-sell space, and rewrite img tags at the server.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix LCP on WooCommerce: shrink the gallery first</title><link>https://modpagespeed.com/blog/fix-lcp-woocommerce-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-lcp-woocommerce-2026/</guid><description>Fix LCP on WooCommerce: shrink the product gallery, drop cart-fragments on non-shop pages, and rewrite catalog images at the server with mod_pagespeed.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix INP on WordPress: plugin discipline</title><link>https://modpagespeed.com/blog/fix-inp-wordpress-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-inp-wordpress-2026/</guid><description>How to fix INP on WordPress: diagnose the responsible interaction, defer non-critical JS at the server layer, then trim plugin handlers and jQuery.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix CLS on WordPress: dimensions at the server</title><link>https://modpagespeed.com/blog/fix-cls-wordpress-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-cls-wordpress-2026/</guid><description>How to fix CLS on WordPress: diagnose the shifts, set width/height on every image at the server layer, lock down fonts, reserve banner space.</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Fix LCP on WordPress: the server-layer fix</title><link>https://modpagespeed.com/blog/fix-lcp-wordpress-2026/</link><guid isPermaLink="true">https://modpagespeed.com/blog/fix-lcp-wordpress-2026/</guid><description>How to fix LCP on WordPress: diagnose the hero, inline critical CSS at the server, convert JPEG to WebP, and verify in Search Console. Step-by-step, 2026.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>mod_pagespeed and ngx_pagespeed alternatives in 2026</title><link>https://modpagespeed.com/blog/mod-pagespeed-alternatives/</link><guid isPermaLink="true">https://modpagespeed.com/blog/mod-pagespeed-alternatives/</guid><description>Google mod_pagespeed and ngx_pagespeed are no longer actively developed. Two maintained successors — mod_pagespeed 1.15 and ModPageSpeed 2.0 — exist. Here is how to choose.</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>ModPageSpeed 2.0 for ASP.NET Core: optimization middleware via NuGet</title><link>https://modpagespeed.com/blog/aspnet-core-middleware/</link><guid isPermaLink="true">https://modpagespeed.com/blog/aspnet-core-middleware/</guid><description>Run the ModPageSpeed 2.0 optimization pipeline as ASP.NET Core middleware via NuGet — image transcoding, critical CSS, and cache serving in two lines of C#, no nginx reverse proxy required.</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Migrate from Google&apos;s mod_pagespeed / ngx_pagespeed to ModPageSpeed 2.0</title><link>https://modpagespeed.com/blog/migrating-from-1x/</link><guid isPermaLink="true">https://modpagespeed.com/blog/migrating-from-1x/</guid><description>Migrate from Google&apos;s mod_pagespeed 1.13.x or ngx_pagespeed to ModPageSpeed 2.0: directive mapping, Docker Compose setup, image-format checks, and a verification checklist.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Extract critical CSS without a browser — or with headless Chrome when you need it</title><link>https://modpagespeed.com/blog/critical-css-heuristics/</link><guid isPermaLink="true">https://modpagespeed.com/blog/critical-css-heuristics/</guid><description>How ModPageSpeed 2.0 extracts and inlines critical CSS two ways: static heuristics in under 5ms on every page, plus an optional headless-Chrome path for true above-the-fold rules at First Contentful Paint.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Image optimization cost: self-hosted vs CDN (2026)</title><link>https://modpagespeed.com/blog/economics-of-image-optimization/</link><guid isPermaLink="true">https://modpagespeed.com/blog/economics-of-image-optimization/</guid><description>Image CDNs run $35–$3,500/mo as traffic grows; self-hosted ModPageSpeed stays flat. Break-even is ~300–500K requests/mo. Full 2026 cost model, no bandwidth fees.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Save-Data: serving lighter image variants to bandwidth-conscious users</title><link>https://modpagespeed.com/blog/save-data-bandwidth/</link><guid isPermaLink="true">https://modpagespeed.com/blog/save-data-bandwidth/</guid><description>How ModPageSpeed 2.0 reads the Save-Data request header to serve lighter image variants -- a 30-50% bandwidth cut stacked on top of format and viewport optimization.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Benchmarking ModPageSpeed 2.0: real numbers on real sites</title><link>https://modpagespeed.com/blog/benchmarking-real-numbers/</link><guid isPermaLink="true">https://modpagespeed.com/blog/benchmarking-real-numbers/</guid><description>Measured ModPageSpeed 2.0 results on e-commerce, blog, news, and portfolio sites: WebP/AVIF image savings and real LCP, FCP, CLS, and Lighthouse gains on 3G, 4G, and broadband.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Automatic WebP/AVIF on nginx: one decode, 37 variants</title><link>https://modpagespeed.com/blog/viewport-aware-image-optimization/</link><guid isPermaLink="true">https://modpagespeed.com/blog/viewport-aware-image-optimization/</guid><description>Serve WebP and AVIF automatically on nginx, self-hosted. ModPageSpeed 2.0 decodes each image once and generates up to 37 responsive variants across format, viewport, and pixel density.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item><item><title>Why I rebuilt mod_pagespeed from scratch</title><link>https://modpagespeed.com/blog/why-i-rebuilt-mod-pagespeed/</link><guid isPermaLink="true">https://modpagespeed.com/blog/why-i-rebuilt-mod-pagespeed/</guid><description>The story behind ModPageSpeed 2.0 — why mod_pagespeed is no longer actively developed, what was kept from PSOL, and how a new architecture replaced the RewriteDriver.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Otto van der Schaaf</dc:creator></item></channel></rss>