NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #4874 most downloaded on Packagist
Drop-in WebP, AVIF, and JPEG XL delivery for TYPO3 images — automatic, no URL or template changes
Last release 16 days ago
22 Sep 2026
Release timing varies
gaps range from 2 weeks to 13 months
Some releases are documented
notes for 20 of 51 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
51 releases · first in 2018
Fixes a conversion loop in multi-storage setups, where sibling rows named the wrong storage and the async queue refilled with the same entries forever
Fixes a conversion loop in multi-storage setups, where sibling rows named the wrong storage and the async queue refilled with the same entries forever.
sys_file_processedfile now record the storage that actually holds the sibling; where a storage keeps its processing folder in another storage, the row named the processing folder's storage while the file sat next to the original, so the extension never found it again and reconverted the image on every render, refilling the async queue with the same entries forever (#121).On upgrade: rows written by earlier versions correct themselves the first time each image is rendered again, at the cost of one extra conversion per affected file. If a storage with a non-Local driver relied on siblings being written next to its originals, set Generate WebP / AVIF / JPEG XL siblings to Enabled on that storage record — webp:diagnose lists the storages that are silently off.
Full changelog: 14.9.0...14.9.1
One column per quarter.
Per-image compression can now be handed out per backend user group instead of being visible to every editor.
Per-image compression can now be handed out per backend user group instead of being visible to every editor.
Compression quality mode, Compression quality and Compression results on file metadata are TCA exclude fields. Add them to a backend user group under Allowed excludefields to let its editors use them. Without the grant an editor does not see the fields, and a submitted value is dropped instead of saved.
Grant all three together. A group that has the quality field but not the mode gets a number it cannot switch on.
On upgrade: every editor could see these fields before. After updating, only admins see them until you add them to a group (#120).
Full changelog: 14.8.3...14.9.0
Fixes a repeated download of every source image on remote storages, where each render fetched the original again even when its siblings already existe
Fixes a repeated download of every source image on remote storages, where each render fetched the original again even when its siblings already existed.
.webp and .avif siblings had long been in place.Full changelog: 14.8.2...14.8.3
Fixes the per-image compression quality override, which could not be activated at all.
Fixes the per-image compression quality override, which could not be activated at all.
Full changelog: 14.8.1...14.8.2
Fixes noisy PostgreSQL logs on async installations by writing queue entries with a native upsert.
Fixes noisy PostgreSQL logs on async installations by writing queue entries with a native upsert.
ERROR for every duplicate queue entry; tx_webp_queue writes now use a native INSERT … ON CONFLICT upsert, while other database platforms keep the existing insert/update fallback (#118).Full changelog: 14.8.0...14.8.1
A CLI command that generates your webserver negotiation config, an explicit per-image quality mode, and a fix for processing folders that live in anot
A CLI command that generates your webserver negotiation config, an explicit per-image quality mode, and a fix for processing folders that live in another storage.
webp:webserver-config --server=nginx|apache|caddy prints a ready-to-paste content-negotiation snippet for exactly the formats your install produces — correct AVIF → WebP → JXL priority, Vary: Accept handling, and the MIME types stock nginx lacks for AVIF/JXL. --scope emits a single section raw for scripting. The E2E suite injects the generated output into real nginx, Apache, and Caddy servers, so the config is proven to negotiate correctly.
The per-image compression quality override is now an explicit quality mode on file metadata: Global (site settings) or Force a fixed quality (1–100). An upgrade wizard migrates existing overrides to the force mode, and saving Force without a valid quality safely falls back to the global setting with a warning.
webp:diagnose and webp:webserver-config are no longer offered in the Scheduler.Full changelog: 14.7.0...14.8.0
webp:webserver-config CLI command that prints a ready-to-paste content-negotiation snippet for nginx, Apache, or Caddy — generated for the formats actually enabled, including the MIME types stock nginx lacks for AVIF/JXL. --scope emits a single section raw for scripting. The E2E suite runs the generated output against real servers.webp:diagnose and webp:webserver-config are no longer offered as schedulable commands in the Scheduler.Two editorial/optimization features on top of the per-image quality override from 14.6.0.
Two editorial/optimization features on top of the per-image quality override from 14.6.0.
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.
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
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 — best practice for responsive images. Off by default; a per-image quality override still wins, and lossless parameters are left untouched. See the README for a recommended starting curve.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
0 to use the global setting. The value is read from current metadata at conversion time, so changing it regenerates the sibling on the next image processing.webp:diagnose no longer fails on PostgreSQL when probing for sibling files; the sibling suffix is now inlined as a literal instead of an untyped bound
webp:diagnose no longer fails on PostgreSQL when probing for sibling files; the sibling suffix is now inlined as a literal instead of an untyped bound parameter inside CONCAT().Configuration memoizes parsed settings (enabled formats, mime-type lists, exclude directories) instead of re-parsing them on every processed image. Th
Configuration memoizes 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.FileNameFilter now also caches an absent filter pattern instead of re-resolving the configuration for every backend file-list row.webp:process-queue --folder converts images while scanning instead of loading the complete file list into memory first.IMAGE.JPG), consistent with the FAL-driven conversion path.Added a Caddy webserver recipe for Accept -header content negotiation, alongside the existing nginx and Apache examples. All three configs are now exe
Accept-header content negotiation, alongside the existing nginx and Apache examples. All three configs are now exercised by the E2E suite.FileNameFilter caches the resolved filter pattern instead of recompiling it on every backend file-list row.parameters_avif and parameters_jxl now ship ImageMagick-compatible defaults; converter_avif and converter_jxl default to MagickConverter . Enabling AV
parameters_avif and parameters_jxl now ship ImageMagick-compatible defaults; converter_avif and converter_jxl default to MagickConverter. Enabling AVIF or JPEG XL via formats_enabled works out of the box on the typical TYPO3 host — no manual parameter string required. Override either to switch to libvips or an external binary.webp:diagnose parameter-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.parameters_avif and parameters_jxl sections with per-backend recipes (ImageMagick, libvips, external binaries).WebP, AVIF, and JPEG XL output in any combination. A new formats_enabled setting (default webp ) lets you pick which sibling formats this install prod
formats_enabled setting (default webp) lets you pick which sibling formats this install produces — e.g. formats_enabled = webp,avif to ship both, or webp,avif,jxl to 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 for jxl). The existing converter / parameters / mime_types keys 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 four Accept headers (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..avif or .jxl sibling follows its original alongside the existing .webp handling.filter_pattern now matches .avif and .jxl siblings as well as .webp. Custom values are left untouched; admins who pinned a webp-only regex keep their value.webp:diagnose degrades gracefully on installs that haven't run the TYPO3 Database Analyzer after upgrade — the affected sections detect the missing format column and point the admin at the analyzer instead of throwing.webp:diagnose no longer certifies PhpGdConverter as AVIF/JPEG XL capable. PhpGd is WebP-only at runtime; the diagnose check now mirrors that.webp:diagnose Accept-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.PhpGdConverter clamps quality values above 100 (PHP imagewebp documents 0–100).ext_emconf.php now declares php >= 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.webp: colon.composer.json now suggests typo3/cms-frontend for installs that pick the PhpGd backend (PhpGd imports TYPO3\CMS\Frontend\Imaging\GifBuilder).tx_webp_queue and tx_webp_failed gain a format column; existing rows remain valid (format defaults to webp) but the schema must match. Stop the Scheduler before running the analyzer if you're worried about concurrent enqueues during the ALTER TABLE — queued work is a transient working set and TRUNCATE tx_webp_queue before the analyzer is also fine.vendor/bin/typo3 cache:flush or Install Tool → Maintenance → Flush cache resolves it.filter_pattern to the previous webp-only default. The old default '/\.(jpe?g|png|gif)\.webp$/i' does not hide .avif / .jxl siblings. The new default covers all three; admins who pinned a webp-only regex keep their value untouched.webp:diagnose no longer requires symfony/process, which is not bundled in TYPO3 v12.4 core. Classic-mode (non-Composer) installs on v12 hit a fatal Cl
webp:diagnose no longer requires symfony/process, which is not bundled in TYPO3 v12.4 core. Classic-mode (non-Composer) installs on v12 hit a fatal Class "Symfony\Component\Process\Process" not found when running the command. The MagickConverter health check now uses PHP's native proc_open with the same 5-second timeout behaviour, removing the runtime dependency on symfony/process entirely (also dropped from composer.json require). Closes #116.libvips as a first-class conversion backend. Pick libvips (native) from the converter dropdown to use a new VipsConverter that calls libvips in-proces
VipsConverter that calls libvips in-process via jcupitt/vips (2.x) + PHP ext-ffi — typically 2–3× faster than MagickConverter at equivalent quality, substantially less memory, and animated GIFs survive as animated WebP automatically (n=-1 load + mixed=true save). The vips CLI binary also works through the existing ExternalConverter and preserves GIF animation when the GIF entry uses %s[n=-1] on the source argument. Parameter format for the native backend is space-separated key=value pairs per mime type, passed straight to libvips's webpsave. webp:diagnose reports libvips availability (ext-ffi state, package, shared library reachable via Vips\Config::version()) and warns on PHP 8.3+ if zend.max_allowed_stack_size=-1 is not set. README and reST documentation updated. CI matrix exercises the native backend on every PHP × TYPO3 cell.webp:diagnose CLI command. Reports per-storage WebP mode (incl. phantom rows whose driver isn't registered), converter health (PHP GD / ImageMagick /
webp:diagnose CLI command. Reports per-storage WebP mode (incl. phantom rows whose driver isn't registered), converter health (PHP GD / ImageMagick / GraphicsMagick / external binary), async pipeline + scheduler state, recent failed conversion attempts, an optional HTTP probe of the webserver's Accept-header rewrite (with Vary: Accept check), and an optional per-file deep dive. Single recommendation block points at the first finding; exit code is 1 only on real failures so the command works as a deployment gate. README and reST documentation updated.Per-storage opt-in for .webp generation on non-Local FAL drivers. A new tx_webp_mode field on sys_file_storage (Storage record → *Generate WebP varian
.webp generation on non-Local FAL drivers. A new tx_webp_mode field on sys_file_storage (Storage record → Generate WebP variants) selects Auto (default, preserves pre-14.2 behaviour — on for Local, off for everything else), Enabled (force on regardless of driver), or Disabled (force off). Closes #108.ResourceStorage::updateProcessedFile() for processing-folder targets, Folder::addFile(..., DuplicationBehavior::REPLACE) for source-folder targets) instead of direct filesystem writes. The driver overwrites atomically on REPLACE — a transient upload failure no longer leaves the user without a previously-valid sibling.ResourceStorage::moveFile, renameFile, getFile, deleteFile) instead of direct filesystem ops. Works driver-agnostically; remote-driver storages no longer accumulate orphans on cross-storage moves..webp stranded at the old filename.SYS/mediafile_ext without webp, so the new FAL publish path tripped ResourceConsistencyService::isFileExtensionAllowed. ext_localconf.php now appends webp to that list if absent — no-op on v13/v14 where it's already there.typo3/cms-install and typo3/cms-scheduler moved from require to suggest. The UpgradeWizard class only loads when cms-install's attribute-autoconfigure
typo3/cms-install and typo3/cms-scheduler moved from require to suggest. The UpgradeWizard class only loads when cms-install's attribute-autoconfigure scans services, and the scheduler task wrapper only loads when cms-scheduler actually instantiates it — both are dormant on installs that don't have the packages. The scheduler-task registration in ext_localconf.php is now guarded with class_exists for explicit clarity. Users running async mode still need cms-scheduler installed; users running the upgrade wizard still need cms-install installed.TYPO3 14.3 no longer logs an ext_emconf.php deprecation notice on every request; composer.json now declares extra.typo3/cms.version and extra.typo3/cm…
async = 1): WebP conversions are queued in a new tx_webp_queue table and processed out-of-band by a TYPO3 Scheduler task. Closes #17.webp:process-queue with optional --folder=PATH argument to convert images in non-FAL folders (e.g., typo3temp/assets/online_media/). Closes #73.async_throttle_ms configuration to space conversions out with randomized jitter, preventing thundering-herd CPU/IO.webp.truncateFailedAttemptsBeforeColumnResize to unblock upgrades from older releases that shipped tx_webp_failed.configuration_hash as VARCHAR(40); the wizard empties the cache of failed attempts so TYPO3's database analyzer can shrink the column to VARCHAR(32). Closes #95.ExternalConverter now preserves non-ASCII bytes in filenames (e.g., German umlauts, accented characters) when passing paths to external converters like cwebp. PHP's escapeshellarg() silently drops multibyte bytes under LC_CTYPE=C, which mangled filenames like Mövenpick.png to Mvenpick.png and caused conversion to silently fail. Closes #89.ext_emconf.php deprecation notice on every request; composer.json now declares extra.typo3/cms.version and extra.typo3/cms.Package.providesPackages so PackageManager recognises the extension as composer-only-capable.TYPO3 v14 support; single code path covers v12, v13, and v14.
.webp siblings next to original images are kept in sync with TYPO3's FAL operations (move, delete, replace). When a storage has a recycler, the sibling follows the file into the recycler so restore keeps the pair intact. Closes #88.mime_types and filter_pattern keys.Plan2net\Webp\Converter\Converter interface constructor now takes a second argument: __construct(string $parameters, Plan2net\Webp\Service\Configuration $configuration). Third-party converter implementations need to update their constructor signature accordingly..webp source files no longer create phantom rows in sys_file_processedfile.FileReference inputs to their underlying File before the repository lookup — fixes a latent v12/v13 bug where the wrong UID was being queried.FileNameFilter no longer emits PHP 8+ warnings on invalid filter regex patterns.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →