Zero Uploads: Building Tools That Never See Your Files

Zero Uploads: Building Tools That Never See Your Files

Most free web utilities are a trade. You get the tool, they get your file. For a holiday photo that is a fair deal. For an ID scan, a signed contract or a medical form it is not a trade anyone should have to make, and a privacy policy is not the same thing as a guarantee.

ZeroDataUpload is my answer to that: a platform of web tools where all processing happens in the browser. No uploads, no server storage, no tracking. This post is about how that works, why it is more achievable than people assume, and where its honest limits are.

A promise versus a guarantee

When a service says "we delete your files after an hour", you are trusting their code, their logs, their backups, their staff and their future owners. All of that may be fine. None of it is something you can check.

The only file a server cannot leak is the one it never received.

Moving the work into the browser changes the question from "do you trust us?" to "can you see any network traffic?". The second question has an answer anyone can verify.

The browser is a far better computer than people think

Tasks that used to need a server now run comfortably on the device:

  • Reading files through the File API, straight from the user's disk into memory, without a network request.
  • Image work with the Canvas API: resize, crop, convert between formats, and re-encode. Re-encoding through a canvas also drops EXIF metadata, location included, which is a privacy feature in itself.
  • Heavy lifting with WebAssembly, which lets mature libraries written in C, C++ or Rust run in the browser at close to native speed.
  • Staying responsive with Web Workers, which move processing off the main thread so the page never freezes on a large file.
  • Handing the result back as a Blob and a download link. The file goes from disk, to memory, back to disk.
// Resize an image on the device. No network involved.
async function resizeLocally(file, maxWidth) {
    const bitmap = await createImageBitmap(file);
    const scale = Math.min(1, maxWidth / bitmap.width);
    const canvas = new OffscreenCanvas(
        Math.round(bitmap.width * scale),
        Math.round(bitmap.height * scale)
    );
    canvas.getContext('2d').drawImage(bitmap, 0, 0, canvas.width, canvas.height);
    // Re-encoding through the canvas also strips EXIF metadata
    return canvas.convertToBlob({ type: 'image/webp', quality: 0.85 });
}

Proving it, not just claiming it

"We don't upload your files" is easy to write on a landing page. What turns it from a claim into something anyone can check:

  • Work offline. With a service worker caching the app, the tools keep running with the network switched off. That is the most honest proof there is: a tool that works with no connection cannot be sending your file anywhere.
  • Lock it down with a Content Security Policy. A strict connect-src tells the browser itself to refuse unexpected outgoing requests, so even a mistake in the code cannot quietly send data somewhere.
  • No third-party scripts on tool pages. Every analytics or advertising script is code that can see the page. If it is not there, it cannot leak anything.
  • Invite people to check. Open the browser's developer tools, watch the Network tab, process a file. Nothing should go out.

The honest limits

Client-side processing is not free, and pretending otherwise would undercut the whole point of being honest with users.

  • The device does the work. A ten-year-old phone processing a large batch will be slower than a server would be.
  • Memory is finite. Very large files need to be processed in chunks or streamed, rather than loaded whole.
  • Download size matters. A WebAssembly library or an on-device AI model can be many megabytes. Load it only when the tool that needs it is opened, and cache it after.
  • Some jobs genuinely need a server. Sharing a file with someone else, for example. The rule is not "never use a server", it is "never send the server more than the job requires".

Switch the Wi-Fi off

Privacy by design does not need to be a slogan. For a large class of everyday tools it is an architecture decision: do the work where the data already is. Browsers are fast enough, the APIs exist, and the result is something users can verify for themselves rather than take on trust. ZeroDataUpload is live, and linked from my projects page. Switch your Wi-Fi off and try it.