{"id":343971,"date":"2026-07-24T19:09:19","date_gmt":"2026-07-24T19:09:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/eu-ai-act-media-marker\/"},"modified":"2026-07-24T19:08:58","modified_gmt":"2026-07-24T19:08:58","slug":"radermacher-ai-media-marker","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/radermacher-ai-media-marker\/","author":17776826,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0.2","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Radermacher AI Media Marker","header_author":"Radermacher.Online","header_description":"Server-side, cache-proof labeling of AI-generated images. Supports the transparency obligations of Article 50 of the EU AI Act.","assets_banners_color":"0e4255","last_updated":"2026-07-24 19:08:58","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/radermacher.online\/","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":23,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"chrisrade","date":"2026-07-24 19:08:58"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3621839,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3621839,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3621839,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3621839,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3621839,"resolution":"1","location":"assets","locale":"","width":2880,"height":1800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3621839,"resolution":"2","location":"assets","locale":"","width":2880,"height":1800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3621839,"resolution":"3","location":"assets","locale":"","width":2880,"height":1800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3621839,"resolution":"4","location":"assets","locale":"","width":2880,"height":1800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3621839,"resolution":"5","location":"assets","locale":"","width":1100,"height":735},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3621839,"resolution":"6","location":"assets","locale":"","width":1600,"height":1000}},"screenshots":{"1":"Frontend badge on a Cover block \u2014 server-side, cache-proof, no JavaScript.","2":"Media library list view with the AI column and status filter.","3":"Attachment details: AI disclosure field with a detection suggestion.","4":"Settings page with live badge preview.","5":"Icon-only style using the official EU \"AI GENERATED\" label.","6":"WP-CLI audit export: wp aiim list --format=csv."}},"plugin_section":[],"plugin_tags":[216086,23968,254918,4096,25098],"plugin_category":[],"plugin_contributors":[273213],"plugin_business_model":[],"class_list":["post-343971","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-images","plugin_tags-disclosure","plugin_tags-eu-ai-act","plugin_tags-iptc","plugin_tags-transparency","plugin_contributors-chrisrade","plugin_committers-chrisrade"],"banners":{"banner":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/banner-772x250.png?rev=3621839","banner_2x":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/banner-1544x500.png?rev=3621839","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/icon-128x128.png?rev=3621839","icon_2x":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/icon-256x256.png?rev=3621839","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/screenshot-1.png?rev=3621839","caption":"Frontend badge on a Cover block \u2014 server-side, cache-proof, no JavaScript."},{"src":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/screenshot-2.png?rev=3621839","caption":"Media library list view with the AI column and status filter."},{"src":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/screenshot-3.png?rev=3621839","caption":"Attachment details: AI disclosure field with a detection suggestion."},{"src":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/screenshot-4.png?rev=3621839","caption":"Settings page with live badge preview."},{"src":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/screenshot-5.png?rev=3621839","caption":"Icon-only style using the official EU \"AI GENERATED\" label."},{"src":"https:\/\/ps.w.org\/radermacher-ai-media-marker\/assets\/screenshot-6.png?rev=3621839","caption":"WP-CLI audit export: wp aiim list --format=csv."}],"raw_content":"<!--section=description-->\n<p>Radermacher AI Media Marker does one thing at production quality: it labels\nAI-generated images in your media library and renders a clear, accessible\nbadge on the frontend \u2014 injected server-side into the HTML, so it works\nwith every page cache and never flickers.<\/p>\n\n<p><strong>What it does<\/strong><\/p>\n\n<ul>\n<li>Mark images as AI-generated in the media library (single, bulk, or WP-CLI)<\/li>\n<li>Automatic detection from IPTC\/XMP metadata (<code>DigitalSourceType<\/code>) and C2PA\nmanifests on upload \u2014 deterministic signals only, no guessing<\/li>\n<li>Filename-based <em>suggestions<\/em> (Midjourney, DALL\u00b7E, \u2026) that you confirm \u2014\nthe plugin never auto-marks from heuristics<\/li>\n<li>Server-side badge injection for core blocks: Image, Cover (including\nbackground variant), Media &amp; Text, Post Featured Image (including Query\nLoop), Site Logo \u2014 plus theme template images and Classic Editor content<\/li>\n<li>Localized, accessible badge: real text, screen-reader label, no\nJavaScript, cache-proof by design<\/li>\n<li>Machine-readable marking: write IPTC\/XMP <code>DigitalSourceType<\/code> into all\nimage sizes \u2014 pure PHP, lossless (files are never re-encoded), works on\nevery host, with a verify\/repair command against optimizer stripping<\/li>\n<li>WP-CLI for agency workflows: <code>wp aiim scan<\/code>, <code>mark<\/code>, <code>list --format=csv<\/code>\n(audit export), <code>write-meta<\/code>, <code>verify-meta<\/code><\/li>\n<\/ul>\n\n<p><strong>What it deliberately does not do<\/strong><\/p>\n\n<p>This is not a compliance suite. No readiness scores, no chatbot notices,\nno assessment wizards. Depth over breadth.<\/p>\n\n<p><strong>Legal note<\/strong><\/p>\n\n<p>This plugin is a technical tool supporting the transparency obligations of\nArticle 50 of the EU AI Act. It does not constitute legal advice and does\nnot guarantee compliance.<\/p>\n\n<h3>Beschreibung (Deutsch)<\/h3>\n\n<p>Radermacher AI Media Marker kennzeichnet KI-generierte Bilder in der Mediathek\nund rendert ein klares, barrierefreies Badge im Frontend \u2014 serverseitig ins\nHTML eingef\u00fcgt, damit es mit jedem Page-Cache funktioniert.<\/p>\n\n<p><strong>Rechtlicher Hinweis:<\/strong> Dieses Plugin ist ein technisches Werkzeug zur\nUnterst\u00fctzung der Transparenzpflichten nach Art. 50 der EU-KI-Verordnung.\nEs stellt keine Rechtsberatung dar und garantiert keine Rechtskonformit\u00e4t.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20plugin%20really%20free%20%E2%80%94%20also%20for%20commercial%20use%3F\"><h3>Is the plugin really free \u2014 also for commercial use?<\/h3><\/dt>\n<dd><p>Yes. The plugin is free software under the GPL, for every kind of site,\nwith no feature restrictions. If it serves your business, you can back\nits development with a voluntary supporter license (a small subscription\nwith a certificate naming your domains) \u2014 entirely optional, the plugin\nworks identically without it.<\/p><\/dd>\n<dt id=\"does%20the%20badge%20work%20with%20caching%20plugins%3F\"><h3>Does the badge work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes, by design. The badge is part of the server-rendered HTML, so it is\ninside whatever your page cache stores. There is no frontend JavaScript.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20guarantee%20eu%20ai%20act%20compliance%3F\"><h3>Does this plugin guarantee EU AI Act compliance?<\/h3><\/dt>\n<dd><p>No. It is a technical tool that supports the transparency obligations of\nArticle 50. It does not constitute legal advice and does not guarantee\ncompliance.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20use%20the%20official%20eu%20icons%3F\"><h3>Does the plugin use the official EU icons?<\/h3><\/dt>\n<dd><p>Yes. The \"EU label\" and \"icon only\" badge styles use the European\nCommission's official icon for labelling AI-generated content\n(published 10 June 2026), bundled locally \u2014 no CDN. Per the\nCommission's own guidance, using the icon does not by itself establish\nlegal compliance.<\/p><\/dd>\n<dt id=\"can%20i%20show%20only%20an%20icon%20instead%20of%20the%20text%20badge%3F\"><h3>Can I show only an icon instead of the text badge?<\/h3><\/dt>\n<dd><p>Yes, as an opt-in \"icon only\" style. The screen-reader text and a tooltip\nwith the full disclosure always remain. Be aware: an icon alone may not\nsatisfy the \"clear and distinguishable\" requirement of Art. 50(5) EU AI\nAct. If you use this style, add a clearly visible explanation on the page\n(for example a footer legend) and review the choice with your legal\ncounsel. This is not legal advice.<\/p><\/dd>\n<dt id=\"what%20about%20emails%20and%20social%20media%20preview%20images%3F\"><h3>What about emails and social media preview images?<\/h3><\/dt>\n<dd><p>HTML badges cannot reach those contexts. The metadata layer (IPTC\/XMP\n    DigitalSourceType written into the files) is the answer there.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Renamed to \"Radermacher AI Media Marker\" (slug\n  radermacher-ai-media-marker) following wordpress.org review feedback\nthat the previous name was too generic. Functionality, settings, and\nmarkings are unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed to \"AI Media Marker\" (slug <code>ai-media-marker<\/code>) following\nwordpress.org review feedback on the previous name. Functionality,\nsettings, and markings are unchanged.<\/li>\n<li>Admin CSS\/JS (media list column, settings page preview and scan) now\ndelivered via wp_add_inline_style\/wp_add_inline_script instead of\nprinted tags.<\/li>\n<li>Hardening: metadata writing refuses any file path that resolves\noutside the uploads directory, even if attachment metadata was\ntampered with.<\/li>\n<li>Translations now come from translate.wordpress.org language packs;\nthe German translation files are no longer bundled.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release: deterministic IPTC\/XMP\/C2PA detection,\nserver-side badge rendering for all supported core blocks, official\nEU icons with source-type auto-match, lossless pure-PHP metadata\nwriting into all image sizes, WP-CLI with CSV audit export, German\ntranslations (de_DE, de_DE_formal).<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>WP-CLI commands (scan, mark, list with CSV audit export, write-meta,\nverify-meta) and pure-PHP metadata writing: IPTC\/XMP DigitalSourceType\nwritten losslessly into all sizes of marked images, on every host.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Internal MVP: marking layer with deterministic IPTC\/XMP\/C2PA detection,\nserver-side badge rendering for all supported core blocks, settings page\nwith live preview and media library scan, German translations.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial scaffold.<\/li>\n<\/ul>","raw_excerpt":"Reliable, server-side, cache-proof labeling of AI-generated images. Supports the transparency obligations of Article 50 of the EU AI Act.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/343971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=343971"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/chrisrade"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=343971"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=343971"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=343971"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=343971"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=343971"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=343971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}