{"id":293491,"date":"2026-05-28T17:14:17","date_gmt":"2026-05-28T17:14:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/cyclone-static\/"},"modified":"2026-05-28T17:13:56","modified_gmt":"2026-05-28T17:13:56","slug":"cyclone-static","status":"publish","type":"plugin","link":"https:\/\/srd.wordpress.org\/plugins\/cyclone-static\/","author":23468812,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.38","stable_tag":"1.1.38","tested":"6.9.4","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Cyclone Static","header_author":"Krypton Media Group","header_description":"Generates fully-rendered static HTML files for WordPress pages and serves them directly via Apache \u2014 bypassing PHP and the database for anonymous visitors. Integrates with W3 Total Cache and Divi\/Extra. Deactivating removes the .htaccess rules and WordPress resumes normal operation.","assets_banners_color":"193855","last_updated":"2026-05-28 17:13:56","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/kryptonmediagroup.com\/cyclone-static","header_author_uri":"https:\/\/kryptonmediagroup.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.38":{"tag":"1.1.38","author":"kryptonmediagroup","date":"2026-05-28 17:13:56"}},"upgrade_notice":{"1.1.37":"<p>Minor fix. Changing Settings \u2192 Reading now automatically triggers cache regeneration. No manual action required after upgrading.<\/p>","1.1.36":"<p>Fix for sites using a static front page with a separate Posts Page: post changes now correctly re-queue and regenerate the Posts Page. No manual action required.<\/p>","1.1.35":"<p>Important fix. Resolves a redirect loop bug (<code>[L]<\/code> vs <code>[END]<\/code> on cache-serving RewriteRules) that caused Apache to log AH00124 internal-redirect errors at high volume. Upgrade is applied automatically on the first request after update.<\/p>","1.1.34":"<p>Important fix. Resolves a mod_rewrite recursion loop on certain hosting configurations and adds explicit Cache-Control headers so CDNs (Cloudflare, CloudFront, Fastly, etc.) cache correctly. Upgrade is applied automatically on the first request after update; purge your CDN cache after upgrading.<\/p>","1.1.33":"<p>Important fix. Resolves a regression where browsers could receive corrupted compressed content (ERR_CONTENT_DECODING_FAILED), appearing as blank pages or unreadable content on hosts that enable mod_brotli globally. Upgrade is applied automatically on the first request after update; remember to purge any CDN cache in front of the site.<\/p>","1.1.32":"<p>Important fix. Resolves a regression where mobile browsers received cached pages as a &quot;download.tgz&quot; archive instead of rendering them. Upgrade is applied automatically on the first request after update; remember to purge any CDN cache in front of the site.<\/p>","1.1.31":"<p>Important fix. Restores serving of pre-compressed (.gz \/ .br) cached pages on Apache configurations whose defaults deny access under wp-content. Upgrade is applied automatically on the first request after update.<\/p>","1.1.28":"<p>Recommended update. Adds a deactivation prompt so your cache is not silently deleted. Fixes a fatal error on the Settings page.<\/p>","1.1.27":"<p>Maintenance update for WordPress.org compatibility. Removes all feature gates and upgrade prompts \u2014 the plugin is now fully functional with no restrictions. Fixes inline script placement and adds required external services disclosure.<\/p>","1.1.26":"<p>Security update. Fixes missing output escaping in the admin dashboard and pages list, and a missing wp_unslash() call on a POST field. All issues are admin-only. Update recommended for all users.<\/p>","1.1.20":"<p>Adds Amazon CloudFront CDN support and WordPress Multisite support (available in Cyclone Static Pro). Also adds a configurable throttle delay to reduce server load during cache generation.<\/p>","1.1.2":"<p>Recommended update. Improves .htaccess resilience \u2014 the Cyclone block now restores itself automatically if the .htaccess file is deleted and regenerated.<\/p>","1.1.1":"<p>Recommended update. Adds pre-compressed gzip delivery for faster page loads.<\/p>","1.1.0":"<p>Important fix. Resolves REST API 404 errors that could break post saving and other WordPress editor functions when Cyclone Static was active.<\/p>"},"ratings":[],"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3552549,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3552549,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.38"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Dashboard \u2014 status, statistics, and action buttons","2":"Posts &amp; Pages list \u2014 cache status for every post and page","3":"Settings \u2014 background processing, exclusions, and advanced options"}},"plugin_section":[],"plugin_tags":[2436,146,247,794,17693],"plugin_category":[52,54],"plugin_contributors":[264828],"plugin_business_model":[],"class_list":["post-293491","plugin","type-plugin","status-publish","hentry","plugin_tags-apache","plugin_tags-cache","plugin_tags-performance","plugin_tags-speed","plugin_tags-static","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-kryptonmediagroup","plugin_committers-kryptonmediagroup"],"banners":{"banner":"https:\/\/ps.w.org\/cyclone-static\/assets\/banner-772x250.jpg?rev=3552549","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/cyclone-static\/assets\/icon.svg?rev=3552549","icon":"https:\/\/ps.w.org\/cyclone-static\/assets\/icon.svg?rev=3552549","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Cyclone Static generates fully-rendered static HTML files for every page on your WordPress site and instructs Apache to serve them directly \u2014 bypassing PHP, WordPress, and the database for anonymous visitors.<\/p>\n\n<p>When a static file exists for a requested URL, Apache reads it from disk and sends it without starting PHP or querying the database. The visitor receives a complete HTML page. Their browser runs your JavaScript, plays your audio, renders your animations \u2014 everything works as it did before, because the static file contains the same HTML WordPress would have generated.<\/p>\n\n<p>Logged-in users, POST requests, query strings, and administrative paths bypass the static cache and receive live WordPress as normal.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Static file serving<\/strong> \u2014 Apache serves files directly from disk. PHP and the database are not involved in serving anonymous page requests.<\/li>\n<li><strong>Automatic regeneration<\/strong> \u2014 When you publish or update a post or page, it is automatically queued for regeneration. You do not need to do anything.<\/li>\n<li><strong>Reduced attack surface<\/strong> \u2014 Static HTML files do not execute PHP or query a database. Common WordPress-targeted attack vectors that require a live PHP process \u2014 such as SQL injection via PHP, PHP code execution, and xmlrpc.php abuse \u2014 do not apply to anonymous page requests served as static files.<\/li>\n<li><strong>CDN integration<\/strong> \u2014 Works alongside W3 Total Cache. Direct integration with Bunny.net, Cloudflare, KeyCDN, and Amazon CloudFront is available in Cyclone Static Pro.<\/li>\n<li><strong>W3 Total Cache compatible<\/strong> \u2014 Installs its .htaccess rules before W3TC rules. Works alongside or without W3TC.<\/li>\n<li><strong>Non-destructive<\/strong> \u2014 Deactivating the plugin removes the .htaccess rules and WordPress resumes normal operation. Your cached files are not deleted without your explicit consent \u2014 a prompt appears when you deactivate, asking whether to keep or delete them.<\/li>\n<li><strong>Free and open<\/strong> \u2014 No license required. Support via the WordPress.org community forums.<\/li>\n<\/ul>\n\n<h4>System requirements<\/h4>\n\n<ul>\n<li>WordPress 6.0 or later<\/li>\n<li>PHP 8.0 or later<\/li>\n<li><strong>Apache web server<\/strong> with mod_rewrite enabled<\/li>\n<li>.htaccess support enabled (AllowOverride All or equivalent)<\/li>\n<li>WordPress Multisite is not supported in this version \u2014 Multisite support is available in Cyclone Static Pro<\/li>\n<\/ul>\n\n<p><strong>Nginx users:<\/strong> Cyclone Static manages .htaccess automatically on Apache. If your server runs Nginx, the Settings page includes a ready-to-paste Nginx server block under <strong>Settings \u2192 Nginx Configuration<\/strong>.<\/p>\n\n<h4>CDN support<\/h4>\n\n<p>The free version works automatically alongside W3 Total Cache \u2014 CDN purges are routed through W3TC when it is active.<\/p>\n\n<p>Direct API integration with Bunny.net, Cloudflare, KeyCDN, and Amazon CloudFront is available in Cyclone Static Pro.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Cyclone Static does not collect, transmit, or store any personal data. The queue table stores only URLs. No external service is contacted except the CDN purge APIs you explicitly configure.<\/p>\n\n<h3>Support<\/h3>\n\n<p>Support is provided via the WordPress.org community forums. Post your question there \u2014 answers are public, so search first as your question may already be answered. For private inquiries, you can reach us at support@kryptonmediagroup.com. Confirmed bugs are addressed through plugin updates. Private one-on-one support is not offered via the forums.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>Cyclone Static can optionally connect to the following third-party services to purge cached content from your CDN. These connections are only made when you configure a CDN provider under <strong>Settings \u2192 CDN Integration<\/strong> and a purge is triggered. No data is sent to these services unless you explicitly configure them.<\/p>\n\n<h4>Bunny.net<\/h4>\n\n<p>Used for CDN cache purging. Your Bunny.net API key and Pull Zone ID are sent to the Bunny.net API.\n* Service: https:\/\/bunny.net\/\n* API documentation: https:\/\/docs.bunny.net\/reference\/purgepublicpullzone\n* Privacy policy: https:\/\/bunny.net\/privacy\/<\/p>\n\n<h4>Cloudflare<\/h4>\n\n<p>Used for CDN cache purging. Your Cloudflare API token and Zone ID are sent to the Cloudflare API.\n* Service: https:\/\/www.cloudflare.com\/\n* API documentation: https:\/\/developers.cloudflare.com\/api\/resources\/cache\/methods\/purge\/\n* Privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<h4>KeyCDN<\/h4>\n\n<p>Used for CDN cache purging. Your KeyCDN API key and Zone ID are sent to the KeyCDN API.\n* Service: https:\/\/www.keycdn.com\/\n* API documentation: https:\/\/www.keycdn.com\/api\n* Privacy policy: https:\/\/www.keycdn.com\/privacy<\/p>\n\n<h4>Amazon CloudFront<\/h4>\n\n<p>Used for CDN cache invalidation. Your AWS Access Key, Secret Key, and CloudFront Distribution ID are sent to the Amazon CloudFront API.\n* Service: https:\/\/aws.amazon.com\/cloudfront\/\n* API documentation: https:\/\/docs.aws.amazon.com\/cloudfront\/latest\/APIReference\/API_CreateInvalidation.html\n* Privacy policy: https:\/\/aws.amazon.com\/privacy\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload <code>cyclone-static.zip<\/code> via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong><\/li>\n<li>Activate the plugin<\/li>\n<li>Go to <strong>Cyclone Static \u2192 Dashboard<\/strong><\/li>\n<li>Confirm <strong>.htaccess Rules<\/strong> shows \u2713 Installed in the System Info panel<\/li>\n<li>Click <strong>Discover from Sitemap<\/strong> to queue all pages for initial generation<\/li>\n<li>Monitor the <strong>Queue Depth<\/strong> stat card until generation is complete<\/li>\n<\/ol>\n\n<h4>Initial generation time<\/h4>\n\n<p>At default settings (2 pages every 60 seconds), a 4,000-page site takes several hours for initial full generation. Increase <strong>Batch Size<\/strong> in Settings to speed this up on servers with capacity to spare.<\/p>\n\n<p>After initial generation, the cache maintains itself automatically as you publish and update content.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20page%20builders%20like%20divi%20and%20extra%3F\"><h3>Does this work with page builders like Divi and Extra?<\/h3><\/dt>\n<dd><p>Yes. Cyclone Static captures the fully-rendered HTML output of each page as WordPress and your page builder produce it, including all JavaScript and CSS references. The static file closely matches what a live WordPress request would produce.<\/p><\/dd>\n<dt id=\"does%20this%20break%20my%20admin%20or%20editor%20experience%3F\"><h3>Does this break my admin or editor experience?<\/h3><\/dt>\n<dd><p>No. Logged-in users bypass the static cache and receive live WordPress. Divi's visual builder, preview functions, and WordPress admin features work as before.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Deactivation removes the Cyclone Static block from .htaccess \u2014 Apache falls through to WordPress for all requests. A prompt appears asking what to do with your cached files: <strong>Keep cache files<\/strong> (recommended if you plan to reactivate \u2014 files are served again immediately upon reactivation) or <strong>Delete cache files<\/strong> (removes them from disk now). If you dismiss the prompt without choosing, your files are kept.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens if I delete the plugin?<\/h3><\/dt>\n<dd><p>Deleting the plugin removes the .htaccess rules, drops the queue database table, and removes plugin settings. Your cached files are only deleted if you chose <strong>Delete cache files<\/strong> when you deactivated \u2014 if you chose to keep them or never saw the prompt, they remain on disk at their original location.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20w3%20total%20cache%3F\"><h3>Does it work with W3 Total Cache?<\/h3><\/dt>\n<dd><p>Yes. Cyclone Static installs its .htaccess rules before W3TC rules, so static files are served by Apache before W3TC is consulted. CDN purges are routed through W3TC automatically when it is active.<\/p><\/dd>\n<dt id=\"can%20i%20remove%20w3%20total%20cache%20if%20i%20install%20cyclone%20static%3F\"><h3>Can I remove W3 Total Cache if I install Cyclone Static?<\/h3><\/dt>\n<dd><p>Yes, but you must follow the safe removal procedure. See the <strong>Removing W3 Total Cache<\/strong> guide in the collapsible section on the Cyclone Settings page. Removing W3TC without preparation can break your site's styles and scripts.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20cloudflare%3F\"><h3>Does it work with Cloudflare?<\/h3><\/dt>\n<dd><p>The free version works behind Cloudflare without any special configuration \u2014 Cloudflare will cache and serve your static files as normal, and its CDN cache will refresh as files expire or are manually purged from the Cloudflare dashboard. Direct Cloudflare cache purging via API is available in Cyclone Static Pro.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20nginx%3F\"><h3>Does it work with Nginx?<\/h3><\/dt>\n<dd><p>Yes, with manual configuration. Cyclone Static manages .htaccess automatically on Apache but cannot write Nginx config files. The Settings page includes a ready-to-paste Nginx server block under <strong>Settings \u2192 Nginx Configuration<\/strong>. Copy that snippet into your site's server block before the location block that passes requests to PHP-FPM.<\/p><\/dd>\n<dt id=\"does%20it%20support%20brotli%20compression%3F\"><h3>Does it support Brotli compression?<\/h3><\/dt>\n<dd><p>Yes, when the php-brotli extension is installed on your server. Cyclone Static automatically generates a pre-compressed index.html.br alongside the standard index.html.gz for every cached page. Apache serves the best variant the browser supports \u2014 Brotli first, then gzip, then uncompressed. If php-brotli is not installed, gzip and uncompressed files are generated as normal with no configuration required.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20cached%20pages%20when%20a%20comment%20is%20posted%3F\"><h3>What happens to cached pages when a comment is posted?<\/h3><\/dt>\n<dd><p>When a new comment is posted and approved, Cyclone Static automatically re-queues the parent post for regeneration so the cached page reflects the updated comment count and list. Comments awaiting moderation do not trigger a regeneration \u2014 the page is only updated when the comment transitions to approved status.<\/p><\/dd>\n<dt id=\"what%20is%20the%20disk%20space%20requirement%3F\"><h3>What is the disk space requirement?<\/h3><\/dt>\n<dd><p>It depends on the complexity of your pages. A typical WordPress page generates a static file of 50\u2013300 KB. A 4,000-page site would require roughly 200 MB \u2013 1.2 GB. Cyclone Static displays your current cache size and available disk space on the Dashboard.<\/p><\/dd>\n<dt id=\"does%20it%20support%20woocommerce%3F\"><h3>Does it support WooCommerce?<\/h3><\/dt>\n<dd><p>Cyclone Static can run on WooCommerce sites with manual configuration. Add \/cart\/, \/checkout\/, \/my-account\/, and \/wc-api\/ to the exclusions list under <strong>Settings \u2192 Exclusions<\/strong> \u2014 this prevents session-sensitive pages from being cached. Product pages cache and serve correctly for anonymous visitors; Add to Cart functions normally via WooCommerce's AJAX handling. Stock level display may lag until pages regenerate.<\/p><\/dd>\n<dt id=\"does%20it%20support%20wordpress%20multisite%3F\"><h3>Does it support WordPress Multisite?<\/h3><\/dt>\n<dd><p>No. Multisite support is available in Cyclone Static Pro, distributed from kryptonmediagroup.com\/cyclone-static.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.38<\/h4>\n\n<ul>\n<li>Fixed: Regenerating an already-cached page was a silent no-op \u2014 the generator's loopback HTTP request was served the existing static file by Apache instead of fresh PHP output, so the cache was overwritten with its own stale content. The .htaccess rules now pass generator requests (identified by the X-Cyclone-Internal header) through to PHP.<\/li>\n<li>Fixed: When a loopback URL is configured, the Host header is now included in the fetch request so Apache can route to the correct virtual host on multi-site servers.<\/li>\n<\/ul>\n\n<h4>1.1.37<\/h4>\n\n<ul>\n<li>Fixed: Changing Settings \u2192 Reading (front page type, front page, or posts page assignments) no longer requires a manual full-site regeneration \u2014 those option changes now trigger automatic full regeneration the same way widget and menu changes do.<\/li>\n<\/ul>\n\n<h4>1.1.36<\/h4>\n\n<ul>\n<li>Fixed: On sites with a static front page and a separate Posts Page (Settings \u2192 Reading \u2192 \"A static page\"), publishing, unpublishing, or deleting a post did not queue the Posts Page for regeneration. Only the home page (\/) was re-queued, leaving the Posts Page with stale content until the next full-site regeneration. The posts page is now detected automatically and queued alongside the home page whenever post content changes.<\/li>\n<\/ul>\n\n<h4>1.1.35<\/h4>\n\n<ul>\n<li>Fixed: All cache-serving RewriteRules and the anti-recursion guard now use the <code>[END]<\/code> flag instead of <code>[L]<\/code>. The <code>[L]<\/code> flag ends the current rewrite pass but restarts the engine with the new URL, allowing the WordPress block to match the internal cache-file path and enter a redirect loop. <code>[END]<\/code> terminates all rewrite processing unconditionally, preventing the loop entirely. Sites with high traffic could accumulate tens of thousands of AH00124 errors per day in the Apache error log.<\/li>\n<\/ul>\n\n<h4>1.1.34<\/h4>\n\n<ul>\n<li>Fixed: mod_rewrite recursion loop on hosting configurations where the cache directory path does not fall under wp-content \u2014 root .htaccess now adds an explicit early pass-through rule for the cache path as a belt-and-suspenders guard against any recursion scenario.<\/li>\n<li>Fixed: No Cache-Control headers were emitted for cached pages, leaving CDN cache TTLs undefined. Compressed variants (Brotli\/gzip) now receive <code>public, max-age=31536000, immutable<\/code>; the plain-HTML fallback receives <code>public, max-age=3600<\/code>. Existing users: purge your CDN cache after upgrading.<\/li>\n<\/ul>\n\n<h4>1.1.33<\/h4>\n\n<ul>\n<li>Fixed: On hosts with mod_brotli enabled globally, pre-compressed cached pages were re-compressed on top of the existing gzip encoding when the client sent <code>Accept-Encoding: br<\/code>, producing a corrupted body that browsers reject with ERR_CONTENT_DECODING_FAILED (blank pages or raw compressed bytes rendered as text). The cache directory's .htaccess now declares Content-Encoding via <code>AddEncoding<\/code> in mod_mime's type_checker phase, which runs before the output filter chain so mod_brotli correctly detects the encoding and skips re-compression. Upgrading installs are migrated automatically on the next request. Remember to purge any CDN cache in front of the site after the upgrade \u2014 edge caches may have pinned the bad responses.<\/li>\n<\/ul>\n\n<h4>1.1.32<\/h4>\n\n<ul>\n<li>Fixed: Mobile browsers (notably Chrome on Android) served cached pages as a \"download.tgz\" archive instead of rendering them as HTML. Root cause was mod_mime's type_checker overriding the RewriteRule's T=text\/html based on the .gz \/ .br file extension; the cache directory's .htaccess now uses ForceType and per-file Content-Encoding headers scoped by FilesMatch, which survive internal subrequests reliably. Upgrading installs are migrated automatically on the next request.<\/li>\n<\/ul>\n\n<h4>1.1.31<\/h4>\n\n<ul>\n<li>Fixed: Pre-compressed .gz and .br cache files failed to serve on Apache configurations whose default authz policy denies access under wp-content \u2014 the cache directory's .htaccess now grants access explicitly instead of relying on a blanket \"Require all denied\" that also blocked internal rewrite subrequests. Upgrading installs are migrated automatically on the next request.<\/li>\n<\/ul>\n\n<h4>1.1.30<\/h4>\n\n<ul>\n<li>Added: Admin notice for users upgrading from v1.1.28 or earlier \u2014 detects the old cache directory (wp-content\/cyclone-static) left behind by the cache location change and offers a one-click delete or dismiss<\/li>\n<\/ul>\n\n<h4>1.1.29<\/h4>\n\n<ul>\n<li>Fixed: Inline <code>&lt;script&gt;<\/code> in deactivation modal moved to wp_add_inline_script() per WP.org coding standards<\/li>\n<li>Fixed: .htaccess path now uses get_home_path() instead of ABSPATH constant directly<\/li>\n<li>Changed: Default cache directory moved to uploads folder (wp-content\/uploads\/cyclone-static) per WP.org guidelines<\/li>\n<li>Changed: Custom cache directory setting now restricted to the uploads directory instead of all of wp-content<\/li>\n<li>Changed: Removed dead code \u2014 unused License methods (is_pro, supports_multisite, get_item_limit, get_key, upgrade_url), unused utility methods (file_exists_for_url, get_cached_count), and write-only CDN credential option keys<\/li>\n<\/ul>\n\n<h4>1.1.28<\/h4>\n\n<ul>\n<li>Added: Deactivation modal \u2014 when deactivating the plugin, a prompt now asks whether to keep or delete cached files; dismissing without choosing defaults to keep<\/li>\n<li>Changed: Uninstall no longer silently deletes the cache directory; files are only removed if the user explicitly chose \"Delete cache files\" at deactivation<\/li>\n<li>Fixed: Settings page fatal error caused by missing PHP closing tag after template variable assignment<\/li>\n<\/ul>\n\n<h4>1.1.27<\/h4>\n\n<ul>\n<li>Changed: Removed all trialware and upgrade-prompt UI; plugin is now fully functional with no feature gates<\/li>\n<li>Changed: Freemius SDK config updated to reflect free-only distribution on WordPress.org<\/li>\n<li>Fixed: Inline <code>&lt;script&gt;<\/code> blocks in settings view moved to wp_add_inline_script() per WP.org coding standards<\/li>\n<li>Fixed: Removed load_plugin_textdomain() call (not needed since WordPress 4.6 for WP.org-hosted plugins)<\/li>\n<li>Added: External Services disclosure in readme.txt for Bunny.net, Cloudflare, KeyCDN, and CloudFront<\/li>\n<\/ul>\n\n<h4>1.1.26<\/h4>\n\n<ul>\n<li>Security: Added missing output escaping on several admin dashboard and pages-list elements (esc_attr on CSS class\/style values; esc_html on human_time_diff output)<\/li>\n<li>Security: Added missing wp_unslash() before sanitize_text_field() on bulk-action POST field<\/li>\n<\/ul>\n\n<h4>1.1.20<\/h4>\n\n<ul>\n<li>Added: Amazon CloudFront CDN support (Pro); WordPress Multisite support (Pro)<\/li>\n<li>Added: Compression status rows in System Info \u2014 shows gzip and Brotli availability and whether cached files are present; includes install instructions if php-brotli is missing<\/li>\n<li>Added: Throttle Delay setting \u2014 configurable pause between page fetches in a batch to prevent cache generation from affecting live visitors<\/li>\n<li>Changed: Default batch size reduced from 20 to 2 for safer out-of-box behaviour on shared\/VPS hosting<\/li>\n<li>Fixed: Plugin update no longer disrupts .htaccess \u2014 hooks into upgrader_process_complete to rewrite rules cleanly after each update<\/li>\n<li>Fixed: First-activation redirect now lands on the correct dashboard page<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Added: Brotli pre-compression \u2014 generates index.html.br alongside index.html.gz when php-brotli extension is available; Apache serves the best variant the browser supports<\/li>\n<li>Added: Comment invalidation \u2014 posting or approving a comment now re-queues the parent post for regeneration<\/li>\n<li>Added: Nginx configuration snippet in Settings \u2014 collapsible panel with a ready-to-paste server block for Nginx users<\/li>\n<li>Fixed: .htaccess header block now correctly sets Content-Encoding and Vary for both Brotli and gzip responses<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Fixed: W3 Total Cache removal guide moved from broken Help tab to a collapsible section on the Settings page<\/li>\n<li>Fixed: Removed dead add_help_tab() calls that were registered too late in the WordPress lifecycle to appear<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Fixed: Widget, sidebar, nav menu, and Customizer changes now trigger a full site regeneration \u2014 previously cached pages retained stale widget output after any widget edit<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Fixed: Dynamic shortcodes settings UI now correctly reflects configuration state<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fixed: .htaccess block now auto-restores if deleted externally (e.g. via Permalinks save)<\/li>\n<li>Fixed: Version stamp check now also verifies block presence, not just version match<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Added: Pre-compressed gzip delivery \u2014 static pages served as .gz files with reduced server CPU overhead<\/li>\n<li>Fixed: E=no-gzip:1 flag prevents mod_deflate double-compressing pre-compressed files<\/li>\n<li>Fixed: RemoveEncoding .gz prevents Apache adding duplicate Content-Encoding from file extension<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fixed: .htaccess restructure \u2014 replaced pass-through RewriteRule [L] patterns with negative RewriteCond conditions, resolving REST API 404 errors that broke post saving, YouTube embeds, and AVIF previews<\/li>\n<li>Fixed: Plugin now auto-rewrites .htaccess rules after in-place upgrades (no deactivate\/reactivate required)<\/li>\n<li>Added: MIME type declarations for AVIF, WebP, and WOFF2<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Serve static HTML files directly from disk \u2014 no PHP, no database queries for anonymous visitors.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=293491"}],"author":[{"embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kryptonmediagroup"}],"wp:attachment":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293491"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293491"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293491"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293491"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293491"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}