تفصیل
TransparAI finds AI-generated images in your WordPress media library, labels them with a visible AI badge and writes a machine-readable AI disclosure (the IPTC digital source type) into the image files themselves. That covers both duties of Article 50 of the EU AI Act for AI-generated media: a visible disclosure and a machine-readable marking. The tedious part, finding the AI content in the first place, is automated.
Automatic AI image detection
Most AI generators leave traces in the files they produce, and TransparAI reads all of the common ones:
- C2PA manifests (Content Credentials) as embedded by OpenAI (ChatGPT, DALL-E and GPT-Image), Adobe Firefly, Google Gemini (Nano Banana output included) and Bing Image Creator
- The IPTC digital source type in XMP metadata, the marking Midjourney and a growing number of tools write
- Generation parameters in PNG text chunks from Stable Diffusion (AUTOMATIC1111), ComfyUI, NovelAI and InvokeAI
- EXIF and XMP generator signatures for Flux (Black Forest Labs), Leonardo.Ai, Ideogram, Recraft, Seedream and Photoshop Generative Fill
- JPEG comment markers, C2PA declarations in MP4 video and AI declarations in MP3 audio (ID3)
Detection parses the actual file containers (JPEG segments, PNG chunks, RIFF, MP4 boxes, ID3 frames) and matches only inside real metadata blocks. It never runs a blind text search over raw file bytes, so a Spanish caption containing the word "imagenes” will not trigger anything. One catch many tools get wrong: cameras from Leica, Sony and Nikon also embed Content Credentials into real photos, so a C2PA manifest alone never auto-labels anything here.
Review queue instead of blind trust
Findings come with a confidence level. Files that explicitly declare their AI origin can be labeled automatically. Strong but informal signals land in a review queue where you confirm or dismiss them, one by one or in bulk, directly in the media library. New uploads are checked as they come in; for everything older there is a batched scan of the whole library with a progress bar, pausable at any time. Media generated by AI plugins on your own site (AI Engine, AI Power, Elementor AI, WordPress AI) is labeled at the source, no file inspection needed.
The visible AI badge
A configurable badge marks labeled media in the front end. Overlay or a caption line, four positions, three sizes, dark, light, outline or icon-only, optional generator name, optional alt text note for screen readers. An optional start date limits the badge to media uploaded on or after that day, so you can introduce the labeling on an existing site without retroactively badging older content; earlier media stay labeled in the admin only. The badge is rendered server-side, so it survives page caching, and it works with the block editor (images, galleries, covers, featured images, inline images, video and audio), the classic editor, template images, text widgets, WooCommerce product and shop pages including the gallery lightbox, Elementor free and Pro including Theme Builder, and WPBakery Page Builder, each image module tested one by one.
Themes love to stack their own layers over images (hover effects, gradient scrims, zoom icons). TransparAI checks the real paint order: a badge that is actually covered is raised, moved to a free corner or, as the last resort, turned into a caption line below the image, automatically. Every single image can also get its own badge position, a caption line or no visible badge at all, straight from its attachment details, and documented CSS utility classes give theme builders the same control per container. An optional extra labels images printed without an attachment ID (ACF fields returning a URL, sliders) and CSS background images through a small script, late-loading galleries and AJAX grids included.
Two optional disclosure layers round it off: a short site-wide note at the end of every page that contains labeled media, and a per-post checkbox that puts a configurable "created with the help of AI” line ahead of AI-written content. When a label changes, TransparAI tells the common page-cache plugins (WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache and others) to refresh, so cached pages never keep an outdated badge state.
Machine-readable AI labeling in the files
For labeled files TransparAI writes the IPTC digital source type (trainedAlgorithmicMedia, or compositeWithTrainedAlgorithmicMedia for AI-edited media) as XMP metadata into JPEG, PNG, WebP and AVIF, including every size variant WordPress generated. Google reads this field and can show an AI notice in image search. Each page additionally carries Schema.org JSON-LD (ImageObject and VideoObject with digitalSourceType) for its labeled media, so search engines get the AI declaration without opening a single file.
Your existing metadata is safe: an existing XMP packet is merged, not replaced, and unlabeling removes exactly what this plugin wrote. Writes are atomic and validated first, so a failed write cannot corrupt an image. And because image optimizers and thumbnail regeneration tend to strip metadata, TransparAI fingerprints every labeled file and restores missing AI declarations in an hourly integrity sweep.
For larger setups
Every label, review decision and repair is recorded per file with its time and the editor who made it, and the whole library can be exported as a CSV audit list straight from the plugin page, so the question "who declared this image AI-generated, and when” has an answer months later. WP-CLI commands for scanning, labeling and auditing: wp transparai scan, wp transparai status --format=csv for the same export on the command line, wp transparai verify-meta --repair to check and fix the in-file metadata. Other plugins can label media through do_action( 'transparai_mark_ai', $attachment_id, 'My Generator' ), the detection rules are extensible via filters, translation setups are covered by a bundled WPML configuration, and uninstalling cleans up across every site of a multisite network when you ask it to.
The plugin runs entirely on your server. No accounts, no telemetry, and no request to anyone else: the only HTTP request it can make is the optional delivery check, which asks your own site for one image to see whether your CDN strips the declaration on the way out. Please also read the Disclaimer section below.
The interface is available in English, German, French, Spanish, Italian and Dutch.
Contact: TransparAI@cms-admins.de
For developers
Everything below is stable API surface; the prefixes are transparai_ for hooks and options and _transparai_ for attachment meta.
Attachment meta (registered for the REST API, readable and writable with upload_files capability):
_transparai_ai:'1'when the attachment carries the confirmed AI label, absent otherwise. This is the single source of truth for badge and file metadata._transparai_type:generatedorcomposite(AI-edited). Controls which digital source type is written._transparai_source: where the detection came from (c2pa,xmp-dst,iim,png-chunk,exif,com,id3,sidecar,filename,context)._transparai_generator: detected generator name, for exampleMidjourneyorOpenAI._transparai_confidence:certain,likelyorhint._transparai_detected:'1'while an unconfirmed detection waits in the review queue. Kept strictly apart from the public label._transparai_history: JSON list of the last ten events for this file, oldest first. Each entry is{"t":unix time,"e":event,"u":user ID,"s":source}, with the eventsflagged,confirmed,unflagged,queued,dismissed,repairedandwrite-failed. Written byTransparAI_Meta::record(), read withTransparAI_Meta::history()andTransparAI_Meta::last_change();TransparAI_Meta::audit_rows()returns the rows behind both the CSV export andwp transparai status._transparai_delivery: result of the last delivery check as{"t":unix time,"verdict":verdict}, withintact,stripped,unreachable,unmarkedorforeign-host. Only written when the check is enabled and someone runs it; read it withTransparAI_Delivery::last_result()._transparai_badge_pos: badge placement for this one image, overriding the site setting.top-left,top-right,bottom-left,bottom-right,below(caption line under the image) orhidden. Absent means the site setting applies.
Label media from your own code (an AI image generator plugin, an import script):
do_action( 'transparai_mark_ai', $attachment_id, 'My Generator' );
This sets the confirmed label, records the generator name and, with file writing enabled, writes the metadata into the files. Existing labels are never overwritten.
Extend or veto detection:
add_filter( 'transparai_signatures', function ( $signatures ) { $signatures[] = array( 'pattern' => '/my-generator/i', 'generator' => 'My Generator' ); return $signatures; } );
transparai_detection_result filters the final result per file (or `null`); return `null` to veto a detection, or return a result array to add your own. Both filters receive documented shapes, see the source of `TransparAI_Detector`.
Customize the badge output:
transparai_badge_html filters the badge element per attachment (`$html, $attachment_id`); `transparai_badge_wrap_classes` filters the wrapper class list (`$classes, $attachment_id`, `0` for the shared template of the optional script).
Place badges from your theme or builder. Put one of these classes on any container and it applies to every badge inside it, which works in every builder because they all allow custom classes:
trai-badge-top-left,trai-badge-top-right,trai-badge-bottom-left,trai-badge-bottom-right: move the badges to that corner.trai-badge-below: show them as a caption line under the media instead of on it.trai-badge-hidden: no visible badge inside this container. File metadata and structured data stay untouched.trai-badge-manual: keep the position as configured and switch the automatic overlay guard off for this subtree.
The first six switch the guard off by themselves, since a placement you chose should not be second-guessed. The stacking level of all badges is the CSS custom property --trai-badge-z (default 30, raised to 99 only where the guard found a real overlap); it inherits, so a theme can tune it globally or per container with a single declaration and without touching the stylesheet. The markup is one wrapper span carrying the state classes plus span.trai-badge directly after the media element.
WP-CLI (wp transparai <command>):
scan [--all] [--dry-run]: scan the library;--allrescans everything,--dry-runonly reports.flag <id>... [--source=<text>]andunflag <id>...: set or remove labels in bulk.status [--status=flagged|detected|all] [--format=table|csv|json|ids|count]: audit export, for examplewp transparai status --format=csv > ai-audit.csv.write-meta [--dry-run] --yesandverify-meta [--repair]: write and verify the in-file metadata.verify-delivery [<id>...] [--sample=<n>]: fetch labeled images over their own public URL and report whether the declaration survives delivery. Needs the delivery check enabled in the settings.
Theme integration: print attachment images through wp_get_attachment_image() (or markup carrying the wp-image-{ID} class) and the badge is rendered server-side and page-cache safe. For raw URL output and CSS backgrounds there is the optional script described above; it wraps matched images with the same markup (span.trai-wrap around the image plus span.trai-badge), so any CSS you write applies to both paths.
External services
None. The plugin makes no requests to external services, and it never sends your media or any data about your site anywhere.
The optional delivery check is the only feature that makes an HTTP request at all, and it requests your own site: when you switch it on in the settings and then press "Check delivery”, the plugin downloads one image from your own public URL and compares the bytes with the file on disk. That is how an optimizing CDN or image proxy that quietly re-encodes your images and drops the AI declaration becomes visible. The check is off by default, it never runs on its own, and it stops before requesting anything if the image is served from a different host than your site.
Privacy
TransparAI processes media files locally on your server and stores its results in the WordPress database (attachment meta and one settings option). The optional delivery check, when you enable it and press the button, requests one image from your own site to see what visitors receive; nothing is sent to a third party. The per-file history records the WordPress user ID of whoever labeled, confirmed or dismissed a file, so a site can show who made a disclosure decision; it holds the last ten events per file and is removed with everything else when you uninstall with data removal enabled. It does not collect, transmit or share any data, and it sets no cookies.
Disclaimer
TransparAI is a technical tool, not legal advice, and it is provided "as is”, without warranty of any kind, to the extent permitted by applicable law (see sections 11 and 12 of the GNU General Public License, version 2).
In particular, the author makes no representation, warranty or guarantee:
- that using this plugin makes your site compliant with the EU AI Act, the Digital Services Act or any other law, regulation or standard. Legal obligations depend on your specific situation and remain solely your responsibility as the site operator; consult a qualified professional for legal questions.
- that AI-generated media is detected completely or correctly. Detection is based on metadata embedded by generators; files whose metadata was stripped carry no detectable signals, and detected metadata is an indication, not proof.
- that any function of the plugin (detection, badges, metadata writing, repair, integrations) operates without errors or interruption in every environment.
You use this plugin at your own risk. To the extent permitted by law, the author accepts no liability for damages arising from the use of, or inability to use, this software, including but not limited to lost data, lost profits or claims by third parties.
اسکرین شاٹس




انسٹالیشن
- Install the plugin from the WordPress plugin directory (Plugins, Add New, search for "TransparAI”) or upload the ZIP, then activate it.
- Open Media, TransparAI. New uploads are checked automatically from now on.
- Click Scan new/unscanned media to go through your existing library in small batches, pausable at any time.
- Clear declarations are labeled right away; strong signals land in the review queue. Follow the Open review queue link and confirm or dismiss each item, single or in bulk. A camera photo with Content Credentials shows up here on purpose; dismiss it once and it stays dismissed. Media you have already decided on yourself is reported as skipped in the scan summary and is never overruled.
- Adjust the badge under Visible badge, and if your theme prints images without an attachment ID (ACF URL fields, sliders) or uses CSS backgrounds, enable the extra option under Extras.
- Single image sitting awkwardly? Open its attachment details and pick a Badge position there: another corner, a caption line below the image, or no visible badge for that one image.
Everything else runs on its own: labeled files get the IPTC digital source type written into the file (verify with exiftool -XMP-iptcExt:DigitalSourceType image.jpg), and the hourly sweep restores metadata that optimizers strip.
عمومی سوالات
-
Can the plugin detect every AI image?
-
No, and no plugin can. Detection relies on metadata that generators embed. Images whose metadata was stripped (social media re-uploads, screenshots, clipboard pastes) carry no signals. Invisible pixel watermarks such as Google SynthID can only be verified by the vendor’s own service; TransparAI does not pretend otherwise. Detected metadata is an indication, not cryptographic proof. That is exactly why the review queue exists.
-
Which AI image generators are recognized?
-
Anything that leaves a standard marking in the file. In practice that covers ChatGPT and DALL-E, GPT-Image, Google Gemini including Nano Banana output, Adobe Firefly and Photoshop Generative Fill, Bing Image Creator, Midjourney, Stable Diffusion (AUTOMATIC1111, ComfyUI, InvokeAI, SwarmUI, Fooocus), NovelAI, Flux by Black Forest Labs, Leonardo.Ai, Ideogram, Recraft and Seedream, plus every tool that writes a C2PA manifest or the IPTC digital source type, which is the direction the whole industry is moving in. New signatures can be added with a filter, no code fork needed. TransparAI is an independent plugin and is not affiliated with any of these vendors.
-
Does the plugin make my site compliant with the EU AI Act?
-
It gives you the technical building blocks Article 50 asks for: a visible disclosure and a machine-readable marking. Whether and how the EU AI Act or any other law applies to your site, and whether your specific setup satisfies it, is a legal question only you (or your lawyer) can answer. See the Disclaimer section.
-
Is this legal advice?
-
No. TransparAI is a technical tool, not legal advice, and using it creates no guarantee of compliance with any regulation. See the Disclaimer section.
-
Does the plugin change my image files?
-
Only when a file is labeled and the metadata option is enabled. The plugin then writes a small XMP block into the JPEG, PNG, WebP or AVIF file and its size variants. The image pixels are untouched. Files are replaced atomically and validated first. Unlabeling removes exactly the metadata this plugin wrote; foreign metadata is never touched.
-
Where can I see what was written into a file?
-
Open the attachment details and click "Show file metadata”. It lists every file of that attachment with its state (declaration present, missing, or a format that cannot carry one), the digital source type currently declared, the detection evidence in full, the recorded history and the raw XMP packet of the main file. Nothing is written while you look; it is a read of the files as they are on disk right now.
-
Does the marking survive my CDN?
-
Not always, and that is worth checking. Image optimizers at the edge, Cloudflare Polish and Jetpack Photon among them, re-encode images while delivering them and drop every metadata block in the process. The file on your server stays perfect while visitors and search engines receive a bare image, and nothing in WordPress shows it. Enable the delivery check in the settings, then press "Check delivery” on a labeled image: the plugin fetches that image from your own public URL and tells you whether the declaration arrived. If it did not, the fix is in your CDN configuration (keep metadata, or exclude labeled images from re-encoding), not in this plugin.
-
Can I also label AI-written text?
-
Yes. Every post and page has a "This content is AI-generated” checkbox in the editor sidebar; marked content gets a short configurable note ahead of it. There is also an optional site-wide note at the end of pages that contain labeled media.
-
Why was a real camera photo put into the review queue?
-
Modern cameras embed C2PA Content Credentials into real photos. A C2PA manifest alone therefore never auto-labels. It lands in the review queue unless the manifest declares an AI source. Dismiss it with one click; dismissed files are not queued again.
-
Which page builders and editors are supported?
-
The visible badge covers the block editor (every image-bearing block incl. cover, media-text, galleries, inline images in text, video and audio), the classic editor, template images, text widgets, Elementor free and Pro (image, galleries, carousels, slides, image box, hotspot, flip box, call to action, posts, Theme Builder) and WPBakery Page Builder (single images, galleries, carousels, row and column backgrounds, parallax, grids). Inside the builders’ own editing screens badges are deliberately not injected. For images a theme prints without an attachment ID (ACF URL or array fields) enable the option under Extras: a small script matches those images and CSS backgrounds against your labeled files. The machine-readable XMP labeling is independent of any builder and always works.
-
My theme puts overlays on images; does the badge disappear under them?
-
Usually not, and never silently. Badges sit above typical theme layers (hover effects, zoom icons, sale badges), and a small script additionally checks the real paint order: a badge that is still covered is raised, moved to a free corner or, as the last resort, shown as a caption line below the image (this guard can be turned off under Visible badge, Extras). For manual control, give any container one of the utility classes
trai-badge-top-left,trai-badge-top-right,trai-badge-bottom-left,trai-badge-bottom-right,trai-badge-belowortrai-badge-hidden, or pick a position for a single image in its attachment details ("Badge position”). Both ways switch the guard off for those badges, andtrai-badge-manualdoes the same without changing the position, for the rare case where the guard misjudges your layout. Hiding the visible badge of one image never touches the machine-readable file metadata or the structured data in the page; that part of the disclosure stays intact. -
Does the plugin phone home?
-
No. There are no external requests of any kind. All detection happens by reading file bytes locally on your server.
-
What happens when I uninstall the plugin?
-
By default your labels stay in the database (reinstalling restores them) and metadata already written stays in the files. If you prefer a full cleanup, enable "Delete all plugin data” in the settings before uninstalling. Unlabel files first if you also want the in-file metadata removed.
-
Can I label media programmatically?
-
Yes. The meta key
_transparai_aiis registered for the REST API, WP-CLI commands cover bulk work, and other plugins can calldo_action( 'transparai_mark_ai', $attachment_id, 'Generator name' ). -
Where do I get help?
-
Post in the support forum here on wordpress.org, or write to TransparAI@cms-admins.de. The plugin is built and maintained by Patrick Schlesinger (cms-admins.de).
جائزے
There are no reviews for this plugin.
شراکت دار اور ڈیویلپرز
“TransparAI: AI Image Detection & EU AI Act Labeling” اوپن سورس سافٹ ویئر ہے۔ مندرجہ ذیل لوگوں نے اس پلگ ان میں حصہ لیا:
شراکت دار“TransparAI: AI Image Detection & EU AI Act Labeling” کا اپنی زبان میں ترجمہ کریں۔
ڈویلپمینٹ میں دلچسپی ہے؟
کوڈ براؤز کریں، ایس این وی ریپوزیٹری کو چیک کریں یا ڈویلپمینٹ لاگ کو سبسکرائب کریں بذریعہ آر ایس ایس۔
چینج لاگ
1.0.2
- Fixed: scanning the existing library stopped after the first batch on some sites. The progress bar simply stayed where it was and reported no error, which looked like a scan still running. Sites whose theme or another plugin loads the media library on the plugin page were affected. The scan runs to the end again.
- Fixed: PNG files were only searched for metadata inside their first 512 KB. PNG allows metadata to sit after the image data, so large generated images carried their declaration outside that window and were reported as clean. The whole file is read now, and the memory it takes no longer grows with the file size.
- Fixed: images from Bing Image Creator, Microsoft Designer and Copilot were only queued for review instead of being labeled, because Microsoft signs them with a claim generator that no rule matched. In return, an editor whose name merely contains "Designer”, Affinity Designer for one, no longer counts as proof of AI origin.
- The file inspection now says whether the attachment is labeled at all, so a file that is not supposed to carry a declaration is no longer listed as if something were missing from it.
1.0.1
- Fixed: the hourly integrity sweep was only scheduled by the activation hook, which fires once for a network-wide activation. Every site created in the network afterwards silently kept no schedule at all, so stripped AI declarations were never repaired there. The schedule is now set up on load and covers new sites, restored backups and cron entries lost in a migration.
- Per-file history: every label, review decision, repair and failed write is recorded with its time and the editor who made it (the last ten events per file), so a disclosure decision can still be explained months later.
- Audit export as CSV directly from the plugin page, with the detection source, confidence and last change of every labeled and pending file. Same rows as
wp transparai status, which now carries the last-change columns too. - File inspection in the attachment details: "Show file metadata” lists every size with its state (declaration present, missing, or a format that cannot carry one), the declared digital source type, the detection evidence in full and the raw XMP packet.
- Optional delivery check: an optimizing CDN or image proxy can re-encode images while serving them and drop the declaration, which is invisible from the admin because the file on disk stays correct. The check fetches one image over its own public URL and compares the delivered bytes with the file. It is off by default, runs only on click or through
wp transparai verify-delivery, and never requests media served from another host. - Translations shipped for German, French, Spanish, Italian and Dutch.
1.0.0
- Automatic AI detection: C2PA Content Credentials (JPEG, PNG, WebP, MP4 and MOV, .c2pa sidecars), the IPTC digital source type in XMP and IPTC-IIM, PNG generator chunks, EXIF and XMP generator signatures, JPEG comment markers, ID3 declarations in MP3.
- Camera rule: a C2PA manifest alone never auto-labels, since Leica, Sony and Nikon put Content Credentials into real photos.
- Confidence levels with a review queue, single and bulk confirm or dismiss, stored evidence per file, plus a batched and pausable scan of the whole library.
- Visible badge: overlay or caption line, four positions, three sizes, dark, light, outline and icon-only, optional generator name, optional badge start date, per-image override and CSS utility classes for themes. Rendered server-side, so it survives page caching.
- Overlay guard: badges that a theme layer actually covers are raised, moved or turned into a caption line, based on the real paint order rather than z-index guessing.
- Machine-readable labeling: the IPTC digital source type written as XMP into JPEG, PNG, WebP and AVIF including every size variant, merging instead of replacing existing metadata, atomic and validated writes, optional IPTC-IIM mirror.
- Schema.org JSON-LD (ImageObject, VideoObject, AudioObject with digitalSourceType) for the labeled media on each page, an optional site-wide disclosure note and a per-post label for AI-written text.
- Auto-repair: file fingerprints and an hourly sweep restore AI declarations that image optimizers or thumbnail regeneration stripped.
- Editor and builder coverage: block editor, classic editor, template images, text widgets, WooCommerce incl. gallery lightbox, Elementor free and Pro incl. Theme Builder, WPBakery Page Builder.
- Page caches are purged when a label changes (WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache, WP Fastest Cache, SiteGround Optimizer, Cache Enabler, Breeze, Nginx Helper, Hummingbird).
- WP-CLI: scan, flag, unflag, status with CSV and JSON export, write-meta, verify-meta with repair.
- Integrations for on-site generators (AI Engine, AI Power, Elementor AI, WordPress AI), a public transparai_mark_ai action, detection filters, WPML and Polylang configuration.
- No external requests of any kind.
