No-Upload File Conversion in the Browser: An Architecture Walkthrough
Most “free online converters” upload your file to a server, convert it, and hand you a download link. That means a client mockup, a signed contract or an unreleased screenshot passes through infrastructure you do not control — usually with a “we delete it after 24 hours” promise you cannot verify.
The converters on this site never upload anything. This is a walkthrough of how they work, the bugs that bit, and why “no upload” is a property you can verify in ten seconds.
“No upload” should be verifiable
Open any tool, open DevTools → Network, tick “Preserve log”, drop in a file and convert it, then filter by Fetch/XHR. You will not see a request carrying your file — only the initial page assets.
That is possible because the deployed artifact is a static bundle served from a CDN. There is no upload endpoint to log, because there is no backend at all.
The image pipeline
Conversion is three steps: decode, draw, encode.
Decode with createImageBitmap, passing the from-image orientation so EXIF rotation is applied and portrait phone photos are not sideways. Fall back to the default call where the option is unsupported.
Draw the bitmap to an offscreen canvas. For JPEG output, fill the canvas white first — JPEG has no alpha channel, so transparent areas would otherwise render black.
Encode the pixels with mozjpeg, libwebp or oxipng compiled to WebAssembly inside a Web Worker. canvas.toBlob is convenient but produces poor JPEGs, often larger than the input; the WASM encoders match desktop optimizers and keep the main thread responsive.
Two details that matter at scale
- Zero-copy transfer: the pixel buffer is passed through the Transferable list in postMessage, so a 40-megapixel image is not structurally cloned.
- Timeouts must kill the worker: rejecting the promise alone leaves the worker busy and queues every later file. On timeout, terminate and rebuild it.
HEIC is the hard one
Browsers cannot decode HEIC outside Safari. The fix is libheif compiled to WebAssembly, but there is a trap under a strict Content-Security-Policy.
The common heic-to entry point relies on new Function, which needs unsafe-eval and fails in production. The heic-to/csp build omits eval, so the only relaxation needed is wasm-unsafe-eval.
Because it is a dynamic import, the decoder never lands in the initial bundle; pages that do not convert HEIC pay nothing for it.
Compression that hits a target size
A quality slider is easy; “compress this to 200 KB” is not. There is no formula, so the tool binary-searches the quality: encode, compare to the target, narrow the range, and keep the highest quality that still fits.
Each encode needs a fresh copy of the pixel buffer, because transferring it detaches the original. A handful of iterations is enough — around five searches land within a couple of percent of quality without re-encoding large images a dozen times.
Editor UIs should degrade, not freeze
The JSON and YAML tools highlight syntax and show a line-number gutter. Both render one node per token or per line, which will lock the main thread on a multi-megabyte file.
Above hard thresholds the view falls back to plain text, and the node counter short-circuits as soon as it passes the limit — so oversized documents are never fully traversed just to be rejected.
Why it matters
Privacy is the headline: files never leave the device, so there is no retention policy to trust. It is also faster — no upload round-trip — and it keeps working on a slow or flaky connection.
Try the tools
Every tool below is free and runs entirely in your browser. Open DevTools → Network while you convert — you will not see a request carrying your file.
- HEIC to JPG — open iPhone photos anywhere
- PNG to JPG — shrink screenshots and graphics
- JPG to PNG — lossless PNG for repeated editing
- PNG to WebP — smaller images for the web
- Image Compressor — quality or a target file size
- Browse all image tools
- JSON Formatter — format, validate, minify
- Base64 Encoder / Decoder — UTF-8 safe
- Properties to YAML — Spring Boot config
- Browse all data tools
- Guide: HEIC won’t open on Windows
- Guide: How to convert Java .properties to YAML
Try it yourself — free and private
These tools run entirely in your browser. Nothing is uploaded.
HEIC to JPG Converter
Convert iPhone HEIC / HEIF photos to JPG — no upload, no watermark.
Image Compressor
Compress JPG, PNG and WebP in your browser — no upload, quality control.
Properties to YAML Converter
Convert Java .properties to YAML (and back) — Spring Boot friendly, no upload.
Frequently Asked Questions
Is the conversion really client-side?
Yes. The deployed site is a static bundle of HTML, CSS, JS and WASM on a CDN with no upload endpoint. You can confirm it in DevTools → Network.
Why not just use canvas.toBlob?
It produces poor JPEG output — often larger than the input. The tools use mozjpeg, libwebp and oxipng compiled to WebAssembly in a Web Worker instead.
Does HEIC conversion work in every browser?
Yes. Browsers cannot decode HEIC natively outside Safari, so the tool loads a WebAssembly build of libheif on demand.