Changelog

1.8.1 (2026-08-29)#Copied!

Query parameters listed in MC_CACHE_IGNORE_REQUEST_KEYS, such as gclid or utm_*, now stay part of the request until the page is rendered. Redirects issued by WordPress, WooCommerce, or multilingual plugins like Polylang keep them in the target URL, while cached pages still never contain them.

Bug Fixes#Copied!

  • engine: keep ignored query keys in the request until rendering (f6f7d33)

1.8.0 (2026-08-22)#Copied!

1.8.0 brings a redesigned cache management experience centered on a command palette, new abilities for AI assistants, and several correctness fixes to the caching engine and rule system.

The admin bar's one-click flush button is replaced by a command palette that lets you clear or expire specific targets — pages, post types, taxonomies, or the full cache — with descriptive labels. A snackbar confirms the action and reports how many entries were actually removed. Add-ons can register their own palette commands and control their position in the list. The palette is wider to accommodate longer target names and no longer intrudes on every admin search field.

AI assistants can now check cache status and clear the cache. Two new abilities — available over REST and from MCP clients — answer the questions site owners most often ask through an assistant: "why is my page not cached" and "clear the cache for this post or URL". The status ability returns a curated health summary (connectivity, entry count, and the checks that need attention) without leaking the full plugin and theme inventory that the settings UI needs. MilliCache Pro extends this to every aspect of the plugin: caching, cache entries, rules, preloading, the edge cache, and the object cache can all be managed through abilities as well.

Cache responses now include the remaining lifetime of a served page. The engine has been corrected to never store redirect responses and to capture output from the outermost buffer, which prevents partial content from being cached when other plugins open buffers early. URL hashes now preserve non-default ports, so sites on non-standard ports get correct per-URL cache isolation. The invalidation queue runs even when the drop-in fails to load, so scheduled purges are not silently lost.

On the rules side, wp-cron.php is now excluded by a dedicated locked rule that cannot be overridden by site rules. Previously it was only covered by the generic dot-file rule, which a higher-priority site rule could outrank, potentially causing a stale cron lock response to be replayed and stalling scheduled events. The REST API exclusion now also matches the ?rest_route= query-string form used when pretty permalinks are off.

WP-CLI's clear flags are now scoped to the current site context on multisite. Redundant entries have been removed from the admin search results. Portuguese (Brazil), Italian, Spanish, and French translations are complete.

Features#Copied!

  • abilities: let assistants read cache status and clear the cache (f80b057)
  • abilities: report network-wide problems in a site's cache status (4e2b9f1)
  • abilities: say whether the install is a multisite (4573485)
  • adminbar: replace one-click flush with command palette integration (382b10b)
  • adminbar: snackbar clear feedback and a wider palette (2c77206)
  • cache: state the lifetime a replayed page has left (8f699fd)
  • clear: report removed-entry counts instead of processed inputs (23ec58f)
  • cli: scope bare clear flags to the WP-CLI site context (d30d31e)
  • commands: let add-ons ride the palette's promote/demote cycle (1db3d3f)
  • commands: offer expire alongside clear with descriptive target labels (880c9eb)
  • engine: capture the page in the outermost output buffer (6c4d393)
  • engine: capture the page in the outermost output buffer (7606f04)
  • engine: capture the page in the outermost output buffer (6cee142)
  • engine: expose the request's effective TTL override (31e2555)
  • rules: build the rule registry when the drop-in has not (b6ef71b)

Bug Fixes#Copied!

  • adminbar: keep the admin bar button size stable on page load (2c77206)
  • cache: report targets that belong to another site (6a7947a)
  • clear: anchor path-only URL targets onto the home URL (27bd7dc)
  • clear: skip non-viewable taxonomies in post-related flags (40cd884)
  • commands: drop the stray focus ring after palette clears (880c9eb)
  • commands: stop crowding every admin search, and drop the settings entry (87b52d1)
  • engine: execute the invalidation queue when the drop-in never loads (746bd0e)
  • engine: keep non-default ports in URL-based cache hashes (ed6f3d6)
  • engine: never store redirect responses (6c4d393)
  • engine: never store redirect responses (7606f04)
  • engine: never store redirect responses (6cee142)
  • rules: lock wp-cron.php out of the cache and cover the rest_route form (908ce04)
  • rules: skip an action whose placeholder resolved to nothing (a5e4894)
  • updates: keep update checks off every admin page load (1661d07)

1.8.0-beta.2 (2026-08-16)#Copied!

This release tightens how MilliCache interacts with CDNs and external caches, extends what AI assistants and WP-CLI can see, and closes a handful of gaps that caused silent failures.

Replayed pages now tell downstream caches their true remaining lifetime. Previously a cached response replayed its original Cache-Control headers unchanged, so a shared cache or CDN that ignored the Age header would treat a near-expired entry as freshly filled and hold it for the full s-maxage. Replayed responses now carry only the share of s-maxage that actually remains, so caches that ignore Age expire in step with the stored entry rather than well after it.

AI assistants can now check cache status and clear the cache. Two new abilities — available over REST and from MCP clients — answer the questions site owners most often ask through an assistant: "why is my page not cached" and "clear the cache for this post or URL". The status ability returns a curated health summary (connectivity, entry count, and the checks that need attention) without leaking the full plugin and theme inventory that the settings UI needs.

WP-CLI now sees the full rule registry. Because WP-CLI skips the drop-in, wp millicache rules list previously showed an empty engine — no built-in rules and nothing registered through millicache()->rules(). The manager now registers the rule set itself when it finds it missing, so the same question gets the same answer regardless of how it is asked.

Placeholder-driven rule actions no longer silently write garbage. When a bucket or flag was set from a placeholder that could not be filled — a missing cookie, for example — the literal placeholder text {cookie.geo_country} was used as the bucket name, pooling every visitor without that cookie together. Those actions now do nothing when the placeholder is empty or unresolved.

Features#Copied!

  • abilities: let assistants read cache status and clear the cache (f80b057)
  • abilities: report network-wide problems in a site's cache status (4e2b9f1)
  • abilities: say whether the install is a multisite (4573485)
  • cache: state the lifetime a replayed page has left (8f699fd)
  • commands: let add-ons ride the palette's promote/demote cycle (1db3d3f)
  • engine: expose the request's effective TTL override (31e2555)
  • rules: build the rule registry when the drop-in has not (b6ef71b)

Bug Fixes#Copied!

  • cache: report targets that belong to another site (6a7947a)
  • commands: stop crowding every admin search, and drop the settings entry (87b52d1)
  • rules: skip an action whose placeholder resolved to nothing (a5e4894)

1.8.0-beta.1 (2026-08-10)#Copied!

Plugin and language-pack update checks previously ran on every admin page load, so a slow or unresponsive millipress.com could stall every admin request waiting for a timeout. Both checks now run only during WordPress's scheduled update refresh cycles, with a 3-second timeout and a 15-minute back-off after any failure. "Check again" still triggers an immediate fresh check.

Bug Fixes#Copied!

  • updates: keep update checks off every admin page load (1661d07)

1.8.0-beta (2026-08-07)#Copied!

1.8.0-beta is a significant release centered on two themes: a smarter cache-clearing experience and a more reliable caching engine.

Command palette integration. The admin bar Cache button now opens the WordPress command palette (wp-admin, WordPress 7.0+) instead of immediately flushing. From there you can clear or expire the website or network cache, jump to settings, or type a post ID, URL, or flag to target exactly what needs clearing. Expire is new — it marks entries stale for stale-while-revalidate regeneration rather than deleting them outright. Clear and expire results surface as snackbar toasts with the actual entry count removed, so you know whether anything was matched. On the front end and older WordPress the submenu behaves as before, with a two-step confirmation added for the network-wide clear.

Accurate cache invalidation. Several bugs that caused clears to silently match nothing are fixed: path-only URL targets (e.g. /blog/) are now anchored to the home URL before hashing, so they find what was actually stored. Sites running on non-standard ports no longer miss URL-based clears due to a port mismatch in the hash. WP-CLI flag clears on multisite now respect the --url site context instead of looking for a bare flag that was never stored. Internal taxonomies (Polylang language terms, nav menus) are excluded from post-related invalidation batches, which reduces unnecessary purge payloads. And queue execution is now guaranteed even in WP-CLI processes where the drop-in never loads, so publishes and imports triggered from the CLI actually clear the cache.

Outermost output buffer capture. The engine now opens its capture buffer before any plugin loads, meaning HTML post-processors (TranslatePress, HTML optimizers) run inside it. Their final output is what gets stored, eliminating a class of caching issues where transformed HTML was bypassed. Redirect responses (3xx) are never stored. The new millicache()->response()->is_storable() method is available for extensions.

Features#Copied!

  • adminbar: replace one-click flush with command palette integration (382b10b)
  • adminbar: snackbar clear feedback and a wider palette (2c77206)
  • clear: report removed-entry counts instead of processed inputs (23ec58f)
  • cli: scope bare clear flags to the WP-CLI site context (d30d31e)
  • commands: offer expire alongside clear with descriptive target labels (880c9eb)
  • engine: capture the page in the outermost output buffer (7606f04)

Bug Fixes#Copied!

  • adminbar: keep the admin bar button size stable on page load (2c77206)
  • clear: anchor path-only URL targets onto the home URL (27bd7dc)
  • clear: skip non-viewable taxonomies in post-related flags (40cd884)
  • commands: drop the stray focus ring after palette clears (880c9eb)
  • engine: execute the invalidation queue when the drop-in never loads (746bd0e)
  • engine: keep non-default ports in URL-based cache hashes (ed6f3d6)
  • engine: never store redirect responses (6cee142)

1.7.7 (2026-07-29)#Copied!

Multisite metrics are the headlining fix here: response times, bandwidth, and stale-serve counts were silently dropped on network installs, leaving Insights charts flat. That's resolved.

On the status side, a new dashboard check surfaces when the settings config file can't be written — meaning components that load before WordPress would otherwise run on stale settings without any warning. MilliCache heals the file automatically once the directory is writable again. Relatedly, constants now behave more predictably: defining one sets and locks the value, and removing it unlocks the setting while preserving whatever was last saved.

Features#Copied!

  • dropins: share install reporting and heal extension drop-ins (800111c)
  • engine: expose readiness for exception-free drop-in probes (24b8d37)
  • status: report when the config file cannot be written (54f2e82)

Bug Fixes#Copied!

  • deps: require millipress/millibase ^2.8.0 (dd906d9)
  • metrics: record response times and honor retention on multisite (087e764)
  • Reinstall an already-correct drop-in symlink when --force is passed (3b2ed2f)

Miscellaneous#Copied!

  • pin the next release to 1.7.7 (dd67e0c)

1.7.6 (2026-07-28)#Copied!

Features#Copied!

  • engine: announce every cache clear as one merged flag batch (e2f1513)
  • status: warn before the storage server runs out of memory (a4fc9e6)

Bug Fixes#Copied!

  • cli: give the interactive redis-cli session the real terminal (14e2128)

Miscellaneous#Copied!

  • deps: update dev dependencies (2aa340a)

1.7.5 (2026-07-24)#Copied!

Bug Fixes#Copied!

  • cache: clear a post's cache when it is unpublished (43a1a88)
  • cache: clear feed caches when a post is published or updated (b04ede8)
  • cache: fire millicache_cache_cleared_by_posts on automatic post invalidation (6615c7d)
  • engine: accept Vary tokens covered by request keying or inert on GET (53ad7b7), closes #172
  • engine: resolve Authorization bucket from redirect and basic-auth channels (7e7ed1b)
  • storage: prevent a fatal error when toggling MilliCache alongside MilliCache Pro (1ad4949)

1.7.4 (2026-07-22)#Copied!

Features#Copied!

  • i18n: install language packs from the millipress.com languages API (dd2d73d)
  • release: post a single Discord notification on stable release (57b0def)

Bug Fixes#Copied!

  • i18n: serve JS translations as handle-named full catalogs (747594a)
  • updater: Correct endpoint URL for plugin update information (46611ad)

Miscellaneous#Copied!

  • release: ship the language-pack injector as 1.7.4 (5bd8ff6)

1.7.3 (2026-07-19)#Copied!

Features#Copied!

  • cli: let wp millicache drop target and reinstall any drop-in (8937287)
  • i18n: make translation-ready for language-pack delivery (4757aa8)
  • logging: adopt the shared MilliBase Logger (7eccbaa)

Bug Fixes#Copied!

  • pcp: satisfy Plugin Check across shipped sources (41f918d)
  • ui: share Status card styles between MilliCache and MilliCache Pro (6aac122)

1.7.2 (2026-07-16)#Copied!

Bug Fixes#Copied!

  • dropin: invalidate OPcache when installing or removing drop-ins (841707d)
  • rules: share the rules engine with other MilliRules integrations (ba02b55)
  • settings: recognize the cache buckets key so MC_CACHE_BUCKETS works (3255794)
  • updater: only self-update when this copy owns the plugin basename (2f6d584)

1.7.1 (2026-07-14)#Copied!

Bug Fixes#Copied!

  • engine: publish singleton before re-entrant bootstrap work (cd6aa21)
  • status: stop KPI tiles stretching in Safari (c8d2945)

1.7.0 (2026-07-12)#Copied!

MilliCache 1.7.0 is a big step forward. The full feature list is long, so here are the highlights:

Redis Replication & Sentinel MilliCache now supports high-availability setups. For most sites we still recommend simply running Redis or Valkey on the host server, but larger projects that need a more resilient topology are now covered.

Status Graphs You can finally see how your cache is actually performing. A rebuilt Status dashboard charts your hit and miss ratio over time, so you can tell at a glance whether the cache is doing its job. On Multisite you also get network-wide stats.

Cache Buckets Store different versions of the same request, for example based on a request header. This is really handy with plugins like roots/post-content-to-markdown, where you want to cache and serve different responses for the same URL: HTML for humans, Markdown for AI. In MilliCache that's a single rule.

Deduplication Byte-identical responses are stored only once. MilliCache content-addresses each response body, so any requests that produce the exact same HTML (whether it's /?foo and /?foo=bar, or two entirely different URLs) share a single stored copy in Redis. Less memory, same speed.

Cache Health Beyond the graphs, MilliCache now integrates with WordPress Site Health, so issues surface where you'd expect them: you won't miss it if, for example, your drop-in file is not in place.

Features#Copied!

  • admin: add millicache_admin_notice action and HTML allowlist (c693a0a)
  • adminbar: animate + 500ms delay before post-clear recount (00c7dc1)
  • adminbar: live cache size + bounded current-view clear (3877451)
  • admin: centered loading indicator on the Status tab (534d7b0)
  • admin: count user-defined custom rules in the snapshot (ab0d686)
  • admin: docs links per check, "warnings" pill label, rules in snapshot (38307a4)
  • admin: expose three extension filters on the status snapshot (28c8cf1)
  • admin: footer Status indicator with unified status payload (dd72515)
  • admin: integrate with the WordPress Site Health screens (2470fb8)
  • admin: make the status extension filters scope-aware (9498b55)
  • admin: per-check breakdown in the footer Status modal (52e58c9)
  • admin: polish free Status chart to match Pro (4841e79)
  • admin: rebuild the Status tab — fixed panels, KPI/chart cards, lean Pro teaser (1ef92ca)
  • admin: surface storage topology across CLI, status, and settings (3f34067)
  • cache: Add bucket framework with content-addressable body dedup (#126) (a279fd7)
  • cache: cap entries at 5MB raw to protect Redis from oversized responses (2e2511f)
  • engine: expose install_mode() to report how MilliCache is loaded (788e079)
  • hand the advanced-cache.php drop-in between co-resident MilliCache copies (80d5ab9)
  • hooks: standardize cache-cleared action names (1dedb37)
  • metrics: make hit/miss retention windows configurable (45257b5)
  • metrics: record hit/miss in the response path, excluding the preloader (f42780f)
  • metrics: time-bucketed per-blog hit/miss metrics engine (e031f9c)
  • migrations: add Core/Migrations with storage→network move (63875c4)
  • plugin: Add author information and plugin URI to advanced cache file (ef97d53)
  • response: emit Age header on cache hits (RFC 9111) (035bd24)
  • rules: skip caching search result pages by default (4bf4be3)
  • settings: Include metrics in network-scoped Settings instance for multisite (59d2fa5)
  • settings: order the settings tabs by declared position (d8f208a)
  • settings: preserve storage connection settings across a full reset (77772b1)
  • settings: skeleton loading state for the Status dashboard (d5b48a7)
  • site-health: surface every status issue, not just the drop-in (7a2d793)
  • status: informational check tier, severity ordering, sticky modal tabs (ec6a249)
  • status: rework cache size metrics and Status tab UI (88991c4)
  • status: show each check as a subject and a verdict (f863b98)
  • storage: add generic key/value surface for reuse by drop-ins (a1d195c)
  • storage: add ping() active reachability probe (85068a2)
  • storage: emit URL + canonical flags from entry deletion/expiry hooks (d2445b1)
  • storage: extract Connection class with shape-inferred topology (afdfdce)
  • ui: Add footer with MilliCache version to Network and Site settings pages (bfe5a1f)
  • ui: Add footer with MilliCache version to Network and Site settings pages (130dcc7)
  • updater: honor millicache_updates at check time + add prerelease opt-in (0153b35)

Bug Fixes#Copied!

  • admin: color the Status modal check icons (4ab80b3)
  • cache status: Correct key prefix for site flags in status retrieval (0f419a2)
  • cache: stop SWR regeneration from storing serve-time headers (2447389)
  • cron: self-heal the nightly maintenance schedule on load (32f8579)
  • drop-in: remove Plugin Name header so the drop-in is not listed as a plugin (c532c15)
  • network: Update network settings URL for MilliCache management (4861431)
  • release: isolate Strauss from setup-php's github-oauth token (85b642e)
  • settings: register the metrics.active default so it survives resolution (f079f91)
  • status: call the deduplication count unique responses, not pages (52447f9)
  • status: show clean package versions in the debug info (4deacaf)
  • storage: preserve flag membership when expiring a cache entry (7c83b33)
  • ui: Correct month value from 'M' to 'mo' (a0dbbf5)
  • workflow: make polish-release-pr idempotent across reruns (077c0c8)

Performance#Copied!

  • storage: batch flag-to-key resolution when clearing by sets (1ee0b65)

1.7.0-beta.7 (2026-07-10)#Copied!

Multi-copy installations — where MilliCache and a bundling plugin such as MilliCache Pro are active side-by-side — now hand off advanced-cache.php cleanly instead of leaving it in a broken state. Deactivating one copy re-points the drop-in to whichever sibling is still active, activation installs the drop-in belonging to the copy actually being activated, and a new self-heal step corrects a stale drop-in automatically after any plugin activation, deactivation, or update.

Features#Copied!

  • hand the advanced-cache.php drop-in between co-resident MilliCache copies (80d5ab9)

1.7.0-beta.6 (2026-07-08)#Copied!

Stale-while-revalidate regeneration was storing serve-time headers — including injected Age and Cache-Control: no-cache — causing regenerated entries to replay no-cache forever and remain edge-uncached. That is fixed: a new millicache_entry_headers filter runs at the single store chokepoint for both miss-capture and background regen, serve-time headers are scrubbed before storage, and regen now uses the original stored headers as its base rather than the frozen post-fastcgi_finish_request() header table.

Cache hits now emit an Age header per RFC 9111, so downstream CDN edges subtract elapsed time from the freshness window and expire their copy in sync with this entry rather than resetting to a full lifetime.

A new 5 MB entry size cap (MAX_ENTRY_SIZE) rejects oversized responses — such as PDF exports — before they reach Redis, preventing maxmemory exhaustion and legitimate-page eviction.

The Status panel gains an informational check tier (gray info icon, no health impact) for neutral facts and features that are off by choice, with checks now ordered by severity. The millicache_updates filter is evaluated at update-check time rather than constructor time, so filters registered in functions.php or mu-plugins are honored. Define MC_UPDATE_PRERELEASE to opt a site into prerelease builds.

Features#Copied!

  • cache: cap entries at 5MB raw to protect Redis from oversized responses (2e2511f)
  • response: emit Age header on cache hits (RFC 9111) (035bd24)
  • status: informational check tier, severity ordering, sticky modal tabs (ec6a249)
  • updater: honor millicache_updates at check time + add prerelease opt-in (0153b35)

Bug Fixes#Copied!

  • cache: stop SWR regeneration from storing serve-time headers (2447389)
  • drop-in: remove Plugin Name header so the drop-in is not listed as a plugin (c532c15)
  • release: isolate Strauss from setup-php's github-oauth token (85b642e)

1.7.0-beta.5 (2026-06-30)#Copied!

This release tightens the storage and hook layers ahead of the 1.7.0 stable cut.

The most important fix addresses a regression introduced in v1.6.2: expiring a cache entry by flag was silently stripping its flag memberships, leaving it orphaned and unreachable by subsequent flag-based clears until its TTL naturally elapsed. Flag membership is now preserved correctly on expiry.

On the hooks side, all cache-invalidation actions are now named consistently under the millicache_cache_cleared_by_<target> pattern — millicache_cache_cleared_by_urls is new, and millicache_cleared_by_networks has been renamed to millicache_cache_cleared_by_networks. This is a breaking change for any code listening on the old name. Entry deletion and expiry hooks (millicache_entry_deleting, millicache_entry_deleted, and the new millicache_entry_expired) now carry the entry URL and canonical flags (e.g. 2:post:123) as additional arguments, giving edge/CDN integrations a complete signal directly from the storage layer. Flag-to-key resolution when clearing by sets is also now batched into a single pipeline, reducing Redis round-trips proportionally to flag fan-out.

Finally, Storage gains a generic key/value surface (get, get_multiple, set, delete, delete_by_pattern) so Pro drop-ins such as an object-cache driver can reuse MilliCache's existing Redis connection and fail-fast logic without opening a second one.

Features#Copied!

  • hooks: standardize cache-cleared action names (1dedb37)
  • plugin: Add author information and plugin URI to advanced cache file (ef97d53)
  • storage: add generic key/value surface for reuse by drop-ins (a1d195c)
  • storage: emit URL + canonical flags from entry deletion/expiry hooks (d2445b1)

Bug Fixes#Copied!

  • storage: preserve flag membership when expiring a cache entry (7c83b33)

Performance#Copied!

  • storage: batch flag-to-key resolution when clearing by sets (1ee0b65)

1.7.0-beta.4 (2026-06-23)#Copied!

A full settings reset now leaves your storage connection intact, so clearing your caching behavior no longer disconnects your cache server or forces you to re-enter the connection details.

Features#Copied!

  • settings: Include metrics in network-scoped Settings instance for multisite (59d2fa5)
  • settings: preserve storage connection settings across a full reset (77772b1)
  • settings: skeleton loading state for the Status dashboard (d5b48a7)

1.7.0-beta.3 (2026-06-20)#Copied!

This beta brings high-availability storage to MilliCache. Alongside single-server setups, it adds first-class support for Redis Replication and Sentinel, inferred automatically from the shape of MC_STORAGE_HOST with no separate mode flag to manage: a host string is single-node, a master map enables master/replica replication, and a service map enables Sentinel-managed failover. The connection layer is also more resilient: a misconfigured connection now disables the cache and serves the site uncached instead of silently falling back to localhost, and a connection failure fails fast so a brief storage outage can no longer slow down every request. Cache analytics gain configurable hit/miss retention windows, letting you decide how much history to keep.

Features#Copied!

  • admin: centered loading indicator on the Status tab (534d7b0)
  • admin: polish free Status chart to match Pro (4841e79)
  • admin: surface storage topology across CLI, status, and settings (3f34067)
  • metrics: make hit/miss retention windows configurable (45257b5)
  • storage: extract Connection class with shape-inferred topology (afdfdce)

Bug Fixes#Copied!

  • network: Update network settings URL for MilliCache management (4861431)

1.7.0-beta.2 (2026-06-09)#Copied!

Here's a friendly intro for the 1.7.0-beta.2 release:


This beta brings the biggest admin overhaul in a while. The Status tab has been rebuilt from the ground up with KPI cards, a 7-day hit-ratio sparkline, and a full-width requests chart — and the same diagnostic story now flows into WordPress's native Site Health screens, so admins troubleshooting from Tools → Site Health see MilliCache's drop-in state, storage connectivity, and WP_CACHE status right alongside core checks.

The footer gets a new Status pill that summarizes overall health at a glance and opens a modal with a structured per-check breakdown (good/warning/critical, with docs links) alongside the existing debug snapshot. That snapshot is also the source of truth for a revamped wp millicache status CLI command and a prefilled GitHub issue template, making bug reports a one-click affair.

On the metrics side, hit and miss counts are now recorded in the response path (hourly buckets, rolled up nightly, scoped per blog) with preloader requests sensibly excluded. The admin bar gains live cache-size fetching on menu open and a fix for "Clear Current View" that was accidentally wiping the entire cache when a shared flag existed.

Rounding things out: the nightly maintenance schedule now self-heals on load so it can't silently go missing after an update, a ping() probe gives Site Health an accurate storage-reachability signal, and the install_mode() helper reports whether MilliCache is running standalone or Composer-loaded.

Features#Copied!

  • adminbar: animate + 500ms delay before post-clear recount (00c7dc1)
  • adminbar: live cache size + bounded current-view clear (3877451)
  • admin: count user-defined custom rules in the snapshot (ab0d686)
  • admin: docs links per check, "warnings" pill label, rules in snapshot (38307a4)
  • admin: expose three extension filters on the status snapshot (28c8cf1)
  • admin: footer Status indicator with unified status payload (dd72515)
  • admin: integrate with the WordPress Site Health screens (2470fb8)
  • admin: make the status extension filters scope-aware (9498b55)
  • admin: per-check breakdown in the footer Status modal (52e58c9)
  • admin: rebuild the Status tab — fixed panels, KPI/chart cards, lean Pro teaser (1ef92ca)
  • engine: expose install_mode() to report how MilliCache is loaded (788e079)
  • metrics: record hit/miss in the response path, excluding the preloader (f42780f)
  • metrics: time-bucketed per-blog hit/miss metrics engine (e031f9c)
  • storage: add ping() active reachability probe (85068a2)
  • ui: Add footer with MilliCache version to Network and Site settings pages (bfe5a1f)
  • ui: Add footer with MilliCache version to Network and Site settings pages (130dcc7)

Bug Fixes#Copied!

  • admin: color the Status modal check icons (4ab80b3)
  • cron: self-heal the nightly maintenance schedule on load (32f8579)
  • settings: register the metrics.active default so it survives resolution (f079f91)
  • workflow: make polish-release-pr idempotent across reruns (077c0c8)

1.7.0-beta.1 (2026-05-13)#Copied!

This release introduces a new bucket framework for response variants. Before, the cache treated every request producing the same URL as one entry — which meant sites returning different content based on a cookie, header, or user state had to either disable caching for those pages or fight invalidation manually. Now any rule condition can split requests into separate buckets — cookie values (consent state, A/B test arm, currency), auth tokens, or the Accept header. That last one is especially useful for sites optimizing for AI agents: pair MilliCache with something like roots/post-content-to-markdown, and the Markdown variant your AI crawlers fetch and the HTML variant your browsers fetch live under the same page context — publish or update a post, and both invalidate together instead of drifting out of sync. Paired with content-addressable body deduplication, identical response bodies are stored once and shared across every bucket that produces them, so variants that happen to land on the same output don't pay for duplicate storage.

Multisite networks get a proper Network Admin UI for storage settings. Until now, sharing Redis connection details across subsites meant setting them via define() constants in wp-config.php — that route still works (and still takes precedence if you set both), but you can now configure storage from Network Admin like any other network-wide setting. Existing per-site UI configurations are migrated there automatically the first time you upgrade, so nothing breaks. The Status tab has also been reworked with breakdowns that tell you something useful at a glance: total bytes, deduplicated bytes, average per entry — so you can see whether the body dedup is paying off for your site.

The upgraded MilliBase foundation also brings the new Abilities API. This exposes your cache settings through standardized REST endpoints that AI assistants and automation tools speak natively — so a tool like Claude can read your current TTL or update your ignore list directly, and CI pipelines can configure MilliCache the same way they'd configure any other service.

Features#Copied!

  • cache: Add bucket framework with content-addressable body dedup (#126) (a279fd7)
  • admin: add millicache_admin_notice action and HTML allowlist (c693a0a)
  • migrations: add Core/Migrations with storage→network move (63875c4)
  • status: rework cache size metrics and Status tab UI (88991c4)

Bug Fixes#Copied!

  • cache status: Correct key prefix for site flags in status retrieval (0f419a2)
  • ui: Correct month value from 'M' to 'mo' (a0dbbf5)

1.7.0-beta (2026-05-05)#Copied!

MilliCache 1.7.0-beta brings a significant upgrade to how the cache handles response variants. The new bucket framework gives any part of your stack a clean way to tell the cache "these requests are different" — whether that's by auth token, content type, A/B test arm, or any other signal you can express as a rule condition. On top of that, identical response bodies are now stored only once and shared across variants automatically, so sites serving multiple representations of the same content use meaningfully less Redis memory without any extra configuration.

Features#Copied!

  • cache: Add bucket framework with content-addressable body dedup (#126) (a279fd7)

1.6.2 (2026-05-04)#Copied!

Features#Copied!

  • flags: Normalize flag identifiers (lowercase + trim) at boundaries (2859cd2)
  • rules: Load user-defined rules from settings into the rule engine (b3fc827)

Bug Fixes#Copied!

  • deps: Require millipress/millirules ^1.1.5 (4edb44d)
  • storage: Drop stale flag fields and their set memberships on store (50b8d54)

Miscellaneous#Copied!

1.6.1 (2026-05-01)#Copied!

Bug Fixes#Copied!

  • deps: Require millipress/millibase ^2.4.0 (3d1a0f9)

1.6.0 (2026-04-30)#Copied!

Features#Copied!

  • rules: Expose MilliRules registry/validation through Manager (812cf36)

Bug Fixes#Copied!

  • rules: Restrict default REST rule to GET/HEAD to avoid lock warning (3144a48)

1.5.2 (2026-04-26)#Copied!

Features#Copied!

  • plugin: Implement singleton pattern for MilliCache instance management (8d92bcb)

Miscellaneous#Copied!

1.5.1 (2026-04-24)#Copied!

Bug Fixes#Copied!

  • engine: Simplify autoloader initialization for better compatibility (fe45266)

1.5.0 (2026-04-23)#Copied!

Features#Copied!

  • rules: Add action metadata, scoped locking, and order-aware execution (7196cd3)
  • rules: Lock critical built-in rules and use order 0/1 convention (c011d4c)
  • storage: support username for authentication (#108) (19d62eb)

Bug Fixes#Copied!

  • activator: Handle both old and new variable name in drop-in regex (cf80b88)
  • engine: Use PHP_INT_MAX - 10 for template_redirect priority (8b7118f)
  • settings: Remove inline padding from status tab wrapper (7d919f3)
  • tests: Update do_cache arguments to include string type with default value (5afed64)

1.4.2 (2026-04-22)#Copied!

Bug Fixes#Copied!

  • activator: Ensure symlink creation only if function exists (f935526)

1.4.1 (2026-04-22)#Copied!

Bug Fixes#Copied!

  • advanced-cache.php: Set correct path to plugin on copy file operation (35179c2)

1.4.0 (2026-04-01)#Copied!

Features#Copied!

  • cache: Store request URL and variant dimensions in cache entries (d334421)
  • settings: Make schema defaults available to add-ons at plugin load (c899d3b)

Bug Fixes#Copied!

  • e2e: Checkout into lowercase directory for consistent plugin slug (9a554a0)
  • release: Reset manifest to last published version (015ab7a)
  • storage: Exclude expired keys from cache index count (dcc68ef)
  • storage: Filter Redis hash fields to correctly identify flag fields (ee18c24)
  • storage: Remove backward compat for pre-1.4.0 cache entries (6ab8e0a)
  • storage: Respect per-entry custom TTL/grace in Redis EXPIRE (fd8ec58)
  • tests: Eliminate connection warnings from Storage scheme tests (306f31d)

Build#Copied!

  • e2e: Migrate to wp-env 11 with lifecycle scripts (0220f95)

1.3.2 (2026-03-23)#Copied!

Bug Fixes#Copied!

  • ui: Prevent asset enqueueing when admin bar is not showing (b9be14a)

1.3.1 (2026-03-16)#Copied!

Bug Fixes#Copied!

  • i18n: Defer UI config to init hook to prevent early textdomain loading (df51634)
  • ui: Register hooks for UI initialization to ensure proper textdomain loading (208621d)

1.3.0 (2026-03-15)#Copied!

Features#Copied!

  • admin: Rebuild settings UI with MilliBase components (574145e)
  • settings: Integrate MilliBase as the settings framework (83ba3fb)
  • storage: Add TLS support via scheme prefix in MC_STORAGE_HOST (ac77698)

Bug Fixes#Copied!

  • e2e: Use dynamic slug in post deletion invalidation test (1dcc057)
  • manager: Clearing by targets processes double prefixed flags in Multisite. (17971f3)

1.2.0 (2026-03-02)#Copied!

Features#Copied!

  • storage: Support Unix socket paths for Redis connections (78254d7)

Bug Fixes#Copied!

  • storage: Handle PredisException when retrieving Redis/Valkey config (098b67c)

1.1.0 (2026-02-21)#Copied!

Features#Copied!

  • deps: Upgrade predis/predis from ^2.2 to ^3.0 (b84a8bd)

Bug Fixes#Copied!

  • release: Remove draft config so Release Please creates git tags (6d11112)
  • ui: Replace removed warning icon with caution (3b8f686)

1.0.2 (2026-02-16)#Copied!

Bug Fixes#Copied!

  • Make check_cache_decision() public and remove Options::is_caching_allowed() (b713aed)

1.0.1 (2026-02-15)#Copied!

Bug Fixes#Copied!

  • ci: Use RELEASE_TOKEN for release-please to trigger PR workflows (2f8322e)
  • Register action namespaces in Engine constructor (4a1ffb3)

Refactoring#Copied!

  • ci: Move E2E from PR trigger to release workflow gate (3c9de93)
  • ci: Remove post-merge CI/E2E gates from release workflow (810055a)

1.0.0 (2026-02-13)#Copied!

Initial stable release of MilliCache — a full-page cache plugin for WordPress powered by Redis compatible servers.

Highlights#Copied!

  • In-Memory Full-Page Cache — Pages are served directly from memory before WordPress even initializes. No database queries.
  • Flag-Based Invalidation — Tag cached pages with flags like post:123 or archive:category:5, then clear related entries with a single command. Built-in flags are assigned automatically; custom flags give you full control.
  • Stale-While-Revalidate — Serve expired content while fresh content regenerates in the background. Prevents cache stampedes on high-traffic pages.
  • Rules Engine — Define caching behavior with a fluent, chainable PHP API. Set TTL, grace periods, and exclusions per condition — all version-controllable.
  • Multisite Native — Per-site cache isolation with network-wide management. Clear one site, a subset, or an entire network.
  • Multiple Backends — Redis, ValKey, KeyDB, or Dragonfly. Any Redis-compatible server works out of the box.
  • WP-CLI Integration — Commands for cache testing, status checks, diagnostics, and bulk operations. AI-agent friendly.
  • Debug Headers & Browser ExtensionX-MilliCache-* headers show cache status, flags, and keys. The companion browser extension makes debugging effortless.
  • REST API/millicache/v1/* endpoints for cache control, status checks, and settings — ideal for CI/CD pipelines and monitoring.
  • Action & Filter Hooks — Full customization of caching behavior, flag assignment, and invalidation events.
  • Smart Auto-Invalidation — Cache clears automatically when posts, menus, widgets, or theme settings change.
  • Open Source — GPL-2.0+ licensed. No vendor lock-in.

Last updated:

Release updates

Get notified when new versions and guides ship. No spam.

By subscribing you agree to our Privacy Policy.­ Double opt-in, no spam, unsubscribe anytime.