DEV Community

Mitesh
Mitesh

Posted on

How I built 15 PDF tools that never upload your files (100% in the browser)

A few months ago I needed to merge two bank statements and password-protect the result. Every "free online PDF tool" I found wanted me to upload those files to their servers first. For a document full of account numbers, that felt completely wrong — I have no idea what happens to a file after it's uploaded, how long it's kept, or who can see it.

So I built the thing I actually wanted: PDF WithMe, a set of PDF tools where your files never leave your device. Everything runs in your browser — no upload, no server, no account. Here's how it works and what I learned.

The core idea: no backend at all

The design flips the usual model. Instead of "send your file to my server, I process it, I send it back," the browser does 100% of the work. Your PDF is read, edited, and saved entirely on your own machine. Nothing is transmitted anywhere — and that single decision (no backend) shaped everything else in a good way.

The stack

Modern browsers are far more capable than people give them credit for. Almost everything I needed already existed as a JavaScript or WebAssembly library:

  • pdf-lib handles the structural work — merging, splitting, rotating, reordering and removing pages, page numbers, watermarks and signatures.
  • pdf.js (Mozilla's PDF engine) renders pages, which powers PDF-to-image conversion.
  • qpdf compiled to WebAssembly does real AES-256 encryption and decryption — that's what lets you password-protect a PDF, or remove a password from one you own, right on your device.
  • Tesseract.js (also WebAssembly) runs OCR to pull text out of scanned documents.
  • JSZip bundles multiple outputs (like split pages) into one download.

WebAssembly is the quiet hero. qpdf and Tesseract are mature C/C++ projects; compiling them to WASM means desktop-grade capabilities in a browser tab, with zero install and zero server.

A nice side effect: it works offline

Because there's no server to call, the app doesn't actually need the internet after it loads. A service worker precaches the app and its libraries, so it's a PWA — turn off your Wi-Fi, merge a PDF, and it just… works.

The trade-offs (it's not all free)

  • Memory is the limit. A server can stream a huge file; a browser tab holds it in RAM, so very large PDFs are constrained by the device.
  • Bundle size. WASM binaries aren't tiny, so I lazy-load each tool's dependencies only when you open that tool.
  • Some problems are genuinely hard client-side. PDF-to-Word is the best example — reconstructing editable layout is messy, so I ship two modes: a best-effort "editable" rebuild, and an "exact look" fallback that drops each page into Word as an image.

Why it was worth it

Beyond privacy — which is why I started — no backend has lovely properties: nothing to run so it costs almost nothing to keep online, no database of user files to breach or subpoena, and "your files never leave your device" isn't a slogan I have to defend, it's just how the architecture works. You can verify it by watching your network tab.

If you want to try it, it's free with no sign-up: pdfwithme.com. It's early, so I'd genuinely love feedback — on the tools, the client-side approach, or what to build next.

Thanks for reading!

Top comments (0)