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_ENABLEDenv var and theenabled/dateFrom/dateTo/userGroupsplugin 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.contentFreezefront-end Twig variable (enabled,freezes,dateRange) for blocking forms/purchases while frozenphp craft content-freeze/runconsole 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
viewOnlyKeepPermissionsconfig 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_ENABLEDenv 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
/adminpath - 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