An article being edited: the uploaded image on the left, and on the right the AI disclosure field showing a pending suggestion, Autonomously AI generated, read from a trusted content credential, with Accept and Dismiss buttons.
The module settings form: which content types are read, and the choice of reading route (signing service, ext-c2pa extension or pure-PHP verifier).
The status report: the module reads one bundle through the verifier route, and warns that the C2PA test root is among the trust anchors.

This project is not covered by Drupal’s security advisory policy.

An editor uploads a photo that was made with AI. Your site notices, and suggests the disclosure.

Content Credentials reads the C2PA content credential inside an uploaded image, video or audio file: a signed record, written by the software that made the file, of how it was made. When that record says a generative model made it, the module suggests the matching grade in AI Disclosure. An editor accepts or dismisses it.

Alpha release: try it and report what you find

1.0.0-alpha6 is the current release. It has been tested end to end on Drupal 11.4, and its test suite runs on 11.3 and 11.4, but it has not run on a production site yet. Try it on a test or staging site first, and report what you find in the issue queue.

How it works

  1. An editor adds an image, video or audio file and saves. The save is not slowed down: the file waits in a queue.
  2. On the next cron run the module reads the file's content credential.
  3. If the credential is signed by a certificate your site trusts and says the file was made by AI, AI Disclosure records a pending suggestion, for example Autonomously AI generated.
  4. The editor sees it on the edit form and accepts or dismisses it.

No credential, an unsigned one or one your site does not trust: nothing happens.

The edit form with the uploaded image, and the AI disclosure field with a pending suggestion, Autonomously AI generated, with Accept and Dismiss buttons.

Only trusted credentials count

The credential arrives with the file, so anyone can write one. A credential your site does not trust gives no suggestion at all, not a weaker one.

A suggestion, never a decision

Nothing is labelled or published automatically. There is no setting to apply a grade without an editor.

Features

  • You choose what is read. Select the content types or media types to read. Existing content is left alone; a file is read when it is added or replaced.
  • Works with Media. Select the media type, for example Image, and the suggestion appears on the media item.
  • Images, video and audio. JPEG, PNG, WebP, AVIF, GIF, TIFF, SVG, MP4, QuickTime, AVI, WAV, FLAC and MP3.
  • No guessing. When one AI term matches several grades you set the order. A term without a match is logged and skipped.
  • Files re-signed by another module. When a module such as C2PA Sign signs every upload, the AI origin is read from the trusted file underneath. Use C2PA Sign 1.5.0 or later: earlier releases lose the origin of a file in the current C2PA format.
  • A status report that tells you what is wrong. It says whether the module is reading, and warns when a setting will stop suggestions from appearing, or lets an uploader decide what reads as trusted.
  • Evidence you can show, if you want it. On the pure-PHP route the module can keep, for every file it reads, what its verdict rested on: the certificates, time-stamps and trust lists. The records are chained, so a later change shows, and editors open them beside the suggestion. Off by default; a certificate can name the person who signed. Set how long documents and records are kept, or erase one by hand.

The status report, where the module reads one bundle through the verifier route, and warns that the C2PA test root is among the trust anchors.

Choose how files are read

Pick one on the settings form. A route whose software is not installed is greyed out there, with how to install it.

Route Choose it when You need
Pure-PHP verifier You want nothing extra on the server. Works on shared hosting. provemark/c2pa-verifier. Does not read TIFF or SVG.
Signing service over HTTP You run, or can reach, a C2PA reading service. Its https:// address and an API key.
ext-c2pa PHP extension You can install PHP extensions and trust the people who upload. ext-c2pa in the PHP that runs cron. MP3 files are skipped.

The verifier and the extension check signatures against the certificates you paste in, called trust anchors. The README says which of C2PA's official trust lists goes in which field.

The settings form, with which content types are read, and the choice of reading route.

What it does not do

  • It does not sign or change files. It only reads.
  • It shows visitors nothing. The label they see is AI Disclosure's.
  • It does not work without AI Disclosure: that is where the suggestion goes.

Related modules

  • AI Disclosure, by sjpagan, holds the grades, the field and the screen where an editor accepts or dismisses a suggestion. This module only adds suggestions to it.
  • C2PA Sign does the other half: it signs the files your site serves, with the grade AI Disclosure stores.

Two articles by the AI Disclosure maintainer show the three modules together:

Requirements

  • Drupal 11.3 or later, PHP 8.3 or later
  • AI Disclosure 1.0.0-beta1 or later. An editor's decision on a suggestion stays when a later file reads the same. The command below installs it on a new site.
  • Composer. The module depends on provemark/content-credentials, which a downloaded tarball cannot include.

Installation

composer require drupal/ai_disclosure:^1.0.0-beta1
composer require drupal/content_credentials:^1.0@alpha

# For the pure-PHP route:
composer require provemark/c2pa-verifier:^0.10

Run both lines. AI Disclosure has no stable release yet, so Composer installs it only when your project asks for it by name. The install line under Releases, on its own, stops with "does not match your minimum-stability".

Updating from an earlier alpha: composer update drupal/content_credentials, then drush updatedb. From 1.0.0-alpha4 the update adds the evidence archive's two tables; the archive stays off until you turn it on. From 1.0.0-alpha5 it also adds the archive's retention periods, both 0, so nothing kept is erased until you set one. A site still on AI Disclosure 1.0.0-alpha3 must update both: composer update drupal/content_credentials drupal/ai_disclosure, then drush updatedb; updating this module alone changes nothing.

Enable the module and go to Configuration → Content authoring → Content credentials:

  1. Select the content types or media types to read.
  2. Choose a reading route and, for the verifier or extension, paste in your trust anchors.
  3. Make sure each selected type has an AI disclosure field. That is where the editor sees the suggestion.

The service API key is not on the form, because configuration usually ends up in Git. Set it in settings.php:

$config['content_credentials.settings']['reader']['api_key'] = getenv('CC_API_KEY');

Known issues in 1.0.0-alpha6

When an image field scales an upload, the module keeps the original in the site's temporary directory until it is read, readable only by the PHP user that handled the upload. Run cron as that user, on a host that shares the temporary directory; otherwise the scaled file is read and no suggestion is made.

The evidence archive has no list page, and retention deletes records from the oldest end only. Its chain shows a change; it does not stop someone who can rewrite the database table from recomputing it. The other known issues are listed in the CHANGELOG.

Try it locally

The README takes you from a fresh site to a suggestion on screen, with the verifier route and a signed sample image that ships with the module. No Docker needed.

Read the README

Project information

Releases