Version 2.0.2

September 3, 2026

Changed

  • The freeze list, dashboard widget and {remaining} token now share one duration formatter, so "Ends in ..." and the notice bar always agree (durations round to the nearest unit, and long windows read as weeks)
  • The user groups table hides groups that are already used as a "Move Users To" target, instead of guessing from the group's name - so renamed clones are excluded and legitimately named groups aren't
  • Cloned view-only groups only keep accessSiteWhenSystemIsOff if the original group had it

Fixed

  • The "freeze ended" email went to nobody: it's queued before users are moved back, so it now looks for recipients in both the original and view-only groups
  • Notification emails format their dates in the recipient's Formatting Locale, matching the language Craft sends the message in
  • The freeze edit screen counts users in one query rather than one per group, and user moves no longer load a full element per affected user

Version 2.0.1

September 3, 2026

Added

  • {remaining} notice token, showing how long is left of a freeze in round terms (e.g. "3 hours")

Changed

  • The user groups table shows how many users are in each group, so you can see how many will be moved before enabling
  • The default notice pane text now spells out the freeze window (from {dateFrom} until {dateTo}), and the notice bar has its own shorter default counting down with {remaining}
  • Open-ended freezes read as "now", "further notice" and "a while" in place of a missing date, rather than "N/A"

Version 2.0.0

June 11, 2026

This is a major release that replaces the single global freeze with multiple, schedulable freezes. Your existing freeze configuration is migrated automatically into one freeze record on update. The CONTENT_FREEZE_ENABLED env var and the enabled / dateFrom / dateTo / userGroups plugin settings have been removed.

Added

  • Multiple freezes, managed from a new Content Freeze section in the CP - each with its own Enabled toggle, optional Date From/To, Description, and user group mapping
  • Schedule freezes for future dates; they activate and lift automatically
  • Open-ended freezes: leave the start date blank to start immediately, or the end date blank to stay frozen until disabled
  • Per-freeze notice (pane/bar) overrides, falling back to the plugin defaults
  • Dashboard widget listing active and upcoming freezes
  • Back Up Database on Freeze setting - queues a database backup when a freeze becomes active
  • Per-freeze Notify Users by Email option - emails affected users (with CP access) when a freeze is scheduled, becomes active and ends, using editable System Messages
  • craft.contentFreeze front-end Twig variable (enabled, freezes, dateRange) for blocking forms/purchases while frozen
  • php craft content-freeze/run console command for precise, cron-driven activation
  • The Clone button prompts for the new view-only group's name (prefilled with "X (Content Freeze)")
  • Clone view-only groups keep view/read/access permissions for Commerce, Freeform, Formie, Comments, SEOmatic and Navigation, plus a viewOnlyKeepPermissions config setting for other plugins

Changed

  • The freeze edit screen is split into General, User Groups and Notices tabs, with error indicators on the tab when a field fails validation
  • A freeze must have at least one enabled user group, and each enabled row requires a "Move Users To" group
  • The freeze list is ordered with active freezes first, then by start date
  • Access is controlled by the Access Content Freeze permission (no longer admin-only)
  • User moves run via a queue job (no more blocking the request)
  • Freezes are stored in the database (not project config)
  • Notices reflect the active freeze window via {dateFrom} / {dateTo}
  • A "Move Users To" group can be reused across freezes as long as it's always mapped from the same source group; only a target shared by two different source groups is blocked
  • The freeze list is cached per request, and user group reassignment fetches current memberships in a single query

Security

  • The "Move Users To" target is restricted to groups the editor is allowed to assign (assignUserGroup:<uid>), preventing privilege escalation for non-admins with the Access Content Freeze permission
  • Notice bar text is HTML-escaped before rendering in the CP alert, preventing stored XSS

Fixed

  • Deleting or disabling an active freeze moves its users back to their original groups
  • A failed user-move job retries instead of assuming the move succeeded
  • User moves skip groups that no longer exist instead of erroring

Removed

  • CONTENT_FREEZE_ENABLED env var and the single-freeze settings (enabled, dateFrom, dateTo, userGroups)

Version 1.0.3

February 18, 2026

Fixed

  • Clone action now uses POST request with CSRF protection
  • User group assignments now preserve existing group memberships instead of replacing them
  • Notice pane no longer crashes when dates are null
  • Notice pane uses correct CP URL instead of hardcoded /admin path
  • Misleading "License purchase required" title in notice pane

Changed

  • moveUsers() no longer runs on every request, only on settings save
  • Added type hints and validation rules to Settings model

Removed

  • Debug logging of permission data
  • Unused imports and dead code

Version 1.0.2

July 15, 2025

Fixed

  • License

Version 1.0.1

July 15, 2025

Fixed

  • Icon

Version 1.0.0

July 15, 2025
  • Initial release