{"id":331858,"date":"2026-07-15T18:32:48","date_gmt":"2026-07-15T18:32:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/cetus-media-optimizer\/"},"modified":"2026-08-20T14:05:39","modified_gmt":"2026-08-20T14:05:39","slug":"cetus-media-optimizer","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/cetus-media-optimizer\/","author":23539435,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Cetus Image Converter & AI Alt Text","header_author":"SkapaCraft","header_description":"Advanced media optimizer: converts images to AVIF\/WebP, auto-generates Alt Text via AI (Gemini \/ OpenAI), detects orphan files and manages your media library.","assets_banners_color":"74778d","last_updated":"2026-08-20 14:05:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/skapacraft\/cetus-media-optimizer","header_author_uri":"https:\/\/skapacraft.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":174,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"danielegagliardi","date":"2026-07-15 18:32:36"},"1.1.1":{"tag":"1.1.1","author":"skapacraft","date":"2026-08-20 14:05:39"}},"upgrade_notice":{"1.1.1":"<p>Fixes a bug where &quot;Reset files&quot; deleted WebP and AVIF sub-sizes generated by WordPress itself, not by this plugin. If you use &quot;Reset files&quot; at all, upgrade before running it again. Also stops the AI from paying for a second alt text on images that already have one.<\/p>","1.1.0":"<p>Images carrying C2PA Content Credentials are now skipped by default instead of being converted, because conversion destroys that provenance record permanently. If you would rather convert them and accept the loss, turn the Content Credentials setting off under Preferences. No existing file is modified or deleted by this upgrade.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3609326,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3609326,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3609326,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3609329,"resolution":"1","location":"assets","locale":"","width":2570,"height":1354},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3609329,"resolution":"2","location":"assets","locale":"","width":2582,"height":1376},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3609329,"resolution":"3","location":"assets","locale":"","width":2590,"height":1378},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3609329,"resolution":"4","location":"assets","locale":"","width":2548,"height":1384},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3609329,"resolution":"5","location":"assets","locale":"","width":2582,"height":1300}},"screenshots":{"1":"<strong>Bulk optimisation in progress<\/strong>: Real-time progress bar with speed (img\/s), ETA, converted\/skipped\/errors counter and Pause\/Stop controls.","2":"<strong>Server Diagnosis<\/strong>: Green indicators confirm Imagick, GD, WebP and AVIF are all available. Runs a real encoding probe, not just a format list check.","3":"<strong>Preferences<\/strong>: Output format selector (Automatic \/ AVIF \/ WebP \/ No conversion), auto-convert on upload toggle, and independent quality sliders for WebP and AVIF.","4":"<strong>AI Alt Text<\/strong>: Configure Google Gemini or OpenAI (BYOK), automatic fallback on quota errors, language selector and custom prompt override.","5":"<strong>Library Management<\/strong>: Statistics cards (total images, to convert, disk usage by format, cumulative savings), orphan file scanner and conversion log."}},"plugin_section":[],"plugin_tags":[2353,17214,194661,29161,15376],"plugin_category":[],"plugin_contributors":[271755],"plugin_business_model":[],"class_list":["post-331858","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-alt-text","plugin_tags-avif","plugin_tags-image-optimization","plugin_tags-webp","plugin_contributors-danielegagliardi","plugin_committers-livqtech","plugin_committers-skapacraft","plugin_support_reps-danielegagliardi"],"banners":{"banner":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/banner-772x250.png?rev=3609326","banner_2x":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/banner-1544x500.png?rev=3609326","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/icon.svg?rev=3609326","icon":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/icon.svg?rev=3609326","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/screenshot-1.png?rev=3609329","caption":"<strong>Bulk optimisation in progress<\/strong>: Real-time progress bar with speed (img\/s), ETA, converted\/skipped\/errors counter and Pause\/Stop controls."},{"src":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/screenshot-2.png?rev=3609329","caption":"<strong>Server Diagnosis<\/strong>: Green indicators confirm Imagick, GD, WebP and AVIF are all available. Runs a real encoding probe, not just a format list check."},{"src":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/screenshot-3.png?rev=3609329","caption":"<strong>Preferences<\/strong>: Output format selector (Automatic \/ AVIF \/ WebP \/ No conversion), auto-convert on upload toggle, and independent quality sliders for WebP and AVIF."},{"src":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/screenshot-4.png?rev=3609329","caption":"<strong>AI Alt Text<\/strong>: Configure Google Gemini or OpenAI (BYOK), automatic fallback on quota errors, language selector and custom prompt override."},{"src":"https:\/\/ps.w.org\/cetus-media-optimizer\/assets\/screenshot-5.png?rev=3609329","caption":"<strong>Library Management<\/strong>: Statistics cards (total images, to convert, disk usage by format, cumulative savings), orphan file scanner and conversion log."}],"raw_content":"<!--section=description-->\n<p><strong>Cetus Image Converter &amp; AI Alt Text<\/strong> turns your WordPress media library into a lean, modern, and accessible asset store.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>AVIF \/ WebP conversion<\/strong>: Creates optimised copies alongside your originals (JPG\/PNG\/GIF are never deleted). Uses Imagick when available, falls back to GD.<\/li>\n<li><strong>Smart format selection<\/strong>: <em>Automatic<\/em> mode picks AVIF when the server supports it, WebP otherwise. You can also force one format.<\/li>\n<li><strong>Auto-convert on upload<\/strong>: Optionally convert every new image the moment it lands in your library.<\/li>\n<li><strong>AI-powered Alt Text<\/strong>: Send images to Google Gemini or OpenAI (your own API key, BYOK) and save the generated description natively as <code>_wp_attachment_image_alt<\/code>. Automatic fallback between providers on quota errors (429).<\/li>\n<li><strong>Content Credentials aware<\/strong>: Detects images carrying C2PA Content Credentials, the signed record of where an image came from and whether AI made it, and leaves them unconverted by default so that record survives. Converting re-encodes the pixels and destroys it permanently.<\/li>\n<li><strong>Orphan file scanner<\/strong>: Finds images on disk that are not registered in the WordPress database and lets you optimise or ignore them.<\/li>\n<li><strong>Bulk processor<\/strong>: Asynchronous AJAX batches with real-time progress bar, Pause and Stop controls. Safe for shared hosting.<\/li>\n<\/ul>\n\n<h4>Privacy &amp; Security<\/h4>\n\n<ul>\n<li>All AJAX requests are protected by WordPress nonces and <code>current_user_can()<\/code> checks.<\/li>\n<li>Original images are <strong>never deleted<\/strong>: conversion only adds new files.<\/li>\n<li>Telemetry is <strong>opt-in only<\/strong> and disabled by default. No data is ever sent unless the administrator explicitly enables it under Preferences \u2192 Telemetry.<\/li>\n<li>API keys are stored in the WordPress options table and are never exposed in the front-end source.<\/li>\n<\/ul>\n\n<h4>Server requirements<\/h4>\n\n\n\n\n  Feature\n  Requirement\n\n\n\n\n  WebP output\n  Imagick with WebP <strong>or<\/strong> GD with WebP\n\n\n  AVIF output\n  Imagick with libavif\/libheif\n\n\n  AI Alt Text\n  A valid Google Gemini or OpenAI API key\n\n\n\n\n<p>The built-in <strong>Step 1 \u2013 Server Diagnosis<\/strong> panel shows green\/red indicators for every capability on your specific server.<\/p>\n\n<h4>BYOK, Bring Your Own Key<\/h4>\n\n<p>Cetus Image Converter &amp; AI Alt Text does <strong>not<\/strong> proxy AI requests through any third-party server. Calls go directly from your WordPress installation to the Google Generative Language API or the OpenAI API using your own credentials. You are responsible for monitoring your quota usage.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the following third-party services:<\/p>\n\n<p><strong>Google Gemini (Google Generative Language API)<\/strong>\nUsed to automatically generate Alt Text for images. Only called when the administrator has entered a valid Google Gemini API key and triggers a conversion (manual bulk process or automatic on upload, if enabled). The image is sent as a Base64-encoded inline payload. No image data is stored on any SkapaCraft server.<\/p>\n\n<ul>\n<li>What is sent: image data (Base64), custom prompt (if set), language preference<\/li>\n<li>When: only on explicit user action (bulk process or single upload with auto-convert enabled)<\/li>\n<li>Google Terms of Service: https:\/\/policies.google.com\/terms<\/li>\n<li>Google Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<li>Google Generative AI Terms: https:\/\/ai.google.dev\/gemini-api\/terms<\/li>\n<\/ul>\n\n<p><strong>OpenAI API<\/strong>\nUsed to automatically generate Alt Text for images. Only called when the administrator has entered a valid OpenAI API key and triggers a conversion. The image is sent as a Base64-encoded inline payload. No image data is stored on any SkapaCraft server.<\/p>\n\n<ul>\n<li>What is sent: image data (Base64), custom prompt (if set), language preference<\/li>\n<li>When: only on explicit user action (bulk process or single upload with auto-convert enabled)<\/li>\n<li>OpenAI Terms of Service: https:\/\/openai.com\/policies\/terms-of-use\/<\/li>\n<li>OpenAI Privacy Policy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<\/ul>\n\n<p><strong>Sentry<\/strong>\nUsed to collect anonymous crash reports (PHP fatal errors and exceptions). This feature is <strong>disabled by default<\/strong> and requires explicit opt-in by the site administrator under Cetus Media \u2192 Preferences \u2192 Telemetry.<\/p>\n\n<ul>\n<li>What is sent: PHP error type and stack trace (limited to plugin files only), WordPress version, PHP version, plugin version. No IP addresses, usernames, email addresses or any personal data are ever transmitted.<\/li>\n<li>When: only when the administrator explicitly enables telemetry opt-in<\/li>\n<li>Sentry Terms of Service: https:\/\/sentry.io\/terms\/<\/li>\n<li>Sentry Privacy Policy: https:\/\/sentry.io\/privacy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>cetus-media-optimizer<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Go to <strong>Cetus Media<\/strong> in the WordPress admin menu.<\/li>\n<li>Follow the three-step wizard:\n\n<ul>\n<li><strong>Step 1<\/strong>: Review the server diagnostics (green = supported, red = unavailable).<\/li>\n<li><strong>Step 2<\/strong>: Choose your output format and optionally add AI API keys.<\/li>\n<li><strong>Step 3<\/strong>: Click <em>Start Optimisation<\/em> to process your library.<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20cetus%20image%20converter%20%26%20ai%20alt%20text%20delete%20my%20original%20images%3F\"><h3>Will Cetus Image Converter &amp; AI Alt Text delete my original images?<\/h3><\/dt>\n<dd><p>No. Originals are never touched. The plugin creates a second file with the new extension (e.g. <code>photo.jpg<\/code> \u2192 <code>photo.webp<\/code>) alongside the original.<\/p><\/dd>\n<dt id=\"my%20server%20does%20not%20support%20avif.%20what%20happens%3F\"><h3>My server does not support AVIF. What happens?<\/h3><\/dt>\n<dd><p>If you choose <em>Automatic<\/em> format, the plugin detects server capabilities at runtime and falls back to WebP. If WebP is also unavailable, the image is skipped and a notice is shown in the diagnostics panel.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20images%20with%20content%20credentials%20%28c2pa%29%3F\"><h3>What happens to images with Content Credentials (C2PA)?<\/h3><\/dt>\n<dd><p>By default they are left unconverted, so they keep their credentials and yield no saving. A C2PA manifest contains a cryptographic hash of the image, so re-encoding the pixels invalidates it, and it cannot simply be copied onto the converted file either: doing that would mark the converted file as tampered with, which validates worse than having no provenance at all. You can turn this protection off under Preferences, in which case those images are converted like any other and the plugin tells you, per image and in the conversion log, that the credentials were lost. Your original file is never deleted in either case, so the credentials always remain in the original on disk.<\/p><\/dd>\n<dt id=\"is%20there%20a%20limit%20to%20the%20number%20of%20images%20i%20can%20process%3F\"><h3>Is there a limit to the number of images I can process?<\/h3><\/dt>\n<dd><p>No hard limit. The bulk processor works in small batches (5 images per AJAX tick) to respect server timeouts and can be paused and resumed at any time.<\/p><\/dd>\n<dt id=\"how%20does%20the%20ai%20alt%20text%20feature%20work%3F\"><h3>How does the AI Alt Text feature work?<\/h3><\/dt>\n<dd><p>After conversion, the plugin sends the image (as a Base64-encoded inline payload) to the selected AI provider. The response is sanitised and saved as the standard WordPress <code>_wp_attachment_image_alt<\/code> post meta. No image data is stored on any server.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20my%20ai%20quota%20is%20exceeded%3F\"><h3>What happens if my AI quota is exceeded?<\/h3><\/dt>\n<dd><p>If the primary provider returns HTTP 429, the plugin automatically retries with the other provider (if both keys are configured and fallback is enabled). A warning is displayed in the admin panel reminding you to monitor your API quota.<\/p><\/dd>\n<dt id=\"is%20the%20telemetry%20feature%20active%3F\"><h3>Is the telemetry feature active?<\/h3><\/dt>\n<dd><p>No, by default. The opt-in checkbox is disabled by default. If you enable it, anonymous PHP crash reports (error type, stack trace limited to plugin files, WordPress\/PHP\/plugin version) are sent to Sentry. No IP address, user data, API keys or personal information is ever transmitted. You can disable it at any time from Preferences \u2192 Telemetry.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: \"Reset files\" deleted the WebP and AVIF sub-sizes WordPress had generated itself. Only the main file of each attachment was protected, so a WebP upload kept its original while its sub-sizes were removed, leaving the media library and every srcset pointing at files that no longer existed.<\/li>\n<li>Fixed: the AI generated, and billed, a second alt text for images that already had one. <code>wp_generate_attachment_metadata<\/code> fires twice for a single upload whenever sub-size generation is deferred, and nothing stopped the second call from overwriting the first.<\/li>\n<li>Fixed: the orphan scan reported files WordPress owns, namely the unscaled original of every big-image upload and the companion files WordPress 7.1 writes when the browser processes an upload.<\/li>\n<li>Compatibility: tested up to WordPress 7.1, including client-side media processing.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added: detection of C2PA Content Credentials in JPEG, PNG, WebP and AVIF, reading only the file header. No new dependency and no external service.<\/li>\n<li>Added: images carrying Content Credentials are no longer converted by default, so their provenance survives. The behaviour is a setting you can turn off.<\/li>\n<li>Added: warnings before conversion, on the attachment screen and in the settings, with counts of files preserved and files whose credentials were lost.<\/li>\n<li>Fixed: <code>imagedestroy()<\/code> emitted a deprecation notice on PHP 8.5. It has done nothing since PHP 8.0 and has been removed; WebP output is unchanged.<\/li>\n<li>Docs: telemetry is now described accurately in the README, author credits corrected, and the code comments are in English throughout.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Minor fix.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Advanced image optimizer: convert to AVIF\/WebP, auto-generate Alt Text via AI, detect orphan files, and manage your entire media library.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/331858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=331858"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/skapacraft"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=331858"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=331858"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=331858"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=331858"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=331858"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=331858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}