DEV Community

Vahzryn
Vahzryn

Posted on

Why I built a 100% private, client-side image converter in browser memory

Hey everyone! 👋
A few weeks ago, I was trying to batch convert a bunch of .heic photos from my phone so I could use them in a project. Like usual, I searched for an online converter, picked the first result, and dragged my files in.
Then it hit me: why am I uploading personal photos to a random server just to change a file format?
Most converter sites upload your images to their backend, process them, and give you a download link. Beyond being a potential privacy nightmare, it's just slow—especially when you're dealing with dozens of high-res images on a spotty connection.

I figured modern browsers are more than powerful enough to handle this locally, so I built Zapixal.

How it works (no servers involved)

Zapixal processes everything right inside your browser memory. Once the page loads, you can literally turn off your Wi-Fi and it will still convert your files.
Here’s a quick look under the hood:

  • Web Workers: Image processing takes some CPU heavy lifting. By offloading the conversion to background workers, the main UI stays smooth and doesn't freeze your tab.
  • WebAssembly (WASM): For formats like HEIC that browsers can't natively decode easily, WASM lets us run fast, native-level parsing right in the browser.
  • Canvas API: Handles the actual scaling, format swaps, and lossy/lossless compression on your local machine. Because no data leaves your computer, there are no upload queues, no file size limits imposed by network speeds, and zero risk of your photos sitting on someone else's server. --- ## What it can do right now
  • Convert between HEIC, PNG, JPG, WEBP, and AVIF.
  • Batch convert whole folders at once.
  • Tweak compression settings to shrink file sizes.

* Works offline as a PWA once loaded.

Give it a spin!

I’d love for you to try it out and let me know what you think:

  • Main Tool: zapixal.com
  • Direct Routes: Tools like /heic-to-jpg or /png-to-webp if you're looking for specific format pairs. If you run into any bugs or have ideas on how to make the client-side processing even faster, drop a comment below!

Top comments (0)