
I dropped a folder of iPhone photos on a free converter and the page stopped at 200. The rest of the roll sat there. Sign in to continue, it said.
The files were already on my disk. I didn't need an account to rename them. I needed JPG copies I could send to a Windows box that still treats HEIC like a foreign language.
The HEIC to JPG page on Softery does that in the tab. One zip. The names you already have. Capture dates ride along. Nothing is uploaded. The page does not count files and does not ask you to sign in.
The Prompt Per File
A lot of converters still ask you to save each photo. Click. Then a save dialog. Then the next file. Do that 200 times and you will close the tab. Do that 2,400 times and you will look for software, which is exactly what one person on r/ios did.
I ranked this idea tenth out of 1,754, score 9.45, about twelve hours of work. The card said unlimited batch and one zip. It also said keep the original names and the capture dates. That last line is the product. The rest is a decode.
Rank 10 of 1,754
The image conversion pile in that list is long. A compressor. A resize tool. HEIC sat near the top because people type the format Apple already chose for them, not a category.
Tenth was the rank because the query is a file type and the work is a decoder plus a zipper. Twelve hours got me the names, the EXIF write-back, and an honest fail row when a file will not open. "No 200 file wall" is what I shipped. A worker pool can wait.
The upload sites work if you are fine putting a holiday roll on someone else's disk for a day. A lot of people are not. The photos are kids. Or a house. That is why the no-upload row matters against those sites, and why I will not put it in the H1. Plenty of pages already say it.
Twenty Five Completions
Bing's autocomplete returned 25 suggestions on "heic to jpg". That was the largest count in the iPhone vertical we measured. People add "windows 11" and "free" because the first result wasted their time or asked them to pay for a codec.
They did not type "image converter". They typed the extension their phone already writes.
A desktop converter on GitHub had 379 stars. Two store apps sat at about 33,800 ratings between them, 16,639 on one and 17,190 on the other. I did not go hunting for review text. Those three numbers were enough. People will install something just to open last Saturday.
If you land here, you get a drop zone and a format toggle. Pressing nothing still shows the page, because an empty converter looks broken. Drop the folder when you have it.
2,400 Photos
The thread I kept coming back to is still up.
I need a software to bulk convert images from heic to jpg. I have around 2400 images. How do i do that?
r/ios, 126 points, 93 comments. The answers name desktop apps and sites that stop at a few hundred files. Nobody in that thread wanted a prompt per photo.
Another thread talked about 8,000 iCloud photos, score 6, 38 comments. Half of them HEIC. I am not going to write that this tab will sail through that. A huge folder can hitch the tab. The page still does not count files and does not ask you to sign in.
What the Other Pages Do
I am not going to pretend those sites never work. They work until the counter hits the cap, or until the signup wall, or until you notice the result URL is sitting on a public CDN.
| Page | Batch | Upload | Names and dates |
|---|---|---|---|
| This tab | No file cap I set. Memory in the browser is the limit. | No | Stem kept. JPEG gets DateTimeOriginal. ZIP entry uses that date. |
| heictojpg.com | Stops at 200. Wants an account past that. | Yes, to their storage | Re-encode on their side |
| The usual upload converters | A daily count or a per-task count | Yes | Whatever their form kept |
I named heictojpg.com because that is the cap I actually hit in the research, 200 photos, not the 50 I first wrote down and had to correct. The live title said "Up to 200 Photos". A 4032 by 3024 HEIC came back 4032 by 3024. The wall is the count, not the pixels.
Their converted JPEG sat on a public URL for up to 48 hours. I opened one in a private window without signing in. That is the part I cannot do here, because the file never left.
One Zip
Drop a folder. Pick JPG or PNG. The page converts them one by one so the progress line can paint, then hands you a single zip. One photo downloads as that photo. Two or more come back as heic-to-jpg-12.zip, or png in the name if you picked png.
I did not want a save dialog per file. That is the complaint. The zip is the answer.
A collision gets a number. Two files named IMG_1234.HEIC become IMG_1234.jpg and IMG_1234 (2).jpg. The second one is not a silent overwrite.
The yield between files is a setTimeout(0). That is enough for the progress row to update. It is not a worker pool. A few hundred files is the job this page was ranked for. I will not write that the tab stays smooth at 2,400.
The Names You Already Have
IMG_1234.HEIC becomes IMG_1234.jpg. That sounds small until you have sorted a roll by the camera's own numbers and a site hands you download (47).jpg.
The stem is the whole contract on names. I do not invent photo-1. I do not lowercase the IMG prefix. I take the file name you dropped, strip the HEIC or HEIF, and put the new extension on.
If you dropped a folder path, only the file name survives. DCIM/100APPLE/IMG_0001.heic is still IMG_0001.jpg.
.heif is accepted the same way. So is image/heic and image/heif. A JPEG you drop next to them is skipped. It stays out of the list so you do not think the page re-encoded a file that was already a JPEG.
Capture Dates
A re-encoded JPEG is a new file. Finder will show today's date unless you put the old one back.
On JPG we copy DateTimeOriginal after the encode. We set Orientation to 1, because the pixels are already rotated. Leaving a 6 in there would flip the photo a second time in any viewer that still honors the tag.
PNG has no EXIF write path I trust in this tab. The zip entry date is how PNG keeps a capture time at all. Open the archive in Finder and the dates should match the shot, not the convert.
If a file has no DateTimeOriginal, we leave it. I will not invent a Tuesday.
We read the EXIF before the decode, with exifr. The write-back uses piexifjs. Those are two libraries because one of them reads and the other one writes JPEG APP1. I did not invent a third.
JPG or PNG
The default is JPG at quality 92. That is the slider's starting point, not a hidden compress. Drag it if you want a smaller file. The event that goes to Mixpanel is the quality number, not the photo.
PNG is there because some people asked for a lossless copy. PNG does not get the EXIF write-back. If you need the capture date on the file itself, stay on JPG.
I left resize off. The 4032 by 3024 I tested on the other site came back 4032 by 3024. People who hit that page were not asking for a smaller picture. They were asking for a picture Windows would open. If I add a resize later, it will be a toggle you can see, not a silent downsize.
What This Tab Cannot Open
The decoder is libheif, loaded as a WASM module the first time you convert. Safari 17 and later can often decode HEIC without that module. Chrome and Firefox need it. libheif is LGPL-3.0. It is not compiled into the first paint. It arrives when you actually convert.
Some iPhone shots wrap HEVC in a way this build cannot open. That file stays in the list as failed. The rest still download. I would rather show a failed row than a black JPEG.
I am not going to write that every Live Photo or every commercial HEIF will come through. The ones that fail stay visible. Convert the rest.
A damaged file fails the same way. So does a file that only looks like HEIC. The label is decode_failed or not_heic. You do not need those strings. The row just says it could not open that one.
Mixpanel Sees the Open, Not the Photo
Mixpanel and Google Analytics load with the rest of Softery.io. They see that someone opened the tool. They do not get the file names, the EXIF, or the bytes.
Sizes go out as buckets. A run reports how many files converted and how many failed, as counts, not as names. The generated JPEG never becomes a property. If you came here because a privacy page promised zero third-party scripts, that is not this site, and I will not write that sentence.
The tool id is heic-to-jpg. Opening the page sends Tool Viewed with that id. Dropping files sends inputProvided with a size bucket of the total bytes, not the names. Format and quality send settingChanged. The download event is zip or jpg or png.
After the layout has loaded you can unplug the cable and still convert. The decoder chunk has to arrive first. Then the work stays here.
What I Left Out
I left out the worker pool. The research file asked for one so a huge batch would not lock the tab. I shipped a yield between files instead. That is the honest twelve hours. The pool is a later pass if someone actually drops 2,400.
I left out the sentence "8,000 photos is fine". The seed asked me to print it. Another thread used that number about an old computer and an iCloud library. Printing it here would be a capacity claim I have not run.
I left out a Microsoft store price for the Windows codec. I did not open that listing in this sitting, so I will not invent $0.99.
I did not hide Mixpanel. The honest line is already on the page. They see that someone opened the tool. They do not get the photo.
I did not put a login in front of a folder you already have. I did not put a 200 file counter on it. Those two were the whole point of ranking this tenth.
How to Check
- Open
/tools/heic-to-jpg. - Open the network panel. Drop two
.heicfiles. - You should not see those files go out. You may see Mixpanel and Google, and you may see the WASM decoder load on the first convert.
- Pick JPG. Convert. One file downloads as itself. Two files download as a zip named after the count.
- Open a JPEG in any EXIF viewer. DateTimeOriginal should be the shot, not today. Orientation should be 1.
| What you drop | What this page does | What you get |
|---|---|---|
One .heic | Decode, write EXIF, download the file | IMG_1234.jpg |
| Two or more | Same, then zip | heic-to-jpg-2.zip |
| A JPEG next to them | Skip it | It never enters the list |
| A file this build cannot open | Fail row | The rest still download |
If a row says it could not decode, leave it. That is the honest outcome for that file.
What to do next
If the next job is a packet of pages, Merge PDF stays in the tab the same way. If you got here because a search result put an ad over 350 F, the unit converter is the page I wanted that day.
For the photos, drop the folder. Get the zip. Keep the names.
Last updated: September 5, 2026 | Reading time: 10 minutes
Written by Evgeniy Poznyak, who still has a folder of HEIC files a Windows box will not open.