How a Browser-Based Image Converter Actually Works

When a website says "we don't upload your files," you're entitled to ask: how does that work, and how do I know it's true? Here is the honest answer.

The Canvas API does the conversion

Every modern browser ships with an image encoder built in. It's exposed through the HTML <canvas> element and the canvas.toBlob() method:

const img = await createImageBitmap(file);
const canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext("2d").drawImage(img, 0, 0);
canvas.toBlob((blob) => {
  // blob is now a JPG, PNG, or WebP — your choice
}, "image/webp", 0.92);

That's the entire conversion. It runs locally in your CPU, in the JavaScript engine inside your tab. No network call is involved.

What about AVIF and JXL?

Canvas doesn't ship with AVIF or JXL encoders, but WASM does. Pixelmint bundles compiled WebAssembly modules (@jsquash/avif, @jsquash/jxl) that run the same encoders Squoosh and other tools use — again, all locally.

How to verify

Open DevTools (F12 or right-click → Inspect). Switch to the Network tab. Now upload a file and convert it. Filter by XHR/Fetch and watch the request count: it stays at zero.

If you're paranoid, you can also throw the page into airplane mode after first load. The conversion still works, because the entire app is static HTML + JS + WASM cached in your browser.

Why this matters

Most online converters keep a copy of every file you upload, at least temporarily, often longer. Their terms of service typically reserve the right to use uploaded content. If your image is a screenshot of an internal dashboard, a photo of your ID, or proprietary artwork — that's a problem.

A browser-based converter sidesteps the entire question.

Trade-offs

Browser-based conversion uses your device's CPU and memory. Very large files (50+ megapixels) can be slow on low-end phones. Server-side converters can run on beefy machines with parallel pipelines. For the file sizes most people work with (10 MB or less), the local approach is faster anyway because there's no upload time.