Breaking Changes
- append the output suffix directly WITHOUT an automatic
@separator (-s 2xnow yieldsfile2x.jpeg) and update the CLI help accordingly - accept a UTF-8
file.listas an input file list, with one file path per line (blank lines are skipped, surrounding whitespace is ignored, and relative paths are resolved against the current working directory); when afile.listis provided, all other input file arguments are ignored
Features
- expand glob patterns in input paths on all platforms (previously Windows-only), preferring existing literal paths
- add
100land100sresize values that anchor on the longest or shortest side of each image - add
--reduce-onlyand--enlarge-onlyas aliases for--no-upscaleand--no-downscale
Bug Fixes
- reject malformed width and height
--resizevalues such as1.5worabc100winstead of silently extracting the first run of digits - map each chained
--resizevalue from the size the previous resize left behind, so a chain composes instead of every value mapping the original dimensions - fix a deadlock with a single-threaded pool by acquiring the concurrency permit inside the worker, and return an error instead of panicking when the thread pool cannot be created
- write outputs atomically through unique temporary files and publish them by rename, with a recoverable swap when replacing existing files on Windows
- detect collisions before any processing: duplicate output mappings, outputs overwriting another input, metadata path conflicts, and output paths identical to
--backuppaths (path names are treated as case-insensitive on every platform as a fail-safe default, covering case-insensitive Linux mounts, and aliases are resolved through canonicalization for existing paths) - never overwrite or delete an existing
--backupfile; create backups via hard link with a no-clobber copy fallback and remove the original input only after a successful publish - normalize input paths without canonicalization so symlinked directory layouts are preserved, and reject output parents that resolve outside the output root
- return non-zero exit codes when no inputs are found, an encoder fails, a collision is detected, files fail, or metadata cannot be written
- fix WebP animation encoding by warning and encoding only the first frame; compute per-frame durations from timestamps in the decoder
- guard against empty frame lists in the AVIF, MozJPEG, OxiPNG and WebP encoders instead of panicking
- restrict MozJPEG to 8-bit output and fix OxiPNG 16-bit endianness for non-RGB colorspaces
- apply ICC profiles to 16-bit frames without panicking and preserve frame timing metadata
- prevent integer overflow panics in quantization and resize, and surface resize worker panics as errors
Improvements
- validate suffixes and output file names (including Windows reserved names) up front, reject recursive inputs without a common root and duplicate output mappings with clear errors
- write JSON metadata atomically and use saturating arithmetic for size and space-saved statistics
- add end-to-end regression tests covering single-thread processing, recursive output layouts, backup collisions, existing-backup protection and non-zero exit codes
- regenerate the AVIF test fixture
- update install steps of dependencies for building on Windows
Dependencies
- bump
zune-imageprocsto 0.5.1 (stable) andregexto 1.13 - bump
jxl-gridto 0.6.2,jxl-oxideto 0.12.6,logto 0.4.33,indicatifto 0.18.6,anyhowto 1.0.103 andserde_jsonto 1.0.150 - replace
winreswithwinresource0.1.31 and makegloba general dependency - pin
ravif0.13.0 without default features foraarch64-unknown-linux-musl
Build / CI
- rewrite the CI workflow: build and test on
mainanddev, Ubuntu 24.04 / Windows 2025 / macOS 15 runners, cross builds foraarch64-unknown-linux-muslwith a pinned image, qemu runner for aarch64 Linux,actions/checkout@v7, concurrency grouping and read-only permissions - use yasm for the libaom build, fix artifact download errors and silence Homebrew tap warnings on macOS
- remove the
config.tomlpre-release override and set the Windows pre-release version inbuild.rs