=== DadsFam Cache ===
Contributors: dadsfam
Tags: cache, caching, performance, page cache, woocommerce
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 1.9.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Make your WordPress and WooCommerce site lekker fast — friendly page caching, no rocket science required.

== Description ==

DadsFam Cache is a straightforward, no-nonsense performance plugin. It saves ready-made copies of your pages so repeat visitors skip PHP and the database entirely, and it ships with a one-click setup that applies safe, sensible defaults for you.

It was built to be understandable by normal humans — every setting is written in plain English with a short explanation of what it actually does.

= What you get, free =

* Disk-based full-page caching (serves cached pages before WordPress even boots)
* Gzip pre-compression of cached pages, plus Brotli where your server supports it (15–20% smaller again)
* Serve-stale-while-refreshing: an expired page is handed to the visitor instantly and rebuilt in the background, so nobody ever waits for a cache expiry
* Bloat removal: drop the emoji script, embed discovery, jQuery Migrate, Dashicons and the leftover head tags — each with a plain note on when to leave it alone
* Browser-cache and compression rules for Apache/LiteSpeed (.htaccess), with a copy-paste NGINX snippet
* Smart automatic clearing — edit a post and only the affected pages clear
* Clears the cache automatically after plugin, theme or WordPress updates
* Sensible exclusions out of the box (cart, checkout, my-account, logged-in users)
* Ignores tracking parameters (utm_*, fbclid, gclid…) so shared links still hit cache
* Optional separate cache for mobile
* Cache preloading from your sitemap
* A dashboard that answers one question first — is my site actually being served fast? — in a sentence, with a dial showing how much of your site is saved and ready
* It measures the difference and shows you: your home page loaded twice, once built from scratch and once from cache, reported in milliseconds
* A setup track with a "fix it" button next to anything still outstanding, and a line explaining why each step matters
* A Support tab with plain-English fixes for the things people actually write in about, and a one-line summary of your setup to paste into a support message
* Runs from an AI assistant on WordPress 6.9+ — see below
* Built-in cache test, stats and a copy-ready debug panel
* Settings export/import

The free plugin never phones home. There is no licensing code in it at all.

= Want more? =

**DadsFam Cache Pro** is a separate add-on plugin that installs alongside this one and adds its tabs to this same settings screen: minification, critical CSS, LCP and font optimisation, defer/delay JavaScript, lazy-loading, WebP conversion, CDN rewriting, database cleanup, Heartbeat control and auto-preload. Grab it from https://www.dadsfam.co.za/shop/

= For developers =

This plugin is built to be extended. The add-on API:

**Filters**

* `dadsfam_cache_is_pro` — answer true to unlock Pro-flagged fields
* `dadsfam_cache_has_addon` — answer true if an add-on is present
* `dadsfam_cache_page_html` ( $html, $context ) — transform a page before it is cached
* `dadsfam_cache_settings_defaults` ( $defaults ) — register extra settings
* `dadsfam_cache_sanitize_settings` ( $clean, $raw ) — sanitize them on save
* `dadsfam_cache_admin_tabs` ( $tabs ) — register settings panels
* `dadsfam_cache_ajax_tasks` ( $tasks ) — register AJAX handlers (cap + nonce checked for you)
* `dadsfam_cache_admin_localize` ( $data ) — add data for the admin JS
* `dadsfam_cache_htaccess_rules_before` / `dadsfam_cache_htaccess_rules` / `dadsfam_cache_nginx_snippet`
* `dadsfam_cache_speed_setup` ( array( $settings, $notes ) ) — contribute to One-Click Speed Setup
* `dadsfam_cache_cache_this_request` ( bool ) — veto caching for the current request
* `dadsfam_cache_purge_post_paths` ( $paths, $post_id ) — extra paths to clear
* `dadsfam_cache_preload_urls` ( $urls ), `dadsfam_cache_auto_preload` ( bool )
* `dadsfam_cache_footer_comment` ( $comment ) — return '' to leave cached pages unmarked
* `dadsfam_cache_debug_info` ( $rows ) — add rows to the support panel

**Actions**

* `dadsfam_cache_loaded` ( $version ) — the plugin is wired and safe to extend
* `dadsfam_cache_purged_all`, `dadsfam_cache_purged_everything`, `dadsfam_cache_purged_post` ( $post_id, $paths )
* `dadsfam_cache_settings_saved` ( $settings ), `dadsfam_cache_deactivated`
* `dadsfam_cache_preload_settings` — print extra fields on the Preload tab

Add-ons should boot on `plugins_loaded` at priority 20 or later. WordPress sorts active plugins alphabetically, so an add-on's file may well be *included* before this one's — never touch a `DadsFam_Cache_` class at include time.

Also useful: add `data-no-optimize` to any script or stylesheet tag to have Pro leave it alone, `data-no-lazy` on an image to keep it eager, and `define( 'DONOTCACHEPAGE', true );` to skip caching a request.

= Works with AI assistants =

If you are on WordPress 6.9 or later and have an MCP plugin connected, this plugin tells your assistant what it can do. You can ask things like "is caching actually working on my site?", "why is my change not showing up?", "how much faster is the cached version?" or "stop caching the members page", and it will read the real state of your site and act on it.

Every action needs the same permission as the settings screen, so an assistant can never do more than you could. Reading is separated from changing, anything that edits a file or slows the site says so first, and removing the caching engine is not offered at all.

= A word about PRO =

Right, let me be straight with you, because I hate being sold to as much as you do.

Everything above is free and it stays free. Caching your pages to disk, gzip, browser-cache rules, clearing the cache automatically when you change something, preloading and the one-click setup — none of those are premium features. Those are the things a cache plugin should just do, and if I put them behind a paywall I would be taking the mickey.

There is a PRO add-on. It exists because I am a dad in Cape Town, and this is one of the things that puts food on the table at my house. That is the honest reason. Not "unlock your potential", not "supercharge your workflow". Just: if this plugin made your site quicker and you can spare it, PRO helps me keep building.

There is one PRO version and one price: R500 once off, roughly $35, per plugin. It is not a subscription, there is no yearly renewal, and it does not expire. Pay once and it stays yours, updates included. If the free version does everything you need, use that and think nothing of it — it is not crippled to push you across, and it never will be.

What PRO adds is the heavier optimisation you reach for once the basics are in place — shrinking and combining your CSS and JavaScript, holding non-critical scripts back until they are needed, lazy-loading images, serving WebP, pushing static files to a CDN, and tidying up your database. That is extra speed and convenience. It is not the plugin working properly, because the plugin already works properly.

So if the free one does everything you need, brilliant. Genuinely. Use it, and I hope it takes a load off your server and your visitors' patience. If you get to the point where squeezing out the last few points would help, PRO is at plugins.dadsfam.co.za.

Either way, thanks for using something I built. — Zak, DadsFam

PRO adds:

- Minification of CSS, JavaScript and HTML
- Critical CSS, LCP and font optimisation
- Defer and delay JavaScript until it is needed
- Lazy-loading for images and iframes
- WebP image conversion
- CDN rewriting
- Database cleanup and Heartbeat control
- Automatic preloading after a purge

== Installation ==

1. Upload the plugin zip via Plugins → Add New → Upload Plugin, then activate it.
2. If you already run another caching plugin, deactivate that one first — two cache plugins on one site causes conflicts. DadsFam Cache will warn you if it spots one.
3. Go to **DF Cache** in the admin menu and click **One-Click Speed Setup**.
4. (Optional) For Pro features, install the separate DadsFam Cache Pro plugin alongside this one and enter your key on the License tab.

== External services ==

DadsFam Cache does not connect to any outside service, and nothing about your site or your visitors is sent anywhere.

It does make requests to your own website — and only to your own website:

* **Preloading** reads your own sitemap and visits your own pages, so a saved copy is ready before the first visitor arrives. Addresses that are not on your site are ignored, even if a sitemap lists them.
* **The Dashboard speed test**, when you press it, loads your own home page twice to measure the difference the cache makes.
* **Serve stale while refreshing** (off unless you switch it on) asks your own server to rebuild an expired page in the background.

== Frequently Asked Questions ==

= Will it work on NGINX? =
Yes. The page cache works everywhere. Browser-cache rules are added to .htaccess only on Apache/LiteSpeed; on NGINX the plugin gives you a snippet to paste into your server config.

= Does it work with WooCommerce? =
Yes. The cart, checkout and account pages are never cached, anyone holding a cart cookie always gets a live page, and shop/product pages clear automatically when stock changes.

= I was on 1.2.x with a license and my Pro features disappeared. =
From 1.3.0 the Pro features live in a separate add-on plugin, DadsFam Cache Pro. Download it from your account and install it alongside this one. Your license key and every one of your settings are still saved — Pro switches straight back on.

= It says another caching plugin is active. What now? =
Deactivate the other plugin first, then run One-Click Speed Setup. Running two page-cache plugins at once will cause problems.

= Something looks wrong after a Pro feature. =
Turn the relevant feature (minify CSS, defer/delay JS) back off, or add the problem file to its exclusion box. Then clear the cache.

= Does it edit my wp-config.php? =
Yes — it adds `define( 'WP_CACHE', true );`, which WordPress requires for page caching to work at all. The line is marked with our name, written atomically, and removed cleanly when you deactivate.

= Does this plugin contact any external services? =
No third-party services at all. The only HTTP requests it makes go to your own website: it visits your own pages to warm the cache (preloading), and it fetches one of your own URLs twice to run a quick self-test that confirms a page is being served from cache. Nothing is sent off-site, and no data leaves your server.

== Screenshots ==

1. Open it and you know where you stand. One plain sentence tells you whether your site is actually being served fast, a dial shows how much of it is saved and ready to go out instantly, and the measured difference sits underneath — your own home page built by WordPress versus served from cache, in milliseconds.
2. Every setting in plain English. Each switch says what it does and when you would want it, not just what it is called.
3. Exclusions: the pages that must never be saved. Carts, checkouts and logged-in visitors are handled for you already — add anything else that is personal to one visitor.
4. Preloading: warm the cache yourself, so even the first visitor to a page gets a quick one.
5. Tools: export and import your settings, reinstall the caching engine, and copy a debug summary for support.
6. The Support tab: how to reach a real person, a one-line summary of your setup to paste into a message, and plain-English fixes for the four things people actually write in about.
7. The rest of the DadsFam range, the guide sites and hosting, all in one place.

== Changelog ==

= 1.9.1 =
* **Fixed: the Dashboard speed test could compare two saved copies and badly undersell the cache.** It loaded your home page twice and called the first visit "built by WordPress" — but when the page was already saved, as it is straight after preloading, both visits came from the cache, and the test reported something like "1.4× faster" when the real difference is many times that. The build is now timed on an address the cache always steps aside for, so it is a genuine build every time, and the saved copy is timed on its own.

= 1.9.0 =
* **Fixed: saved pages lost the security rules your site sends.** Security plugins and many themes tell browsers things like "never show this site inside someone else's frame" (clickjacking protection), "only ever use https", and — for pages you keep out of Google — "do not index this". The first visitor to a page got those rules; everyone served the saved copy afterwards did not, because the cache stored the page but not the rules that came with it. Saved pages now carry the same security, search-engine and resource-hint headers as freshly built ones. Anything that belongs to one visitor — cookies, cross-site permissions, compression, dates — is never kept, and every stored rule is checked again before it is sent, so a tampered file cannot add one of its own. On by default (Caching tab → "Keep security headers on saved pages").
* **Fixed: behind some proxies and CDNs, nothing was ever served from the cache.** When a proxy passes a secure visit on to your server as plain http, the part of the plugin that saves pages and the part that serves them disagreed about whether the visit was secure — so every page was saved under one name and looked for under another, and never once came from the cache. Both now decide it the same way.
* **Fixed: "serve stale while refreshing" never refreshed on some sites.** The background refresh left the port off the address it asked for, so on a site that is not on the standard web ports WordPress answered with a redirect instead of rebuilding the page, and visitors kept getting the expired copy until it was an hour past its time. It now asks exactly the way the visitor did. It also goes straight to your own server rather than out through any CDN or firewall in front of it, which could block or challenge it, and falls back to the old route if that fails.
* **Fixed: a settings change could take a while to take effect — or never, on some hosts.** The part of the plugin that serves saved pages reads its settings from a small file, and PHP's code cache (OPcache) can keep handing out the previous version of that file for a few seconds after it changes — or indefinitely on hosts that switch off its re-checking. So switching caching off, or telling it to leave a page with personal details alone, could keep being ignored. The plugin now clears the old copy the moment you save, and the engine notices if it was given an out-of-date one and reads the file again.
* **Fixed: switching caching on or off loosened wp-config.php's permissions.** Many hosts lock wp-config.php so that only its owner can read it, because it holds your database password. Every time this plugin added or removed its one WP_CACHE line, the file came back readable by others (0600 became 0644). It now keeps whatever permissions it had.
* **New: the speed test tells you why, not just whether.** If your home page is not coming from the cache, the Dashboard's speed test now names the cause and the fix — another plugin telling WordPress not to cache it, caching switched off, the engine file missing, a page cut short by a PHP error, a rule of yours that matches the home page, and more — instead of "save settings and try again". If a CDN or your host's own cache is answering first, it says so, and that this is fine.
* **New: a What's new tab** in the plugin, so you can see what changed on your site without hunting for the changelog.
* Only a real web page is ever saved as one. A download or data feed that happened to look like a page is now left alone rather than handed to the next visitor as a broken page.
* The cache-lifetime setting now explains why 10 hours is the safe choice: pages carry security codes that WordPress expires after about 12 hours, so a form on an older saved copy can stop working.
* The engine file (advanced-cache.php) is replaced automatically the first time your site loads after updating, and pages saved by the previous version are cleared. Nothing to do.

= 1.8.3 =
* **Fixed: edit your CSS, clear the cache, and still see the old design.** The browser-caching rules marked your stylesheets and scripts `immutable`, which tells a browser never to check for a newer copy — not on a refresh, not on a reload — for a full thirty days. That is only safe when the file name changes with the file, and a WordPress theme stylesheet keeps the same `?ver=` when you edit it, because the version comes from the theme header rather than the file. So a corrected stylesheet could sit invisible behind the copy already in your browser, clearing the cache made no difference, and switching the plugin off appeared to "fix" it — because that removed the rule. `immutable` is gone from CSS and JavaScript. They are still cached for the full thirty days, so nothing is slower; a reload now re-fetches them.
* **Fixed: "Clear cache" now refreshes the copy in your visitors' browsers as well.** It always meant "show everyone the new version", but a browser holds its own copy of your CSS and JS and will not ask for a fresh one until it expires. Clearing the cache now stamps a new revision onto your own stylesheets and scripts, which changes their address — the one thing a browser reliably reacts to. Edit, clear, done.
* Only your own files are stamped. Google Fonts, CDN scripts, payment providers and anything else on another domain are left exactly as they are, and a CDN rewrite in Cache Pro still works because it swaps the host and keeps the address intact.

= 1.8.2 =
* Changed: the PRO note in the description now states the actual arrangement. There are two versions and one price -- R500 once off, roughly $35, per plugin. No subscription, no yearly renewal, no expiry date. Nothing about the free plugin has changed; it was never crippled and still is not.

= 1.8.1 =
* Improved: the cache size and page count on the settings screen no longer re-walk the whole cache folder every time the page is drawn. With Brotli on, every cached page now has three files on disk (the page, its gzip twin and its Brotli twin), so on a busy site that walk had grown by half again — and the abilities that report status paid it too. The figures are now memoised for a minute and cleared the instant anything is purged, so they are never stale; pressing refresh still reads the disk.

= 1.8.0 =
* **New: serve stale while refreshing.** When a cached page passes its lifetime, the visitor now gets the existing copy instantly (marked `X-DadsFam-Cache: STALE`) and the engine asks WordPress to rebuild it in the background — a socket call that takes milliseconds, with a per-page lock so a busy URL fires one rebuild, not one per visitor. A copy is never served more than an hour past its lifetime, so if rebuilds keep failing you get a fresh render rather than an ever-older page. Off by default; One-Click Speed Setup turns it on.
* **New: Brotli.** A `.br` twin is stored next to the `.gz` one on servers with the Brotli extension, and served to browsers that ask for it. Off by default; Speed Setup turns it on only where the server can make the files.
* **New: bloat removal.** Five switches on the new Speed extras tab remove the emoji script, embed discovery and wp-embed.js, jQuery Migrate, Dashicons for visitors, and the RSD / WLW / shortlink / REST / generator head tags. Each says when an old theme might still want it. All off by default; Speed Setup turns on the three that are safe on any site.
* **New: find any setting.** A search box in the settings rail filters every tab at once.
* **Improved: recommended values.** The cache lifetime field carries a "Recommended" chip that fills it in for you, and the save bar lights up the moment something changes so you cannot walk away from an unsaved tab.
* Improved: the diagnose check now reports whether Brotli is on (or unavailable on this server) and whether stale serving is on.
* Engine drop-in updated to 1.3.0 for the above; it is reinstalled automatically on update.

= 1.7.1 =
* Readme only — no code changed. The screenshot captions and the feature list still described the dashboard as it was before 1.6.0, so the listing undersold what you actually get: the plain-English verdict, the coverage dial, the measured speed difference and the Support tab.

= 1.7.0 =
* You can now run this plugin by talking to an AI assistant. It registers sixteen abilities with WordPress (6.9 and up), so an assistant connected to your site — through Claude, ChatGPT or anything else that speaks MCP — can check whether caching is actually working, work out why it is not, measure the speed difference, clear a page or the whole cache, change settings, manage the never-cache list and warm the cache up. No logging in to wp-admin required.
* Every one of those actions needs the same permission as the settings screen, so an assistant can only do what the logged-in user could already do. Read-only actions are marked as such, and anything that writes to a file or slows the site down tells the assistant to check with you first. Removing the caching engine is deliberately not offered.
* On WordPress 6.8 and older nothing is registered and the plugin behaves exactly as before.

= 1.6.0 =
* The dashboard has been rebuilt. It now opens with one plain sentence telling you whether your site is actually being served fast, and a dial showing how much of your site is saved and ready to go out instantly.
* New: it measures the difference and shows you. The speed test now times your own home page twice — once built from scratch, once served from cache — and reports both numbers in milliseconds, so you can see what your visitors get instead of taking my word for it.
* The setup list is now a progress track with a "fix it" button next to anything still outstanding, and each step explains in one line why it matters.
* Quick actions became proper tiles, each saying what it does and when you would want it.

= 1.5.1 =
* The section menu down the left has been rebuilt to match the rest of the screen: a dark rail with a marker showing where you are, and a small panel at the bottom telling you at a glance whether caching is on, how many pages are stored and which version you are running. On a phone or a narrow window it becomes a single row you can swipe.
* Appearance only — no change to caching, settings or your cached files.

= 1.5.0 =
* New Support tab: how to reach a real person, a one-line summary of your setup you can copy straight into a support message, and plain-English answers to the four things people actually write in about — changes not showing up, the site looking broken, carts and checkouts behaving oddly, and how to tell whether caching is doing anything at all. Each answer has a button that takes you to the screen you need.
* The "More from DadsFam" list is now a proper set of cards showing the rest of the range, with links to the guides and to hosting.
* No change to caching behaviour, your settings or your cached files.

= 1.4.1 =
* Hardening: every value read from the incoming request is now filtered before use. In particular the server protocol is checked against a fixed list before it can reach a response header, so a malicious request cannot inject headers of its own.
* The page-capture output buffer is now closed explicitly at shutdown instead of being left for PHP to unwind, which keeps it aligned with buffers opened by other plugins or the theme.
* No change to settings, cached files or behaviour.

= 1.4.0 =
* Housekeeping release, to meet the WordPress.org naming guidelines. Everything the plugin registers inside WordPress — its settings, its scheduled jobs, its hooks and its classes — now carries a full-length `dadsfam_cache` name instead of the old short `dfc` one, so it cannot collide with another plugin or theme on your site.
* Your settings, licence, preload queue and dismissed notices are moved to the new names automatically the first time the updated plugin loads. Nothing is lost, and no cached file is touched — the cache is simply rebuilt fresh. The drop-in and per-host config are refreshed to match.
* Add-on hooks were renamed to match (for example `dfc_settings_saved` is now `dadsfam_cache_settings_saved`), so DadsFam Cache Pro must be updated to 1.4.0 at the same time. If one is updated without the other, Pro simply shows a notice instead of loading — nothing breaks.
* Added a plain-English "A word about PRO" note to the readme — what stays free, why the optional add-on exists, and what it does. No features were moved behind a paywall.
* Housekeeping: the readme now lists the current WordPress and PHP versions it is tested against.

= 1.3.0 =
**The plugin is now free + Pro as two separate plugins.** This one is the free page cache and never phones home. Pro features moved to the DadsFam Cache Pro add-on, which installs alongside it and adds its tabs to the same settings screen. Your settings and license key are untouched by the update — install Pro and everything switches back on exactly as it was.

Fixes and improvements in this release:

* FIXED: cached pages are now served with an explicit `Cache-Control: public, max-age=0, must-revalidate`. Without it browsers guessed a freshness lifetime from Last-Modified, so a returning visitor could sit on a stale page for hours after you cleared the cache.
* FIXED: the drop-in no longer sends a Content-Length when PHP's `zlib.output_compression` is on. PHP rewrites the body in that case, so the length described the wrong thing and browsers truncated the page.
* FIXED: cached pages are served with your site's actual charset instead of a hardcoded UTF-8.
* FIXED: `Vary: User-Agent` is now sent when the separate mobile cache is on. Without it a proxy in front of the site could hand the desktop page to a phone.
* FIXED: browser-cache rules spelled out `max-age` explicitly. The old `Header set Cache-Control "public, immutable"` overwrote the max-age that mod_expires had just set, leaving assets with no freshness lifetime at all — the opposite of what browser caching is for.
* FIXED: `immutable` is no longer applied to images. They carry no `?ver=` cache-buster, so re-uploading a photo under the same filename was invisible to returning visitors for six months.
* FIXED: clearing a single page now works for URLs containing `[`, `]`, `*` or `?`. The old code used glob(), which silently matched nothing for those slugs.
* FIXED: advanced-cache.php is written atomically. A visitor whose request landed mid-write could previously include a half-written file and fatal.
* FIXED: minified assets are garbage-collected after 30 days. They are content-hashed, so nothing ever removed the old ones and the folder grew forever.
* NEW: "Clear All Cache", saving settings, and updates now clear generated assets as well as pages.
* NEW: the generated drop-in config folder is protected from direct HTTP access.
* NEW: a full add-on API (see the developer notes) — tabs, AJAX tasks, settings and the page pipeline are all extension points.
* NEW: `dadsfam_cache_footer_comment` filter, and the signature comment no longer advertises the plugin version.
* NEW: "Rewrite .htaccess rules" button on the Tools tab.
* Site-wide purge hooks now go through an argument-safe wrapper, so a WordPress hook can never pass a stray value into a purge.
* Widget changes now clear the cache.
* Conflict detection covers NitroPack and WP-Optimize, understands multisite network-activated plugins, and no longer flags plugins that do not own advanced-cache.php.

= 1.2.2 =
* FIXED: The admin-bar "Clear all cache" / "Clear this page" links now return you to the exact page you were on. Previously they redirected to the HTTP referer, which broke when purging from action endpoints — e.g. clicking purge from the plugin-upload screen landed on update.php's "Please select a file" error. The link now carries an explicit return URL, and the handler refuses to bounce back to form-target-only endpoints (update.php, admin-post.php, async-upload.php, wp-login.php), falling back to the DF Cache settings page.

= 1.2.1 =
* Security fix: earlier versions saved a wp-config.php backup (wp-config.dfc-backup.php) in the web root when enabling caching, which could expose database credentials. That backup is no longer created, any existing copy is deleted automatically on update, and wp-config.php is now edited with a safe atomic write that needs no backup.

= 1.2.0 =
* New Pro: WebP image conversion, with bulk conversion and auto-conversion of new uploads.
* Added an Images tab with conversion progress, counts and quality control.
* One-Click Speed Setup now enables WebP serving when the server supports it.

= 1.1.0 =
* New Pro: render-blocking CSS elimination, LCP image optimisation, font optimisation and link prefetching.
* One-Click Speed Setup now enables the LCP, font and prefetch optimisations automatically.

= 1.0.0 =
* Initial release: disk page caching, gzip, browser-cache/.htaccess rules, smart purge, exclusions, preloading, stats and cache testing.

== Upgrade Notice ==

= 1.9.1 =
The Dashboard speed test now always times a genuine WordPress build, so its "faster" figure is the real one. Includes everything in 1.9.0.

= 1.9.0 =
Saved pages now keep your security and "noindex" headers, settings changes take effect immediately, sites behind some proxies get cached at all, wp-config.php keeps its permissions, and the speed test explains why a page is not cached. Recommended for everyone.

= 1.8.3 =
Fixes CSS and JavaScript edits appearing not to take effect. Browsers were told never to re-check your stylesheets for 30 days, so clearing the cache could not help. Recommended for everyone.

= 1.8.1 =
Performance: the settings screen and the status abilities no longer re-walk the entire cache folder on every read. Includes everything in 1.8.0.

= 1.8.0 =
Serve-stale-while-refreshing, Brotli, bloat removal and a settings search. Everything new is off until you switch it on — press One-Click Speed Setup after updating to get the safe set. The engine drop-in updates itself.

= 1.7.1 =
Readme and listing text only — no code changed. Nothing to do.

= 1.7.0 =
Adds AI assistant support: sixteen WordPress abilities so Claude, ChatGPT or any MCP client can check, diagnose and manage your cache without logging in. Same permissions as the settings screen. If you run the Pro add-on, update it to 1.7.0 at the same time.

= 1.6.0 =
Rebuilt dashboard: a plain-English verdict, a dial showing how much of your site is ready, and a real measurement of how much faster cached pages are. If you run the Pro add-on, update it to 1.6.0 at the same time.

= 1.5.1 =
Tidies up the section menu on the settings screen and adds an at-a-glance panel showing whether caching is on. Appearance only — nothing about caching changes.

= 1.5.0 =
Adds a Support tab with plain-English fixes for the common problems and a one-line summary of your setup you can paste into a support request. Nothing about caching changes. If you run the Pro add-on, update it to 1.5.0 at the same time.

= 1.3.0 =
Pro features have moved into a separate add-on plugin. If you have a license, download DadsFam Cache Pro from your account and install it alongside this one — your key and settings are kept and everything switches straight back on. This release also fixes several real caching bugs, including browsers holding on to stale pages after a purge.

= 1.2.1 =
Security fix — removes an insecure wp-config backup from the web root. Update right away.
