Every major PDF tool — Smallpdf, ILovePDF, Adobe Acrobat Online — routes your files through a remote server. You upload a confidential contract, a financial statement, a medical record — and it passes through infrastructure you don't control.
QuickPDF is different. It processes everything 100% client-side using pdf-lib in the browser. Your files never leave your device. Not for a millisecond. No backend. No uploads. No data liability.
- Merge PDFs — Combine unlimited PDFs with drag-and-drop reordering
- Split PDFs — Extract any page range with start/end page precision
- Zero uploads — All processing happens in-memory in your browser via WebAssembly
- No watermarks — Clean, unbranded output on every export
- Instant — No network round-trips; operations complete in milliseconds
- Fully responsive — Works on desktop, tablet, and mobile
| Layer | Technology |
|---|---|
| UI Framework | React 19 |
| Build Tool | Vite 8 |
| PDF Engine | pdf-lib 1.17 (client-side / WASM) |
| Styling | Tailwind CSS 4 |
| Animations | Framer Motion 12 |
| Routing | React Router 7 |
| Icons | Lucide React |
Prerequisites: Node.js v18+
# Clone the repo
git clone https://github.com/jhasourav07/quickpdf.git
cd quickpdf
# Install dependencies
npm install
# Start dev server
npm run devOpen http://localhost:5173 in your browser.
# Production build
npm run build
# Preview production build locally
npm run previewThe dist/ output is fully static — deploy to Vercel, Netlify, or Cloudflare Pages with zero configuration.
src/
├── components/
│ ├── layout/
│ │ ├── Navbar.jsx # Sticky top navigation
│ │ └── PageContainer.jsx # Page layout wrapper
│ ├── pdf/
│ │ └── Dropzone.jsx # Drag-and-drop file input
│ └── ui/
│ ├── AnimatedBackground.jsx # Mouse-reactive background
│ └── Button.jsx # Reusable button component
├── pages/
│ ├── Home/ # Landing page
│ ├── Merge/ # Multi-file merge tool
│ └── Split/ # Page-range split tool
├── services/
│ └── pdf.service.js # Core PDF logic (merge, split, page count)
└── utils/
└── formatters.js # File size helpers
QuickPDF uses pdf-lib — a pure JavaScript library that runs entirely in the browser with no server dependency.
Merging
- Files are read as
ArrayBuffervia the browser's native File API - Each PDF is loaded into a
PDFDocumentinstance in memory - Pages are copied into a new document in the user-defined drag order
- The merged document is serialized and triggered as a browser download — never transmitted anywhere
Splitting
- User uploads a PDF; page count is extracted immediately in-memory
- User specifies start and end pages
- Only the selected page range is copied into a new
PDFDocument - Output is downloaded directly — the original file is never modified
- Sign PDF — Local, private e-signature drawing tool
- Add Page Numbers — Auto-stamp sequential numbers on footers
- Extract Text (OCR) — Pull readable text directly to clipboard
- Protect/Unlock PDF — Add or remove passwords locally
- Fork the repository
- Create a branch:
git checkout -b feat/your-feature - Commit your changes:
git commit -m 'feat: add your feature' - Push:
git push origin feat/your-feature - Open a Pull Request
Please follow Conventional Commits for commit message format.
QuickPDF is architected so that a breach of the application itself cannot expose user files — because files are never transmitted. The attack surface is limited entirely to the user's own browser session.
If you discover a vulnerability, please open a GitHub Security Advisory rather than a public issue.
MIT © Sourav Jha