Free online PDF tools — merge, split, compress, watermark, and convert PDFs entirely in your browser. No document uploads or sign-up; practical capacity depends on the device and browser.
Use the production tools at labofpdf.com, make a large scan smaller with the private scanned PDF compressor, read why scanned PDFs become large and how to reduce them, or start with the printable PDF submission checklist before uploading a document to a university, visa, government, job, grant, or client portal.
| Tool | Description |
|---|---|
| Merge PDF | Combine multiple PDFs into one. Preview pages and pick exactly which ones to include. |
| Split PDF | Extract specific pages from a PDF or split it into two separate files. |
| Compress PDF | Reduce PDF file size losslessly — text stays selectable. |
| Compress Scanned PDF | Detect image-based scans, choose a size target, and make the document smaller locally. |
| PDF to Word | Convert PDF to Word document. OCR applied automatically to scanned pages. |
| Add Watermark | Add a text watermark to every page of your PDF. |
| Remove Watermark Annotations | Inspect supported Stamp/Watermark annotations and remove only selected candidates. |
| Manage Pages | Reorder, rotate, remove, restore, duplicate, extract, or insert blank pages with a visual preview. |
| PDF to Image | Convert PDF pages to PNG or JPEG images. Download individually or as ZIP. |
| Images to PDF | Arrange JPG, PNG, or WebP images visually and create A4, Letter, or image-sized PDF pages. |
| Visual PDF Editor | Drag, resize, align, layer, lock, hide, copy, sign, highlight, draw, and securely redact objects on real PDF pages. |
All processing happens locally in your browser using pdf-lib and pdfjs-dist. Your files never leave your device.
- React 19 + TypeScript
- Vite (build tool)
- TailwindCSS 4 (styling)
- pdf-lib / pdfjs-dist (PDF processing)
- Tesseract.js (OCR)
- JSZip (ZIP downloads)
- Zustand (state management)
- lottie-web (animations)
- Lucide (icons)
npm install
npm run devOpen http://localhost:5173 in your browser.
npm run buildOutput goes to dist/.
The production build also creates route-specific HTML files such as
dist/to-image.html. Configure Nginx to resolve $uri.html before the SPA
fallback so search engines and link-preview bots receive the correct title,
description, canonical URL, and structured data without running JavaScript.
Use deploy/nginx-labofpdf.conf as the application portion of the HTTPS server
block. It includes:
- route-specific SEO HTML resolution;
- one-year immutable caching for hashed assets;
- no-cache handling for the application entry document;
- gzip compression;
- HSTS, permissions policy, MIME sniffing and framing protection;
- a report-only Content Security Policy that can be monitored before enforcement.
Run nginx -t before reloading Nginx. Keep the CSP in report-only mode until
PDF conversion, OCR, analytics, social sharing, and downloads have been tested
on the deployed domain.
Deploy into one fixed working directory instead of creating a permanent copy
for every release. Vite clears dist/ before rebuilding, so old hashed assets
do not accumulate. Once the build has succeeded and Nginx is serving dist/,
node_modules/ can be removed; restore it with npm ci for the next build.
If release directories are used for rollback, retain the active release and at
most two previous releases.
See PROJECT_HANDOFF.md for the current deployment state and the complete
cross-agent verification checklist.
GitHub main → canonical local worktree → lint and tests → npm run build →
validated dist/ → atomic upload → Nginx /var/www/labofpdf.
Run deploy/deploy-to-server.sh production-YYYY-MM-DD-description only from
the canonical worktree after pushing that new immutable tag. The build
writes dist/release.json, and deployment succeeds only when the online
manifest reports the same Git commit. The deployment also installs the local
Node API at /opt/labofpdf-api and restarts visitor-counter.service on port
3001 behind /api/. API state is kept in /var/lib/labofpdf, outside the
static release directories.
All PDF processing runs entirely client-side. No files are uploaded to the server. After a result is downloaded, users can optionally report whether it worked. Feedback stores the tool path, outcome, reason, optional short comment, and release commit in a server-local SQLite database. It does not store the PDF, file name, document content, or IP address.
Administrators can view privacy-safe 30-day aggregates on the server with:
sudo -u www-data node /opt/labofpdf-api/feedback-report.mjsMIT