Ropemark Image Marking for the EU AI Act
WordPress plugin: AI badge, label and provenance metadata for AI-generated images (EU AI Act art. 50). By The Rope.
by The Rope · github.com/wearetherope/ai-act-image-disclosure · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/wearetherope/ai-act-image-disclosure/archive/refs/heads/main.zipReadme
Ropemark Image Marking for the EU AI Act
WordPress plugin for the EU AI Act, article 50. It marks AI-generated images that lack the IPTC marking, keeps the marking (XMP, IPTC) in every image size WordPress generates, discloses it on the page (AI badge with provenance popup, label, notice, schema.org) and documents it in the Media Library (classification, filters, export). Plugin slug ropemark-image-marking-for-eu-ai-act; the repository keeps its original name.
Made by The Rope. GPL-2.0-or-later.
Why
Since 2 August 2026 AI-generated and AI-manipulated images must be marked in a machine-readable way, and deepfakes (including photorealistic portraits of people who do not exist, per the Commission guidelines of 20 July 2026) must be disclosed visibly to the public.
WordPress leaves the uploaded file untouched, but every generated size (thumbnail, medium, large and the -scaled copy served as "full" above 2560 px) goes through GD or Imagick and loses XMP and IPTC. Measured on WordPress 7.1 with GD: the original keeps DigitalSourceType, disclosure text and C2PA manifest; the seven generated files carry nothing. Those are the files the pages show.
What it does
- Visible disclosure: round semi-transparent "AI" badge in a chosen corner (text or icon, diameter, colors, opacity, minimum width, tooltip) with a provenance popup kept as hidden HTML in the page; per-image choice (follow settings, always, never); optional text label, site notice,
[ropemark_disclosure]shortcode and block;data-ai-generatedanddata-digital-source-typeattributes; schema.orgImageObjectwithdigitalSourceType. - Machine-readable marking: reads the provenance of the original (IPTC digital source type, description, creator, credit, rights, C2PA presence and signers) and copies the XMP and IPTC segments into every generated size without re-encoding. JPEG (APP1 + APP13), PNG (
iTXt), WebP (XMPchunk, VP8X header created when missing). - Manual classification (AI generated, AI modified, not AI), per image and in bulk: an AI classification writes the IPTC digital source type into sizes and, without C2PA, into the original. Files with generator traces (Midjourney, DALL·E, Firefly, Stable Diffusion, ComfyUI, Google, OpenAI...) are listed as suspected AI, to confirm.
- Control: which images (AI only, or every image with metadata), what to carry (full blocks or a minimal provenance packet), which sizes, and whether to clean post-production traces from the original while keeping the marking (never on files with a C2PA manifest).
- Media Library: column and badge in list view, badge on grid tiles, read-only provenance panel in the attachment details, filter by provenance (list and grid), re-scan per file.
- Library scan in batches, CSV export, WP-CLI (
wp ropemark scan). - REST:
_ropemark_provenanceand_ropemark_aion the attachment endpoint.
It does not detect AI from pixels, does not copy C2PA manifests into derivatives (their hard binding covers the original bytes only), and does not write AVIF yet.
Install
Clone or download into wp-content/plugins/ropemark-image-marking-for-eu-ai-act, activate, then Media → Ropemark. Requires WordPress 6.1 and PHP 7.4.
Developers
$record = ropemark_get_provenance( $attachment_id ); // digital_source_type, ai, description, creator, credit, rights, generators, has_c2pa, ...
if ( ropemark_is_ai_generated( $attachment_id ) ) { /* ... */ }
add_filter( 'ropemark_should_preserve', fn( $want, $id, $record ) => $want, 10, 3 );
add_filter( 'ropemark_decorate_image', fn( $show, $record, $html ) => $show, 10, 3 );
add_filter( 'ropemark_badge_text', fn( $text, $record ) => $text, 10, 2 );
add_filter( 'ropemark_label_text', fn( $text, $record ) => $text, 10, 2 );
add_filter( 'ropemark_popup_rows', fn( $rows, $record ) => $rows, 10, 2 );
define( 'ROPEMARK_CREDIT_DEFAULT', true ); // wp-config.php: credit line in the popup on by default
add_action( 'ropemark_after_inject', fn( $id, $result ) => null, 10, 2 );
CSS classes for the front end: .ropemark-wrap, .ropemark-ai-badge, .ropemark-pos-{bottom-right|bottom-left|top-right|top-left}, .ropemark-popup, .ropemark-label, img[data-ai-generated].
Development
for f in $(git ls-files '*.php'); do php -l "$f"; done
The GitHub workflow lints every PHP file on PHP 7.4 to 8.4 and runs the WordPress Plugin Check. Translations: languages/ropemark-image-marking-for-eu-ai-act.pot, Italian included.
Marking files before upload
The plugin reads what the file declares. Most generators embed a C2PA manifest; any DAM or an exiftool command can write Iptc4xmpExt:DigitalSourceType before upload. Files without marking can be classified by hand in the Media Library.
License
GPL-2.0-or-later. Copyright (C) 2026 The Chain S.r.l.