Content Credentials
Status: early development, no supported release yet
There is deliberately no release. The code works and has run end to end against a real signing service on a Drupal 11.4.6 site, but it has never run in production, and until a release exists this project is not something to put on a live site.
What is honest about where it stands: every acceptance criterion is traced to a test that was watched failing for its own reason, and the two most useful defects found so far -- a suggestion stored where no field could display it, and a queue that retried work it could never finish -- were both invisible to that suite and turned up only when somebody used the software. Expect more of those.
What there is instead is a development snapshot on the 1.0.x branch, installable as drupal/content_credentials:1.0.x-dev. A tagged release will come when this has been used by somebody other than its author, and it will be an alpha.
Editors are increasingly asked to disclose whether content was made with AI. AI Disclosure records such a disclosure when a caller supplies one, which assumes somebody was present when the content was made. For a file the site simply receives, nobody was.
A C2PA content credential travels with the file and carries an IPTC digitalSourceType URI — the same URIs AI Disclosure's grades already store. So the file can answer the question the editor cannot. This module reads it and offers the answer as a suggestion.
Features
- Opt in per entity type and bundle. Nothing is read until you name one: enabling a module should not start opening every file on a site. Only bundles carrying a file or image field are offered.
- The read never happens in the save request. Saving enqueues; a queue worker reads. Reading a file and calling a sidecar service inside a save times out on exactly the sites uploading the largest media.
- Trust gates the write. The manifest arrives with the uploaded file, so it is attacker input. Only a manifest the reader reports as trusted produces a suggestion at all — an untrusted one is not a weaker suggestion, it is none. Otherwise an uploader could write the site's own AI label.
- Never a guessed grade. One IPTC term can carry several grades and nothing in a manifest breaks the tie, so the mapping is a configurable ordered list per URI. A URI that matches nothing is logged and stops.
- A suggestion, never a decision. Only AI Disclosure's suggest() is called. Results arrive as a pending suggestion for an editor to accept or ignore.
- Files above a ceiling are skipped unread (15 MiB by default), and the skip is logged — skipped is not the same outcome as "carries no credentials".
- The status report tells apart the three states that look identical from outside: reading nothing, configured with a route that cannot answer, and working.
Post-Installation
Go to Configuration → Content authoring → Content credentials, or use the Configure link on the Extend page. Permission: Administer content credentials.
Two things need a decision there. Name the entity types and bundles that should be read, and choose a reading route — a signing service over HTTP, or the ext-c2pa PHP extension in the web process. Neither is chosen for you.
The service API key is deliberately not a field on that form. Drupal configuration is exported to code and usually committed, so a credential written there would land in Git. Set it in settings.php instead:
$config['content_credentials.settings']['reader']['api_key'] = getenv('CC_API_KEY');
The form says whether a key is in effect, and saving never erases one it did not show.
A suggestion needs somewhere to appear: AI Disclosure shows one through its own field, so a participating bundle without that field stores suggestions nobody can see. The status report warns about that.
Additional Requirements
- Composer is required, not preferred. This module depends on provemark/content-credentials, which is not a Drupal project and is not on packages.drupal.org. A release tarball cannot bring it, so a site that installs this module by downloading one gets a module that cannot boot.
- PHP 8.3 or later, because that library requires it. A Drupal 10.4 site on PHP 8.1 or 8.2 cannot install this module, whichever reading route it picks.
- A reading route. Either a C2PA signing/reading service reachable over HTTP, or the ext-c2pa PHP extension.
- AI Disclosure has no stable release yet, so ask for it by name first:
composer require drupal/ai_disclosure:^1.0@alpha
composer require drupal/content_credentials
Recommended modules/libraries
AI Disclosure is required, not merely recommended: it owns the grades, the field on your content, the stored suggestion and the screen an editor accepts it on. This module owns one step — reading the credential and turning its IPTC term into one of those grades. Disable this module and your disclosures stay exactly as they are; only new suggestions stop arriving.
Depends on
Dependencies of the latest stable release
No dependencies recorded for this project.
Required by
Tracked projects that depend on this one
No tracked projects depend on this one yet.
Activity
Releases
| Version | Type | Core | Notes | Release date | |
|---|---|---|---|---|---|
| 1.0.x-dev | Dev | 10–11 | Development snapshot. Works on a real site; has never run in production. | Sep 9, 2026 |