{"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-07-15T18:32:36","modified_gmt":"2026-07-15T18:32:36","slug":"cetus-media-optimizer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cetus-media-optimizer\/","author":23522813,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.1","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Cetus Image Converter & AI Alt Text","header_author":"LivQ","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-07-15 18:32:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/livqtech\/cetus-media-optimizer","header_author_uri":"https:\/\/livq.it","rating":0,"author_block_rating":0,"active_installs":0,"downloads":28,"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"}},"upgrade_notice":{"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"],"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> \u2014 Real-time progress bar with speed (img\/s), ETA, converted\/skipped\/errors counter and Pause\/Stop controls.","2":"<strong>Server Diagnosis<\/strong> \u2014 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> \u2014 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> \u2014 Configure Google Gemini or OpenAI (BYOK), automatic fallback on quota errors, language selector and custom prompt override.","5":"<strong>Library Management<\/strong> \u2014 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-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> \u2014 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> \u2014 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> \u2014 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> \u2014 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> \u2014 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> \u2014 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> \u2014 <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> \u2014 Optionally convert every new image the moment it lands in your library.<\/li>\n<li><strong>AI-powered Alt Text<\/strong> \u2014 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>Orphan file scanner<\/strong> \u2014 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> \u2014 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> \u2014 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 \u2014 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 LivQ 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 LivQ 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> \u2014 Review the server diagnostics (green = supported, red = unavailable).<\/li>\n<li><strong>Step 2<\/strong> \u2014 Choose your output format and optionally add AI API keys.<\/li>\n<li><strong>Step 3<\/strong> \u2014 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=\"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 LivQ 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.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:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/331858","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=331858"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/danielegagliardi"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=331858"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=331858"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=331858"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=331858"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=331858"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=331858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}