HEIC to JPG, in your browser
Drop a HEIC file. Get a JPG. Your photo never travels to a server. Open DevTools and watch the Network tab to confirm.
Loading...
Files stay on your device. Nothing uploads.
Why convert HEIC at all?
Apple introduced HEIC as the default photo format on iPhone starting with iOS 11. It compresses better than JPG and supports things like depth maps and Live Photos. The trade-off is that a lot of software still cannot open it. Older Windows installs, plenty of CMS upload widgets, and many email clients silently reject HEIC files.
JPG, by contrast, opens everywhere. If you need to send an iPhone photo to someone on a Windows desktop, paste it into a Google Doc, or attach it to a job application form, JPG is the safe choice. The file gets bigger, sometimes by 50%, but it actually arrives.
How this converter works
When you drop a HEIC file on the dropzone, we hand it to a JavaScript build of libheif (a battle-tested C++ library that decodes HEIF/HEIC). Decoding happens entirely in your browser tab. The decoded pixels are then drawn into a canvas and re-encoded as JPG using the encoder built into your browser.
Nothing about your file is sent anywhere. We do not POST it to a server. We do not stream it to a CDN. We do not log its filename or its hash. The only network requests you will see while a conversion runs are the ones for our own JavaScript and the manifest JSON. Open DevTools (F12), click Network, and check for yourself.
Privacy, in plain English
Most online HEIC converters work by uploading your file to their servers, running ImageMagick or a similar tool there, and emailing or returning the result. That model is convenient and dangerous. Your file sits on their disks, in their backups, and on their network in transit. Some providers reserve the right to use it for "service improvement". Some have leaked.
FileForge uses a different model. Static HTML, JavaScript, and CSS download to your browser. The decoder runs there. The output blob is created in memory. Saving it goes through the File System Access API or a download link. There is no upload step, period.
Quality and file size
You can pick a JPG quality from 0.1 to 1.0. The default is 0.9, which keeps photos visually identical to the source for most cameras. Lower values shrink the file aggressively at the cost of visible artifacts. We do not strip EXIF; if you want that, save the JPG and run a separate metadata cleaner.
For a typical 12-megapixel iPhone photo (around 2-3 MB as HEIC), a quality 0.9 JPG runs 3-5 MB. Quality 0.7 cuts that to roughly 1.5-2 MB with no visible loss for screen viewing. Print or extreme zoom is another story.
Limitations
Multi-frame HEIC files (Live Photos, burst captures) yield only the first frame in this version. Apple Depth and Portrait modes embed a depth map; we discard it. Animated HEIC (heif-sequence) is not supported yet.
HEIC files larger than around 50 MB may exceed your browser's memory budget on a constrained device. If conversion fails with an out-of-memory error, try a smaller file or close other tabs. We expose the rough memory estimate in the manifest so you know what to expect.
Frequently asked questions
- Does the file actually stay on my device?
- Yes. Open the Network tab in DevTools before dropping the file. You will see requests for our HTML, JS, and CSS, plus the converter manifest. You will not see your file leave the page.
- Why is the first conversion slower than the next one?
- The HEIC decoder is around 1.5 MB. The first time you use it, your browser downloads it from our CDN. After that the Service Worker caches it; subsequent conversions skip the download.
- Is this open source?
- Yes. The full source, including the decoder bindings and the FileForge Runtime, lives on GitHub. The decoder itself is libheif, LGPL-licensed.
- Can I batch convert many files at once?
- Drop several HEIC files at once or pick them with the file picker. They convert one after another. A future release will run multiple in parallel where memory allows.
- Does this work offline?
- After the first visit, yes. The Service Worker caches the page and the decoder. Disconnect from the internet, reload, and convert.