Craft Content Diff
Version 1.0.10
February 28, 2026
- Compare fix: Array comparison is now key-order independent (deep compare). Identical field values that differed only by JSON key order (e.g. Color Swatches) no longer show as changed.
Version 1.0.9
February 28, 2026
- Compare fix: Resolved "Array to string conversion" when comparing: block/Matrix type labels and HTTP Basic auth are coerced to strings;
valueChanged()no longer casts arrays to string when one side is array and the other is not; asset filename in labels is always string. - Settings: Resolved values (API key, URLs, HTTP auth) now use
App::env()for known env vars (e.g.CRAFT_CONTENT_DIFF_API_KEY) with fallback to stored settings. Resolution logic moved intoSettingsService. - Docs: README notes env resolution via
App::env()and that HTTP Basic auth can be left blank when not used.
Version 1.0.8
February 28, 2026
- Logging fix: All
Craft::error()/Craft::info()calls now pass the category as the string'craft-content-diff'(not an array). Fixesstrpos(): Argument #1 ($haystack) must be of type string, array givenin Yii log Target when a compare fetch failed.
Version 1.0.7
February 28, 2026
- README: Added “Cloudflare (or similar WAF)” section: server-to-server compare requests can be blocked; how to allowlist
/actions/craft-content-diff/diff(and optionally requireX-Content-Diff-Token) in Cloudflare WAF. - Compare errors: Fetch failure messages now point to the README Cloudflare section when connection fails or response is invalid. Logging simplified (Craft
craft-content-diffcategory, single-line error).
Version 1.0.6
February 28, 2026
- Compare errors: Dashboard now shows the actual failure reason when fetch fails (e.g. remote 401 message, connection timeout). Logging improved with HTTP status, remote message, and PHP/connection errors (category
craft-content-diff). - View JSON: Link includes API key as
?token=when set, so it works when opened from the CP. Diff URL uses the current environment (staging/production/local) instead of alwayslocal. - Remote fetch: Request to production/staging now sends the correct
?environment=so the remote’s JSON reflects the right environment label. - Environment detection: If
ENVIRONMENT/CRAFT_ENVIRONMENTis not set, current environment is inferred by comparing the site URL to the configured Production URL and Staging URL. - Docs: API key examples use
$CRAFT_CONTENT_DIFF_API_KEYin settings, README, and 401 hints.
Version 1.0.5
February 24, 2026
- README: Installation section simplified to Composer commands only.
Version 1.0.4
February 24, 2026
- Updated icons.
Version 1.0.3
February 24, 2026
- Added required
descriptiontocomposer.jsonfor Packagist publishing. - Removed
versionfromcomposer.json(version is taken from git tags for published packages).
Version 1.0.2
February 23, 2026
- Updated Craft CMS version constraint in
composer.json.
Version 1.0.1
February 22, 2026
- README updates.
Version 1.0.0
February 22, 2026
- Initial release.
- Simplified plugin icon (SVG and mask).
- Compare entry content between environments (local, staging, production) from the Control Panel dashboard.
- Field-level diffs including Matrix and nested blocks; asset/relation IDs shown as labels where possible.
- Diff endpoint at
/actions/craft-content-diff/diff(site action URL) with API key auth viaX-Content-Diff-Tokenheader. - Plugin Settings: API key, Production URL, Staging URL, optional HTTP Basic auth for staging/production. All values support literals or env var aliases (e.g.
$CONTENT_DIFF_PRODUCTION_URL) via Craft’sEnvAttributeParserBehavior. - Generate API key button in Settings (output shown in a span for copy/paste).
- Graceful error handling: compare and enrich failures show user message and log; remote fetch failures log and return empty with clear warnings.