I spent the last few months building OpenFile, a free toolbox with 360+ file tools (PDF, image, video, audio, archives, fonts, local AI) that all run inside the browser. No server touches the files. Here are the things that actually mattered.
1. Lazy load every engine
FFmpeg.wasm, pdf libraries, image codecs and ML models add up to hundreds of MB. Nobody should download all of that to merge two PDFs. Each tool imports its engine only when you open it, and the service worker caches it after the first use.
2. Never block the main thread
Anything heavier than a few milliseconds runs in a Web Worker. The UI sends a File or ArrayBuffer, the worker does the work, and posts progress events back. Transferable objects keep this from copying big buffers twice.
3. Memory is the real limit
A 2 GB video does not fit in a 32 bit WASM heap. I stream where I can, process in chunks, and show a clear message when a file is too big for the device instead of crashing the tab.
4. Offline is a feature, not a bonus
With a service worker and a PWA manifest, the whole app installs and runs with no network. For a privacy tool this is the strongest proof: turn off Wi-Fi and it still works.
5. One tool registry
Every tool is a small module with metadata (name, category, accepted types, engine). Search, routing, the sitemap and the docs are all generated from that list, so adding tool number 361 is one file.
Stack: React 19, TypeScript, Vite, Tailwind 4, WebAssembly, Web Workers.
Try it: https://openfile-studio.vercel.app/
Code (MIT): https://github.com/aniruddhaadak80/OpenFile
Demo video:
If you have built something heavy with WASM, I would like to hear how you handled memory.
Top comments (0)