DEV Community

Cover image for I Built a Privacy-First PDF Tool That Never Uploads Your File
Aizaz Ali
Aizaz Ali

Posted on

I Built a Privacy-First PDF Tool That Never Uploads Your File

I Built a Privacy-First PDF Tool That Never Uploads Your Files

Hey everyone! πŸ‘‹

I've been working on a side project for a while now, and I finally feel ready to share it with the dev community. It's called AeroPDF a collection of free PDF tools that run 100% in your browser.

No uploads. No servers touching your files. Just pure client-side magic.

Why I Built This

We've all been there. You need to quickly merge two PDFs or compress a file before emailing it. You Google "merge pdf online" and end up on some sketchy site that:

  1. Uploads your file to who-knows-where
  2. Shows you 47 ads
  3. Asks you to "sign up for premium" after processing ONE file
  4. Probably keeps a copy of your data forever

I got tired of it. Especially when dealing with sensitive stuff like contracts, invoices, or personal documents. Why should I trust a random server with my files?
So I thought: What if everything just happened locally?

The Tech Stack

For the curious devs out there, here's what powers AeroPDF:

  • Next.js 14 (App Router) For the framework and SSR
  • pdf-lib The backbone for most PDF manipulations (merge, split, rotate, etc.)
  • PDF.js Mozilla's library for rendering PDF previews
  • Tailwind CSS Because life's too short for vanilla CSS
  • Deployed on Netlify Simple, fast, free tier is generous

The key insight was that pdf-lib can do almost everything you need for basic PDF operations, and it runs entirely in JavaScript. No backend required.

How It Actually Works
When you drop a file into AeroPDF, here's what happens:

// Simplified example of merging PDFs client-side
import { PDFDocument } from 'pdf-lib';
async function mergePDFs(pdfFiles) {
  const mergedPdf = await PDFDocument.create();

  for (const file of pdfFiles) {
    const arrayBuffer = await file.arrayBuffer();
    const pdf = await PDFDocument.load(arrayBuffer);
    const pages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
    pages.forEach(page => mergedPdf.addPage(page));
  }

  return await mergedPdf.save();
}
Enter fullscreen mode Exit fullscreen mode

That's it. The file goes from your device β†’ browser memory β†’ back to your device as a download. The server never sees it.

Features I'm Most Proud Of

  • Merge PDF Combine multiple files, drag to reorder
  • Split/Extract Pages Visual page picker
  • Compress PDF Reduces file size (with quality options)
  • PDF to Word Basic text extraction
  • E-Sign Draw or type signatures directly on documents
  • Password Protection Encrypt PDFs before sharing

And honestly, most of these took way less code than I expected once I figured out the pdf-lib API.

The Privacy Angle

I'm not just saying "privacy-first" for marketing. There's literally no backend processing.

  • No file uploads
  • No analytics tracking your documents
  • No cookies beyond what's needed for the site to function
  • Works offline once loaded (it's a PWA)

You can literally disconnect from the internet after the page loads and it still works. Try that with iLovePDF.

Lessons Learned

  1. Browser APIs are powerful FileReader, Blob, URL.createObjectURL() are your friends

  2. pdf-lib is amazing Seriously, huge thanks to the maintainers

  3. SEO for tool sites is hard Competing with established players takes time

  4. Users actually care about privacy The feedback I've gotten shows people appreciate not uploading files

What's Next?

I'm working on:

A Chrome extension for quick access

Try It Out

If you work with PDFs (and who doesn't?), give it a spin: aeropdf.app

It's completely free. No accounts. No limits. No BS.

Would love to hear your feedback or suggestions. And if you're interested in the technical details of any specific feature, drop a comment happy to write a deeper dive!

P.S. If you're building something similar and need help with client-side PDF processing, feel free to reach out. I've learned a lot of tricks along the way.

Top comments (2)

Collapse
 
aizazart profile image
Aizaz Ali

Just a heads up to anyone digging into the code: getting pdf-lib to handle large files purely client-side was a bit of a challenge with memory limits πŸ˜…. If anyone has experience optimizing ArrayBuffers for huge PDFs, I’m all ears for suggestions!

Collapse
 
usman_khan_07ce9bfb16e0c4 profile image
usman khan

Love the clean UI. Just tested the merge tool and it was instant. Good stuff. πŸ™Œ