{"id":292268,"date":"2026-05-27T11:34:52","date_gmt":"2026-05-27T11:34:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/speedpress\/"},"modified":"2026-08-27T17:18:57","modified_gmt":"2026-08-27T17:18:57","slug":"xspeed","status":"publish","type":"plugin","link":"https:\/\/dv.wordpress.org\/plugins\/xspeed\/","author":15786956,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"xSpeed Cache","header_author":"WPDeveloper","header_description":"Minimal, ultra-fast caching plugin for WordPress.","assets_banners_color":"f5fbf9","last_updated":"2026-08-27 17:18:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/wpdeveloper.com","rating":5,"author_block_rating":4.3265306122449,"active_installs":70,"downloads":1603,"num_ratings":6,"support_threads":0,"support_threads_resolved":0,"author_block_count":21,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wpdevteam","date":"2026-05-27 11:31:36","revision":3550552},"1.0.1":{"tag":"1.0.1","author":"wpdevteam","date":"2026-06-01 17:33:21","revision":3557092},"1.0.2":{"tag":"1.0.2","author":"wpdevteam","date":"2026-06-02 05:31:36","revision":3557475},"1.0.3":{"tag":"1.0.3","author":"wpdevteam","date":"2026-06-09 06:20:13","revision":3565511},"1.0.4":{"tag":"1.0.4","author":"priyomukul","date":"2026-06-14 07:01:26","revision":3571602},"1.0.5":{"tag":"1.0.5","author":"wpdevteam","date":"2026-06-18 10:03:29","revision":3576983},"1.0.6":{"tag":"1.0.6","author":"wpdevteam","date":"2026-06-25 12:53:32","revision":3586188},"1.0.7":{"tag":"1.0.7","author":"wpdevteam","date":"2026-07-05 11:41:46","revision":3596701},"1.0.8":{"tag":"1.0.8","author":"wpdevteam","date":"2026-07-14 10:10:49","revision":3607248},"1.0.9":{"tag":"1.0.9","author":"wpdevteam","date":"2026-07-16 11:41:06","revision":3610142},"1.1.0":{"tag":"1.1.0","author":"wpdevteam","date":"2026-07-22 13:36:19","revision":3618696},"1.1.1":{"tag":"1.1.1","author":"wpdevteam","date":"2026-07-28 06:23:24","revision":3625462},"1.1.2":{"tag":"1.1.2","author":"wpdevteam","date":"2026-07-30 20:04:11","revision":3629083},"1.1.3":{"tag":"1.1.3","author":"wpdevteam","date":"2026-08-05 12:06:42","revision":3635353},"1.1.4":{"tag":"1.1.4","author":"wpdevteam","date":"2026-08-09 20:11:50","revision":3639766},"1.1.5":{"tag":"1.1.5","author":"wpdevteam","date":"2026-08-11 13:46:41","revision":3642074},"1.1.6":{"tag":"1.1.6","author":"wpdevteam","date":"2026-08-13 15:55:04","revision":3645756},"1.1.7":{"tag":"1.1.7","author":"wpdevteam","date":"2026-08-18 02:49:32","revision":3651926},"1.1.8":{"tag":"1.1.8","author":"wpdevteam","date":"2026-08-19 18:43:32","revision":3655176},"1.2.0":{"tag":"1.2.0","author":"priyomukul","date":"2026-08-24 06:55:50","revision":3662753},"1.2.1":{"tag":"1.2.1","author":"wpdevteam","date":"2026-08-27 17:18:57","revision":3669284}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":6},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3642074,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3642074,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3669284,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3669284,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.1.8","1.2.0","1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3669284,"resolution":"1","location":"assets","locale":"","width":1200,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3669284,"resolution":"2","location":"assets","locale":"","width":1200,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3669284,"resolution":"3","location":"assets","locale":"","width":1200,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3669284,"resolution":"4","location":"assets","locale":"","width":1200,"height":800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3669284,"resolution":"5","location":"assets","locale":"","width":1200,"height":800},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3669284,"resolution":"6","location":"assets","locale":"","width":1200,"height":800},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3669284,"resolution":"7","location":"assets","locale":"","width":1200,"height":800},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3669284,"resolution":"8","location":"assets","locale":"","width":1200,"height":800}},"screenshots":{"1":"Overview \u2014 cache status, hit ratio, cached pages, cache size, and average time saved at a glance.","2":"Optimization \u2014 minify, compress, lazy-load, resource hints, fonts, and bloat control in one place.","3":"Advanced Cache \u2014 cache 404s, search results, feeds, and the REST API, plus custom rules and maintenance bypass.","4":"Browser Cache \u2014 Cache-Control and Expires headers with separate TTLs for static assets and HTML.","5":"Health &amp; Insights \u2014 diagnostics, hit ratio, cache coverage, and rule-based suggestions you can apply in one click.","6":"MCP Server \u2014 control this site's cache from Claude and other AI agents over a token-scoped connection.","7":"AI Provider \u2014 choose OpenAI, Anthropic, Google Gemini, or OpenRouter and set the model powering the AI features.","8":"Migration \u2014 import settings from WP Rocket, W3 Total Cache, WP Super Cache, or LiteSpeed Cache."}},"plugin_section":[],"plugin_tags":[144,1736,187,247,794],"plugin_category":[52,54],"plugin_contributors":[80044,274928,212095,274927,149406],"plugin_business_model":[],"class_list":["post-292268","plugin","type-plugin","status-publish","hentry","plugin_tags-caching","plugin_tags-minify","plugin_tags-optimization","plugin_tags-performance","plugin_tags-speed","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-asif2bd","plugin_contributors-hurayraiit","plugin_contributors-seakashdiu","plugin_contributors-tushar284","plugin_contributors-wpdevteam","plugin_committers-priyomukul","plugin_committers-re_enter_rupok","plugin_committers-wpdevteam"],"banners":{"banner":"https:\/\/ps.w.org\/xspeed\/assets\/banner-772x250.png?rev=3669284","banner_2x":"https:\/\/ps.w.org\/xspeed\/assets\/banner-1544x500.png?rev=3669284","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/xspeed\/assets\/icon-128x128.png?rev=3642074","icon_2x":"https:\/\/ps.w.org\/xspeed\/assets\/icon-256x256.png?rev=3642074","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-1.png?rev=3669284","caption":"Overview \u2014 cache status, hit ratio, cached pages, cache size, and average time saved at a glance."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-2.png?rev=3669284","caption":"Optimization \u2014 minify, compress, lazy-load, resource hints, fonts, and bloat control in one place."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-3.png?rev=3669284","caption":"Advanced Cache \u2014 cache 404s, search results, feeds, and the REST API, plus custom rules and maintenance bypass."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-4.png?rev=3669284","caption":"Browser Cache \u2014 Cache-Control and Expires headers with separate TTLs for static assets and HTML."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-5.png?rev=3669284","caption":"Health &amp; Insights \u2014 diagnostics, hit ratio, cache coverage, and rule-based suggestions you can apply in one click."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-6.png?rev=3669284","caption":"MCP Server \u2014 control this site's cache from Claude and other AI agents over a token-scoped connection."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-7.png?rev=3669284","caption":"AI Provider \u2014 choose OpenAI, Anthropic, Google Gemini, or OpenRouter and set the model powering the AI features."},{"src":"https:\/\/ps.w.org\/xspeed\/assets\/screenshot-8.png?rev=3669284","caption":"Migration \u2014 import settings from WP Rocket, W3 Total Cache, WP Super Cache, or LiteSpeed Cache."}],"raw_content":"<!--section=description-->\n<p>Your visitors decide to stay or leave in under 3 seconds. <strong>xSpeed Cache<\/strong> makes sure they stay.<\/p>\n\n<p>Most caching plugins bury you in settings, charts, and upgrade popups. xSpeed Cache does the opposite \u2014 install it, flip one switch, and your site loads faster. No bloat, no upsells nagging you, no PhD required.<\/p>\n\n<p>Built by the team at <strong>WPDeveloper<\/strong> \u2014 trusted by over 7 million WordPress users worldwide.<\/p>\n\n<h4>What Does xSpeed Cache Do?<\/h4>\n\n<p>xSpeed Cache is a full-site performance plugin. It caches your pages, shrinks your code, compresses your files, and serves everything as fast as your server physically can \u2014 including an AI-powered audit that tells you exactly what's slowing your site down.<\/p>\n\n<p>The result: pages that load in milliseconds, not seconds. Better Google PageSpeed scores. Happier visitors. Better SEO rankings.<\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=fYVy77GJDE4<\/p>\n\n<h4>The Speed Advantage No Other Free Plugin Offers<\/h4>\n\n<p>When xSpeed Cache caches a page, it doesn't just save it \u2014 it serves it directly from the server, bypassing PHP entirely.<\/p>\n\n<p>That means:<\/p>\n\n<ul>\n<li><strong>With xSpeed static cache:<\/strong> 5\u201315ms response time<\/li>\n<li><strong>Without it (PHP-served cache):<\/strong> ~85ms response time<\/li>\n<\/ul>\n\n<p>That's up to <strong>17\u00d7 faster<\/strong> page delivery on cache hits. No other free caching plugin does this across Apache, nginx, and LiteSpeed automatically.<\/p>\n\n<h4>Features at a Glance<\/h4>\n\n<p><strong>Page Caching<\/strong><\/p>\n\n<p>Your pages are saved as static HTML files and served instantly to visitors \u2014 before WordPress even loads. The cache rebuilds itself automatically whenever you publish a post, switch themes, or update a plugin. You never have to think about it.<\/p>\n\n<ul>\n<li>Static-file rewrite path (bypasses PHP entirely \u2014 5\u201315ms TTFB)<\/li>\n<li>Auto-purge on publish, update, comment, theme change<\/li>\n<li>One-click cache purge from the admin bar<\/li>\n<li>Exclude specific URLs (e.g. <code>\/cart<\/code>, <code>\/checkout<\/code>, <code>\/my-account<\/code>)<\/li>\n<li>Set your own cache expiry (1\u2013720 hours)<\/li>\n<li>Separate mobile cache for phone and tablet visitors<\/li>\n<li>Per-post cache rules \u2014 custom expiry or disable caching for individual posts<\/li>\n<\/ul>\n\n<p><strong>Code Minification<\/strong><\/p>\n\n<p>Strips all the unnecessary whitespace, comments, and characters from your HTML, CSS, and JavaScript without breaking anything.<\/p>\n\n<ul>\n<li>Minify HTML, CSS, and JavaScript<\/li>\n<li>Combine CSS and JS files to reduce HTTP requests<\/li>\n<li>Defer or delay JavaScript so it doesn't block page rendering<\/li>\n<li>Async CSS loading<\/li>\n<li>Removes <code>?ver=<\/code> query strings from asset URLs<\/li>\n<li>Safe-minify: automatically skips already-minified files and falls back if anything looks off<\/li>\n<\/ul>\n\n<p><strong>GZIP Compression<\/strong><\/p>\n\n<p>Makes every file your server sends smaller \u2014 so browsers download them faster.<\/p>\n\n<ul>\n<li>Auto-configures GZIP on Apache and LiteSpeed<\/li>\n<li>Shows a ready-to-paste config snippet for nginx and IIS<\/li>\n<li>Detects if your server already has GZIP active \u2014 no double-configuration<\/li>\n<\/ul>\n\n<p><strong>Lazy Load<\/strong><\/p>\n\n<p>Images, videos, and iframes load only when a visitor scrolls to them \u2014 not all at once on page load.<\/p>\n\n<ul>\n<li>Lazy load images, iframes, and videos<\/li>\n<li>Automatic CLS (Cumulative Layout Shift) fix so your layout doesn't jump<\/li>\n<\/ul>\n\n<p><strong>Fonts Optimization<\/strong><\/p>\n\n<p>Web fonts are one of the most common causes of slow-loading pages.<\/p>\n\n<ul>\n<li>Adds <code>font-display: swap<\/code> so text is visible immediately while fonts load<\/li>\n<li>Preloads above-the-fold font files for instant rendering<\/li>\n<li>Removes the blank-text flash caused by slow Google Fonts responses<\/li>\n<\/ul>\n\n<p><strong>Browser Cache<\/strong><\/p>\n\n<p>Tells browsers to remember your static files (images, CSS, JS) so returning visitors load your site even faster.<\/p>\n\n<ul>\n<li>Sets proper <code>Cache-Control<\/code> and <code>Expires<\/code> headers<\/li>\n<li>Works automatically \u2014 no manual configuration needed<\/li>\n<\/ul>\n\n<p><strong>Cache Preloader<\/strong><\/p>\n\n<p>Warms up your cache automatically so the very first visitor after a purge still gets a fast page.<\/p>\n\n<ul>\n<li>Sitemap-driven cache warmer<\/li>\n<li>Auto-warms cache when you publish or update content<\/li>\n<\/ul>\n\n<p><strong>Object Cache (Redis \/ Memcached)<\/strong><\/p>\n\n<p>Speed up database-heavy WordPress installs with server-side object caching.<\/p>\n\n<ul>\n<li>Connect Redis or Memcached in seconds<\/li>\n<li>View status and flush cache from the dashboard<\/li>\n<\/ul>\n\n<p><strong>CDN Support<\/strong><\/p>\n\n<p>Serve your static files from a CDN for faster global delivery.<\/p>\n\n<ul>\n<li>Pull-zone URL rewriting for any CDN provider<\/li>\n<li>Built-in Cloudflare integration: connect your zone, auto-purge on publish, toggle dev mode<\/li>\n<\/ul>\n\n<p><strong>Database Optimization<\/strong><\/p>\n\n<p>A bloated database slows down every page load. xSpeed Cache keeps yours clean.<\/p>\n\n<ul>\n<li>Optimize database tables<\/li>\n<li>Remove post revisions, spam, trash, transients, and orphaned meta<\/li>\n<li>Schedule automatic cleanup so it runs on autopilot<\/li>\n<\/ul>\n\n<p><strong>Disable Bloat<\/strong><\/p>\n\n<p>Turn off WordPress features you don't use \u2014 each one is a request your server doesn't have to make.<\/p>\n\n<ul>\n<li>Disable dashicons on the frontend<\/li>\n<li>Remove oEmbed, RSS feeds, XML-RPC, jQuery Migrate, REST API authentication headers<\/li>\n<\/ul>\n\n<p><strong>AI-Powered Site Audit (Pro)<\/strong><\/p>\n\n<p>xSpeed Pro scans your specific site and tells you exactly which performance features will help the most \u2014 with severity ratings and concrete reasons, not generic advice.<\/p>\n\n<h4>Smart Enough to Stay Out of Trouble<\/h4>\n\n<p>xSpeed Cache handles the edge cases other plugins miss:<\/p>\n\n<ul>\n<li><strong>Multisite ready<\/strong> \u2014 each site in the network gets its own cache and settings.<\/li>\n<li><strong>LiteSpeed server?<\/strong> \u2014 xSpeed Cache detects LiteSpeed Cache's server module and steps back to avoid conflicts.<\/li>\n<li><strong>WooCommerce?<\/strong> \u2014 logged-in customers and checkout pages are never cached.<\/li>\n<li><strong>WordPress Site Health<\/strong> \u2014 xSpeed Cache adds its own health check under Tools \u2192 Site Health so you always know your cache config is working correctly.<\/li>\n<li><strong>Works on any server<\/strong> \u2014 Apache, nginx, LiteSpeed, IIS, and any standard PHP host.<\/li>\n<\/ul>\n\n<h4>Designed for Everyone<\/h4>\n\n<p><strong>Non-technical users:<\/strong> A 3-step setup wizard walks you through first-time configuration in under 2 minutes. Settings auto-save \u2014 there's no Save button to forget.<\/p>\n\n<p><strong>Developers:<\/strong> REST API at <code>\/wp-json\/xspeed\/v1\/<\/code>, developer filters (<code>xspeed_skip_minify<\/code>, <code>xspeed_cache_skip_for_post<\/code>, <code>xspeed_cache_expiry_for_post<\/code>), <code>WP_DEBUG<\/code> awareness, and a React 18 + TypeScript admin UI under 80 KB gzipped.<\/p>\n\n<p><strong>Agencies:<\/strong> Use the <code>xspeed_branding<\/code> filter to white-label the dashboard for clients.<\/p>\n\n<h4>Private By Default<\/h4>\n\n<p>xSpeed Cache never collects personal data, stores IP addresses, or uses tracking cookies. Every optimization runs locally on your server. By default it makes no calls to any third-party server \u2014 the only request is a quick check to your own site's home URL to confirm GZIP is active, rate-limited to once per hour.<\/p>\n\n<p>xSpeed Cache also includes <strong>optional usage analytics<\/strong>. The setup wizard shows a clearly-labeled consent control for it (enabled by default, untick to opt out), and nothing is sent until you confirm your choices in the wizard. When enabled, xSpeed Cache shares anonymous, non-sensitive diagnostics \u2014 your WordPress &amp; PHP version, active theme &amp; plugins, server type, site language, and which xSpeed Cache features you have switched on \u2014 so we know what to keep fast and compatible. No personal data and no page content are ever sent, and you can turn it off again at any time from your dashboard. (See \"External services\" below.)<\/p>\n\n<h4>Backed By a Team You Trust<\/h4>\n\n<p>xSpeed Cache is developed by the trusted team at WPDeveloper, a leading WordPress marketplace used and loved by millions of users.<\/p>\n\n<h4>Loved xSpeed Cache?<\/h4>\n\n<p>If xSpeed Cache makes your site faster, please leave a review on WordPress.org \u2014 it really helps!<\/p>\n\n<h3>External services<\/h3>\n\n<p>xSpeed Cache contacts your own site (the gzip probe below); when usage analytics is enabled, an analytics service; only if you choose to submit the optional deactivation survey, that same service; and \u2014 only if you turn it on \u2014 one external performance-score provider. The setup wizard shows a clearly-labeled consent control for analytics (enabled by default, untick to opt out), and nothing is sent until you confirm your choices there. The deactivation survey is separate and never sends anything unless you explicitly click Submit. External scores are off by default and never run on their own.<\/p>\n\n<h4>Self-hosted gzip probe<\/h4>\n\n<ul>\n<li><strong>What it does:<\/strong> Issues a single <code>GET<\/code> request to your site's home URL (<code>home_url('\/')<\/code>) with an <code>Accept-Encoding: gzip<\/code> header to detect whether your web server is already serving gzipped responses. The response body is discarded; only the <code>Content-Encoding<\/code> header is read.<\/li>\n<li><strong>When it runs:<\/strong> On demand when the admin dashboard loads server status, throttled to once per hour via a transient (<code>xspeed_gzip_active<\/code>).<\/li>\n<li><strong>Where the request goes:<\/strong> Your own site (<code>home_url()<\/code>). This request goes only to your own server.<\/li>\n<li><strong>What is sent:<\/strong> No personal data, no site identifiers, no payload \u2014 just a standard HTTP <code>GET<\/code> from your server back to your server.<\/li>\n<\/ul>\n\n<h4>Usage analytics (opt-in, off by default)<\/h4>\n\n<ul>\n<li><strong>What it does:<\/strong> When usage analytics is enabled, xSpeed Cache periodically sends anonymous, non-sensitive diagnostics to help us keep the plugin fast and compatible with real-world WordPress environments. Data sent: site URL, site name, WordPress version, PHP version, site language &amp; charset, multisite flag, server software, your list of active &amp; inactive plugins, active theme &amp; version, text direction, and your xSpeed Cache feature usage (which optimization features you have switched on and their numeric settings \u2014 e.g. cache lifetime, minification, lazy-load). This is feature-usage data only: it tells us which features are actually used so we can focus on what matters. <strong>We never send any values you enter<\/strong> \u2014 no API keys, tokens, passwords, license keys, email addresses, URLs, brand names, or logos \u2014 and <strong>no page content, no visitor data, and no personal data<\/strong> (your email is never collected in the free plugin).<\/li>\n<li><strong>When it runs:<\/strong> It runs at most once per day via WP-Cron, only after you confirm your choices in the setup wizard. Untick the consent control (or disable it later from the dashboard) and nothing is ever sent.<\/li>\n<li><strong>Where the request goes:<\/strong> WP Insights, WPDeveloper's usage-analytics service \u2014 <code>https:\/\/send.wpinsight.com\/process-plugin-data<\/code>. (<a href=\"https:\/\/wpdeveloper.com\/privacy-policy\">Privacy Policy<\/a>)<\/li>\n<li><strong>How to turn it off:<\/strong> Untick the consent control in the wizard, or disable it later from the xSpeed Cache dashboard. Opting out stops all data collection and clears the scheduled task.<\/li>\n<\/ul>\n\n<h4>External performance scores (opt-in, off by default)<\/h4>\n\n<ul>\n<li><strong>What it does:<\/strong> Lets you run a performance audit of one of your own pages from the dashboard and shows the score alongside xSpeed Cache's internal TTFB benchmark. Two providers are supported: Google PageSpeed Insights (works without an API key; you may add your own key to raise Google's anonymous rate limit) and GTmetrix (requires your own API key \u2014 it has no anonymous mode).<\/li>\n<li><strong>When it runs:<\/strong> Only when you press <strong>Test now<\/strong> on the dashboard, or run <code>wp xspeed score run<\/code>. There is no schedule and no background call. If the feature is left off \u2014 which is the default \u2014 no request is ever made.<\/li>\n<li><strong>Where the request goes:<\/strong> Google PageSpeed Insights \u2014 <code>https:\/\/www.googleapis.com\/pagespeedonline\/v5\/runPagespeed<\/code> (<a href=\"https:\/\/developers.google.com\/speed\/docs\/insights\/v5\/about\">Terms<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">Privacy Policy<\/a>) \u2014 or GTmetrix \u2014 <code>https:\/\/gtmetrix.com\/api\/2.0\/tests<\/code> (<a href=\"https:\/\/gtmetrix.com\/terms-of-service.html\">Terms<\/a>, <a href=\"https:\/\/gtmetrix.com\/privacy.html\">Privacy Policy<\/a>).<\/li>\n<li><strong>What is sent:<\/strong> The URL you are testing (your own page, which the provider then fetches publicly) and, if you supplied one, your own API key for that provider. No personal data, no visitor data, and no site content are sent by the plugin.<\/li>\n<li><strong>How to turn it off:<\/strong> Switch \"Enable external scores\" off in the xSpeed Cache dashboard (Health \u2192 PageSpeed). Past results stay in your database until you clear them.<\/li>\n<\/ul>\n\n<h4>Deactivation feedback (optional, only when you submit it)<\/h4>\n\n<ul>\n<li><strong>What it does:<\/strong> When you deactivate xSpeed Cache, a short optional survey asks why, so we can fix problems and prioritize the right features. Nothing is sent unless you pick a reason and click <strong>Submit &amp; Deactivate<\/strong>.<\/li>\n<li><strong>What is sent:<\/strong> the reason (or reasons) you selected and any note you type. If usage analytics (above) is enabled, that reason is attached to your regular analytics report. If usage analytics is disabled, only a minimal message is sent \u2014 the reason, your optional note, your site URL, the xSpeed Cache version, and your WordPress &amp; PHP version \u2014 and nothing else (no plugin list, no theme data, no personal data, no page content).<\/li>\n<li><strong>When it runs:<\/strong> Only on the deactivation screen, and only when you click <strong>Submit &amp; Deactivate<\/strong>. Choosing <strong>Skip &amp; Deactivate<\/strong>, closing the dialog, or pressing Esc sends nothing at all.<\/li>\n<li><strong>Where the request goes:<\/strong> WP Insights, WPDeveloper's service \u2014 <code>https:\/\/send.wpinsight.com\/process-plugin-data<\/code>. (<a href=\"https:\/\/wpdeveloper.com\/privacy-policy\">Privacy Policy<\/a>)<\/li>\n<li><strong>How to avoid it:<\/strong> Click <strong>Skip &amp; Deactivate<\/strong> (or close the dialog) instead of Submit \u2014 deactivation works exactly the same, with no data sent.<\/li>\n<\/ul>\n\n<h3>Third-party libraries<\/h3>\n\n<p>This plugin bundles the following GPL-compatible third-party libraries:<\/p>\n\n<h4>matthiasmullie\/minify<\/h4>\n\n<p>Used for CSS and JavaScript minification.<\/p>\n\n<ul>\n<li>Source: https:\/\/github.com\/matthiasmullie\/minify<\/li>\n<li>License: MIT<\/li>\n<\/ul>\n\n<h4>matthiasmullie\/path-converter<\/h4>\n\n<p>Dependency of <code>matthiasmullie\/minify<\/code>.<\/p>\n\n<ul>\n<li>Source: https:\/\/github.com\/matthiasmullie\/path-converter<\/li>\n<li>License: MIT<\/li>\n<\/ul>\n\n<h4>React \/ React DOM \/ Scheduler<\/h4>\n\n<p>Used for the xSpeed Cache admin interface bundle.<\/p>\n\n<ul>\n<li>Source: https:\/\/github.com\/facebook\/react<\/li>\n<li>License: MIT<\/li>\n<\/ul>\n\n<h4>lucide-react<\/h4>\n\n<p>Used for admin interface icons.<\/p>\n\n<ul>\n<li>Source: https:\/\/github.com\/lucide-icons\/lucide<\/li>\n<li>License: ISC<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New<\/strong> in your WordPress admin and search for <strong>xSpeed Cache<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Navigate to <strong>xSpeed Cache<\/strong> in your sidebar.<\/li>\n<li>The setup wizard will guide you through the rest \u2014 it takes about 2 minutes.<\/li>\n<\/ol>\n\n<p>That's it. Your site is now faster.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20break%20my%20site%3F\"><h3>Will this break my site?<\/h3><\/dt>\n<dd><p>Very unlikely. xSpeed Cache includes safety checks for every optimization: minification falls back to the original if anything looks off, and the cache bypasses logged-in users, admin pages, AJAX, and REST requests automatically. If something ever looks wrong, you can toggle any feature off individually.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Add <code>\/cart<\/code>, <code>\/checkout<\/code>, and <code>\/my-account<\/code> to the Excluded URLs list and xSpeed Cache will skip caching those pages. Logged-in customers are never served cached pages regardless.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20server%3F\"><h3>Does it work with my server?<\/h3><\/dt>\n<dd><p>xSpeed Cache works on Apache, nginx, LiteSpeed, IIS, and any standard PHP host. Static-cache rewriting and GZIP auto-configuration work out of the box on Apache and LiteSpeed. For nginx and IIS, xSpeed Cache shows you a ready-to-paste config snippet.<\/p><\/dd>\n<dt id=\"does%20it%20support%20wordpress%20multisite%3F\"><h3>Does it support WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. Each site in the network has its own independent cache and settings.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20litespeed%20cache%3F\"><h3>Will it conflict with LiteSpeed Cache?<\/h3><\/dt>\n<dd><p>No. xSpeed Cache detects LiteSpeed's server-level caching module and steps back automatically to avoid double-caching. Otherwise, only run one page-cache plugin at a time.<\/p><\/dd>\n<dt id=\"how%20do%20i%20exclude%20a%20page%20from%20being%20cached%3F\"><h3>How do I exclude a page from being cached?<\/h3><\/dt>\n<dd><p>Go to <strong>xSpeed Cache \u2192 Settings<\/strong>, paste the URL path (e.g. <code>\/cart<\/code>) into the Excluded URLs field \u2014 one path per line. Changes save automatically.<\/p><\/dd>\n<dt id=\"how%20do%20i%20clear%20the%20cache%3F\"><h3>How do I clear the cache?<\/h3><\/dt>\n<dd><p>Click <strong>Purge<\/strong> in the xSpeed Cache dashboard, or use <strong>Purge xSpeed Cache<\/strong> in your admin bar. The cache also clears itself automatically whenever you publish or update content.<\/p><\/dd>\n<dt id=\"can%20i%20use%20xspeed%20cache%20alongside%20cloudflare%3F\"><h3>Can I use xSpeed Cache alongside Cloudflare?<\/h3><\/dt>\n<dd><p>Yes. The built-in Cloudflare module connects your zone and auto-purges Cloudflare's cache whenever xSpeed Cache purges its own \u2014 so both caches stay in sync.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20minification%20temporarily%20for%20debugging%3F\"><h3>Can I disable minification temporarily for debugging?<\/h3><\/dt>\n<dd><p>Yes. Either toggle the option off in the admin UI, enable <code>WP_DEBUG<\/code> (xSpeed Cache automatically skips HTML minification when debug is on), or use the <code>xspeed_skip_minify<\/code> filter.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>[1.2.1] \u2013 2026-08-27<\/h4>\n\n<p><strong>Self-hosted videos no longer download in full before anyone presses play, the autopilot now undoes a change that makes the site slower instead of calling it verified, and the diagnosis finally reports the content problems it was measuring all along.<\/strong><\/p>\n\n<p>Optimization:\n- Fixed: A self-hosted video with its own preload setting is no longer skipped. \"Lazy-load HTML5 videos\" now overrides a player's preload=\"auto\" or \"metadata\", which is where the setting was meant to help \u2014 a page carrying a 924KB video no longer transfers it before anyone presses play. Autoplaying videos are left alone.\n- New: The click-to-play facade now covers self-hosted videos that have a poster image, not just YouTube and Vimeo embeds. The file downloads on click; without JavaScript the original video is still there.\n- New: Each optimization step is now measured, and a change that makes the page measurably slower is undone instead of being reported as verified. A change inside normal run-to-run variation is reported as unchanged rather than claimed as a win.\n- Fixed: An image the theme has already marked as the most important one on the page is no longer lazy-loaded, which delayed the very image it was told to prioritise.<\/p>\n\n<p>Diagnosis and reporting:\n- Fixed: The reported score came from the oldest audit on record rather than the newest, so re-measuring never moved the number. The newest successful run is now used, and a failed audit is never presented as the current score.\n- Fixed: Page weight, heavy videos and DOM size were measured but never shown. The content problems only a person can fix are now reported alongside the settings the plugin can change itself.\n- New: The last audit's own named opportunities, with their measured savings, now feed the diagnosis \u2014 routed to either the settings the plugin can change or the content a person has to.<\/p>\n\n<p>Reliability:\n- Fixed: A missing plugin file no longer takes down wp-admin. xSpeed now stops cleanly and names the file that is missing, so the Plugins screen still loads and the plugin can be switched off to recover.\n- Fixed: An unresolvable class is reported with the path of the file that is missing, rather than only the class name, so an interrupted update or a quarantined file can be identified from the log.<\/p>\n\n<p>Caching:\n- New: The cache is cleared when a plugin, theme or WordPress core is updated, so a page is never served from markup the updated code no longer produces. It clears network-wide on multisite, can be switched off, and leaves the cache alone for a plugin you installed but never activated or for a nightly language-pack update.\n- Improved: Visitors arriving with a tracking parameter such as utm_source, fbclid or gclid are now served from the fast path instead of loading WordPress in full.\n- Fixed: Add-ons can now read the signal that says the cache was already cleared by an update, so the cache is no longer cleared a second time.<\/p>\n\n<p>Settings and AI tools:\n- New: A setting that is accepted but has no effect on your server now says so. Enabling Brotli on a server without Brotli support reported plain success while nothing changed; the tools that flip the setting now report the same warning the dashboard shows.\n- Fixed: A URL field that is posted to now rejects an address that cannot be called. An email address entered in one of these fields was silently accepted and the feature then failed with nothing on screen to explain why.\n- Fixed: Score history now reports whether each audit succeeded, and the error when one did not, so a failed run is no longer indistinguishable from a run that returned no score.<\/p>\n\n<p>Dashboard:\n- Fixed: Switching tabs on Health &amp; insights no longer jumps the page back to the top.\n- Fixed: A shorter tab is no longer padded out to the height of the tallest one, which left a screen of blank space below the content. Tab strips are also fully wired for screen readers and keyboard navigation.<\/p>\n\n<p>Setup wizard:\n- Fixed: The wizard opens with Balanced selected instead of no preset, warns in both directions when a setting is changed away from the preset, and uses the same labels throughout.\n- Fixed: A brand-new install showed all three preset cards as inactive, because nothing had been configured yet. The cache lifetime also starts at 7 days rather than empty.<\/p>\n\n<h4>[1.2.0] \u2013 2026-08-24<\/h4>\n\n<p><strong>One command now measures your site, applies the settings that help, and undoes anything that breaks. Four cache-poisoning routes are closed, importing from W3 Total Cache carries settings across faithfully instead of a handful, and combined JavaScript keeps running in the order the page expects.<\/strong><\/p>\n\n<p>Security:\n- Fixed: A page rendered with a query string is no longer stored under the bare URL's cache key, where it would then be served to every visitor asking for the plain URL.\n- Fixed: Percent-encoded query keys can no longer poison the cache. Two spellings of the same key resolved to different cache keys, so a crafted URL could seed the entry a normal request would later read.\n- Fixed: An allow-listed tracking parameter no longer lets a crafted URL overwrite a cached page.\n- Fixed: A search-results page no longer poisons the homepage through the cache key.<\/p>\n\n<p>Optimization:\n- Added: <code>wp xspeed optimize<\/code> and the <code>optimize_site<\/code> AI tool make the whole tuning loop one command. It measures the site, applies the recommended settings one at a time, re-checks the page after each change, and reverts anything that breaks it \u2014 then reports what it applied, what it undid and why, and what it could not reach at all (page weight, hotlinked images, DOM size) rather than claiming a win it did not make.\n- Added: Images hosted on another domain get their real dimensions resolved, so lazy loading and the preloader no longer skip them.<\/p>\n\n<p>Migration:\n- Fixed: Importing from W3 Total Cache brought across 8 of 510 settings. Page cache, browser cache, object cache, exclusions and compression now map to their xSpeed equivalents.\n- Fixed: Disabling W3 Total Cache's master Minify switch is now respected. Its child CSS\/JS settings stay populated while the master is off, so reading them alone imported minification and combination as enabled on a site that had deliberately turned them off.\n- Fixed: An encrypted Redis password that cannot be read is now reported rather than silently dropped, so the object cache no longer fails to connect with nothing on screen to explain why.\n- Fixed: An object-cache endpoint written as <code>tls:\/\/host:port<\/code> imported a host that could never resolve. The host and port are now imported and the dropped transport is stated, since xSpeed connects over plain TCP.\n- Fixed: Compression enabled only for \"other\" file types no longer imports GZIP as switched off.\n- Fixed: A partial import no longer switches off the plugin it imported from, and no longer shows a finished \"Imported\" state with no way to retry.\n- Fixed: WP Super Cache is detected and imported. Its settings are stored under different keys than the importer looked for, so it reported nothing to import.\n- Fixed: Page caching is actually enabled by an import that says it is.<\/p>\n\n<p>Caching:\n- Fixed: Ignored query parameters are matched by whole name rather than as substrings, so <code>utm_source<\/code> no longer matches an unrelated parameter that merely contains it.\n- Fixed: Purging a URL on a non-standard port deleted nothing.\n- Fixed: Query-string requests skip only the cache write, not the HTML transforms, so those pages keep their minification and lazy loading.<\/p>\n\n<p>CSS and JavaScript:\n- Fixed: Combined JavaScript is split by print group, so scripts registered for the footer are no longer hoisted into the head and run before first paint.\n- Fixed: The combined bundle is carried on an existing handle rather than a new one, preserving inline payloads attached to it and the surrounding cascade order.\n- Fixed: Configuration a page builder attaches late \u2014 Elementor writes <code>elementorFrontendConfig<\/code> on <code>wp_footer<\/code>, long after combining runs \u2014 now prints ahead of the combined bundle instead of behind it, so scripts no longer initialise against a config that does not exist yet.<\/p>\n\n<p>CDN:\n- Fixed: Changing the CDN URL clears Elementor's render caches, which stored the previous URLs in their markup.<\/p>\n\n<p>Interface:\n- Fixed: The setup wizard and the \u2318K search palette no longer render underneath the WordPress admin menu.\n- Fixed: Opening a panel no longer shifts the page behind it when the dashboard is scrolled away from the top.\n- Fixed: The Apply button on a Pro recommendation works instead of failing silently. Free and Pro name their recommendations differently, and only Free's were understood by the button both of them use.\n- Added: The MCP server appears on the Overview as a capability card, so an AI connection can be set up without hunting for the panel.<\/p>\n\n<p>MCP server:\n- Fixed: OAuth discovery keeps working when another plugin claims <code>\/.well-known\/<\/code>.<\/p>\n\n<p>Server configuration:\n- Fixed: URL exclusions are mirrored into the generated nginx snippet, so nginx no longer serves cached copies of pages xSpeed was told to exclude.<\/p>\n\n<h4>[1.1.8] \u2013 2026-08-20<\/h4>\n\n<p><strong>Importing settings from another caching plugin no longer switches that plugin off without asking. Purging CSS or JavaScript now also clears the pages that link them, a failed save no longer reports success, and another MCP plugin\u2019s AI connections keep working alongside xSpeed.<\/strong><\/p>\n\n<p><strong>Migration:<\/strong><\/p>\n\n<ul>\n<li>Fixed: Importing settings no longer deactivates the plugin you imported from as an unavoidable side effect. The panel now offers both outcomes: \u201cImport &amp; switch to xSpeed\u201d and \u201cImport settings only.\u201d Previously, the only way to decline was Cancel, which also abandoned the import. WP-CLI and MCP did the opposite and left both plugins running silently; all three now behave consistently.<\/li>\n<li>Fixed: On a multisite network, a single site\u2019s administrator can no longer switch off a network-activated caching plugin for every site on the network. WordPress refuses the same action from its own Plugins screen.<\/li>\n<li>Fixed: Choosing to leave the other plugin running now raises a Health item naming the plugin and the risk, so two page caches competing for the drop-in don\u2019t go unnoticed. It clears itself once the plugin is switched off.<\/li>\n<li>Fixed: LiteSpeed\u2019s exclusion lists are stored as JSON and were imported literally, causing imported exclusions to never match anything.<\/li>\n<\/ul>\n\n<p><strong>Caching:<\/strong><\/p>\n\n<ul>\n<li>Fixed: Purging CSS or JavaScript now also purges the pages that link those files. Cached pages could keep pointing to deleted combined assets, leaving them unstyled until another page purge occurred.<\/li>\n<li>Fixed: A single POST request no longer keeps a visitor on the uncached path for the rest of their visit. Previously, one form submission or comment could cause every later page to be generated from scratch.<\/li>\n<li>Fixed: Cache now purges when any module\u2019s settings change, not only the cache module\u2019s.<\/li>\n<\/ul>\n\n<p><strong>CSS and JavaScript:<\/strong><\/p>\n\n<ul>\n<li>Fixed: \u201cDefer\u201d and \u201cDelay\u201d now apply to the external script itself rather than an inline block queued before it, preventing execution order issues.<\/li>\n<li>Fixed: Combined JavaScript keeps its declared dependencies, so scripts no longer run before the libraries they need.<\/li>\n<li>Fixed: Inline style and script blocks are now minified, and anything deliberately skipped clearly indicates why.<\/li>\n<\/ul>\n\n<p><strong>Settings and interface:<\/strong><\/p>\n\n<ul>\n<li>Fixed: A failed save no longer shows the green \u201cSettings saved\u201d toast. The failure now stays visible instead of disappearing with the toast.<\/li>\n<li>Fixed: Settings writes with keys that would be silently dropped are now refused instead of being accepted and discarded.<\/li>\n<li>Fixed: A cleared URL field stays cleared instead of reverting to its previous value.<\/li>\n<li>Fixed: Sub-sections of a disabled feature now collapse with it.<\/li>\n<li>Fixed: A failing server snippet now identifies the problem instead of showing only a status code.<\/li>\n<\/ul>\n\n<p><strong>MCP server:<\/strong><\/p>\n\n<ul>\n<li>Fixed: xSpeed no longer answers another MCP plugin\u2019s OAuth discovery URLs. Previously, its rule could match every .well-known discovery address on the site and return xSpeed\u2019s details, preventing AI assistants from connecting correctly to other MCP plugins.<\/li>\n<\/ul>\n\n<p><strong>Security:<\/strong><\/p>\n\n<ul>\n<li>Fixed: The MCP server\u2019s dynamic client registration is now bounded with limits on stored clients, redirect URIs, name and URI length, plus per-IP rate limiting on the registration endpoint.<\/li>\n<li>Fixed: MCP and WP-CLI settings writes are now gated by the Pro license, matching the dashboard.<\/li>\n<\/ul>\n\n<h4>[1.1.7] \u2013 2026-08-17<\/h4>\n\n<p><strong>On a multisite network, a change to one site no longer wipes every other site's cache. Cache cleanup no longer deletes stylesheets a live page is still using, and a consent banner styled by another plugin stays styled.<\/strong><\/p>\n\n<p>Caching:\n- Fixed: On a multisite network, each site's cache is now cleared on its own. Changing a setting, publishing a post, or clicking Purge on one site previously deleted the cached pages of every other site on the network, so the cache was rarely warm for anyone.\n- Fixed: Cache cleanup no longer deletes a combined stylesheet or script that cached pages are still pointing at. Those pages carried on being served while their CSS and JavaScript returned \"not found\", leaving a site unstyled and unresponsive \u2014 and invisible to the owner, whose own browser still held the old copy.<\/p>\n\n<p>CSS and JavaScript:\n- Fixed: \"Load CSS Asynchronously\" no longer breaks a stylesheet another plugin has already made non-render-blocking. A cookie-consent banner in that position loaded with none of its styling applied, in both logged-in and logged-out states.<\/p>\n\n<p>Settings:\n- New: List settings \u2014 cache exclusions, ignored parameters and the rest \u2014 now show the stock value beside the box you edit, with a Reset action to restore it. These are lists where one wrong entry can quietly stop a whole section of the site being cached, and there was previously no way to see how far a list had drifted.\n- Improved: The box you edit is now labelled, and Reset sits on it rather than beside the defaults.<\/p>\n\n<p>Accessibility:\n- Fixed: Hint text, captions and status pills now meet the AA contrast minimum in light mode. The worst affected was the \"Off\" state pill \u2014 the only thing communicating whether a feature was on.<\/p>\n\n<h4>[1.1.6] \u2013 2026-08-13<\/h4>\n\n<p><strong>A search-results page could be cached and served as your home page. Combining CSS no longer strips a site's styling, Pro settings can no longer be changed without an active licence, and an AI assistant now reports this site's tier and audits the page you actually asked for.<\/strong><\/p>\n\n<p>Security:\n- Fixed: A single search request could replace your cached home page. With search caching on, one visit to a search URL was stored as the site's front page, so every later visitor \u2014 and search engines \u2014 were served those results instead. The cached copy was handed out by the web server without WordPress running, so it kept being served until the cache was cleared. Search pages are now kept out of that store entirely.<\/p>\n\n<p>CSS and JavaScript:\n- Fixed: Combining CSS files could leave a site completely unstyled \u2014 no missing files, no errors, just the theme's styling gone. WordPress can inline a stylesheet it considers small, and doing so dropped the combined file that every other stylesheet had been folded into. Combining now happens on the finished page, after WordPress has made those decisions, so what you see in the browser is what was combined.\n- Fixed: A stylesheet saved with a byte-order mark \u2014 common in files edited on Windows \u2014 no longer breaks the styling of every file combined after it.\n- Fixed: Fonts and stylesheets brought in by an <code>@import<\/code> rule are no longer dropped when their file is combined with others.<\/p>\n\n<p>AI assistants and WP-CLI:\n- Fixed: On a site without an active Pro licence, Pro settings can no longer be changed through WP-CLI or an AI assistant. The dashboard already showed them locked; four write routes and the image recommendation did not enforce it, so a change made that way appeared to succeed.\n- Fixed: A refused change is now reported as a refusal. It previously returned success over settings it had not written, in both the REST response and the command's exit code.\n- New: <code>run_score<\/code> runs an external performance audit from any install, and honours the provider you configured \u2014 asking for GTmetrix no longer silently runs PageSpeed Insights instead.\n- Fixed: An AI assistant asking what this site is now gets the truth about its tier. On a Pro site with a lapsed licence it previously reported the licence as active.\n- Improved: A PageSpeed audit started from an assistant now measures the page you asked for. It previously measured the home page whatever URL was given, and reported success.<\/p>\n\n<p>Cache:\n- Fixed: Turning the page cache off, or uninstalling xSpeed, now removes the <code>WP_CACHE<\/code> setting it added to your <code>wp-config.php<\/code>. It was only removed when written exactly one way, so most sites kept a stale setting behind after the cache was switched off \u2014 including after the plugin was deleted.<\/p>\n\n<p>Compatibility:\n- Fixed: <code>wp xspeed purge<\/code> no longer clears the page cache on Apache servers without mod_headers, where the cache could not be served from disk anyway.<\/p>\n\n<p>Accessibility:\n- Fixed: Two buttons \u2014 the nginx snippet's copy control and the MCP panel's tool list \u2014 now show a focus ring again when reached by keyboard. They suppressed the outline entirely, which left anyone navigating by Tab with no indication of where they were.<\/p>\n\n<p>Settings:\n- Improved: Duration fields now show what the number means in plain words \u2014 \"6 hours\", \"1 day 12 hours\" \u2014 for every value, not only round ones.<\/p>\n\n<h4>[1.1.5] \u2013 2026-08-11<\/h4>\n\n<p><strong>AI assistants can change your settings again, and the cache preloader works on sites without a readable sitemap.<\/strong><\/p>\n\n<p>AI assistants and WP-CLI:\n- Fixed: An AI assistant can read and change your xSpeed settings again. The two tools that do this were dropped from the catalog on every site, so an assistant \u2014 including the one connected through the Hub \u2014 was told they did not exist and could only fall back to raw commands.\n- New: <code>wp xspeed settings list|get|update<\/code> \u2014 read and change any module's settings from the command line, and from an AI assistant through the same commands.\n- Improved: Settings for Pro features are no longer readable or writable over WP-CLI or an AI connection on a site without an active licence. The dashboard already hid them; these two surfaces did not.\n- Improved: Credentials still cannot be set from the command line or an AI assistant. Asking to now names the field it refused rather than reporting success over an unchanged key.<\/p>\n\n<p>Preloading:\n- Fixed: On a site whose sitemap can't be read, the preloader now warms your most recent pages straight from your content instead of silently queueing nothing. This affected two common setups that are not misconfigurations: sites discouraging search engines (where WordPress disables the sitemap outright, standard on staging and pre-launch sites), and SEO plugins that serve their own sitemap at a path we were never told about.\n- Fixed: When a crawl can't start at all, the preloader panel now says \"Couldn't start\" and names the reason, rather than reporting \"Ready\" over an empty run.\n- Improved: The explanation appears while the crawl is running, not only once it finishes \u2014 on a large site that is the difference between watching an unexplained crawl for hours and knowing why on the first tick.\n- Fixed: <code>wp xspeed preloader status<\/code> no longer fails with an internal error after a crawl that ended with nothing queued. An AI assistant asking why a preload failed now gets the actual reason instead of a type error.<\/p>\n\n<p>Branding:\n- Improved: New xSpeed Cache logo and wordpress.org banners.<\/p>\n\n<h4>[1.1.4] \u2013 2026-08-09<\/h4>\n\n<p><strong>Stored credentials are now encrypted, exclusions are enforced by the server itself, and the cache cleans up after itself.<\/strong><\/p>\n\n<p>Security:\n- Fixed: Stored credentials \u2014 API tokens, keys, and object-cache passwords \u2014 are now encrypted at rest and never returned in full by the dashboard, REST API, or an AI assistant. They were previously readable in plain text by anyone who could reach those endpoints. Existing values are encrypted automatically on upgrade; nothing needs re-entering.\n- Improved: An AI assistant can no longer write credentials unless you explicitly grant it that permission when connecting.\n- Improved: Cloudflare settings are verified when you save them, so a wrong token or zone is reported straight away instead of failing silently on the next purge.<\/p>\n\n<p>Caching:\n- New: Expired cache entries and orphaned minified assets are now collected on a schedule, so the cache directory no longer grows without bound on a busy site.\n- Fixed: Excluded cookies and bypassed user agents are now enforced on the fast path the web server serves directly. Previously they applied only while a page was cold, so a warm page could serve the shared anonymous copy to carts, members and bypassed bots.\n- Fixed: Sites using TranslatePress now cache the translated page rather than the untranslated one.\n- Improved: Response headers now distinguish a cache miss from a deliberate bypass, so a quick header check shows whether a page is about to be cached or was skipped on purpose. Previously both came back with no header at all.\n- Improved: With debug mode on, a bypassed response also names which rule skipped it \u2014 logged-in, excluded URL, query parameter, and so on.\n- Fixed: Cache hits are now counted on every server, not only nginx, so Apache and LiteSpeed sites no longer show a permanent 0% hit ratio.\n- Improved: The static-rewrite check now reports a known blocker (such as Separate Mobile Cache) instead of a bare \"inactive\", and says the same thing in the dashboard, WP-CLI, REST and MCP.\n- Improved: The hit ratio now excludes 404s and bot traffic, and reports the origin only when a CDN sits in front \u2014 so the number reflects what your visitors actually experience.<\/p>\n\n<p>Compression:\n- Fixed: GZIP is no longer reported as inactive when the check itself couldn't complete. A blocked loopback request is not evidence that compression is missing, and telling you your server was misconfigured because we couldn't reach it was the bug. Only a check that positively proves GZIP is absent now warns.<\/p>\n\n<p>Optimization:\n- Fixed: The CDN now serves CSS, JavaScript and fonts, not just images from post content. Font files also get the CORS header they need when loaded cross-origin.\n- Fixed: LCP preload now picks the largest image on the page instead of the first one, so the preload helps the image that actually decides your LCP score rather than competing with it.\n- Fixed: Brotli is detected on nginx by asking the server, so a host with ngx_brotli installed is no longer told to install it. A check that can't complete now says so rather than reporting Brotli as unavailable.\n- Fixed: The Compression page no longer promises an nginx snippet that isn't on it \u2014 it links to the snippet instead, and the link is there whether or not compression is already working.<\/p>\n\n<p>Dashboard &amp; Admin UX:\n- Fixed: Enter now inserts a newline in the \"one per line\" settings fields (Excluded URLs, Excluded Cookies, and the rest). Typing a list previously merged every line into one.\n- Fixed: The Setup Wizard starts from your site's real settings, so re-running it and pressing Apply no longer silently switches off options you had turned on. A cache expiry that isn't one of the presets is shown as its own option and named before anything overwrites it.\n- Fixed: The Recent activity feed shows setting names as they appear on screen instead of internal storage keys, and no longer writes connection details or account identifiers into the log.\n- Fixed: Links to Tools \u2192 Migration now open that page rather than dropping you on the Overview.\n- New: Settings fields can now link to their documentation; the PageSpeed API key field points at the setup guide.\n- Fixed: External Score now lives in one place, under Health &amp; insights. It previously rendered a second copy of the same settings and run history inside the Health page's PageSpeed tab.<\/p>\n\n<p>AI &amp; agents:\n- Fixed: A read-only MCP connection can now read status through every per-command tool. It previously refused the whole tool if any of its actions could write, so an assistant with read-only access could not inspect state at all. Write actions are still refused, and an unrecognised action is refused rather than allowed.<\/p>\n\n<h4>[1.1.3] \u2013 2026-08-05<\/h4>\n\n<p><strong>A redesigned dashboard, a homepage cache-poisoning fix, and caching that survives a plugin update.<\/strong><\/p>\n\n<p>Security:\n- Fixed: A crafted URL could poison the homepage cache, causing search-results content to be served to every visitor from the cached homepage.<\/p>\n\n<p>Caching:\n- Fixed: Updating the plugin no longer silently disables page caching until the next admin login \u2014 the drop-in is restored on activation.\n- Fixed: Cache hits served statically by Apache are now reported and counted, instead of showing a permanent 0% hit ratio.\n- Improved: Health now explains when the fast static-cache path is unavailable because the server lacks mod_headers, and what to change, instead of suggesting a fix that cannot work.\n- Improved: Fresh installs now start on the recommended profile, so sites set up by WP-CLI or a skipped wizard get compression, browser caching, and minification by default.<\/p>\n\n<p>Dashboard &amp; Admin UX:\n- New: Redesigned dashboard \u2014 new typography, colour system, navigation rail, and top bar, with grouped navigation and a consistent module-settings layout.\n- New: Command palette for jumping to any setting.\n- New: A dedicated Pro page describing what each Pro feature does.\n- New: \"Avg saved\" card on the Overview, showing the real per-request time saved from your latest benchmark.\n- Improved: License, Branding, and Multisite are now cards of their own, so the license form is one click away instead of three.\n- Improved: Fonts now lives in one place under Optimization, and the page that used to host it is now \"Media Optimization\".\n- Fixed: Recommendation links on the Overview now open the screen they point at, and \"Get the snippet\" opens the snippet.\n- Fixed: The brand mark no longer renders black against the dark rail in light mode.<\/p>\n\n<p>Optimization:\n- New: Delay JavaScript now also covers scripts printed directly into the page \u2014 analytics, pixels, and chat widgets that previously bypassed it entirely.\n- New: The delay-JavaScript failsafe timer is now configurable, so it can be tuned or switched off instead of firing mid-measurement.\n- Fixed: Delayed scripts are now matched correctly when minification rewrites their URLs.\n- Fixed: HTML minification now says when it is deliberately suppressed by debug mode, instead of reading as on while changing nothing.<\/p>\n\n<p>AI \/ MCP:\n- New: Stored PageSpeed Insights and GTmetrix history is now readable from your AI assistant.\n- Fixed: Removed fifteen duplicate tools that shadowed the typed ones, trimming the tool list.\n- Fixed: An unrecognised migration command now reports an error instead of silently succeeding.<\/p>\n\n<h4>[1.1.2] \u2013 2026-07-30<\/h4>\n\n<p><strong>A new Overview dashboard, click-to-play video embeds, and a full audit trail for AI actions.<\/strong><\/p>\n\n<p>Dashboard &amp; Admin UX:\n- New: Overview screen is now the landing page, showing cache status, key stats, recommendations, and recent activity at a glance.\n- New: PageSpeed and GTmetrix scores on the dashboard.\n- New: Stat cards open into drill-downs so you can see what is behind each number.\n- Improved: Notice buttons now take you straight to the control they refer to.\n- Improved: Deactivating the plugin now asks for feedback, so problems reach us instead of going unreported.<\/p>\n\n<p>Optimization:\n- New: Click-to-play facade for YouTube and Vimeo embeds \u2014 the player loads only when a visitor presses play, cutting page weight.\n- Fixed: Minified HTML no longer loses the space between inline elements, which could run words together.<\/p>\n\n<p>AI \/ MCP:\n- New: Audit trail recording every AI tool call, with an activity panel showing what was run and whether it changed anything.\n- New: Every xSpeed CLI command is now available as its own MCP tool.\n- Fixed: AI tool calls failed with a server error instead of running. Every tool works again.<\/p>\n\n<p>Onboarding:\n- Improved: Account connection moved to the final step, so caching is set up before you are asked to sign in.\n- Fixed: Returning from account setup now resumes on the right step.\n- Fixed: Each \"next step\" card in the wizard now goes to its own destination.<\/p>\n\n<p>Health:\n- Fixed: No longer tells you to configure your server when the check could not reach a verdict.<\/p>\n\n<h4>[1.1.1] \u2013 2026-07-28<\/h4>\n\n<p><strong>Actionable dashboard insights, richer AI tooling, and smarter health detection.<\/strong><\/p>\n\n<p>Dashboard &amp; Admin UX:\n- New: Impact hero showing the real-world speed gain your cache is delivering, with a one-click next-best-action to apply the top recommendation.\n- New: Benchmark history and daily hit-ratio trend charts, annotated with the setting changes that moved them.<\/p>\n\n<p>AI \/ MCP:\n- New: Purge a single URL, read site health, test the object cache connection, and verify Cloudflare credentials directly from your AI assistant.<\/p>\n\n<p>Health:\n- New: Detects third-party cookies that would poison the page cache and names the plugin responsible.\n- New: Warns when the cache lifetime is shorter than the preloader interval, which would leave pages permanently uncached.<\/p>\n\n<p>Optimization:\n- New: Delay individual scripts by name instead of all-or-nothing, so you can defer heavy third-party embeds while leaving critical scripts alone.\n- Fixed: Lazy-loaded images now get correct width and height even when the theme strips WordPress' image size class, preventing layout shift.<\/p>\n\n<p>Caching:\n- Improved: Benchmark now reports the real compressed transfer size alongside the uncompressed page weight.<\/p>\n\n<p>Object Cache:\n- Fixed: A failed write to Redis or Memcached no longer leaves a stale value served from the backend.<\/p>\n\n<h4>[1.1.0] \u2013 2026-07-22<\/h4>\n\n<p><strong>New xSpeed Hub \u2014 connect one AI assistant to manage caching across all your sites.<\/strong><\/p>\n\n<p>xSpeed  &hellip;<\/p>","raw_excerpt":"Ultra-fast WordPress caching &amp; performance plugin. Page cache, minify, GZIP, lazy load, fonts, object cache, CDN \u2014 one switch, no bloat, no upsells.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/292268","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=292268"}],"author":[{"embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpdevteam"}],"wp:attachment":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=292268"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=292268"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=292268"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=292268"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=292268"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=292268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}