Optimazz – Website Optimization and Speedup — full changelog

= 1.0.24 =
* Fixed: the automatic preload (after saving settings, and the scheduled one) only warmed the first 50 addresses, so on bigger sites it covered far fewer pages than a manual preload. It now warms the whole site in short background chunks — each continues where the last stopped, and only one runs at a time — so it never overloads the server or hits the PHP time limit.
* Improved: preloading is much faster — desktop and mobile copies are warmed at the same time, a manual preload warms several pages per step, and the page list is built once per run instead of on every step.
* Improved: the preload explains what it is warming, e.g. "Found 74 pages to warm: 10 pages, 11 posts, 18 products, 12 category and tag pages" — the total includes posts, products and archive pages, not only Pages. Page-builder template libraries (Elementor, Beaver Builder, Divi, Bricks …), WooCommerce cart / checkout / account pages and anything in "Never cache these URLs" are no longer in the list, since visitors never get them from the cache.
* Fixed: the preloader reported pages as "warmed" even when none were saved to the cache (e.g. "Warmed 114 / 121" while Cached pages stayed at 0), with no hint why. It now counts only pages that really reached the cache ("· 98 cached · 16 not cached") — counted per page (desktop and mobile copies of one page count once), so it matches the "Cached pages" card, and when pages are not being cached it stops after a few and explains the exact reason and fix: another caching plugin owns advanced-cache.php, the drop-in or WP_CACHE is missing, a server or CDN cache (LiteSpeed, Cloudflare, Varnish …) answers before WordPress, a plugin sets DONOTCACHEPAGE, pages return an error status, the cache folder is not writable, or your exclusion rules match.
* Fixed: on sites behind a proxy, load balancer or Cloudflare (HTTPS ends at the proxy), cached pages were saved under an http address and never found again for https visitors. The real scheme is now read from X-Forwarded-Proto / CF-Visitor.
* New: if another caching plugin (WP Rocket, Seraphinite Accelerator, LiteSpeed Cache …) controls the cache drop-in while Optimazz page cache is on, a notice now appears on every admin screen — naming the plugin, with one-click "Deactivate it and use Optimazz" and "Use Optimazz for caching" buttons, or "Keep the other plugin" to hide it. Before, the Optimazz page cache silently stayed inactive unless you opened its Cache health panel.
* Improved: conflict detection now also recognises Seraphinite Accelerator, FlyingPress, WP-Optimize and NitroPack, and cache plugins installed under a renamed folder (e.g. a GitHub download).
* Improved: "Cache lifespan" and "Auto-preload" can now be changed right from the Dashboard (a dropdown on each row), and the preload row shows when the next run is due.
* Fixed: scheduled auto-preload often never ran on well-cached sites. WordPress only runs scheduled tasks when it loads, but cached pages are served without loading WordPress, so the preload quietly went overdue. When a preload is due, a cached page view now wakes WordPress's scheduler in the background (after the page has been sent, at most once a minute).
* Fixed: the dashboard showed an overdue preload as "in 3 hours"; it now says "due now", and a new "Last auto-preload" line shows when it last ran and how many pages it warmed (or that a firewall blocked it).
* New: choose how often the automatic preload runs — every hour, twice a day or once a day (Preload settings). Turning page caching off now also clears the preload schedule, and a notice explains when WP-Cron is disabled on the site.
* Fixed: switching a module on or off (or using Undo, Reset, or the post-update refresh) cleared the whole page cache and then left it empty, so the site ran uncached — and slow — until each page happened to get a visitor or the twice-daily preload ran. The cache is now rebuilt automatically straight after (when page cache and preloading are on).
* Fixed: switching Optimazz page caching off, or deactivating Optimazz, turned off WP_CACHE even when another caching plugin (e.g. WP Rocket) owned the cache drop-in, which silently disabled that plugin's page cache. WP_CACHE is now only turned off when the drop-in was Optimazz's own.
* Fixed: cache preloading stopped with a 403 error when a firewall such as the 6G/7G rules in All-In-One Security was enabled. The preloader identified itself as "Optimazz-Preloader", and these firewalls block any visitor whose user-agent contains the word "loader". It now identifies as "Optimazz-CacheWarmer" in the standard crawler format, which those rules allow. The user-agent can be changed with the new `optimazz_preload_user_agent` filter.

= 1.0.23 =
* Fixed: with WebP/AVIF serving on, some images (often the site logo) showed as broken on HTTPS sites whose content still used old http:// image addresses. Browsers upgrade a plain http:// image to https:// automatically, but block an http:// image inside a <picture> source — and never fall back. Next-gen image sources now always use https:// on HTTPS pages.
* Fixed: in responsive images, a size without a WebP/AVIF copy could be offered to the browser and show as broken; only sizes whose next-gen file exists are now listed.
* Fixed: tidier image markup — no attributes added after a self-closing slash, and no duplicate decoding/fetchpriority attributes.
* New: Google Fonts optimization (Fonts module). Page builders such as Elementor load every Google Font family as a separate request, each with every weight from 100 to 900 plus italics. Optimazz now merges them into a single request and loads only the weights and styles your pages actually use (weights 400 and 700 are always kept). On a typical Elementor site this turns three render-blocking requests into one and cuts the font CSS by more than half (measured: 170 KB down to 64 KB). Both options are on by default and can be switched off in the Fonts settings; requests that subset by text are never changed.
* Improved: the build tooling (`package.json`) ships with the plugin again, so the admin interface can be rebuilt from the included source as described under "Build process and source code".
* Fixed: with the CDN module on, CSS minify/combine, WebP delivery and missing-image-dimension fixes were silently skipped, because the CDN rewrite ran before the other optimizations and they could no longer recognise your own files. The CDN rewrite now runs last, on the finished page.
* Improved: when the update safety check switches Safe Mode on to protect a site, it now keeps re-checking and switches Safe Mode back off by itself as soon as pages load correctly again, restoring full optimization (CSS combine, async CSS and JavaScript delay). Previously Safe Mode stayed on until someone turned it off manually, so a site could quietly run slower for a long time after a temporary problem. If pages break again within a day of being restored, Safe Mode stays on and the admin decides. Safe Mode that you switch on yourself is never changed automatically.
* Fixed: the update safety check now also recognises stylesheets served from your CDN hostname (when the CDN module is on), so a page that loads unstyled through the CDN is detected instead of being reported as healthy.
* Fixed: the "Optimazz Safe Mode is on" notice no longer lingers after Safe Mode was switched off via Undo last change, Reset or Import.
* Fixed: uninstalling Optimazz now removes all of its data, including the version marker, the safety-check state and its scheduled check, and the cached font-weight data.

= 1.0.22 =
* Fixed: on some hosts (certain LiteSpeed/WAF setups and managed hosts) pages loaded unstyled because the server does not serve — or routinely deletes — files under `wp-content/cache/`, which is where Optimazz kept its generated CSS. Since the page HTML references those files by name, a page that could not load them rendered without styling. Optimazz now stores generated CSS under `wp-content/uploads/optimazz/` instead — the standard, always-served, persistent location page builders also use — so the stylesheets load reliably and are never wiped out from under a cached page. On update the page cache is refreshed automatically so pages pick up the new location with no manual step.
* New: update safety guard. Shortly after the plugin updates, Optimazz quietly checks its own front page to confirm the optimized CSS actually loads. If it finds pages rendering unstyled — their generated stylesheets returning 404, usually because an external server or CDN cache is still serving old pages — it automatically switches on Safe Mode to keep the site working (pausing the risky CSS/JS transforms without changing your saved settings, so pages fall back to their original stylesheets) and shows an admin notice explaining what happened. After you clear your server/CDN cache and switch Safe Mode off from Tools, Optimazz re-checks and re-protects the site if anything is still broken — so an update can no longer leave a site visibly broken.

= 1.0.21 =
* Fixed: after updating, a site whose page cache was already populated could keep serving pages that loaded unstyled, until the cache was purged by hand. A plugin update never clears the page cache, so any HTML cached by an earlier version — still pointing at combined CSS/JS files that an older purge had removed — stayed in place and rendered without styling. Optimazz now clears the page cache automatically once, the first time it runs after an update, and re-aligns its caching drop-in; the generated CSS/JS assets are kept, so pages come back fully styled on the next visit with no manual purge needed. This completes the 1.0.20 fix for existing installs.

= 1.0.20 =
* Fixed: pages could intermittently load completely unstyled when CSS minify/combine was on together with page caching (or a server-level cache such as LiteSpeed). Optimazz names each generated CSS/JS file by a content hash and embeds those filenames in the cached HTML — but purging the page cache also deleted those generated files, so any HTML still held in a cache (Optimazz's own, a CDN's, or the server's) pointed at stylesheets that had been removed, returning 404 and rendering the page without styling until they regenerated. Purging the page cache now preserves the hashed CSS/JS assets (they are self-invalidating — a source change produces a new filename), keeping the HTML and its stylesheets consistent.

= 1.0.19 =
* Fixed: page caching could silently stop working after a plugin update or a manual re-upload, making the whole site slow (every request fell back to full PHP). The advanced-cache.php drop-in embeds the path to the cache engine, and if the plugin folder was moved or recreated by the update, that path went stale — but Optimazz still recognised the drop-in as its own and never repaired it. Optimazz now detects a stale drop-in and rewrites it with the correct path automatically, and the drop-in itself falls back to the standard plugin location so caching keeps working immediately. If you were affected, the cache heals itself on the first page view after updating.
* Improved: the per-request cache readiness check no longer spins up the WordPress filesystem API just to read its own drop-in, removing needless overhead on every uncached request.

= 1.0.18 =
* New: **Safe Mode** (Tools screen). If a theme or page builder looks broken after you enable optimization, one toggle pauses just the riskiest transforms — combine CSS, async CSS, remove-block-CSS and JavaScript delay — while keeping page cache, minify, defer and lazy-load running. It changes nothing in your saved settings; those optimizations simply pause until you switch Safe Mode off, so recovery is instant and reversible. Filterable via `optimazz_safe_mode` so a host can force it on during an incident.
* New: **Undo last change** (Tools screen). Optimazz now keeps a one-step backup of your settings taken before every save, reset or Safe Mode toggle, so a single click restores the previous state — and undo is itself reversible (press it again to redo).

= 1.0.17 =
* Fixed: enabling CSS minify or combine no longer risks breaking an Elementor header, footer or page layout. Elementor writes its Theme Builder and per-page CSS to generated files under `wp-content/uploads/elementor/css/` and rewrites them whenever you edit content; Optimazz now leaves those generated files byte-for-byte untouched by default (the same approach used by other major cache plugins), so the layout can never be affected by CSS optimization. Elementor's own static library CSS is still optimized. Adjustable via the `optimazz_css_default_exclusions` filter.
* New: after you activate Optimazz it takes you straight to its settings page, so you can start configuring right away. This only happens the first time and is skipped when activating several plugins at once.
* Improved: page-builder compatibility is now handled by one central registry covering Elementor, Divi, Bricks, Beaver Builder, Oxygen, WPBakery and Swiper-based feed/gallery widgets. Their generated CSS is never minified/combined and their layout/carousel scripts are never delayed, so CSS and JS optimization stay safe on builder sites out of the box. Extendable via the `optimazz_compat_profiles` filter.
* Improved: the Server Requirements panel now detects GD/Imagick more reliably (with functional fallbacks) and, whenever an image library shows as "Not enabled", explains the usual cause — it was enabled for a different PHP version or handler than the one running your site — and shows the exact PHP version and php.ini path so you can fix it in your hosting panel.
* Fixed: an optional image library that isn't installed (for example Imagick when GD is already handling everything) is now shown as a neutral "Not installed (optional)" with a muted marker, instead of a green tick next to the words "Not enabled" — no more mixed signal suggesting something is wrong when it isn't.

= 1.0.15 =
* Fixed: the "Instagram Widget by WPZOOM" feed no longer collapses into a broken vertical stack when JavaScript delay is on. Its carousel is built by Swiper on page load, so its scripts are now never delayed (added to the built-in never-delay list). Any other Swiper/carousel widget can be protected the same way by adding a keyword to the JavaScript exclusion list.
* New: a "Recommendations" panel on the Dashboard shows what to optimize next, ranked by impact — for example "Enable Page Cache", "Delay JavaScript to cut Total Blocking Time", or "Set fonts to Optional to reduce layout shift". Most items have a one-click **Fix it** button that applies the setting for you, and the list updates as you go. It reads only your own settings, server capabilities and cache state — no external service, no PageSpeed API, no data leaves your site.

= 1.0.14 =
* Fixed: enabling CSS optimization no longer makes a theme's accessibility "skip links" (e.g. "Skip to content") flash into the header on page load. Some themes hide these off-screen with a CSS transition; Optimazz now suppresses that transition on the common skip-link / screen-reader classes so they stay hidden (and still appear instantly on keyboard focus). Filterable via `optimazz_skiplink_guard_css`.
* Fixed: bulk image compression / conversion no longer stops with a "critical error" on large libraries. A single image the host cannot process (usually a very large one that would exhaust memory) is now skipped cleanly, the job only stops after many consecutive failures instead of a handful spread across the run, and the maximum image size that is attempted now scales to the server's memory limit so it is skipped before it can crash the request.
* New: Font loading mode (Fonts module) — choose **Optional**, **Swap** or **Block** for `font-display`. **Optional** eliminates the layout shift caused when a web font swaps in over the fallback (a major source of a high CLS score); it is forced onto Google Fonts URLs even when the theme hard-coded `display=swap`.
* Improved: images and iframes now reserve their space with `aspect-ratio` so they no longer push content down as they load. This attacks Cumulative Layout Shift (CLS) directly and works even on themes that force `height:auto`. It is applied only when the dimensions are known and never overrides an explicit CSS height.
* Fixed: the settings dropdowns (select controls) now render with the proper bordered box and a single arrow, matching the rest of the interface.

= 1.0.13 =
* New: a "Server Requirements" panel on the Tools screen shows what your host supports — PHP and WordPress versions, the image library (GD/Imagick), WebP and AVIF support, memory limit, execution time and WP-Cron — with clear warnings that explain why a feature may be unavailable or slow (for example, why WebP/AVIF cannot be generated on a given server).
* Fixed: WebP/AVIF conversion could stop with "There has been a critical error on this website" on a large image. AVIF encoding in particular can exhaust memory or the execution time limit — an unrecoverable fatal that cannot be caught. Very large images are now skipped before encoding (a configurable megapixel ceiling that applies on both the GD and Imagick engines and even on hosts that report no memory limit), and AVIF is processed in smaller batches, so the job completes instead of crashing.
* Improved: bulk media jobs now survive a single failed batch. If one image makes a request time out, the job skips that item and continues to the end instead of stopping with "The response is not a valid JSON response".

= 1.0.12 =
* Fixed: the "Cached pages" counter on the Dashboard counted the internal empty index.html protection files as pages, so it showed the wrong number (and 0 KB pages). It now counts only real cached pages.
* Improved: the cache preloader is now firewall-friendly. It paces its requests, identifies itself with a clear user-agent, and — most importantly — stops immediately if the server or a security plugin/firewall responds with 403, 429 or 503, instead of continuing to send requests. This prevents the warmer from tripping a rate-limiter or web-application firewall, and the admin shows a clear message if warming was blocked. A new `optimazz_preload_delay_ms` filter tunes the pause between requests.

= 1.0.11 =
* Fixed: bulk image compression and WebP/AVIF conversion could stop with "There has been a critical error on this website" when the image library hit a single file it could not process (a corrupt image, or a PHP 8 error from GD/Imagick). Each image is now processed defensively — a problematic file is skipped and the batch continues to the end, and the progress panel reports how many were skipped. Oversized images are also checked for both the GD and Imagick engines to avoid running out of memory.
* Improved: better cache preloading. Warming now follows the whole site like a sitemap — home, static front and posts pages, every public post type (pages, posts and custom types), then the busiest category and tag archives — most-important first, instead of only pages and posts, so more of the site is served warm from cache. The live progress now shows an estimated time remaining. New `optimazz_preload_max` filter caps how many URLs are warmed.

= 1.0.10 =
* New: "Remove unused CSS" — opt-in options under File Optimization → CSS. "Remove block-editor CSS on the front end" dequeues WordPress block-library and global styles (a large saving on classic or page-builder sites that do not render Gutenberg blocks on the front end), "Load WooCommerce CSS only on shop pages" stops WooCommerce stylesheets loading on pages that do not need them (kept on cart, checkout, account, product and shop), and "Load Easy Digital Downloads CSS only on EDD pages" does the same for EDD (kept on checkout, purchase confirmation, purchase history and download archives). Both cut render-blocking CSS and improve First Contentful Paint, especially on mobile. They remove whole known-unused stylesheets and never guess at individual rules, so they are safe and reversible. Developers can scope any other plugin's stylesheets with the new `optimazz_plugin_css_scopes` filter.
* Improved: refreshed the admin sidebar with a cleaner, consistent icon set.
* Fixed: the admin screen no longer flickers while scrolling (the fixed action bar was repainting a blurred backdrop on every scroll frame), and the plugin version now sits neatly below the menu instead of leaving an empty gap at the bottom.

= 1.0.9 =
* Fixed: the admin app (the React dashboard) can now be translated. It previously stayed in English even when the WordPress menu translated, because the plugin was not telling WordPress where the JavaScript translations live. It now calls wp_set_script_translations, so translated strings load in the dashboard (delivered automatically for translations on WordPress.org).
* Fixed: deferring JavaScript no longer causes "jQuery is not defined" or "wp is not defined" errors that broke some layouts. jQuery, jQuery Migrate and WordPress core scripts are now always kept immediate (never deferred), because inline scripts on the page expect them to already exist; every other script is still deferred, so the performance benefit is preserved.
* Improved: the action buttons (Clear & Preload, Preload, Purge cache and others) now have clearer, more responsive feedback — hover lift, press animation, a subtle busy indicator, an icon spin on Purge, and visible keyboard focus.
* New: "Take over caching". When the Cache health check finds that another caching plugin's `advanced-cache.php` is blocking Optimazz — so pages are not actually cached and the site can feel slower — a one-click button now makes Optimazz the caching drop-in and enables `WP_CACHE`, so caching finally engages. The conflicting plugin is named where possible, and when `wp-config.php` is not writable the exact `WP_CACHE` line to add is shown. If that plugin is still active afterwards (it could reclaim the cache), Optimazz now warns and offers a one-click button to deactivate it.

= 1.0.8 =
* Fixed: the main hero image (the Largest Contentful Paint element) is no longer lazy-loaded. Previously the biggest above-the-fold image could be given `loading="lazy"` and deprioritised, which made LCP *slower* after activating the plugin — most noticeably on mobile. The hero image is now always loaded eagerly at high priority (and preloaded), while below-the-fold images still lazy-load as before. This is the most important fix for "my site got slower after installing."
* New: common third-party scripts — Google Tag Manager and Analytics, Facebook and TikTok pixels, Hotjar, Microsoft Clarity, chat widgets and similar — are now delayed until the first interaction by default when JavaScript delay is on. They do not affect what the visitor sees, so delaying them cuts mobile Total Blocking Time and improves responsiveness (a major mobile win), while jQuery, your theme, page builders and payment scripts are always kept immediate.
* New: a "Cache health" check on the Page Cache screen. One click tells you whether pages are actually being served from cache (HIT) or rebuilt on every request (MISS), and flags the usual reasons caching fails to engage — another caching plugin owns `advanced-cache.php`, the drop-in is missing, `WP_CACHE` is not enabled, or `wp-config.php` is not writable. If a site felt *slower* after enabling optimizations, this shows why.
* New: the Dashboard now shows a clear notice when file or media optimizations are enabled but Page Cache is off, with a one-click button to turn caching on. Running optimizations without caching rebuilds every page on each request and can make a site feel slower — this points users to the fix.
* Fixed: the translation template (`languages/optimazz.pot`) was empty. It is now generated with WP-CLI's `i18n make-pot` and contains every translatable string from the plugin (PHP and the React admin), so the plugin can be fully translated.

= 1.0.7 =
* New: the Page Cache screen now has a "Browser cache headers" control that adds Expires / Cache-Control rules (on Apache and LiteSpeed) so repeat visits load CSS, JavaScript, images and fonts straight from the browser cache, plus a "Cache lifetime" setting for how long cached pages are kept before they are refreshed.
* Fixed: bulk WebP/AVIF conversion (and image compression) could stop partway with "The response is not a valid JSON response" on low-memory hosts — the batch ran out of memory converting large images and the request died. The batch size now adapts to the host's PHP memory limit (one image at a time on 128 MB hosts), oversized images that would exhaust memory are skipped rather than crashing the job, and WordPress's image memory limit is raised where the host allows it. Large image libraries now convert reliably in small, safe steps.
* Fixed: "Clear & Preload" and "Preload" could stop partway with the error "The response is not a valid JSON response" on larger page-builder or WooCommerce sites. The preloader now warms one page per request, so each call stays well within the server's time limit and the progress bar advances smoothly to the end.
* Fixed: the LCP image preload no longer targets the site logo. It now picks a genuine above-the-fold hero image, preloads it responsively (matching the image's own srcset/sizes so the correctly sized file is fetched instead of the full-size original), preloads only a single image, and skips the preload when the image is served as WebP/AVIF — avoiding a duplicate download. This resolves a possible speed regression seen on some sites after 1.0.5.

= 1.0.6 =
* Fixed: enabling "Combine CSS" no longer breaks the layout of mega-menus and page-builder sections. Stylesheets are now merged only in contiguous, same-media groups and kept in their original position, so a later stylesheet can still override an earlier one (the cascade is preserved instead of being hoisted to the top).
* Improved: the Database "Optimize now" action now shows the same progress panel as the other tools, with an animated bar while cleanup runs.

= 1.0.5 =
* Improved: "Clear & Preload" and "Preload" now show live progress — the cached-page count climbs in small batches as pages warm, with a progress panel, and the job resumes if you reload the page.
* Fixed: WooCommerce cart, checkout and account pages are now never cached and never have their CSS/JS optimized, regardless of page slug or language. This prevents broken checkouts on the default settings. Payment scripts (Stripe, PayPal, and others) are also never delayed.
* Fixed: delaying JavaScript no longer postpones the visible page. jQuery, your theme and Elementor scripts are now always kept immediate (even with "Delay all" on), so First and Largest Contentful Paint are not slowed on JavaScript-rendered sites. The fallback timer was also shortened.
* New: JavaScript minification for inline scripts. It strips comments and whitespace while keeping line breaks, so it is safe against automatic-semicolon-insertion issues; strings, template literals and regular expressions are preserved.
* New: the LCP (largest contentful paint) image is now preloaded by default when the Media module is enabled, for a faster mobile load.
* New: the above-the-fold hero background image (used by page builders such as Elementor) is now detected and preloaded, and is never lazy-loaded, improving LCP on builder-based sites.
* New: a Critical CSS field. Paste your above-the-fold CSS and enable "Load CSS asynchronously" to remove render-blocking CSS without a flash of unstyled content.
* Fixed: with asynchronous CSS enabled, critical CSS was only inlined when "Combine CSS" was also on. It is now inlined in all cases, so async CSS no longer causes a flash of unstyled content.
* Improved: the asynchronous-CSS and "Delay all scripts" options are now clearly labelled and warn about their effects.
* Improved: settings with a small set of choices (cleanup frequency, Heartbeat behaviour, eager-image count) now use clean one-click button groups instead of dropdowns.

= 1.0.4 =
* Fixed: bulk image optimization could hit a fatal out-of-memory error on very large images, stopping the whole job. Oversized images are now skipped safely.
* Fixed: a rare image-resize failure could trigger a fatal error on PHP 8. The resize now falls back gracefully.
* New: JavaScript defer and delay now have separate exclusion lists, so a script can be excluded from one without losing the other. Added "Never defer", "Never delay" and "Never optimize" fields, each with guidance and examples.
* Fixed: the "Delay these scripts" list is now shown in the admin (it was previously not reachable in the interface).
* Improved: cleaner, self-explanatory exclusion fields, and removed an empty "No items found" suggestion box that appeared on keyword inputs.
* Improved: the admin footer no longer overlaps the plugin's own footer on the Optimazz screen.

= 1.0.3 =
* Fixed: generated CSS files returned 403 on Apache/LiteSpeed servers, leaving pages unstyled. The cache directory now denies only its private files and allows the generated assets.
* Fixed: editing a post now also clears its category, tag, author and date archives, the blog page and the feed. Previously only the post and home page were cleared, so archives could serve outdated content indefinitely.
* Fixed: a new comment no longer clears the entire site cache — only the page it was posted on. Comment edits, approvals and deletions clear that page too.
* Fixed: stylesheets are rewritten in place instead of being moved, preserving the cascade order of interleaved inline styles.
* Fixed: the CSS minifier no longer collapses a descendant combinator before a pseudo-class (".card :is(h1,h2)" kept intact), and no longer strips comment-like text inside CSS strings.
* Fixed: a failed CSS combine no longer drops the stylesheets from the page.
* Fixed: changing an optimization setting now purges the page cache, so stale markup is not served.
* Fixed: per-user cache keys are derived from the full session cookie, preventing a forged cookie from reaching another user's cached page.
* Fixed: Dashboard "File Optimization" now shows as on when either JavaScript or CSS is enabled.
* Fixed: the page cache no longer stores wp-admin, login, cron or XML-RPC requests.
* Added fail-safe guards so a PCRE limit on very large pages can never blank the output.

= 1.0.1 =
* Subdirectory-install-safe URL-to-path mapping for CSS/media optimization.
* Simplified the WP_CACHE handling in wp-config.php to a single WP_Filesystem edit.
* Included the React admin source (src/) and documented the build steps.

= 1.0.0 =
* Initial release: page cache + preloader, JavaScript defer/delay, CSS minify/combine/async, image optimization (lazy-load, dimensions, WebP/AVIF, bulk compression, PNG→JPEG, YouTube facade), fonts, database cleanup, heartbeat control, tweaks, and CDN — with a React admin dashboard.

