Version 5.0.2
July 22, 2026
Fixed
- Publishing a release that had already been published could apply unrelated drafts to random entries. Applying a draft deletes it and the
draftIdforeign key isSET NULL, so published release entries carry a null draft ID — whichEntry::find()->id()treated as "no filter" rather than "no match" - Releases can no longer be published twice;
Publishedis now enforced as a terminal status viaReleaseStatus::isPublishable() publishRelease()andvalidateRelease()threw aTypeErrorinstead of failing gracefully when passed an unsaved release- Release entries whose draft has gone missing are now reported by
validateRelease()and refused bypublishRelease(), instead of being silently skipped
Added
- Craft-backed integration test suite running against a real Craft install, covering the releases service, draft discovery, field diffing, plugin event listeners, install migration schema, the scheduler command, and the publish queue job
composer test-unitandcomposer test-integrationscripts;composer testnow runs both suites
Version 5.0.1
July 19, 2026
Changed
- Expanded automated unit test coverage for the release status state machine,
Release/ReleaseEntry/Settingsvalidation, andDiffServicefield-value serialization - Added a unit-suite bootstrap so model validation rules can be tested without booting a full Craft application
Version 5.0.0
June 12, 2026
Added
- Field-by-field diff comparison for drafts vs. live content
- Side-by-side visual preview with synchronized scrolling
- Release management for coordinated multi-entry publishing
- Atomic publish — all entries in a release publish together or none do
- Scheduled releases with cron-based automation
- Dashboard with draft overview and release status
- Permissions for diff viewing, release management, and settings
- Entry editor sidebar integration showing diff summary and release membership