Firefox will ship JPEG XL, and the decoder had to be rewritten in Rust first
Mozilla posted its intent to ship on August 24. The condition it set five years ago was met: Google Research rebuilt the decoder in Rust, because 100,000 lines of multithreaded C++ was too much attack surface to accept.
Firefox has had JPEG XL behind a flag since 2021 and has not shipped it in all that time. The reason was never the format. It was the decoder: 100,000 lines of multithreaded C++, parsing untrusted files from the open web, inside the browser process. Mozilla's answer was a challenge rather than a refusal — build a safe, performant, compact and compatible decoder in Rust, and we will ship it. Google Research built jxl-rs, and it is now the core of JPEG XL support in Firefox.
What is actually shipping
An intent to ship is a public commitment, not a release. Mozilla says Chrome also intends to ship, and that Safari already carries a partial implementation — it shipped JPEG XL in 2023, but without progressive rendering. On that basis Mozilla expects the format to be supported across browsers before the end of the year.
Alongside the decoder, Mozilla pushed for integration tests as an Interop 2026 investigation area. That matters more than it sounds: an image format that decodes differently in three browsers is a format nobody can use in production.
Checked against webstatus.dev on August 25, 2026: JPEG XL is Baseline limited. Safari and Safari on iOS have shipped it since September 18, 2023; Chrome and Firefox have not. AVIF, by contrast, has been Baseline widely available since January 25, 2024. Today the two formats are not interchangeable in production, whatever the intent notices say.
AVIF or JPEG XL: the numbers say it depends
For the first time the web has two modern formats that are both worth using, and the honest answer to which one is that they win in different places. Mozilla published measurements on a photographic image, scored with SSIMULACRA 2.
At medium-high quality (score 62.8) the AVIF is 116 kB and the JPEG XL is 134 kB. At very high quality (score 80) it is 227 kB against 264 kB. Lossless flips it: 1.76 MB for AVIF, 1.45 MB for JPEG XL, and 1.55 MB for lossless WebP. On a screenshot the gap is wider still — at score 78, AVIF is 11.6 kB and JPEG XL 23.8 kB, but lossless it is 164 kB against 92 kB.
- JPEG XL: lossless imagery, progressive rendering, and recompressing existing JPEGs without quality loss.
- AVIF: photographic images at web quality, and images mixing sharp edges with flat surfaces.
Progressive rendering is the part you can see
Progressive rendering means the image starts drawing while it is still downloading. In Mozilla's demo the full image is 135 kB, and a few kilobytes in, a reader can already tell what the picture is of. AVIF has only basic support for this, which is why Mozilla pushed for it in the Rust implementation.
For very large images that difference can outweigh the file size. The advice from the post is not to pick a winner but to test with a representative set of your own images, at the quality your readers actually get, and to optimize for high pixel density.
„Build a safe, performant, compact, and compatible JPEG XL decoder in Rust, and we'll ship it.“
Related
WebAuthn Level 3 is a Recommendation, which means the passkey surface stops moving
The W3C published Level 3 on August 25. The text carries no substantive change since the Candidate Recommendation of May 26, and everything new is pushed to Level 4 — which is the point of the milestone rather than a footnote to it.
W3Cverified

A class prefix selector is now spec text in Selectors Level 5
The draft of August 18 adds section 2.1, Class Prefix Selectors, defining .foo-* to match any class beginning with that prefix. It replaces the attribute-selector workarounds every design system carries. Nothing implements it yet, and the matching rule has an edge that will catch people: .foo-* does not match foo--bar.
CSS Working Groupverified

Put Baseline in CI so the browser stops deciding for you
Three packages and about 20 minutes. One config tells your build which browsers you target, a linter warns when a stylesheet reaches past that line, and CI says it on the pull request instead of a user saying it in a bug report six weeks later.
web.dev, npmverified
