v1.1 — JPEG XL, one decode path, fewer dependencies.

Three new things, one architectural change, and a half-dozen fewer direct dependencies. The default WebP output is still byte-identical to v1.0.

JPEG XL · in and out

JPEG XL (.jxl) is now a first-class input and output format. It's a royalty-free modern codec with excellent compression and full alpha support — the format every browser has politely refused to ship for the last three years, but which is great when you control the pipeline.

Quality and effort knobs are exposed in the options panel. The default effort of 7 matches libjxl's own default (highest compression, slow). For everyday batches, turn it down to 4 — encodes get roughly 4× faster and files stay close in size.

Strip metadata · Preserve color profile

Two new global toggles live in the Privacy section.

Strip metadata is on by default. It scrubs EXIF, GPS coordinates, camera info, XMP and other personal data from converted outputs. Sharp-native formats (JPEG, PNG, WebP, AVIF, GIF, TIFF) respect the toggle directly.

Preserve color profile pairs with it: drop personal data but keep the ICC profile so colors don't shift after conversion. Useful when you're sharing photos publicly but want them to look right in color-managed apps. Disabled when Strip metadata is off — redundant in that case.

Caveat (see known limitations). Magick-routed outputs (BMP, JXL, future niche formats) currently strip metadata unconditionally at the raw-RGBA bridge. The toggle is honoured in the privacy-positive direction; the "keep all metadata" branch is on the v1.1.x list.

Hybrid decode/encode architecture

This is the change that took the most time and shows the least.

sharp continues to handle the hot path — JPEG, PNG, WebP, AVIF, GIF, TIFF — at native libvips speed. Everything else (HEIC, PSD, BMP, JPEG XL, and future additions like JP2, EXR, RAW) now routes through a single magick-wasm dependency instead of one bespoke JS library per format.

The cost: ~7 MB net bundle increase. The win: adding a new format is now one dispatch entry, not a new dependency.

Removed direct deps: ag-psd, heic-decode, libheif-js, bmp-js.

32-bit BMP output

BMP output is now 32-bit RGBA instead of 24-bit RGB. It preserves source transparency at the cost of ~33% larger files on transparent sources. Every modern tool — Preview, Photoshop, GIMP, Paint.NET, Windows Paint on Win10+ — handles 32-bit BMPs without issue.

What stayed identical

WebP output is byte-identical to every previous LocalPix and LocalConvert release, all the way back to the original WEBPConvert app. Default WebP at quality 80, effort 4 produces the same bytes as v1.0.0. If you're hashing outputs in a pipeline, nothing needs to change.

All v1.0 features remain: drag-and-drop, segmented format selector, dark mode, ⌘O / ⌘⇧O menu actions, Electron folder picker, ICO multi-size output, SVG density control, JPEG alpha background fill, animated source flattening.

Known limitations

  • PDF input is not yet supported. Magick-wasm relies on a system Ghostscript binary for PDF rasterization, which we can't ship in a packaged Electron app. PDF support requires a separate decoder (e.g. mupdf-js) — planned for v1.1.x.
  • RAW input (DNG, CR2, NEF, ARW) is advertised by magick-wasm but hasn't been validated against real camera files yet. Planned for v1.2.
  • Metadata toggle only fully applies to sharp-native outputs (see callout above).

How to upgrade

Download the v1.1 .dmg or .exe from the downloads page and replace your existing install. LocalPix has no settings file outside the OS defaults system — your output folder choice persists across the upgrade.

← All posts · Previous: v1.0 · Next: v1.1.1 →