Version 5.0.1

October 4, 2026

Security

  • Reverting a whole element to a revision asked only that the user could view it, so someone with read-only access to a section could overwrite its content. It now needs the right to edit the element, as the selective restore already did.
  • Deleting revisions and purging an element's history had the same gap, on the history screen and the prune screen. Both now need the right to edit the element. The prune screen checked no element access at all for a single element.
  • Pinning and unpinning accepted any revision ID on the site. A pin decides what pruning may delete, so it now needs the right to view the revision's element.
  • Purging a section, an element type or the whole site regardless of the retention policies now takes an admin. Enforcing the policies still needs only the prune permission.
  • The pinned list showed every pin on the site, and the overview and storage report showed the titles of the largest histories wherever they were. Pins on elements you can't view are now hidden, and titles in the reports are masked; the totals still count them.
  • Element access now goes through Craft's Elements service, which also checks that the user may edit the element's site and lets other plugins weigh in. It used to ask the element directly.

Fixed

  • Code-quality fixes from static analysis (nullsafe operators on values that can't be null).

Version 5.0.0

August 23, 2026

Initial release. Version 5.0.0 to match the Craft major it targets, as with the rest of the family.

Compare

  • Field-by-field comparison of any two versions of an element, in either direction, including a revision against the current live version.
  • Word-level diff with a dependency-free LCS implementation; large values fall back to a line-level comparison and then to a side-by-side view rather than exhausting memory.
  • Matrix and other nested-element fields are compared block by block, aligned by content so an edit reads as changed, a reorder as moved, and only real insertions as added.
  • Rich text is flattened to readable text before diffing, so a wrapper class change no longer reads as a rewritten paragraph.
  • Changed fields sort first, biggest change first.

Restore

  • Selective restore: put back only the fields you choose, leaving the rest of the element alone.
  • Every restore is previewed as "what will be overwritten" before it writes.
  • Restores save through Craft, so they create a revision of their own and can themselves be undone.
  • Craft's whole-element revert is exposed alongside, unchanged.

Retention and pruning

  • Retention policies per element type, section and site, resolved most-specific-first, stored in project config.
  • Pinned revisions, protected from Visorr's pruning and from Craft's own.
  • Craft's PruneRevisions job is replaced by Visorr's when — and only when — Visorr has something to add.
  • Dry-run preview and execution share one resolver; every run is recorded with the IDs it planned to delete alongside what it actually deleted.
  • Scheduled pruning by cron or from control-panel traffic.
  • Console commands: visorr/prune/plan, visorr/prune/apply, visorr/report, visorr/sites/status, visorr/sites/backfill.

Insight

  • Storage report by section, element type and individual element.
  • A revision panel on element edit screens showing history depth, retention in force, and pins.

Multi-site

  • The site a revision was authored from is recorded in every edition.
  • Revision history in the control panel can be filtered to the current site, for elements shared across sites.
  • Backfill for revisions written before Visorr was installed.