The Status Quo Is Broken
Upload an image to compress it. Upload a photo to remove its background. Upload a PDF to merge pages. Upload, upload, upload.
Every upload means your file lives on someone elses server, you trust their privacy policy, you wait for network round-trips, and you wonder if your data actually gets deleted.
The alternative? Process everything client-side.
What the Browser Can Do in 2026
Modern browsers are full application runtimes:
| API | What It Enables |
|---|---|
| Canvas API | Pixel-level image manipulation, resizing, format conversion |
| WebAssembly | Near-native performance for heavy computation |
| Web Workers | Multi-threaded processing without blocking the UI |
| WebCodecs API | Direct access to hardware video/audio codecs |
| File System Access API | Read/write local files with user permission |
Combined, these APIs make server-side processing unnecessary for most image, video, and document operations.
Real Benchmark: Browser vs Server
Compressing a 2MB photo:
| Method | Time | Privacy |
|---|---|---|
| Browser (Canvas API) | 1.2s | Local |
| TinyPNG (upload + process + download) | 4.3s | Server |
| Compressor.io | 6.1s | Server |
The browser is 3-5x faster because there is no network overhead. And your image never left your device.
The Privacy Argument
This is not just about speed. It is about liability. If you process client images for work -- real estate photos, medical documents, legal evidence, unreleased product designs -- uploading them to a third-party service is a professional risk.
Browser-based processing eliminates that risk entirely.
The Code
async function compressImage(file, quality = 0.8, maxWidth = 1920) {
const dataUrl = await new Promise(r => {
const reader = new FileReader();
reader.onload = e => r(e.target.result);
reader.readAsDataURL(file);
});
const img = await new Promise(r => {
const i = new Image();
i.onload = () => r(i);
i.src = dataUrl;
});
let w = img.width, h = img.height;
if (w > maxWidth) { h *= maxWidth / w; w = maxWidth; }
const canvas = Object.assign(document.createElement("canvas"), { width: w, height: h });
canvas.getContext("2d").drawImage(img, 0, 0, w, h);
return new Promise(r => canvas.toBlob(r, "image/webp", quality));
}
20 lines. No dependencies. No server.
The Growing Ecosystem
More tools are going client-side:
- Image compression: Squash -- free, open source, batch processing
- Background removal: @imgly/background-removal -- runs models locally via WebAssembly
- PDF tools: Stirling PDF -- self-hosted, local processing
- Code editors: Monaco -- VS Code engine, runs in browser
- Design tools: Figma -- entire design engine in WebAssembly
The Future
WebGPU is here. WebTransport is standardized. The line between desktop and web apps is disappearing. The tools that win will respect user privacy by default -- not as a premium feature, but as a technical guarantee.
Check out Squash for free, private image compression. Source on GitHub. Support on Ko-fi.
Top comments (0)