Releases: plan2net/webp
14.7.0
Two editorial/optimization features on top of the per-image quality override from 14.6.0.
Per-image compression report
The file metadata form now shows, right below the compression quality field, what each enabled format achieved for that image: per processed variant (each rendered size), the generated WebP / AVIF / JPEG XL sibling's size and the saving versus the source it replaces. Read-only; it fills in as the image is rendered at more sizes.
Compress larger variants harder
Optional per-format width-to-quality curves (quality_by_width, quality_by_width_avif, quality_by_width_jxl) map a rendered variant's width to a quality, so larger variants are compressed harder automatically — the responsive-image best practice (a large hero that produced no smaller WebP at the global quality now does). Off by default; a per-image quality override still wins, and lossless parameters are left untouched. The README has a copy-paste recommended starting curve.
Full changelog: 14.6.0...14.7.0
14.6.0
Per-image compression quality override
Editors can set a Compression quality (1–100) on an individual image's metadata in the Filelist. It overrides the global converter quality for that file across every enabled output format (WebP / AVIF / JPEG XL); leave it at 0 to use the global setting.
Quality is read from the file's current metadata at conversion time, so changing it regenerates the sibling on the next image processing, and it applies everywhere the image is used. Folder-mode sweeps continue to use the global quality.
Full changelog: 14.5.4...14.6.0
14.5.4
14.5.3
Changed
Configurationmemoizes parsed settings (enabled formats, mime-type lists, exclude directories) instead of re-parsing them on every processed image. The cache is keyed by the raw setting value, so runtime configuration changes are still picked up.FileNameFilternow also caches an absent filter pattern instead of re-resolving the configuration for every backend file-list row.webp:process-queue --folderconverts images while scanning instead of loading the complete file list into memory first.
Fixed
- The folder sweep now matches uppercase and mixed-case file extensions (
IMAGE.JPG), consistent with the FAL-driven conversion path.
14.5.2
Documentation
- Added a Caddy webserver recipe for
Accept-header content negotiation, alongside the existing nginx and Apache examples. All three configs are now exercised by the E2E suite. - Rewrote the core-vs-extension comparison: TYPO3 core handles WebP (13.0+) and AVIF (13.4+, ImageMagick); this extension's distinct value is unchanged URLs, transparent per-request fallback, and JPEG XL.
Changed
FileNameFiltercaches the resolved filter pattern instead of recompiling it on every backend file-list row.
14.5.1
Changed
parameters_avifandparameters_jxlnow ship ImageMagick-compatible defaults;converter_avifandconverter_jxldefault toMagickConverter. Enabling AVIF or JPEG XL viaformats_enabledworks out of the box on the typical TYPO3 host — no manual parameter string required. Override either to switch to libvips or an external binary.
Fixed
webp:diagnoseparameter-parsing check now distinguishes empty, malformed-global, and missing-per-mime cases and emits the concrete recommended value for the configured converter, instead of pointing at the README.
Documentation
- README adds dedicated
parameters_avifandparameters_jxlsections with per-backend recipes (ImageMagick, libvips, external binaries).
14.5.0
Added
- WebP, AVIF, and JPEG XL output in any combination. A new
formats_enabledsetting (defaultwebp) lets you pick which sibling formats this install produces — e.g.formats_enabled = webp,avifto ship both, orwebp,avif,jxlto ship all three. Each non-webp format has its own converter, parameters, and mime-types tab in the Extension Configuration form (converter_avif,parameters_avif,mime_types_avif; same forjxl). The existingconverter/parameters/mime_typeskeys remain the source of truth for the WebP slot. The 4-converter × 3-format support matrix (VipsConverter,MagickConverter,ExternalConverter,PhpGdConverter) is in the README. Closes #94. webp:diagnose --format=<webp|avif|jxl>to restrict the report to one format. The delivery probe now sends fourAcceptheaders (avif/jxl/webp/*/*) and verifies the server returns the highest-priority format the install actually generates. Storages, converter health, async pipeline, failed-attempts cache, and per-file deep-dive all report per format.webp:process-queue --folder=<path>now sweeps for every enabled output format, not just WebP.
Changed
- Sibling lifecycle (move / rename / replace / delete) now covers all three formats. Any on-disk
.avifor.jxlsibling follows its original alongside the existing.webphandling. - Default
filter_patternnow matches.avifand.jxlsiblings as well as.webp. Custom values are left untouched; admins who pinned a webp-only regex keep their value.
Fixed
- A previously-good sibling is no longer deleted when a fresh conversion attempt turns out larger than the original. The failed-attempts cache already prevents the next render from retrying with the same parameters; we keep the file the webserver was happily serving.
- Renaming a source file no longer overwrites a same-named file at the destination. The orphaned source sibling is cleaned up and the next render produces a fresh destination sibling, instead of silently replacing whatever was there.
- Enabling a format without its converter or parameters no longer generates an error on every render. The listener skips the unconfigured format with a one-line notice instead.
webp:diagnosedegrades gracefully on installs that haven't run the TYPO3 Database Analyzer after upgrade — the affected sections detect the missingformatcolumn and point the admin at the analyzer instead of throwing.webp:diagnoseno longer certifies PhpGdConverter as AVIF/JPEG XL capable. PhpGd is WebP-only at runtime; the diagnose check now mirrors that.webp:diagnoseAccept-header probe grades against the format actually available on disk, instead of always comparing against the highest-priority enabled format — eliminates the spurious "server prefers webp over avif" warning when a file has no AVIF sibling yet.PhpGdConverterclampsqualityvalues above 100 (PHPimagewebpdocuments 0–100).ext_emconf.phpnow declaresphp >= 8.2.0, matching the long-standing composer constraint. TER installs on PHP 8.1 no longer fetch the extension only to fatal on first request.- Async-mode label in the Extension Configuration backend module no longer breaks mid-sentence — TYPO3's EM UI was splitting the label on the
webp:colon. composer.jsonnowsuggeststypo3/cms-frontendfor installs that pick the PhpGd backend (PhpGd importsTYPO3\CMS\Frontend\Imaging\GifBuilder).
Upgrade notes
- Run the TYPO3 Database Analyzer.
tx_webp_queueandtx_webp_failedgain aformatcolumn; existing rows remain valid (formatdefaults towebp) but the schema must match. Stop the Scheduler before running the analyzer if you're worried about concurrent enqueues during theALTER TABLE— queued work is a transient working set andTRUNCATE tx_webp_queuebefore the analyzer is also fine. - Flush all caches after deploy. The compiled DI container caches references to the renamed service classes; a stale container will fatal on the first request that touches them.
vendor/bin/typo3 cache:flushor Install Tool → Maintenance → Flush cache resolves it. - Re-save the Extension Configuration if you customised
filter_patternto the previous webp-only default. The old default'/\.(jpe?g|png|gif)\.webp$/i'does not hide.avif/.jxlsiblings. The new default covers all three; admins who pinned a webp-only regex keep their value untouched.
14.4.1
A bugfix release: webp:diagnose no longer crashes on classic-mode (non-Composer) TYPO3 v12 installs.
Bug fixes
webp:diagnoseno longer requiressymfony/process. Classic-mode TYPO3 v12 core does not bundle that package, so the command crashed withClass "Symfony\Component\Process\Process" not found. The MagickConverter health check now uses PHP's nativeproc_openwith the same 5-second timeout behaviour.symfony/processis dropped fromcomposer.jsonrequireentirely. A new smoke test (Tests/Functional/Command/DiagnoseCommandTest) keeps the command exercised in every PHP × TYPO3 CI matrix cell. Closes #116.
Upgrade notes
- No schema changes, no upgrade wizard, no BC concerns.
14.4.0
libvips becomes a first-class WebP conversion backend, either in-process via jcupitt/vips 2.x + PHP ext-ffi (typically 2–3× faster than MagickConverter at equivalent quality, substantially less memory) or as the vips CLI binary through the existing ExternalConverter. Both routes preserve animated GIFs as animated WebP.
New features
- libvips (native) backend. A new
VipsConvertercalling libvips in-process viajcupitt/vips(2.x) + PHPext-ffi. Pick libvips (native) in the converter dropdown. Parameters are space-separatedkey=valuepairs per mime type (e.g.image/jpeg::Q=85 smart_subsample=true effort=4|…) passed straight to libvips'swebpsave— see the option reference for the full list. - Animated GIFs survive as animated WebP.
VipsConverterloads all frames automatically (n=-1) and emits multi-frame WebP whenmixed=trueis set. ThevipsCLI binary viaExternalConverteralso preserves animation when the GIF entry uses%s[n=-1]on the source argument. webp:diagnosereports libvips availability. Distinguishes ext-ffi missing / disabled /preloadmode,jcupitt/vipsnot installed, and libvips shared library unreachable viaVips\Config::version(). Warns on PHP 8.3+ ifzend.max_allowed_stack_size=-1is not set (jcupitt/vips runs FFI callbacks off the main thread).
Upgrade notes
- No schema changes, no upgrade wizard, no BC concerns. Default backend stays
MagickConverter— existing installs are unaffected until you opt in. - To use the native backend, install
libvips-toolson the host (Debian/Ubuntu pulls inlibvips42/libvips42t64as a dependency), enable PHP'sext-ffiwithffi.enable=truein php.ini (notpreload— jcupitt/vips does not support preloading),composer require jcupitt/vips, and set the converter to libvips (native) in the extension configuration. On PHP 8.3+ also setzend.max_allowed_stack_size=-1. Full recipe in the README's Using libvips natively section.
14.3.0
A new webp:diagnose CLI command walks the full delivery chain end-to-end and points at the first failing link.
New features
webp:diagnoseCLI command. Runvendor/bin/typo3 webp:diagnosefor a single-pass health check covering:- Storages — WebP mode, driver,
.webpsibling counts, silent-off cases, phantom storage rows with unregistered drivers. - Converter — class, binary availability, parameter string.
- Async pipeline — queue size, oldest entry age, scheduler task state.
- Failed-conversion cache — recent rows, dominant configuration_hash warning.
- Optional HTTP probe (
--url=<url>) —Accept-header rewrite +Vary: Acceptcheck. - Optional per-file deep dive (
--file=<uid>) — metadata, sibling lookups, failed-attempts rows.
- Storages — WebP mode, driver,
- Output uses coloured markers (
✓ok,!warning,✗failure). Exit code is1only on real failures, so the command works as a deployment gate.
Upgrade notes
- No schema changes, no upgrade wizard, no BC concerns.