HEIC to JPG Without Uploading

Your photos contain where you live, who you were with, and when. They should not have to leave your laptop.

Zero upload Works offline GPS stripped

Drop your HEIC or HEIF files here

or choose files — up to 100 at once, 100 MB each

No upload. Files are processed in your browser.

92%

Files never leave your device · EXIF and GPS removed

Works on Chrome, Safari, Firefox and Edge · No installation

Short answer

This version of the converter never uploads anything. Decoding runs in the browser, there is no server-side copy, and conversion keeps working after you disconnect from the internet.

Every mainstream converter — iLoveIMG, CloudConvert, Convertio — uploads your file, converts it on a server, then sends it back. That is fine for a stock photo and less fine for a passport scan or a picture of your kids.

FormatWave loads a WebAssembly decoder into your browser and converts locally. There is no upload endpoint in the code, and once the page has loaded you can switch off Wi-Fi and keep converting.

Last reviewed November 2026

What “no upload” actually means

Nothing is transmitted

Decoding and re-encoding happen in your tab. You can verify in DevTools: no network request carries your file.

No server-side retention

There is no storage bucket, no 24-hour deletion policy to trust, and nothing to leak.

Location data removed

Re-encoding drops EXIF, including the GPS coordinates iPhone cameras embed.

How to convert HEIC → JPG

  1. Load the page once. The decoder (~1.5 MB) is cached by your browser.
  2. Disconnect if you like. Turn off the network — conversion still works.
  3. Convert and download. Files go straight from memory to your downloads folder.

Upload-based converters vs this one

Typical upload-based converterThis converter
Where your file goesTheir serverNowhere — it stays in the tab
RetentionDeleted after N hours, per their policyNothing is stored, so there is nothing to delete
Works offlineNoYes, once the page and decoder are cached
Speed for one photoUpload + queue + downloadDecode and encode only
Size limitTheir cap, often 5–25 MB on free tiersYour available memory
How you verify itRead the privacy policy and trust itWatch the Network tab yourself

How to verify the claim in about 30 seconds

You should not have to take this on faith, and you do not. Open DevTools — F12, or Cmd-Option-I on a Mac — switch to the Network tab, clear it, then convert a photo. A local conversion produces no request that carries the file: no POST, no multipart body, nothing with an image payload. The only requests are the page itself, the decoder, and the analytics beacon.

The stronger test is to disconnect. Load this page, convert one photo so the decoder is cached, then turn off Wi-Fi and convert the rest. If anything were being uploaded, it would fail immediately. It does not, because the conversion path never calls `fetch` with your image.

The decoder itself is a WebAssembly build of libheif, roughly two megabytes, downloaded once and cached by the browser. That download is the only network activity in the whole flow, which is also why the very first conversion needs a connection even though later ones do not.

What is sent: a page-view beacon, cookieless and aggregate. No filename, no image data, no identifier that survives the session. If you want even that gone, a content blocker will stop it without affecting the conversion.

If you are not convinced yet

These are the objections people raise after watching the Network tab, and what each one actually means.

What you seeWhat it isWhat it means
Requests still appear while convertingThe page, the cached decoder, and analytics — none of them carry image bytesFilter the Network tab to Fetch/XHR and check the request bodies
A POST request shows upAnalytics beacons are POSTs with a small text payloadClick it and read the body: a page-view event, not your photo
Conversion fails right after going offlineThe decoder had not been cached yetConvert one file while online first, then disconnect
Offline conversion fails in a private windowIncognito may not retain the cached decoder between loadsUse a normal window for the offline test
The page needs internet on first loadThat is the two-megabyte decoder downloadUnavoidable, and it is the only download

What "no upload" does not mean

Worth being precise about, because the phrase is used loosely across the category.

ClaimTrue here?Detail
Your image is never transmittedYesDecoding and encoding happen in the tab
Nothing is stored on a serverYesThere is no upload endpoint in the code
It works with the network offYes, after first loadThe decoder is cached locally
It is anonymousMostlyCookieless analytics still sees a page view
It is immune to browser exploitsNoLocal processing removes the upload risk, not every risk — keep the browser updated

The honest summary: local conversion removes the entire class of risk that comes from handing a file to a stranger’s server. It does not make the browser itself safer.

Questions

How can I be sure nothing is uploaded?

Open your browser’s Network tab and convert a file. The only requests are for the page and the decoder; no file data is sent. The source is also inspectable in DevTools.

Does it really work offline?

Yes. Once the page and decoder are cached, the conversion path has no network dependency.

What about the analytics?

We use cookieless, aggregate page-view analytics. No filenames, no image data, no personal identifiers.

Is it slower than cloud conversion?

For a single photo, usually faster — there is no upload. For 100 photos, a fast desktop finishes in under a minute.

Can I check this without trusting the page?

Yes — open the Network tab, convert a file, and look for a request whose body contains image data. There is none. You can also disconnect the network after loading and keep converting.

Does the offline mode work on every browser?

It works wherever the decoder has been cached. That is reliable in Chrome, Edge, Firefox and Safari in a normal window; private windows may drop the cache between sessions.