Free, private file tools that run entirely in your browser.
No uploads. No servers. No tracking. Your files never leave your device.
I saw many other similar client-side PDF tools which wanted to serve as a privacy-first alternative to ilovepdf etc, cuz most of the stuff that ilovepdf does can be done client-side and it should be. But the other tools which did this client-side were hastily built and their design and UX weren't thought through properly—it felt weird to use them even though they came up with the concept first.
So I built my own with better design and UX which could actually be used in production as an alternative to ilovepdf for most of the functions.
After some days of building noupload with just PDF tools, I was randomly researching what more stuff we could do client-side. I figured out that just like we could do most of the PDF manipulation stuff client-side, we could also do the same with images, and audio too—though audio is way heavier because FFmpeg is massive, but it still works. So I built the pages for these with many tools in them. A lot of days were spent figuring out the proper flow of everything, but they both turned out pretty well and became worthy additions to noupload. Hence, noupload became a suite, and then I added QR functionality too for people who want to generate/scan/bulk generate or custom design QR codes etc. I also added Encrypt/Decrypt PDF later after figuring out about qpdf-wasm, it's amazing, allows us to do encryption and decryption client-side with ease.
Compression
Compression at first was just removing metadata which basically didn't do anything—it was pretty much useless. That's why the previous version of this README said PDF compression isn't up to the mark, not very good, etc. Then I researched and read up some stuff and figured that qpdf-wasm could do PDF compression, so I tried that. It didn't work that well either—qpdf can't actually recompress images, which is where most of the file size comes from.
Then I researched more and figured out that Ghostscript is the real deal for PDF compression. I stumbled upon Playing around with Webassembly: Ghostscript by laurentmmeyer, which was such an interesting read. He built ghostscript-pdf-compress.wasm because he wanted a privacy-first solution for compressing his hefty bank statement PDF—he didn't want to upload sensitive documents to random online compressors. So he compiled Ghostscript to WebAssembly and made it work entirely in the browser. His work was based on ps-wasm by ochachacha, the original Ghostscript WASM port.
I was about to self-host from laurentmmeyer's repo, but then I found @bentopdf/gs-wasm—a polished npm package that wraps Ghostscript WASM nicely. Tried it out, and it worked amazingly well. A 4.8MB PDF compressed to 480KB. So I merged it into main, and now noupload's PDF compression actually works—thanks to Ghostscript and all these awesome open source contributors!
Q: Why is there a ⚡ icon, what's its purpose?
While making this tool, I realised that for tasks like PDF → Images, it feels like friction when I upload a PDF and then still have to click "Convert" to get the images. So I experimented with this new UX where enabling this mode removes one layer of friction—for tasks where it makes sense, it just gets straight to the result without that extra click.
I added this to pages which actually allowed it, because obviously you can't remove this friction everywhere. Like for Images → PDF, we can't know when the user is done uploading all the pages they want, but for PDF → Images, we know there's one PDF uploaded so we can skip straight to converting. Another example is HEIC → JPEG in the image tools—just upload and get your JPEG. Same with Strip Metadata—upload the image and it's done, no need for a useless "Remove Metadata" button click.
This works well because everything is processed client-side anyway, so there's no risk of your file going somewhere by mistake—it never leaves your device.
I would love if people would contribute and use this.
| Tool | Description |
|---|---|
| Organize | Drag & drop to reorder, add, or delete pages |
| Merge | Combine multiple PDFs into one |
| Split | Extract pages or divide into multiple files |
| Compress | Reduce file size (metadata removal, structure optimization) |
| Rotate | Rotate pages in any direction |
| Watermark | Add text watermarks to documents |
| Page Numbers | Add page numbers to your PDF |
| Sign | Draw or upload your signature |
| OCR | Extract text from scanned documents |
| PDF → Images | Convert pages to JPG or PNG |
| Images → PDF | Create a PDF from images |
| PDF → Text | Extract text content from PDFs |
| Sanitize | Remove metadata and hidden data |
| Encrypt | Add password protection |
| Decrypt | Remove password from protected PDFs |
| Reverse Pages | Flip the order of all pages |
| Duplicate Pages | Copy and append pages |
| Delete Pages | Remove unwanted pages |
| Tool | Description |
|---|---|
| Compress | Reduce image file size |
| Resize | Change image dimensions |
| Convert | Convert between formats (PNG, JPG, WebP, etc.) |
| Crop | Crop images to any size |
| Rotate | Rotate and flip images |
| Border | Add borders and frames |
| Watermark | Add text watermarks |
| Adjust | Brightness, contrast, saturation |
| Filters | Apply image filters |
| Strip Metadata | Remove EXIF data |
| To Base64 | Convert to Base64 string |
| Screenshot | Capture webpage screenshots |
| Favicon Generator | Create favicons from images |
| HEIC → JPEG | Convert iPhone photos |
| Bulk Compress | Compress multiple images |
| Bulk Resize | Resize multiple images |
| Bulk Convert | Convert multiple images |
| Tool | Description |
|---|---|
| Trim | Cut audio to specific length |
| Convert | Convert between formats (MP3, WAV, OGG, etc.) |
| Merge | Combine multiple audio files |
| Extract | Extract audio from video |
| Speed | Change playback speed |
| Volume | Adjust audio volume |
| Fade | Add fade in/out effects |
| Normalize | Normalize audio levels |
| Denoise | Reduce background noise |
| Remove Silence | Trim silent sections |
| Reverse | Reverse audio playback |
| Waveform | Generate waveform visualization |
| Record | Record audio from microphone |
| Tool | Description |
|---|---|
| Generate | Create QR codes from text/URLs |
| Scan | Scan QR codes from images or camera |
| Bulk Generate | Create multiple QR codes at once |
- Next.js 16 — React framework
- React 19 — UI library
- Tailwind CSS — Styling
- shadcn/ui — UI components
- pdf-lib — PDF manipulation
- react-pdf (PDF.js) — PDF rendering
- Tesseract.js — OCR engine
- FFmpeg.wasm — Audio/video processing
- qrcode — QR code generation
- html5-qrcode — QR code scanning
- heic2any — HEIC conversion
- html-to-image — Screenshot capture
- qpdf-wasm — PDF encryption/decryption
- @bentopdf/gs-wasm — PDF compression (Ghostscript WASM)
# Clone the repo
git clone https://github.com/shockz09/noupload.git
cd noupload
# Install dependencies
bun install
# Start dev server
bun devbun run build
bun startContributions are welcome! Please read CONTRIBUTING.md first.
- Fork the repo
- Create your feature branch (
git checkout -b feature/awesome) - Commit your changes (
git commit -m 'Add awesome feature') - Push to the branch (
git push origin feature/awesome) - Open a Pull Request
MIT — see LICENSE
Built with these amazing open source libraries:
- pdf-lib — PDF creation and modification
- PDF.js — PDF rendering
- Tesseract.js — OCR engine
- FFmpeg.wasm — Audio/video processing
- shadcn/ui — Beautiful UI components
- qrcode — QR code generation
- html5-qrcode — QR code scanning
- heic2any — HEIC to JPEG conversion
- html-to-image — DOM to image conversion
- qpdf-wasm — PDF encryption/decryption
- @bentopdf/gs-wasm — PDF compression (Ghostscript WASM)