When I started building ImgToolkit, the goal was simple: every image tool site I used either uploaded my files to some server I didn't trust, watermarked the output, or locked the useful features behind a {blurStrength}px) ; ctx.drawImage(canvas, x, y, w, h, x, y, w, h); ctx.filter = "none"; Works surprisingly well on photos with 1–4 faces. Degrades on crowds — but so does every commercial API at that task. What I learned The browser is ready. WebAssembly, ONNX inference, full PDF manipulation, video processing — it all works. The main limits are file size (very large files hit memory limits) and first-load time for WASM binaries. Lazy loading is non-negotiable. Without it, you're shipping 50MB of JS to every visitor regardless of which tool they use. Headers matter for WASM. SharedArrayBuffer requires COOP: same-origin and COEP: require-corp. Get these wrong and FFmpeg silently fails. Client-side means private by default. Users immediately trust a tool more when you can prove their files never leave their device. It's a genuine differentiator, not just a marketing claim. The site is at imgtoolkit.com — 100 tools, all free, all client-side. Happy to answer questions about any part of the implementation.

How I Built 100 Browser-Based Image Tools With No Server (FFmpeg WASM, PDF-lib, AI Background Removal)
ImgToolKit

