{"id":247126,"date":"2025-08-24T13:50:53","date_gmt":"2025-08-24T13:50:53","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/avif-local-support\/"},"modified":"2026-03-09T04:05:18","modified_gmt":"2026-03-09T04:05:18","slug":"avif-local-support","status":"publish","type":"plugin","link":"https:\/\/kal.wordpress.org\/plugins\/avif-local-support\/","author":147249,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.6.3","stable_tag":"0.6.3","tested":"6.9.4","requires":"6.8","requires_php":"8.3","requires_plugins":null,"header_name":"AVIF Local Support","header_author":"ddegner","header_description":"Unified AVIF support and conversion. Local-first processing with a strong focus on image quality when converting JPEGs.","assets_banners_color":"0d0f1a","last_updated":"2026-03-09 04:05:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/ddegner\/avif-local-support","header_author_uri":"https:\/\/www.daviddegner.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":1683,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.3":{"tag":"0.1.3","author":"ddegner","date":"2025-08-25 02:58:00"},"0.1.5":{"tag":"0.1.5","author":"ddegner","date":"2025-08-28 03:12:06"},"0.1.6":{"tag":"0.1.6","author":"ddegner","date":"2025-08-28 04:17:44"},"0.1.7":{"tag":"0.1.7","author":"ddegner","date":"2025-08-28 05:09:13"},"0.2.1":{"tag":"0.2.1","author":"ddegner","date":"2025-11-18 16:55:27"},"0.2.2":{"tag":"0.2.2","author":"ddegner","date":"2025-11-18 17:28:27"},"0.2.3":{"tag":"0.2.3","author":"ddegner","date":"2025-11-18 18:12:57"},"0.2.4":{"tag":"0.2.4","author":"ddegner","date":"2025-11-22 05:01:18"},"0.2.5":{"tag":"0.2.5","author":"ddegner","date":"2025-11-22 05:07:32"},"0.2.6":{"tag":"0.2.6","author":"ddegner","date":"2025-11-22 05:17:11"},"0.2.7":{"tag":"0.2.7","author":"ddegner","date":"2025-11-22 05:20:15"},"0.2.8":{"tag":"0.2.8","author":"ddegner","date":"2025-11-23 04:12:47"},"0.2.9":{"tag":"0.2.9","author":"ddegner","date":"2025-11-23 04:23:12"},"0.3.0":{"tag":"0.3.0","author":"ddegner","date":"2025-11-24 22:09:08"},"0.4.2":{"tag":"0.4.2","author":"ddegner","date":"2025-12-12 04:36:24"},"0.4.5":{"tag":"0.4.5","author":"ddegner","date":"2025-12-15 05:31:04"},"0.4.6":{"tag":"0.4.6","author":"ddegner","date":"2025-12-15 13:14:27"},"0.4.7":{"tag":"0.4.7","author":"ddegner","date":"2025-12-15 19:04:56"},"0.4.8":{"tag":"0.4.8","author":"ddegner","date":"2025-12-15 21:27:01"},"0.4.9":{"tag":"0.4.9","author":"ddegner","date":"2025-12-17 19:56:35"},"0.5.0":{"tag":"0.5.0","author":"ddegner","date":"2025-12-26 02:04:43"},"0.5.1":{"tag":"0.5.1","author":"ddegner","date":"2025-12-26 02:36:25"},"0.5.10":{"tag":"0.5.10","author":"ddegner","date":"2026-01-04 03:05:40"},"0.5.11":{"tag":"0.5.11","author":"ddegner","date":"2026-01-04 03:39:39"},"0.5.13":{"tag":"0.5.13","author":"ddegner","date":"2026-01-04 06:44:30"},"0.5.14":{"tag":"0.5.14","author":"ddegner","date":"2026-01-04 06:50:50"},"0.5.15":{"tag":"0.5.15","author":"ddegner","date":"2026-01-04 07:07:55"},"0.5.16":{"tag":"0.5.16","author":"ddegner","date":"2026-01-04 21:07:07"},"0.5.17":{"tag":"0.5.17","author":"ddegner","date":"2026-01-04 22:00:49"},"0.5.18":{"tag":"0.5.18","author":"ddegner","date":"2026-01-05 01:30:58"},"0.5.19":{"tag":"0.5.19","author":"ddegner","date":"2026-01-05 14:04:09"},"0.5.20":{"tag":"0.5.20","author":"ddegner","date":"2026-01-06 03:46:26"},"0.5.21":{"tag":"0.5.21","author":"ddegner","date":"2026-01-22 10:44:36"},"0.5.22":{"tag":"0.5.22","author":"ddegner","date":"2026-02-08 03:08:21"},"0.5.23":{"tag":"0.5.23","author":"ddegner","date":"2026-02-09 15:55:54"},"0.5.3":{"tag":"0.5.3","author":"ddegner","date":"2025-12-26 03:30:29"},"0.5.4":{"tag":"0.5.4","author":"ddegner","date":"2025-12-28 18:15:01"},"0.5.5":{"tag":"0.5.5","author":"ddegner","date":"2025-12-28 18:55:04"},"0.5.6":{"tag":"0.5.6","author":"ddegner","date":"2025-12-28 19:40:52"},"0.5.7":{"tag":"0.5.7","author":"ddegner","date":"2026-01-04 02:23:04"},"0.5.8":{"tag":"0.5.8","author":"ddegner","date":"2026-01-04 02:33:24"},"0.5.9":{"tag":"0.5.9","author":"ddegner","date":"2026-01-04 03:00:24"},"0.6.0":{"tag":"0.6.0","author":"ddegner","date":"2026-02-10 23:53:17"},"0.6.1":{"tag":"0.6.1","author":"ddegner","date":"2026-02-15 16:24:59"},"0.6.2":{"tag":"0.6.2","author":"ddegner","date":"2026-02-20 04:35:59"},"0.6.3":{"tag":"0.6.3","author":"ddegner","date":"2026-03-09 04:05:18"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3482841,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3482841,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3482841,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3482841,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.3","0.1.5","0.1.6","0.1.7","0.2.1","0.2.2","0.2.3","0.2.4","0.2.5","0.2.6","0.2.7","0.2.8","0.2.9","0.3.0","0.4.2","0.4.5","0.4.6","0.4.7","0.4.8","0.4.9","0.5.0","0.5.1","0.5.10","0.5.11","0.5.13","0.5.14","0.5.15","0.5.16","0.5.17","0.5.18","0.5.19","0.5.20","0.5.21","0.5.22","0.5.23","0.5.3","0.5.4","0.5.5","0.5.6","0.5.7","0.5.8","0.5.9","0.6.0","0.6.1","0.6.2","0.6.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3457258,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3457258,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3457258,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3457258,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"<strong>AVIF Images<\/strong> \u2014 Configure AVIF delivery, conversion quality, speed, and engine settings","2":"<strong>LQIP<\/strong> \u2014 Configure ThumbHash generation and display behavior","3":"<strong>Tools<\/strong> \u2014 Run AVIF\/LQIP bulk tools and review server support diagnostics","4":"<strong>About<\/strong> \u2014 Quick reference and version info"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[194661,163,84,187,247],"plugin_category":[50,54,55],"plugin_contributors":[246731],"plugin_business_model":[],"class_list":["post-247126","plugin","type-plugin","status-publish","hentry","plugin_tags-avif","plugin_tags-images","plugin_tags-media","plugin_tags-optimization","plugin_tags-performance","plugin_category-media","plugin_category-security-and-spam-protection","plugin_category-seo-and-marketing","plugin_contributors-ddegner","plugin_committers-ddegner"],"banners":{"banner":"https:\/\/ps.w.org\/avif-local-support\/assets\/banner-772x250.png?rev=3482841","banner_2x":"https:\/\/ps.w.org\/avif-local-support\/assets\/banner-1544x500.png?rev=3482841","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/avif-local-support\/assets\/icon-128x128.png?rev=3482841","icon_2x":"https:\/\/ps.w.org\/avif-local-support\/assets\/icon-256x256.png?rev=3482841","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/avif-local-support\/assets\/screenshot-1.png?rev=3457258","caption":"<strong>AVIF Images<\/strong> \u2014 Configure AVIF delivery, conversion quality, speed, and engine settings"},{"src":"https:\/\/ps.w.org\/avif-local-support\/assets\/screenshot-2.png?rev=3457258","caption":"<strong>LQIP<\/strong> \u2014 Configure ThumbHash generation and display behavior"},{"src":"https:\/\/ps.w.org\/avif-local-support\/assets\/screenshot-3.png?rev=3457258","caption":"<strong>Tools<\/strong> \u2014 Run AVIF\/LQIP bulk tools and review server support diagnostics"},{"src":"https:\/\/ps.w.org\/avif-local-support\/assets\/screenshot-4.png?rev=3457258","caption":"<strong>About<\/strong> \u2014 Quick reference and version info"}],"raw_content":"<!--section=description-->\n<p>Built by a <a href=\"https:\/\/www.daviddegner.com\">Boston photographer<\/a> for site owners who care about visual quality and full control. This plugin prioritizes <strong>image quality<\/strong> over everything else \u2014 no subscriptions, no external services.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Local Processing<\/strong> \u2014 All conversion happens on your server. No subscriptions or external API calls. Works great on a shared CPU with 2GB RAM.<\/li>\n<li><strong>Quality First<\/strong> \u2014 Uses LANCZOS resizing, preserves ICC color profiles, and keeps EXIF\/XMP\/IPTC metadata intact.<\/li>\n<li><strong>Fully Tunable<\/strong> \u2014 Control quality (0\u2013100), speed (0\u201310), chroma subsampling (4:2:0, 4:2:2, 4:4:4), and bit depth (8\/10\/12-bit).<\/li>\n<li><strong>Smart Fallback<\/strong> \u2014 Serves AVIF to supported browsers, JPEG to everyone else via picture elements.<\/li>\n<li><strong>Automatic Conversion<\/strong> \u2014 Convert on upload or via daily scheduled background scans.<\/li>\n<li><strong>LQIP Placeholders<\/strong> \u2014 Generate ThumbHash-based low-quality image placeholders for smooth loading.<\/li>\n<\/ul>\n\n<h3>How It Works<\/h3>\n\n<p><strong>Front end:<\/strong> The plugin wraps your img tags in picture elements with an AVIF source. Browsers that support AVIF load the smaller, higher-quality file \u2014 others gracefully fall back to JPEG.<\/p>\n\n<p><strong>Conversion:<\/strong> Uses ImageMagick CLI (fastest), Imagick PHP extension (high quality), or GD Library (fallback) to convert JPEGs to AVIF on upload or via background jobs.<\/p>\n\n<p><strong>LQIP:<\/strong> Generates compact (~30 byte) ThumbHash placeholders that display instantly while images load.<\/p>\n\n<h3>Server Setup<\/h3>\n\n<p>The plugin supports three conversion engines, in order of preference:<\/p>\n\n<h4>ImageMagick CLI (Fastest, Recommended)<\/h4>\n\n<p>Uses the ImageMagick command-line binary directly:<\/p>\n\n<ul>\n<li><strong>System binary:<\/strong> ImageMagick 7.x built with HEIF\/AVIF support (via libheif)<\/li>\n<li><strong>No PHP extension required<\/strong><\/li>\n<li><strong>Benefits:<\/strong> Fastest performance, LANCZOS resizing, full metadata preservation (EXIF, XMP, IPTC, ICC)<\/li>\n<li><strong>Typical paths:<\/strong> <code>\/usr\/bin\/magick<\/code>, <code>\/usr\/local\/bin\/magick<\/code>, or Homebrew on macOS<\/li>\n<\/ul>\n\n<p>To verify AVIF support:<\/p>\n\n<pre><code>magick -list format | grep -i avif\n<\/code><\/pre>\n\n<h4>Imagick PHP Extension (High Quality)<\/h4>\n\n<p>Uses the PHP Imagick extension:<\/p>\n\n<ul>\n<li><strong>PHP extension:<\/strong> imagick<\/li>\n<li><strong>System libraries:<\/strong> ImageMagick built with HEIF\/AVIF support (via libheif)<\/li>\n<li><strong>Benefits:<\/strong> LANCZOS resizing, full metadata preservation (EXIF, XMP, IPTC, ICC), color profile handling<\/li>\n<\/ul>\n\n<p>To install on Ubuntu\/Debian:<\/p>\n\n<pre><code>apt install php-imagick imagemagick libheif-dev\n<\/code><\/pre>\n\n<h4>GD Library (Fallback)<\/h4>\n\n<p>Uses PHP's built-in GD library:<\/p>\n\n<ul>\n<li><strong>PHP extension:<\/strong> gd built with AVIF support (provides imageavif on PHP 8.1+)<\/li>\n<li><strong>Note:<\/strong> Some distro builds omit AVIF support; limited metadata preservation<\/li>\n<\/ul>\n\n<h4>MIME Type Configuration<\/h4>\n\n<p>Ensure your web server is configured to serve .avif files as image\/avif.<\/p>\n\n<h4>Documentation<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/imagemagick.org\/script\/download.php\">ImageMagick installation<\/a><\/li>\n<li><a href=\"https:\/\/www.php.net\/imagick\">PHP Imagick installation<\/a><\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/image.installation.php\">PHP GD installation<\/a><\/li>\n<li><a href=\"https:\/\/imagemagick.org\/script\/formats.php\">ImageMagick format support<\/a><\/li>\n<\/ul>\n\n<h4>Need help with setup?<\/h4>\n\n<p>If you're not sure what to install or upgrade, copy your <strong>Server Diagnostics<\/strong> from the plugin status\/tools screen (or run <code>wp avif status --format=json<\/code>) and paste it into an LLM.<\/p>\n\n<p>Example prompt:<\/p>\n\n<pre><code>I need AVIF support for WordPress. Based on this diagnostics output, give me step-by-step commands to install or upgrade ImageMagick, libheif, and PHP Imagick on my server.\n<\/code><\/pre>\n\n<p>After applying changes, verify with:<\/p>\n\n<pre><code>wp avif status\nmagick -list format | grep -i avif&lt;h3&gt;WP-CLI Commands&lt;\/h3&gt;\n<\/code><\/pre>\n\n<p>Manage AVIF conversions from the command line.<\/p>\n\n<h4>Status<\/h4>\n\n<p>Show system status and AVIF support diagnostics:<\/p>\n\n<pre><code>wp avif status\nwp avif status --format=json\n<\/code><\/pre>\n\n<h4>Convert<\/h4>\n\n<p>Convert JPEG images to AVIF format:<\/p>\n\n<pre><code>wp avif convert --all\nwp avif convert 123\nwp avif convert --all --dry-run\n<\/code><\/pre>\n\n<p>Options:<\/p>\n\n<ul>\n<li><code>&lt;attachment-id&gt;<\/code> \u2014 Specific attachment ID to convert<\/li>\n<li><code>--all<\/code> \u2014 Convert all attachments missing AVIF versions<\/li>\n<li><code>--dry-run<\/code> \u2014 Show what would be converted without actually converting<\/li>\n<\/ul>\n\n<h4>Statistics<\/h4>\n\n<p>Show AVIF conversion statistics:<\/p>\n\n<pre><code>wp avif stats\nwp avif stats --format=json\n<\/code><\/pre>\n\n<h4>Logs<\/h4>\n\n<p>View or clear conversion logs:<\/p>\n\n<pre><code>wp avif logs\nwp avif logs --limit=50\nwp avif logs --clear\n<\/code><\/pre>\n\n<p>Options:<\/p>\n\n<ul>\n<li><code>--clear<\/code> \u2014 Clear all logs<\/li>\n<li><code>--limit=&lt;number&gt;<\/code> \u2014 Number of logs to show (default: 20)<\/li>\n<\/ul>\n\n<h4>Delete<\/h4>\n\n<p>Delete AVIF files for an attachment or all attachments:<\/p>\n\n<pre><code>wp avif delete 123\nwp avif delete --all --yes\n<\/code><\/pre>\n\n<p>Options:<\/p>\n\n<ul>\n<li><code>&lt;attachment-id&gt;<\/code> \u2014 Attachment ID to delete AVIF files for<\/li>\n<li><code>--all<\/code> \u2014 Delete all AVIF files in the media library<\/li>\n<li><code>--yes<\/code> \u2014 Skip confirmation prompt when using --all<\/li>\n<\/ul>\n\n<h4>LQIP Commands<\/h4>\n\n<p>Manage LQIP (ThumbHash) placeholders:<\/p>\n\n<pre><code>wp lqip stats\nwp lqip generate --all --force\nwp lqip generate 123\nwp lqip delete --all --yes\n<\/code><\/pre>\n\n<p>For more information, visit <a href=\"https:\/\/wp-cli.org\/\">wp-cli.org<\/a>.<\/p>\n\n<h3>Contributing<\/h3>\n\n<p>Contributions welcome! Please submit issues and pull requests on <a href=\"https:\/\/github.com\/ddegner\/avif-local-support\">GitHub<\/a>.<\/p>\n\n<h3>License<\/h3>\n\n<p>GPL v2 or later \u2014 <a href=\"https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\">View License<\/a><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload to <code>\/wp-content\/plugins\/avif-local-support<\/code> or install via <strong>Plugins \u2192 Add New<\/strong><\/li>\n<li>Activate the plugin<\/li>\n<li>Navigate to <strong>Settings \u2192 AVIF Local Support<\/strong><\/li>\n<\/ol>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li><strong>PHP:<\/strong> 8.3 or later<\/li>\n<li><strong>WordPress:<\/strong> 6.8 or later<\/li>\n<li><strong>Recommended:<\/strong> Imagick extension with AVIF-enabled ImageMagick<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20modify%20my%20original%20jpegs%3F\"><h3>Does this modify my original JPEGs?<\/h3><\/dt>\n<dd><p>No. AVIF files are created alongside your existing images. Your originals remain untouched.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20uploads%3F\"><h3>Will this slow down uploads?<\/h3><\/dt>\n<dd><p>If \"Convert on upload\" is enabled, uploads may take slightly longer. You can disable this and use scheduled background conversion instead.<\/p><\/dd>\n<dt id=\"do%20i%20need%20imagick%3F\"><h3>Do I need Imagick?<\/h3><\/dt>\n<dd><p>Recommended but not required. Imagick provides the best quality and preserves metadata\/color profiles. The plugin falls back to GD if unavailable.<\/p><\/dd>\n<dt id=\"does%20it%20track%20users%20or%20send%20data%20externally%3F\"><h3>Does it track users or send data externally?<\/h3><\/dt>\n<dd><p>No. Zero tracking, zero external calls. Everything runs locally.<\/p><\/dd>\n<dt id=\"why%20do%20i%20see%20%22high%20risk%20of%20memory%20exhaustion%22%3F\"><h3>Why do I see \"High risk of memory exhaustion\"?<\/h3><\/dt>\n<dd><p>The plugin estimates memory before processing to prevent crashes. Try switching to \"ImageMagick CLI\" engine, increasing PHP memory_limit, or checking \"Disable memory check\" in settings.<\/p><\/dd>\n<dt id=\"avif%20conversions%20produce%20empty%20files%20on%20litespeed%3F\"><h3>AVIF conversions produce empty files on LiteSpeed?<\/h3><\/dt>\n<dd><p>This is caused by libheif 1.12.0 crashing in LiteSpeed's restricted environment. Upgrade libheif to 1.15+ to fix. See the <a href=\"https:\/\/wordpress.org\/plugins\/avif-local-support\/#faq\">WordPress.org FAQ<\/a> for build instructions.<\/p><\/dd>\n<dt id=\"imagemagick%20cli%20not%20detected%20on%20litespeed%2Fcyberpanel%3F\"><h3>ImageMagick CLI not detected on LiteSpeed\/CyberPanel?<\/h3><\/dt>\n<dd><p>LiteSpeed's open_basedir restriction prevents PHP from detecting executables outside allowed paths. The binary may still work \u2014 try setting the path manually in settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.6.3<\/h4>\n\n<ul>\n<li>Fix: Lightbox\/slideshow links now correctly rewrite from JPEG to AVIF when the image was already wrapped in a <code>&lt;picture&gt;<\/code> element by another plugin (e.g. photo-collage). Previously the <code>&lt;a&gt;<\/code> href rewriting was skipped for images inside <code>&lt;picture&gt;<\/code>, causing lightboxes to load full-size JPEGs instead of AVIFs.<\/li>\n<\/ul>\n\n<h4>0.6.2<\/h4>\n\n<ul>\n<li>Chore: Added a commit-based beta build workflow that publishes prerelease ZIPs to GitHub Releases.<\/li>\n<li>Chore: Kept stable release builds tag-based and guarded WordPress.org deploy so <code>beta-*<\/code> tags are ignored.<\/li>\n<\/ul>\n\n<h4>0.6.1<\/h4>\n\n<ul>\n<li>Fix: Clear Logs now reliably clears stored logs and prevents stale long-running processes from repopulating old entries.<\/li>\n<li>Enhancement: Logs panel now refreshes from server state after clearing, so UI always matches stored data.<\/li>\n<li>Enhancement: Clear Logs button is temporarily disabled while the clear request is in progress to prevent duplicate requests.<\/li>\n<li>Chore: Uninstall now removes the logs-generation option used by the clear-logs protection.<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Fix: Removed redundant on-upload AVIF conversion hook path to avoid duplicate work and keep upload conversion predictable.<\/li>\n<li>Fix: Improved daily scheduling behavior so overdue events run instead of being pushed to tomorrow, and on-demand AVIF scans always run regardless of schedule toggle state.<\/li>\n<li>Feature: Added stop control for bulk LQIP generation (REST endpoint + transient stop signal + admin status updates).<\/li>\n<li>Enhancement: Standardized admin LQIP wording and labels, including a short LQIP explanation at the top of the LQIP tab.<\/li>\n<li>Fix: Uninstall now clears LQIP stop transient and uses <code>delete_post_meta_by_key()<\/code> for ThumbHash metadata cleanup.<\/li>\n<li>Chore: Plugin Check hardening for release by excluding non-distribution files from check scope and clearing stray <code>.DS_Store<\/code> files.<\/li>\n<\/ul>\n\n<h4>0.5.23<\/h4>\n\n<ul>\n<li>Feature: Added an AVIF Settings Playground for real JPEG\/AVIF preview comparisons and one-click apply of tested settings.<\/li>\n<li>Feature: Expanded Tools with dedicated LQIP bulk generation\/deletion controls and progress\/status feedback.<\/li>\n<li>Enhancement: Refreshed admin UX across tabs (clearer labels, advanced sections, improved diagnostics and logs layout).<\/li>\n<li>Enhancement: Updated WordPress.org screenshots to match the current AVIF, Placeholders, Tools, and About screens.<\/li>\n<li>Fix: Plugin Check hardening for release by escaping help-tip output safely and using <code>wp_delete_file()<\/code> in preview cleanup paths.<\/li>\n<\/ul>\n\n<h4>0.5.22<\/h4>\n\n<ul>\n<li>Fix: AVIF Delete All now removes only plugin companion AVIF files for JPEG attachments, preventing deletion of user-uploaded AVIF originals.<\/li>\n<li>Fix: CSS background AVIF overrides now keep a JPEG fallback and use <code>image-set(...)<\/code> so non-AVIF browsers still render backgrounds.<\/li>\n<li>Fix: ThumbHash decoder aspect-ratio extraction corrected (<code>h16 &amp; 7<\/code>) to match the upstream reference implementation.<\/li>\n<li>Fix: Restore defaults now resets background-image and all LQIP settings in addition to core AVIF settings.<\/li>\n<li>Fix: Corrected malformed HTML in the Tools diagnostics table around the schedule-time display.<\/li>\n<li>Fix: Clarified Tools count labels to match scope: AVIF now shows file-level totals as \"JPEG Files\" (originals + generated sizes), and LQIP shows attachment-level totals as \"Media Items\" (plus clearer \"Without AVIF\/LQIP\" and \"AVIF files\" progress wording).<\/li>\n<\/ul>\n\n<h4>0.5.21<\/h4>\n\n<ul>\n<li>Enhancement: ThumbHash input increased to 100px for richer LQIP placeholders.<\/li>\n<li>Fix: AVIF srcset now correctly lists all responsive sizes by running after WordPress adds srcset attributes.<\/li>\n<li>Fix: Single AVIF images now include width descriptors for proper responsive selection.<\/li>\n<li>Refactor: Removed redundant <code>render_block<\/code> filter; unified image processing in <code>the_content<\/code> filter.<\/li>\n<\/ul>\n\n<h4>0.5.20<\/h4>\n\n<ul>\n<li>Fix: Instant reveal now waits for <code>img.decode()<\/code> to prevent white flash on fast-loading images.<\/li>\n<\/ul>\n\n<h4>0.5.19<\/h4>\n\n<ul>\n<li>Refactor: Simplified LQIP fade transition \u2014 removed blur filter and scale animation.<\/li>\n<li>Fix: Eliminated white flash during LQIP-to-image transition by ensuring image is fully visible before removing placeholder.<\/li>\n<li>Fix: Fast-loading images now appear instantly without the 400ms fade delay.<\/li>\n<li>Cleanup: Removed unused per-image load duration tracking.<\/li>\n<\/ul>\n\n<h4>0.5.18<\/h4>\n\n<ul>\n<li>Feature: LQIP Generate All now shows real-time progress counter, status text, and stop button.<\/li>\n<li>Feature: Unified spinner\/status UI for both AVIF and LQIP tools panels.<\/li>\n<li>Fix: \"AVIF conversion available\" badge now correctly shows \"Yes\" when engines report support.<\/li>\n<li>Fix: AVIF Delete All button now correctly re-enables Generate All button after completion.<\/li>\n<\/ul>\n\n<h4>0.5.17<\/h4>\n\n<ul>\n<li>Fix: LQIP background now correctly clears for already-loaded\/cached images.<\/li>\n<\/ul>\n\n<h4>0.5.16<\/h4>\n\n<ul>\n<li>Feature: Restored LQIP background cleanup after image load.<\/li>\n<li>Feature: Added \"Pixelated placeholders\" option to display ThumbHash as sharp pixels.<\/li>\n<li>Enhancement: Improved LQIP transition \u2014 blur-up effect with scale animation.<\/li>\n<li>Change: Transition updated to 400ms ease-out for smoother reveal.<\/li>\n<\/ul>\n\n<h4>0.5.15<\/h4>\n\n<ul>\n<li>Enhancement: Tuned LQIP fade thresholds based on human perception research.<\/li>\n<li>Change: Page load window increased to 2 seconds (covers initial render).<\/li>\n<li>Change: Individual load duration increased to 200ms (perception threshold).<\/li>\n<\/ul>\n\n<h4>0.5.14<\/h4>\n\n<ul>\n<li>Fix: WordPress Plugin Check compliance \u2014 proper escaping for inline scripts\/styles.<\/li>\n<li>Fix: Replace <code>strip_tags()<\/code> with <code>wp_strip_all_tags()<\/code> in BackgroundImages.<\/li>\n<li>Fix: Prefix global variables with plugin prefix.<\/li>\n<li>Chore: Remove <code>.DS_Store<\/code> files from repository.<\/li>\n<\/ul>\n\n<h4>0.5.13<\/h4>\n\n<ul>\n<li>Refactor: Simplified LQIP fade logic by removing background cleanup step.<\/li>\n<\/ul>\n\n<h4>0.5.12<\/h4>\n\n<ul>\n<li>Feature: LQIP operations now log successes, failures, and summaries to the Logs panel.<\/li>\n<li>Fix: LQIP stats now correctly validate metadata structure, matching generation skip logic.<\/li>\n<li>Fix: Add object cache clearing before LQIP generation to prevent stale data on servers with persistent caching.<\/li>\n<li>Fix: Prevent false positive \\\"success\\\" reports in <code>wp lqip generate<\/code> when generation fails silently but stale data exists.<\/li>\n<li>Fix: Remove deprecated <code>imagedestroy()<\/code> calls for PHP 8.0+ compatibility.<\/li>\n<li>Refactor: Consolidate LQIP generation logic into shared helper for consistency between Admin UI and CLI.<\/li>\n<\/ul>\n\n<h4>0.5.11<\/h4>\n\n<ul>\n<li>Fix: Critical fix for <code>wp lqip generate --force<\/code> option.<\/li>\n<li>Fix: <code>wp lqip delete --all<\/code> now correctly clears object cache to prevent stale stats.<\/li>\n<\/ul>\n\n<h4>0.5.9<\/h4>\n\n<ul>\n<li>Feature: Added <code>--force<\/code> option to <code>wp lqip generate<\/code> command to force regeneration of LQIPs.<\/li>\n<\/ul>\n\n<h4>0.5.8<\/h4>\n\n<ul>\n<li>Fix: Resolved \"Insufficient memory\" error when generating LQIP for high-resolution images by optimizing ImageMagick loading.<\/li>\n<\/ul>\n\n<h4>0.5.7<\/h4>\n\n<ul>\n<li>Feature: CSS background image AVIF support \u2014 replaces JPEG background images with AVIF versions. Thanks to <a href=\"https:\/\/www.rankxpress.com\">David C.<\/a><\/li>\n<li>Feature: Works with page builders (Elementor, Divi, Beaver Builder, WPBakery, Bricks, etc.)<\/li>\n<li>Feature: New setting \"Serve AVIF for CSS backgrounds\" under AVIF serving options<\/li>\n<li>Fix: Versioned image URLs (e.g., <code>image.jpg?ver=123<\/code>) now correctly detected and replaced<\/li>\n<li>Fix: Query string stripping for CSS file path resolution<\/li>\n<li>Security: Sanitize CSS selectors to prevent XSS injection<\/li>\n<\/ul>\n\n<h4>0.5.6<\/h4>\n\n<ul>\n<li>Enhancement: Smart fade logic \u2014 only apply fade transition for slow-loading images<\/li>\n<li>Enhancement: Images loading within 1 second of page load display instantly (no fade)<\/li>\n<li>Enhancement: Cached\/fast-loading images skip fade for snappier feel<\/li>\n<\/ul>\n\n<h4>0.5.5<\/h4>\n\n<ul>\n<li>Feature: Added \"Fade in images\" option to smoothly transition from LQIP to full image<\/li>\n<li>Fix: Used img.decode() to prevent white flash during LQIP fade transition<\/li>\n<li>Fix: CSS selector now correctly handles both picture wrapper and standalone img cases<\/li>\n<\/ul>\n\n<h4>0.5.4<\/h4>\n\n<ul>\n<li>Feature: Added optional smooth fade-in for LQIP images<\/li>\n<li>Translations: Added German, Italian, Japanese, Portuguese (Brazil), and Russian translations<\/li>\n<li>Enhancement: Updated translations for Spanish, French, Hindi, and Chinese<\/li>\n<li>Fix: <code>wp lqip generate --all<\/code> now correctly processes all eligible images<\/li>\n<li>Fix: <code>wp lqip stats<\/code> accurately counts all supported image types<\/li>\n<li>Fix: LQIP JavaScript is now correctly excluded when feature is disabled<\/li>\n<li>Fix: Improved error logging for LQIP generation failures<\/li>\n<\/ul>\n\n<h4>0.5.3<\/h4>\n\n<ul>\n<li>Fix: Added missing LQIP options to plugin activation (thumbhash_size, generate_on_upload, generate_via_schedule)<\/li>\n<li>Fix: Added missing LQIP options to uninstall cleanup for complete data removal<\/li>\n<li>Fix: Properly minified thumbhash-decoder.min.js (62% size reduction)<\/li>\n<li>Fix: Excluded developer documentation from WordPress plugin distribution<\/li>\n<\/ul>\n\n<h4>0.5.2<\/h4>\n\n<ul>\n<li>Feature: Bundled ThumbHash library \u2014 no Composer dependency required on deployment<\/li>\n<li>Enhancement: Improved LQIP generation with better error handling, progress reporting, and memory management<\/li>\n<li>Enhancement: Added <code>--limit<\/code> and <code>--verbose<\/code> options to <code>wp lqip generate<\/code> command<\/li>\n<li>Fix: Resolved hanging issue in <code>wp lqip generate --all<\/code> command with better error handling and progress output<\/li>\n<li>Fix: Clear error messages when ThumbHash library is unavailable<\/li>\n<\/ul>\n\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>Fix: Improved error handling and logging for ThumbHash generation<\/li>\n<li>Enhancement: WP-CLI now warns if LQIP feature is disabled in settings<\/li>\n<li>Enhancement: Better diagnostics for missing source files during LQIP generation<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Feature: LQIP (Low Quality Image Placeholder) using ThumbHash for smooth image loading<\/li>\n<li>Feature: WP-CLI commands for LQIP management (<code>wp lqip stats<\/code>, <code>wp lqip generate<\/code>, <code>wp lqip delete<\/code>)<\/li>\n<li>Feature: Dedicated LQIP settings tab with enable\/disable toggle<\/li>\n<li>Enhancement: Reorganized admin UI with combined AVIF Tools section<\/li>\n<li>Enhancement: Consistent stat labels across AVIF and LQIP tools (Images\/With\/Without)<\/li>\n<li>Enhancement: Renamed \"Test conversion\" to \"Test AVIF Conversion\" for clarity<\/li>\n<li>Enhancement: Removed beta labels from LQIP feature<\/li>\n<li>Fix: LQIP stats now correctly count all supported image types (JPEG, PNG, GIF, WebP)<\/li>\n<li>Dev: Auto-fixed 6,152+ PHPCS issues for WordPress coding standards compliance<\/li>\n<\/ul>\n\n<h4>0.4.9<\/h4>\n\n<ul>\n<li>Fix: WordPress Plugin Check compliance \u2014 proper escaping, Yoda conditions, and PHPCS ignores<\/li>\n<li>Fix: Improved uninstall cleanup with object cache awareness<\/li>\n<li>Dev: Code formatting aligned with WordPress coding standards<\/li>\n<\/ul>\n\n<h4>0.4.8<\/h4>\n\n<ul>\n<li>Fix: Resolved logging pipeline issues where REST API couldn't retrieve logs due to <code>is_admin()<\/code> check<\/li>\n<li>Fix: Fixed upload test timeout by temporarily disabling synchronous AVIF conversion during test uploads<\/li>\n<li>Fix: Improved AJAX feedback for log operations (clear\/refresh)<\/li>\n<li>Docs: Updated minimum requirements to WordPress 6.8 and PHP 8.3<\/li>\n<li>Docs: Cleaned up README header format for WordPress.org compatibility<\/li>\n<li>Docs: Removed donate link from readme<\/li>\n<li>Dev: Added WordPress stubs for improved IDE support<\/li>\n<\/ul>\n\n<h4>0.4.7<\/h4>\n\n<ul>\n<li>Enhancement: Improved time formatting in conversion progress display (hh:mm:ss format)<\/li>\n<li>Enhancement: CLI code formatting improvements<\/li>\n<li>Fix: Corrected contributor username in readme<\/li>\n<\/ul>\n\n<h4>0.4.6<\/h4>\n\n<ul>\n<li>Docs: Added WordPress.org metadata headers<\/li>\n<li>Docs: Updated tested up to WordPress 6.9<\/li>\n<\/ul>\n\n<h4>0.4.5<\/h4>\n\n<ul>\n<li>Fix: Corrected \"Upload &amp; Test\" status display issues (spinner visibility, status text alignment)<\/li>\n<li>Fix: <code>wp avif delete<\/code> command now correctly reports success\/failure counts and handles permission errors<\/li>\n<li>Fix: <code>wp avif convert<\/code> command output now includes count of missing AVIFs<\/li>\n<li>Enhancement: Added GitHub Action for automated release creation<\/li>\n<\/ul>\n\n<h4>0.4.4<\/h4>\n\n<ul>\n<li>Feature: Fully asynchronous \"Upload &amp; Test\" conversion to prevent timeouts on large images<\/li>\n<li>Enhancement: Re-architected test conversion to use sequential polling<\/li>\n<li>Enhancement: Admin UI modularized with template-based architecture<\/li>\n<li>Optimization: Removed unused <code>vendor<\/code> storage and legacy dependencies, reducing plugin size<\/li>\n<li>Fix: Restored robust queue rendering for test results<\/li>\n<\/ul>\n\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>Added WP-CLI commands: status, convert, stats, logs, delete<\/li>\n<li>Refactored admin interface with modular architecture<\/li>\n<li>Improved logging and environment diagnostics<\/li>\n<\/ul>\n\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Auto-detection for ImageMagick CLI in \"Auto\" mode<\/li>\n<li>REST API replaces admin-ajax for better performance<\/li>\n<li>Smart -define namespace probing (heic\/avif)<\/li>\n<li>Tested with WordPress 6.9<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Compatibility: Tested up to WordPress 6.9<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Major refactor: strict types, DTOs, dedicated Encoder classes<\/li>\n<li>Optimized frontend HTML parsing<\/li>\n<li>Enhanced CLI execution and error handling<\/li>\n<li>Composer support (PSR-4 ready)<\/li>\n<\/ul>\n\n<h4>0.3.x<\/h4>\n\n<ul>\n<li>Environment variable injection for restricted PHP environments<\/li>\n<li>Original image source handling fixes<\/li>\n<li>Engine priority: CLI, Imagick, GD<\/li>\n<\/ul>\n\n<h4>0.2.x<\/h4>\n\n<ul>\n<li>ImageMagick CLI support with auto-detection<\/li>\n<li>Memory pre-check to prevent fatal errors<\/li>\n<li>Logs panel with detailed entries<\/li>\n<li>Lightbox anchor rewriting<\/li>\n<li>Chroma subsampling and bit depth options<\/li>\n<\/ul>\n\n<h4>0.1.x<\/h4>\n\n<ul>\n<li>Initial release with Imagick\/GD support<\/li>\n<li>ICC profile preservation<\/li>\n<li>EXIF orientation handling<\/li>\n<li>Basic admin interface<\/li>\n<\/ul>\n\n<p>See <a href=\"https:\/\/github.com\/ddegner\/avif-local-support\/releases\">GitHub releases<\/a> for complete version history.<\/p>","raw_excerpt":"High-quality AVIF image conversion for WordPress \u2014 local, quality-first.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/247126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=247126"}],"author":[{"embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ddegner"}],"wp:attachment":[{"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=247126"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=247126"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=247126"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=247126"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=247126"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=247126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}