Fixed: a transparent HEIC or AVIF converted to JPEG came back black. Debian bookworm's libheif
1.15.1 drops the alpha channel across the whole HEIF family in both directions, with exit code 0
and every format and delegate check passing, so the flattening this Actor does onto white had
nothing to work with. The base image moves to node:22-trixie-slim (ImageMagick 7.1.1, libheif
1.19.8) with libheif's codec plugins, which trixie splits out of the base package. The build now
asserts the pixels rather than the format table: that a transparent image flattens to white, and
that alpha survives a round trip through PNG, WebP, AVIF and TIFF. Affected avif to jpg,
avif to png and any transparent HEIC in 0.1.
Converts up to 100 files in one run. The new files input is a multi-file upload in Console and an
array of URLs from the API; filesBase64 is its base64 equivalent. The single-file file and
fileBase64 inputs still work and can be mixed with the new ones.
A file that cannot be converted no longer fails the run. It gets a dataset record with ok: false
and the reason, and the rest of the batch converts. The run only fails if nothing converted.
OUTPUT, which is what run-sync returns, is now the converted image when the run produced one
and converted-images.zip when it produced several. The archive is written by a small in-repo ZIP
writer shared with the sibling converters, so there is still exactly one runtime dependency. Past
192 MB of images it is skipped and OUTPUT lists the individual records instead.
Output keys no longer overwrite each other. A second IMG_1234.heic is stored as IMG_1234-2.jpg.
allImages combines with a batch: inside the ZIP, a source file that produced several images gets
a folder of its own, so two bursts in one run cannot bury each other's frames.
The dataset holds one record per source file rather than one per run, with ok and error fields.
outputFilename is ignored when converting more than one file, since it would name them all the same.
A run has a budget: 100 files, 512 MB of input in total, 100 MB for one file, 100 MP for one image
and 4 GP of decoded pixels across the run. Exceeding one says which limit was hit and at what
number, instead of timing out halfway, and fails only the file that hit it.
Downloads have a two-minute timeout, so one unresponsive URL cannot stall a batch.