Image Formats · Guide

JPEG XL Is in Chrome: What Changes for Your Images, and What Does Not Yet

20 min read · October 7, 2026 · Mochify Engineering Team

Chrome supports JPEG XL. As of Chrome 155, released on October 6, 2026, the browser decodes .jxl images by default on every platform it ships on, with no flag, using a new decoder written in Rust. Firefox 158 switches its own JPEG XL decoder on by default a week later, on October 13. Safari has opened still JXL images since Safari 17 in 2023. That is the headline, and it is a real one: the format that Chrome dropped in 2023 is back in the three major engines within the same fortnight. What the headline leaves out is the part you have to plan around. Chrome 155 being released is not the same as Chrome 155 being installed; the morning after the release, our own Mac was still on Chrome 152. Safari still cannot show animated or progressively loading JXL. Edge has said nothing. Shopify will not accept a .jxl upload. This guide gives you the dated support table, the caveats nobody prints next to it, and a what-to-do list by stack so you can decide whether JPEG XL goes into your pipeline this month or next quarter.

Published October 7, 2026 by the Mochify Engineering Team. Written the day after Chrome 155 shipped, with a dated support table and the caveats the release notes leave out.

What Chrome 155 actually shipped

Chrome 155 decodes JPEG XL images on by default, on Windows, macOS, Linux, ChromeOS, Android and Android WebView, with a decoder called jxl-rs that is written entirely in Rust. That is the whole change, and it is the one that matters: a <img src="photo.jxl"> renders in Chrome 155 the way a WebP or AVIF does, with no setting for the user to flip.

The announcement came from the Chrome team on October 6 in a post titled Shipping JPEG XL in Chrome, and the same day's Chrome 155 release notes list "JPEG XL decoding support (image/jxl) in blink". Two details from the post are worth keeping:

  • The decoder is new, not the one Chrome removed. The 2021 experiment used libjxl, the C++ reference implementation. Chrome's position since late 2025 was that it would ship JPEG XL only with a memory-safe decoder, because image decoders parse untrusted bytes inside the renderer and have been a reliable source of browser vulnerabilities. jxl-rs is that decoder. Google says fuzzing and code review have found no memory-safety bugs across its history, and that its SIMD layer gets it to roughly the speed of the C++ implementation.

  • Google's own advice is "try both". The post recommends testing AVIF and JPEG XL against each other, and says JPEG XL is "most helpful for high-fidelity or lossless compression, especially of photographic images", or where fine-grained progressive loading matters. That is a narrower pitch than "replace everything", and it is the right one.

The timeline, for anyone who lost track:

DateEvent
2021Chromium adds JPEG XL behind a flag (versions 91 to 109)
February 2023Chrome 110 removes it, citing too little ecosystem interest
September 2023Safari 17 ships JPEG XL for still images
November 2025Chrome says it will ship JPEG XL once a memory-safe decoder exists
January 2026jxl-rs lands in Chromium 145 behind chrome://flags/#enable-jxl-image-format
August 24, 2026Chrome and Mozilla post intents to ship on the same day
October 6, 2026Chrome 155 stable: JPEG XL on by default
October 13, 2026Firefox 158 stable: JPEG XL on by default

We covered the February step in Does Chrome 145 Enable JPEG XL by Default?, and the answer to that question is still no. The answer to "does Chrome support JPEG XL" changed on October 6.

JPEG XL browser support, dated October 7, 2026

Three engines decode JPEG XL from mid-October 2026: Chrome from 155, Firefox from 158, and Safari from 17. Each comes with a caveat, and the caveats are different.

BrowserJPEG XLSinceCaveats (October 7, 2026)
Chrome (desktop)Yes, by default155 (October 6, 2026)Rollout to installed browsers takes weeks; versions 145 to 154 need the flag
Chrome for AndroidYes, per the intent to ship155Listed as shipping on Android and WebView in Chrome's Intent to Ship; caniuse's Android row had not caught up on October 7
EdgeNot yetn/aBuilt on Chromium; no statement from Microsoft; Edge 155 had not shipped on October 7
FirefoxYes, by default158 (October 13, 2026)Firefox 157 does not have it (the August intent said 157; the pref flipped for 158). Animation and progressive display supported; HDR JXL is shown as SDR
Safari (macOS, iOS, iPadOS)Still images only17 (September 2023)No animated JXL, no progressive decoding; uses the C++ decoder
Samsung Internet, Opera, Brave, VivaldiNot yetn/aChromium derivatives pick the change up on their own schedules

Sources: the caniuse JPEG XL table (which records Chrome 155+ and Firefox 158+ as supported and Safari 17+ as partial, with the notes "Supports still images. Animated image sequences are not supported" and "Partial support refers to not supporting progressive decoding"), Chrome's release notes and intent to ship, and Mozilla's Bugzilla entry enabling the image.jxl.enabled preference by default with a target of Firefox 158.

One number to treat carefully: on October 7 caniuse put global support at about 17%, almost all of it Safari. That figure is a snapshot taken the day after Chrome's release and before Firefox's, so it measures installed browsers, not shipping ones. It will climb through October and November as Chrome and Firefox auto-update, and it will stall below the AVIF line until Edge and Samsung Internet move. Quote the date with the number or do not quote it.

Why you still need a fallback, and for how long

You still need a non-JXL fallback for every image you serve on the open web, and you will need it for months, not days. A stable release is the start of a rollout, not the end of one, and three things sit between "Chrome 155 is out" and "my visitors can decode JXL".

Installed versions lag the release. Chrome updates itself in the background, but only when the browser is restarted and only as Google ramps the release across its user base. We checked our own Mac the morning after the announcement and it reported Chrome 152. Enterprise fleets pin versions for longer. For a few weeks, a meaningful share of "Chrome" traffic is Chrome 152, 153 and 154, none of which decode JXL without the flag.

The other Chromium browsers have not moved. Edge, Samsung Internet, Opera, Brave and Vivaldi all inherit Chromium's decoder, but each ships on its own cadence and each can leave a feature off. Edge is the one that matters for desktop traffic, and as of October 7 Microsoft has said nothing. Treat Edge as unsupported until its own release notes say otherwise.

Everything that is not a browser. Email clients render images with their own engines, and none of the big ones have announced JXL. Slack, Notion, Jira and most chat apps show an uploaded .jxl as a broken thumbnail or an undownloadable attachment. Windows still needs an add-on to preview the format. A JXL that renders perfectly in Chrome 155 is still the wrong file to attach to a message.

How long is "months"? Nobody publishes a rollout curve, so here is the honest version: check the caniuse share monthly, and drop the fallback when the browsers your analytics actually show have cleared the version line. For a consumer site in late 2026 that is a question for the new year, not for this quarter.

How to serve JPEG XL safely today

The safe way to serve JPEG XL in October 2026 is the <picture> element with a type attribute per source, JXL first, then AVIF, then WebP, then a JPEG <img> that every client on earth can open. The browser picks the first <source> whose MIME type it can decode and ignores the rest, so a browser that cannot decode JXL never requests the file.

hero.html
<picture>
  <source type="image/jxl"  srcset="hero.jxl">
  <source type="image/avif" srcset="hero.avif">
  <source type="image/webp" srcset="hero.webp">
  <img src="hero.jpg" alt="Describe the image" width="1600" height="900">
</picture>

Three practical notes:

  1. Put width and height on the <img>. The fallback image's dimensions reserve the layout box for whichever source wins, which is what keeps your CLS at zero while the browser decides.

  2. Do not ship a bare <img src="x.jxl">. On Chrome 152, Edge, and every email client it is a broken image, and a broken LCP image is an LCP failure. This was true last week and it is true this week.

  3. Content negotiation is a separate question. Services that pick a format on the server read the Accept request header. Safari has advertised image/jxl there since 17; we could not confirm from Chrome's announcement or release notes whether 155 adds it, so if your CDN negotiates formats, check its documentation for JPEG XL specifically rather than assuming the new Chrome will be served JXL automatically. The <picture> route does not depend on the header at all.

For feature detection in script, decoding a one-pixel JXL data URI and checking naturalWidth is the reliable test; the format-sniffing shortcuts that work for WebP (checking canvas.toDataURL) do not apply, because browsers decode JXL but do not encode it.

Ready to make the JXL variants? Convert a batch to JPEG XL by describing what you want, or go straight to the PNG to JXL converter if the source is PNG.

What JPEG XL gives you that AVIF and WebP do not (and the reverse)

JPEG XL earns its place for lossless work, for high-fidelity photography, for progressive loading and for recompressing existing JPEGs without loss; AVIF stays the stronger choice for ordinary web photos at the file sizes most sites actually serve. Google's advice to try both is not hedging. The formats are good at different things, and the two browser vendors said so in nearly the same words: Mozilla's intent to ship describes JPEG XL as excelling "at lossless imagery, progressive rendering, and further compressing JPEGs without quality loss" and AVIF at "web-quality photographic images".

Where JPEG XL wins:

  • Lossless. JPEG XL's lossless mode is the best general-purpose lossless image coder in a browser today. In our screenshot test, one 1440x900 macOS screenshot came out at 1.84 MiB as a PNG and 0.99 MiB as a lossless JXL, a 46% saving with identical pixels. In our six-image lossless benchmark, lossless JXL edged lossless WebP on photographs and lossless AVIF never came first. One caveat from Chrome's own intent-to-ship thread: a reviewer measured the new decoder's lossless path at roughly 30 times slower than WebP's lossless decode on one test image, so for flat graphics that will be viewed in a browser, lossless WebP remains the quicker file to display as well as, in our tests, the smaller one.

  • Reversible JPEG recompression. A JPEG can be re-wrapped as a JXL about 20% smaller and converted back to the byte-identical original on demand. No other web format can do this. For an archive of existing JPEGs it is free space with zero risk.

  • Progressive decoding. A JXL can render a usable low-resolution image from the first bytes and refine as the rest arrives. Chrome and Firefox decode it progressively; Safari does not. AVIF has no comparable mode.

  • Bit depth and gamut. Up to 32 bits per channel, wide gamut and HDR in the format itself. (Note that Firefox currently displays HDR JXL as SDR, and that Mochify's own JXL output is standard range; see the workflow section.)

  • Big images. JXL's size limit is over a billion pixels on a side; WebP stops at 16,383.

Where AVIF wins:

  • Low and medium bitrates. For a product photo or a blog hero at the quality most sites serve, AVIF usually produces the smaller file. Google's own codec comparisons have AVIF ahead at the bitrates typical of web delivery, and the Chrome blog's "30-50% better than JPEG" figure for JXL is in the same range as AVIF's, not above it.

  • Installed base. AVIF has been in Chrome since 85, Firefox since 93 and Safari since 16.4, and it is in Edge and Samsung Internet. For the next several months it reaches more people than JXL by a wide margin.

The practical reading: if you already serve AVIF, you are not behind. Add JXL at the top of the cascade where it is cheaper or where you need lossless or progressive; keep AVIF as the second source; keep WebP and JPEG below that. The decision is covered format by format in WebP, AVIF or JPEG XL in 2026?.

What to do now, by stack

What you should do this month depends on who serves your images, not on the format's merits. Here is the list.

You run a static site or your own build pipeline. Add a JXL variant to your image step and put it first in <picture>. If you encode with cjxl from libjxl, cjxl photo.jpg photo.jxl performs the reversible JPEG transcode by default, and -d 0 gives lossless from any source. If your build uses Node's sharp, check that your installed build includes the JXL codec before relying on it; the prebuilt binaries have historically shipped without it. Or hand the encode to an API: Mochify's POST /v1/squish?type=jxl returns a JXL for any JPEG, PNG, WebP, AVIF, HEIC or SVG you send it.

You use an image CDN. This is where the format arrives with the least work, and where the provider decides. Fastly Image Optimizer accepts format=jxl and its auto mode prioritizes "JPEGXL, AVIF, WebP" in that order. Cloudinary has offered f_jxl since 2020; check its current automatic-format behavior. Cloudflare Images' documented format values are auto, avif, webp, jpeg and baseline-jpeg, with no JXL output at the time of writing. If your CDN cannot produce JXL, nothing changes for you until it can.

You run WordPress. WordPress 7.1's client-side media pipeline decodes HEIC, WebP and AVIF in the browser and outputs JPEG, PNG, WebP, AVIF and GIF; JPEG XL appeared in the June test build's decode list but is in neither list in the release documentation, core has no JXL encoder, and a .jxl upload is still refused because core does not register the MIME type. Keep serving AVIF with WebP and JPEG below it, as in our WordPress next-gen formats guide, and revisit when a plugin or core adds JXL output. You can hand-place a JXL in a <picture> block today, but you cannot make the media library generate one.

You sell on Shopify or a marketplace. Nothing changes. Shopify's accepted upload formats are JPEG, progressive JPEG, PNG, GIF, HEIC and WebP, and its storefront image transforms output JPG, PNG and WebP. A .jxl upload is refused. Our JPEG XL for Shopify answer stands: keep your masters as lossless JXL if you like, upload JPEG or PNG.

You are a photographer or keep an archive. This is the group the release changes most, and the change is not about delivery. Chrome and Firefox decoding JXL means a .jxl sent to a client or a picture editor opens in their browser, where last month it did not. For storage, the lossless JPEG transcode is the move: 20% back on an existing JPEG library with a byte-exact undo, and lossless JXL from RAW-derived TIFFs or PNGs at a fraction of their size. For delivery, keep sending JPEG until the recipient's tools catch up; the format opening in a browser does not mean it opens in Lightroom or an email preview.

You build agent or API pipelines. Add type=jxl as an output option and let the consumer choose. The format is a safe target now because the two browsers your users run will decode it, and the API accepts JXL as input too, so a JXL-in, AVIF-out step costs nothing extra. See how the Mochify MCP server works for the agent surfaces.

Mochify Workflow: converting images to JPEG XL

Every Mochify image surface can output JPEG XL, and the fastest path is to say so in plain English. Here is the workflow for a batch of web images, followed by the other surfaces.

  1. Open the web app and describe the result

    Drop up to three images (25 on a paid plan) into mochify.app/flow and type the goal: "convert these to JPEG XL for the web, max 1600px wide, strip location data". Magic Flow parses the instruction with a language model, then the C++ engine runs the resize, the EXIF strip and the JXL encode. One high-quality lossy encode per image is the default.

  2. Ask for lossless when you mean it

    "Save as lossless JPEG XL" produces a pixel-exact file; the same instruction works on the CLI, both MCP servers and the API. On the API it is lossless=1, and it only applies to JXL, WebP and PNG output (JPG and AVIF return a 400 rather than quietly encoding lossy). A source that is already lossy, such as a JPEG, comes back as the best lossy encode with the X-Mochify-Lossless: downgraded header, because no encoder can restore what that file has already thrown away.

  3. Use the fixed-purpose converters for one-format jobs

    PNG to JXL has a Lossless switch after upload (default off); JPG to JXL and AVIF to JXL each run one high-quality re-encode; SVG to JXL rasterizes a vector at the long edge you pick, with transparency kept. These pages are converters, not prompt boxes: drop files, get files.

  4. Script it

    From the CLI, mochify photo.jpg -t jxl -o ./out, or mochify *.png -p "lossless JPEG XL". From code, POST https://api.mochify.app/v1/squish?type=jxl with Authorization: Bearer <key> and the image as the request body; the API docs have cURL, JavaScript and Python examples. Both MCP servers take the same instruction from an agent in plain language.

  5. Grab one image off any page

    The Chrome extension adds a right-click "Convert to" menu with JPEG XL as an option; the file lands in Downloads with no prompt and no settings.

Two honest limits. Mochify's JPG to JXL path is a decode and re-encode, not JXL's reversible JPEG transcode; if you want the byte-exact round trip for an archive, use cjxl, and use Mochify for the web variants. And Mochify's JXL output is standard dynamic range: the HDR gain-map path exists for JPG output only.

Privacy, for this workflow: images travel to api.mochify.app over HTTPS, are encoded in RAM, and are wiped immediately with no disk writes, no logs containing file data, and no use for AI training. That holds for the web app, the CLI, the Chrome extension, the API and both MCP servers; the CLI and local MCP server are clients over the same API and do not encode locally. The hosted MCP server holds the compressed output for up to five minutes on files.mochify.app so the agent can fetch it. The "never leaves your device" line belongs only to Mochify's video tools, which run in the browser.

Cheat Sheet

You want to...Do this in October 2026Why
Know if Chrome shows .jxlChrome 155 or later does, by defaultShipped October 6, 2026; 145 to 154 need the flag
Know if Firefox shows .jxlFirefox 158 or later doesShips October 13, 2026; 157 does not
Know if Safari shows .jxlSafari 17 or later does, still images onlyNo animation, no progressive decode
Know about EdgeTreat as noNo Microsoft statement; Edge 155 not out on October 7
Serve JXL on a public site<picture> with JXL, AVIF, WebP sources and a JPEG <img>Installed browsers lag the release by weeks; Edge and email clients do not decode it
Decide JXL vs AVIF for a web photoTest both; AVIF usually smaller at web quality, JXL at high qualityGoogle and Mozilla both say so
Shrink an archive of JPEGscjxl reversible transcode, about 20% smallerByte-exact undo; no other format does this
Store lossless mastersLossless JXL (Mochify: "lossless" in the prompt, the PNG to JXL switch, or lossless=1)Smallest lossless on photos; 46% under PNG on our screenshot
Upload to Shopify or a marketplaceJPEG or PNG, as beforeJXL uploads are refused
Send a .jxl in email or chatDo not; send JPEG or PNGEmail clients and chat apps do not render it
Drop the fallbackNot yet; re-check caniuse monthlyEdge, Samsung Internet and pinned enterprise versions

FAQ

Does Chrome support JPEG XL now?

Yes. Chrome 155, released on October 6, 2026, decodes JPEG XL images by default on Windows, macOS, Linux, ChromeOS and Android, using the jxl-rs decoder written in Rust. Chrome 145 to 154 contain the decoder but keep it behind chrome://flags/#enable-jxl-image-format. Check your version at chrome://version; if it is below 155, restart Chrome to pick up the update.

Why did Chrome remove JPEG XL in 2023, and why is it back?

Chrome 110 removed the original flag-gated support in February 2023, saying there was not enough ecosystem interest to justify maintaining it. In November 2025 Chrome said it would ship the format if a memory-safe decoder existed, and the Rust decoder jxl-rs was written to meet that condition. The Chrome team also cites developer demand through the Interop project as a reason for the reversal.

Does Firefox support JPEG XL?

From Firefox 158, released on October 13, 2026, yes, on desktop and Android, including animation and progressive display. Firefox 157 does not, despite Mozilla's August intent to ship naming it; the preference was enabled by default for 158. Firefox currently displays HDR JPEG XL images as standard dynamic range.

Does Safari support JPEG XL?

Safari 17 and later on macOS, iOS and iPadOS decode still JPEG XL images. Animated JXL and progressive decoding are not supported, which is why caniuse lists Safari as partial support.

Does Microsoft Edge support JPEG XL?

Not as of October 7, 2026. Edge is built on Chromium and normally inherits Chromium features within days or weeks of a Chrome release, but Microsoft has made no statement and Edge 155 had not shipped. Treat Edge as unsupported until its release notes say otherwise.

Do I still need an AVIF or WebP fallback for JPEG XL?

Yes, for at least the rest of 2026. Installed Chrome versions lag the release by weeks, Edge and Samsung Internet have not moved, and email clients and chat apps do not decode the format. Serve JXL as the first <source> in a <picture> element with AVIF and WebP below it and a JPEG <img> fallback.

Should I switch from AVIF to JPEG XL?

No, add rather than switch. AVIF usually produces the smaller file at the quality most web photos are served at and reaches more installed browsers today. JPEG XL wins for lossless images, for high-fidelity photography, for progressive loading and for recompressing existing JPEGs reversibly. Put JXL above AVIF in the cascade where it is smaller, and keep both.

How do I check whether my browser can display JPEG XL?

Open a known .jxl image, such as the test page on jpegxl.info, in the browser you want to check; if it renders, the browser decodes the format. In script, decode a one-pixel JXL data URI into an Image and test naturalWidth for a value above zero. Do not rely on the user-agent string, because a browser version can be new enough and still have the feature off.

Ready to add JPEG XL above your AVIF and WebP sources? Convert a batch at mochify.app and prompt "convert these to JPEG XL for the web, max 1600px wide". You get a JXL variant of every image, ready to drop into your picture element.