A free, fully offline utility app — 57 tools for PDF, image, audio and data work. Everything runs 100% in your browser. No upload, no server, no internet needed. Files never leave your device.
Installable as a PWA on macOS, Windows, and Linux. Light & dark themes.
PDF — Merge · Split / extract · PDF → images · Images → PDF · Rotate · Watermark · Page numbers · Organize (delete/reorder) · Compress · PDF → Word · PDF → Text · Word viewer Image — Convert · Resize / compress · Enlarge · Remove background (AI) · OCR · Rotate / flip · Crop · Watermark · EXIF viewer/cleaner · Color palette · Batch convert · ASCII art · Favicon set Audio / Video — Extract audio · Convert video · Trim · Video → GIF · Convert audio · Trim audio · Compress video · Extract frames · Waveform Data — Hash & verify · Base64 · JSON · Text case · UUID · QR generate / read · WiFi QR · Password · CSV ↔ JSON · Text diff · Color · Word count · Timestamp · JWT · Regex · URL/HTML encode · Number base · Lorem · Spreadsheet · HTML → Markdown · Markdown → HTML · Barcode
npm install
npm run fetch-models # one-time: downloads the offline engines/models
npm run devThen open the local URL. To test the production PWA + offline behaviour:
npm run build && npm run preview- Vite + React + TypeScript + Tailwind, single-page app.
- Heavy work runs in Web Workers (Comlink) so the UI stays responsive.
- PDF:
pdf-lib(edit) +pdf.js(render). Audio/Video:ffmpeg.wasm(single-thread, no special headers). OCR:tesseract.js. Background removal:@imgly/background-removal(ONNX). Hashing: Web Crypto. - Offline: a service worker (
vite-plugin-pwa) precaches the small app shell. The large engine/model assets (ffmpeg core, tesseract, the bg-removal model) are served from the app's own origin — never a CDN — and runtime-cached on first use, after which every tool works offline.
The large binaries are not committed to git. npm run fetch-models copies
the engine files out of node_modules and downloads the OCR language data and
the background-removal model into public/ (git-ignored). Run it once after
cloning, and again only if you bump those dependencies.
