# h4b-image-optim ICC-safe image optimisation with WebP + AVIF generation for WordPress. Replaces Smush Pro without the grey-wash bug. No CDN. **Status:** v0.1.0 MVP — under active development. Tested on AlmaLinux 9 + PHP 8.4 + Imagick 3.8.1. ## Why this exists Smush Pro's Ultra mode (`lossy=2` + `strip_exif=true`) destroyed 1,345 high-contrast B&W ink art JPGs on rds.ink by stripping ICC profiles and applying aggressive JPEG quantisation. The diagnosis, rescue, and a full design document are in the sibling `image-rescue/` directory. This plugin is the structural fix: an in-house Smush replacement that **never** strips ICC profiles, with full source-code ownership and zero CDN dependency. ## Features (v0.1) - ✅ JPEG / PNG optimisation in place (Imagick + jpegoptim/pngquant) - ✅ ICC profile preservation (the Smush-bug fix) - ✅ EXIF orientation applied + GPS stripped for privacy - ✅ WebP sibling generation (cwebp) - ✅ AVIF sibling generation (avifenc, queued via WP-Cron) - ✅ Backup of originals to `wp-content/h4b-img-originals/`, pruned after 90 days - ✅ WP-CLI: `wp h4b-img status`, `wp h4b-img optimise --id=` - 🔜 Bulk processing (`wp h4b-img bulk`) - 🔜 Picture-tag rewriting + .htaccess fallback - 🔜 Admin settings page - 🔜 Migration command from Smush metadata ## Required system tools Install on AlmaLinux 9: ```bash dnf install --setopt=install_weak_deps=False \ libwebp-tools jpegoptim libjpeg-turbo-utils libavif-tools pngquant ``` Verify with: ```bash wp h4b-img status ``` ## Settings (v0.1 — set via WP-CLI) ```bash wp option get h4b_image_optim_settings wp option patch update h4b_image_optim_settings jpeg_quality 90 ``` Key defaults: | Setting | Default | Why | |---|---|---| | `jpeg_quality` | 85 | Industry standard; visually lossless for art | | `jpeg_chroma_subsampling` | `4:4:4` | The Smush-bug fix — no chroma loss on edges | | `preserve_icc_profile` | `true` | **Critical** — never strip ICC | | `generate_webp` | `true` | Always make .webp sibling | | `generate_avif` | `true` | Always make .avif sibling (background) | | `avif_async` | `true` | Don't block upload UI | | `backup_originals` | `true` | Always | | `backup_prune_days` | `90` | Cron prunes after 90 days | | `resize_max_width` | `2560` | Hard cap on uploaded image size | ## Uninstall `uninstall.php` deletes the settings option and clears cron hooks. It does **not** delete backup files or .webp/.avif siblings — those are user data. ## License GPL-2.0-or-later.