π Live: pdf.arwebs.my.id
A fast, privacy-first PDF toolkit that runs entirely in your browser. No uploads. No accounts. No server.
| Tool | Description |
|---|---|
| Compress PDF | Reduce file size with quality presets (Screen / Web / Print / Custom) |
| Merge PDF | Combine multiple PDFs into one. Drag rows to set order |
| Split PDF | Extract pages or define custom ranges into separate files |
| PDF β Image | Render each page as JPEG or PNG at 72β216 dpi |
| Image β PDF | Pack JPG/PNG files into a single PDF. Drag to set page order |
| Protect PDF | Lock a PDF with a password. Encrypted output works in any PDF reader |
| Rotate Pages | Rotate all pages clockwise by 90Β°, 180Β°, or 270Β° |
| Watermark PDF | Stamp a text watermark on every page with custom opacity and angle |
| Edit Metadata | Read and update title, author, subject, keywords, and creator fields |
All processing happens locally in the browser using WebAssembly and Canvas APIs. Files are never sent to any server.
- Next.js 16 β App Router, React 19 (requires Node.js 20+)
- pdf-lib β PDF creation, merging, splitting, rotation, watermarking, metadata editing
- pdfjs-dist β PDF rendering to canvas
- browser-image-compression β JPEG compression for compress tool
- jsPDF β PDF creation with password encryption for protect tool
- file-saver β Client-side file downloads
# Install dependencies npm install # Run dev server npm run dev # Run tests npm test # Build for production npm run build
Open http://localhost:3000.
Requires Node.js 20+ on the server.
# Build, zip, and upload to FTP in one command
npm run deployCredentials are read from .env.ftp:
FTP_HOST=...
FTP_USER=...
FTP_PASS=...
FTP_REMOTE_PATH=...
The script builds a standalone bundle, assembles standalone/ + public/ + .next/static/ into one folder, zips it, uploads deploy.zip to the FTP root, then cleans up locally.
GitHub Actions runs on every push: lint β test β build. See .github/workflows/ci.yml.
app/
βββ page.tsx # Landing page with tool search
βββ compress/page.tsx
βββ merge/page.tsx
βββ split/page.tsx
βββ pdf-to-image/page.tsx
βββ image-to-pdf/page.tsx
βββ protect/page.tsx
βββ rotate/page.tsx
βββ watermark/page.tsx
βββ metadata/page.tsx
components/
βββ Navbar/ # Responsive navbar with mobile hamburger menu
βββ AppLoader/ # Preloads all PDF libraries before site renders
βββ DropZone/ # Drag-and-drop file input (supports page-wide drop)
βββ FileList/ # File list with drag-to-reorder
βββ ProgressBar/ # Animated shimmer progress bar
βββ ToolLayout/ # Shared page wrapper, records recently used tools
βββ ToolUI/ # Err, Ok, ActionBtn, PasswordStrength components
βββ TopLoader/ # Page transition progress bar
βββ PwaInit/ # Registers service worker for PWA support
lib/
βββ compressPdf.ts
βββ mergePdf.ts
βββ splitPdf.ts
βββ pdfToImage.ts
βββ imageToPdf.ts
βββ protectPdf.ts
βββ rotatePdf.ts
βββ watermarkPdf.ts
βββ editMetadata.ts
βββ validate.ts # File size / format / password strength validation
βββ usePreference.ts # localStorage preference hook
βββ useRecentTools.ts # Recently used tools tracking
βββ useHotkey.ts # Cmd/Ctrl+Enter shortcut
tests/
βββ lib/
βββ validate.test.ts
βββ usePreference.test.ts
MIT