PHPackages                             roadsterworks/craft-content-diff - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. roadsterworks/craft-content-diff

ActiveCraft-plugin[Utility &amp; Helpers](/categories/utility)

roadsterworks/craft-content-diff
================================

Compare entry content between environments (local, staging, production) from the Craft Control Panel.

v1.0.10(4mo ago)017proprietaryPHPPHP &gt;=8.2CI failing

Since Feb 22Pushed 4mo agoCompare

[ Source](https://github.com/harry2909/craft-content-diff)[ Packagist](https://packagist.org/packages/roadsterworks/craft-content-diff)[ RSS](/packages/roadsterworks-craft-content-diff/feed)WikiDiscussions main Synced today

READMEChangelog (10)Dependencies (6)Versions (10)Used By (0)

Craft Content Diff
==================

[](#craft-content-diff)

[![Content Diff dashboard](https://private-user-images.githubusercontent.com/47326455/553263647-c4a91dc4-6e3a-4965-837d-c50c8f1fbbc2.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI3ODA4NjUsIm5iZiI6MTc4Mjc4MDU2NSwicGF0aCI6Ii80NzMyNjQ1NS81NTMyNjM2NDctYzRhOTFkYzQtNmUzYS00OTY1LTgzN2QtYzUwYzhmMWZiYmMyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA2MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNjMwVDAwNDkyNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZmMmZhOTk1NjIyYjBmZTYzNzQxYmE3OWM5OTVjMTg0YTlhZTM1OTFhYTg3MzA1MjcyMWJjYTdkMGE0MzRmMjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.XhkzLSPSbIb23ufOFaWF3LetOrIpe45IqbMPin9iddA)](https://private-user-images.githubusercontent.com/47326455/553263647-c4a91dc4-6e3a-4965-837d-c50c8f1fbbc2.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI3ODA4NjUsIm5iZiI6MTc4Mjc4MDU2NSwicGF0aCI6Ii80NzMyNjQ1NS81NTMyNjM2NDctYzRhOTFkYzQtNmUzYS00OTY1LTgzN2QtYzUwYzhmMWZiYmMyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA2MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNjMwVDAwNDkyNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZmMmZhOTk1NjIyYjBmZTYzNzQxYmE3OWM5OTVjMTg0YTlhZTM1OTFhYTg3MzA1MjcyMWJjYTdkMGE0MzRmMjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.XhkzLSPSbIb23ufOFaWF3LetOrIpe45IqbMPin9iddA)[![Content Diff settings](https://private-user-images.githubusercontent.com/47326455/553263652-d845543e-7cdf-4e63-9465-3b7756fd7f3b.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI3ODA4NjUsIm5iZiI6MTc4Mjc4MDU2NSwicGF0aCI6Ii80NzMyNjQ1NS81NTMyNjM2NTItZDg0NTU0M2UtN2NkZi00ZTYzLTk0NjUtM2I3NzU2ZmQ3ZjNiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA2MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNjMwVDAwNDkyNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThhZTAwMmQ3MmY0ZGJlOTBlOGJlNDM3ZTVkNGZmOTNlZDM0Y2M4NDI5M2U5ZDg2NGZmYmZjZjdhNDJiNjNlMTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.76FD5kmaulCNx9gJnciItBX8IRCjeo7qGajkhdZOUXw)](https://private-user-images.githubusercontent.com/47326455/553263652-d845543e-7cdf-4e63-9465-3b7756fd7f3b.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI3ODA4NjUsIm5iZiI6MTc4Mjc4MDU2NSwicGF0aCI6Ii80NzMyNjQ1NS81NTMyNjM2NTItZDg0NTU0M2UtN2NkZi00ZTYzLTk0NjUtM2I3NzU2ZmQ3ZjNiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA2MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNjMwVDAwNDkyNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThhZTAwMmQ3MmY0ZGJlOTBlOGJlNDM3ZTVkNGZmOTNlZDM0Y2M4NDI5M2U5ZDg2NGZmYmZjZjdhNDJiNjNlMTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.76FD5kmaulCNx9gJnciItBX8IRCjeo7qGajkhdZOUXw)Compare entry content between Craft CMS environments (local, staging, production). View created, deleted, and updated entries with field-level diffs, including Matrix and nested blocks.

Requirements
------------

[](#requirements)

- Craft CMS 5.0.0 or later
- PHP 8.2 or later

Installation
------------

[](#installation)

```
composer require roadsterworks/craft-content-diff
./craft plugin/install craft-content-diff
```

Configuration
-------------

[](#configuration)

Configure in **Control Panel → Content Diff → Settings**. Use the same API key and (where relevant) env vars on **every environment** (local, staging, production) so the diff endpoint and dashboard work correctly.

SettingRequiredNotes**API key**YesSecret for the diff endpoint. Generate in Settings or set a literal / env alias (e.g. `$CRAFT_CONTENT_DIFF_API_KEY`). Same value on all envs.**Production URL**Yes (for staging/dev)Base URL of production (e.g. `https://example.com`). Literal or env alias.**Staging URL**Yes (for production/dev)Base URL of staging. Literal or env alias.**HTTP Basic auth**NoIf staging or production is behind server-level HTTP Basic auth, set username and password (literals or env aliases). Leave blank on an environment that does not use HTTP auth; you do not need to set empty env vars.Env aliases (e.g. `$CRAFT_CONTENT_DIFF_API_KEY`) are resolved at runtime using Craft’s `App::env()`.

Set **ENVIRONMENT** (or **CRAFT\_ENVIRONMENT**) to `dev`, `staging`, or `production` so the dashboard shows the right compare targets.

Cloudflare (or similar WAF)
---------------------------

[](#cloudflare-or-similar-waf)

Compare uses **server-to-server** requests (no browser, no cookies). If production or staging is behind **Cloudflare** (or another WAF), it may block or challenge those requests and the compare will fail with a connection or invalid-response error.

**Fix — step by step in Cloudflare:**

1. Go to **Security** → **WAF** → **Custom rules** (or **Security** → **Configuration** → **WAF Custom rules**).
2. Click **Create rule** (or **Add rule**).
3. **Rule name:** e.g. `Allow Content Diff endpoint`.
4. **Field / When:** Build an expression:
    - Choose **Field**: **URI Path** (under “Request”).
    - **Operator:** **equals** (or **contains**).
    - **Value:** `/actions/craft-content-diff/diff` (for equals) or `craft-content-diff/diff` (for contains).
        Do **not** use the full URL (no `https://` or domain).
5. (Optional) Click **Add condition** (or **And**): **Request Header** → **Name** `X-Content-Diff-Token` → **Operator** “is present” or “exists”, so only requests that send the API key are allowed.
6. **Action:** Choose **Skip** → **Skip all remaining custom rules**, or **Allow**. (“Skip” only skips WAF custom rules; if the request is still blocked, try **Allow** or check **Security** → **Events** to see which product blocked it.)
7. **Deploy** / **Save**.

If it still fails, open **Security** → **Events**, trigger a compare, find the request to `craft-content-diff/diff`, and check the **Action** and **Reason** (e.g. Bot Fight Mode, Security Level). Add an exception for that path or lower the security level for that URI if needed.

Licence
-------

[](#licence)

Proprietary (Craft License). See [LICENSE.md](LICENSE.md).

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance77

Regular maintenance activity

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

9

Last Release

125d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f3760f1cf019ae9d2014740accbdc071a32a65945cacb13a4c0354742f5f0e52?d=identicon)[roadsterworks](/maintainers/roadsterworks)

---

Top Contributors

[![harry2909](https://avatars.githubusercontent.com/u/47326455?v=4)](https://github.com/harry2909 "harry2909 (14 commits)")

### Embed Badge

![Health badge](/badges/roadsterworks-craft-content-diff/health.svg)

```
[![Health](https://phpackages.com/badges/roadsterworks-craft-content-diff/health.svg)](https://phpackages.com/packages/roadsterworks-craft-content-diff)
```

###  Alternatives

[spicyweb/craft-neo

A Matrix-like field type with block hierarchy

393813.5k10](/packages/spicyweb-craft-neo)[craftcms/feed-me

Import content from XML, RSS, CSV or JSON feeds into entries, categories, Craft Commerce products, and more.

293952.6k33](/packages/craftcms-feed-me)[verbb/formie

The most user-friendly forms plugin for Craft.

102393.6k70](/packages/verbb-formie)[solspace/craft-freeform

The most flexible and user-friendly form building plugin!

54681.3k19](/packages/solspace-craft-freeform)[verbb/comments

Add comments to your site.

13753.9k](/packages/verbb-comments)[verbb/vizy

A flexible visual editor field for Craft.

4250.4k](/packages/verbb-vizy)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
