Changelog

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.