TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻译准备中
221 privacy-first file tools for PDFs, images, media and developer work. No account, no watermark, no tracking. Self-hostable, MIT.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Every file task, done privately. Free, open-source tools for PDFs, images, video, audio, and developer work — use them at privatools.me or run them on your own server. AI two private ways: on-device models that download once into your browser, or your own API key going straight to the provider. PrivaTools never passes your files to third parties. No account needed. No watermarks. No premium tier. [README 설치·사용 부분 발췌] Install the pinned Python environment (requires uv) and frontend packages. npm run setup:backend npm --prefix frontend ci查看完整 README ↗
Every file task, done privately.
Free, open-source tools for PDFs, images, video, audio, and developer work — use them at privatools.me or run them on your own server. AI two private ways: on-device models that download once into your browser, or your own API key going straight to the provider. PrivaTools never passes your files to third parties. No account needed. No watermarks. No premium tier.
| Feature | PrivaTools | iLovePDF / Smallpdf / Adobe |
|---|---|---|
| Truly free | No paid tier and no daily quota on the website (fair-use rate limits apply); the API has a free daily allowance | Limited free / paid tier |
| No account | Just open and use | Email / sign-up required |
| Privacy | Server tools delete their temporary files after the response, and a sweep clears leftovers; many tools never leave your browser | Uploaded to vendor cloud |
| Tool range | PDF, image, video, audio and developer tools in one place (full list) | 20–95 tools, PDF only |
| On-device AI | 6 models (summarize, PII detection, translation, background removal, 2× Whisper speech-to-text) download once into the browser cache, then run offline without uploading their input | Cloud APIs |
| Bring your own AI key | Chat with PDF, vision OCR, translation, redaction, transcription through your Anthropic/OpenAI/Gemini/Groq/Mistral/OpenRouter/DeepSeek/Together or self-hosted key — requests go browser → provider, never through PrivaTools | Not offered |
| Batch everywhere | Many tools take several files per run (up to 25 on the standard tool page): per-file status, retry failed, one ZIP | Batch is a paid feature |
| Pipeline | Chain steps such as Compress → Watermark → Page numbers → Strip metadata on one PDF | Not offered free |
| Self-hostable | docker compose up --build | No |
| Open source | MIT — fork, modify, deploy | Proprietary |
git clone https://github.com/ethereaglehq/privatools.git
cd privatools
docker compose up --build
Open http://localhost:8000 — that's it!
git clone https://github.com/ethereaglehq/privatools.git
cd privatools
# Install the pinned Python environment (requires uv) and frontend packages.
npm run setup:backend
npm --prefix frontend ci
# Build Air + Play and serve the frontend and API together.
npm start
Open http://127.0.0.1:8000. The same-origin server supports real uploads,
account sessions (Clerk with a development key, or native accounts in a build
with VITE_AUTH_PROVIDER=local), API keys, downloads, scoped security policies
and the production PWA. Local accounts persist in data/local/; job files use
temp/local/ and are deleted after responses or by the cleanup worker. Both
directories are ignored by Git. The launcher does not load production secrets.
For active development, run npm run backend:dev and npm run frontend in
separate terminals. Vite runs on port 5173 and proxies /api/ to port 8000;
the public /api documentation page remains a frontend route. Preview the PWA
on port 8000 after rebuilding. To change the local backend port, use
npm run backend -- --port 8001 (set VITE_DEV_API_TARGET when using Vite).
The consumer UI uses Clerk for Google, GitHub, email or username with a
password, and passkey sign-in, with password recovery by email. Configure
matching public frontend/backend instance keys; localhost uses a Development
instance with a separate user list.
Without a key, tools work and account controls show an unavailable state.
Existing self-hosted native accounts require explicit VITE_AUTH_PROVIDER=local
and no Clerk key. See the Clerk deployment guide.
AI provider calls
require the user's own provider key; browser models are installed from the AI
studio as needed.
To run the backend test suite with the installed environment:
.venv/bin/python -m pytest backend/tests -q
On macOS, native-library interactions may require running each test module in a separate Python process; Linux CI runs the complete suite together.
# macOS
brew install tesseract ffmpeg qpdf poppler pango cairo zbar
brew install --cask libreoffice
# Ubuntu / Debian
sudo apt install tesseract-ocr ffmpeg qpdf libreoffice poppler-utils libzbar0 libcairo2 libpango-1.0-0 libpangocairo-1.0-0
The full, always-current catalogue, with each tool's page and guide, lives at privatools.me/tools. The families:
| Family | What's inside |
|---|---|
| 📄 PDF — organize | Merge, Split (by bookmarks/size/text/half), Organize, Delete/Extract Pages, Remove Blank Pages, Reverse, Booklet |
| 📄 PDF — edit | Edit PDF (text, ink pen, arrows, shapes, images, whiteout, layers panel), Sign & E-Sign, Watermark + Remove Watermark, Stamp, Header/Footer, Page Numbers, Bates, Bookmarks, White-Out, Shapes, Attachments, Hyperlinks, Highlight, Annotate, Transparent Background |
| 📄 PDF — optimize | Compress (presets, custom settings or a target size) and Batch Compress, Web Optimize, Flatten, Grayscale, Deskew, Repair, Crop, Auto Crop, Resize, Rotate, Invert Colors |
| 📄 PDF — security | Protect, Unlock (vault auto-try), Redact, Smart Redact (AI), Sanitize, Strip Metadata, Metadata Editor, Delete Annotations, Permissions, Remove Bates Numbering, Accessibility Checker, PDF/A Validator, Verify Signature |
| 📄 PDF — convert to | Images/HTML and web pages/Office/ODT/TXT/Markdown/CSV/EPUB/RTF/JSON/XML → PDF |
| 📄 PDF — convert from | PDF → images/Word/Excel/PowerPoint/Text/HTML/RTF/EPUB/Markdown, Extract Tables, Long Image |
| 📄 PDF — advanced | Chat with PDF (AI), Summarize (AI), Translate (AI), OCR (3 engines), Compare, N-up, Overlay, Alternate Mix, Fill Form, Form Creator, Extract Images, PDF to PDF/A, QR Code, Page Counter |
| 🖼️ Images | Compress, Convert, Resize & Crop, Background Remover (server or on-device), Upscale, Watermark ± removal, EXIF scrub/view, Image OCR (3 engines), Collage, Merge Images, Favicon, QR Code Reader, Rotate/Flip, Pixelate/Blur, Color Palette, HEIC/WebP/TIFF/BMP/GIF/SVG ↔ JPG/PNG |
| 🎬 Video & Audio | Convert, Resize, Merge, Trim, GIF ↔ MP4, Mute/Reverse/Speed, Compress, Extract Audio, Transcribe Audio (AI, on-device Whisper or your key), Subtitles (convert + burn), thumbnails |
| 💻 Developer & Text | JSON/XML/SQL/GraphQL formatters, YAML ↔ JSON/TOML, JSON to CSV schema, Diff, Counter, Base64, Hashes, JWT, Regex, Timestamps, Cron, UUID/Password/Barcode generators, Case, Colors, URL encoder, URL to PDF |
| 📦 Archive & documents | Extract Archive, Create ZIP, CSV ↔ JSON, Markdown editor with HTML export |
On-device models — download once into the browser, then work on every visit, even offline: the transformers.js models from the Hugging Face CDN and the background-removal model from privatools.me itself. No key, no account, and the model's input stays in the browser. Managed from the AI hub in the top bar (install, sizes, remove):
| Model | Powers | Size |
|---|---|---|
| DistilBART CNN 6-6 | Summarize PDF | ~275 MB |
| BERT-base-NER | Smart Redact PII detection | ~110 MB |
| OPUS-MT (per language pair) | Translate PDF | ~107 MB |
| U²-Net-P | Background Remover (optional on-device engine; the server engine is the default) | ~4.4 MB + runtime |
| Whisper tiny / base | Transcribe Audio | ~41 / ~74 MB |
The OCR tools' optional browser engine loads tesseract.js and its language data (a few MB per language) from jsDelivr; the server engine is their default.
Bring your own key (BYOK) — paste an API key once (encrypted on-device, never sent to PrivaTools) and these tools can use it: Chat with PDF, Summarize, Translate (any language), Smart Redact NER, Transcribe Audio — plus vision OCR on both OCR tools for hard scans. Eight hosted providers (Anthropic, OpenAI, Gemini, OpenRouter, Groq, Mistral, DeepSeek, Together) plus any self-hosted OpenAI-compatible endpoint (Ollama, vLLM). Every request goes browser → provider directly; the page's Content-Security-Policy only permits provider egress on the pages that actually use a key.
Honest, side-by-side comparisons with the popular paid tools:
In-depth guides on the blog:
Chain tools sequentially and download one final PDF. Drafts auto-save locally,
named pipelines can be saved, and share links use /pipeline?p=<base64url>
payloads so recipes are portable without an account. Available at /pipeline.
The pipeline API runs up to 12 of its 17 PDF steps (compress, repair, deskew,
grayscale, flatten, rotate, reverse, N-up, booklet, page numbers, Bates
numbering, header/footer, watermark, stamp, strip metadata, delete annotations
and PDF/A) on one uploaded PDF. The same routes exist under /api/v1/ for
account keys:
GET /api/v1/openapi.json (FastAPI's /api-docs is disabled when
ENVIRONMENT=production, as Docker Compose sets it)GET /api/pipeline/templatesPOST /api/pipeline/validatePOST /api/pipeline with file and JSON steps
(POST /api/v1/pipeline with an account key costs the sum of its steps)PRIVATOOLS_API_KEYS in the
backend's environment and send X-API-Key/api/v1An account exists only to hold API keys — the tools themselves never ask for
one. Sign up at /account, create a key, and call the versioned API:
curl -X POST https://api.privatools.me/api/v1/compress \
-H "X-API-Key: $PRIVATOOLS_API_KEY" \
-F [email protected] -F level=recommended -o out.pdf
Authorization: Bearer pk_… works too, for clients that default to it.
GET /api/v1/whoami — confirm a key worksGET /api/v1/usage — what today's quota looks like without spending anyGET /api/v1/operations — public operation catalog, current costs/limits and background-job availabilityGET /api/v1/openapi.json — public schema containing only the versioned APIX-RateLimit-Limit, -Remaining and -Reset, so a
client never has to call /usage to find out it is nearly out.429 with Retry-After.code beside the human message, so a
client can branch without matching on prose. Existing detail fields remain.V1 processing and account/usage queries require a key. Its catalog and schema
are public and do not spend processing quota. The website continues to use
the unversioned /api/* routes.
Background processing is enabled on api.privatools.me and optional when
self-hosting (API_V1_JOBS_ENABLED=true; off by default in
docker-compose.yml). It adds
POST /api/v1/jobs with an Idempotency-Key, authenticated status/result
retrieval, and explicit deletion. The initial adapters are merge, compress,
grayscale, and pdf-to-text; the catalog reports actual availability.
One worker shares the existing web container's 4 GB / 1.8 CPU limits.
Results expire one hour after completion; repeat downloads are supported
until expiry or deletion. See API integration and rollout.
Clerk accounts recover access by email; users do not need to save a recovery code. When Clerk is configured, native password/recovery endpoints are retired. Explicit legacy self-hosted deployments retain their existing account records and recovery-code flow.
Developer clients live under packages/:
npx --no-install privatools --helppackages/extension unpacked in a Manifest V3 browserMany tools accept several files directly on the tool page (up to 25 on the standard tool page) — same settings applied to each, bounded concurrency, per-file status rows, retry-failed, and a single ZIP (one file keeps the classic direct download). The dedicated /batch page takes larger drops for a single tool and processes them file by file.
The AI button in the top bar opens one dialog for everything AI: manage the encrypted provider keys (BYOK) and see, pre-download, or delete the on-device models with their true cached sizes — introspected live from the browser cache, so it can't lie.
| Shortcut | Action |
|---|---|
⌘K / Ctrl+K | Open search — matches tool names, synonyms, descriptions, categories, file types and site pages |
↑ ↓ | Move through results |
Enter | Open the selected result |
Escape | Close search |
/ | Jump to the filter on the tools page |
⌘↵ / Ctrl+↵ | Start processing (when a file is selected) |
privatools/
├── backend/ # FastAPI application and Python tests
│ ├── app/ # Routes, services, auth, API jobs and SEO
│ └── tests/
├── frontend/ # React, Vite and TypeScript
│ ├── src/ # Shared tools, pages and Air/Play interfaces
│ ├── public/ # Public assets and generated starter downloads
│ ├── scripts/ # Frontend build and content generators
│ └── tests/ # Browser checks
├── packages/ # CLI and browser extension
├── examples/api/ # Runnable API integration examples
├── scripts/
│ ├── api/ # Capacity checks and starter generation/tests
│ ├── analytics/ # Public analytics configuration verification
│ ├── ci/ # Boot the built image and probe what it serves
│ ├── dev/ # Local application launcher
│ └── seo/ # Tool guide export, registry copy merge, manifest checks
├── deploy/ # Deployment profiles and operational guides
│ └── oracle-vm/ # Oracle deployment, backup and systemd files
├── docs/
│ ├── api/ # API integration and maintainer guides
│ ├── verification/ # Account and API verification evidence
│ ├── seo/ # Search visibility runbook
│ ├── superpowers/ # Engineering plans and specifications
│ └── archive/ # Explicitly historical research, roadmap and analysis
├── Dockerfile
├── docker-compose.yml
├── package.json # Root development commands and CLI workspace
└── requirements*.txt/.lock # Pinned runtime, development and CI dependencies
See the documentation index, frontend guide and script guide for the relevant commands and conventions.
PrivaTools ships with serious AI / answer-engine optimisation:
backend/app/tool_content.py and exported by scripts/seo/export-tool-guides.pyseoTitle and metaDescription; a test enforces length, format and uniquenessfrontend/src/data/sitemap-priority.json get priority 0.8 and other tool pages 0.6; each tool's lastReviewed drives its lastmod, JSON-LD dateModified and visible "Last reviewed" line, and a pull request that changes a tool's copy without moving its date fails CIllms.txt + llms-full.txt — auto-generated index and full corpus for AI crawlers (ChatGPT, Claude, Perplexity, Gemini)/api/og-image?p=<path>/api/ closed except /api/og-image; eight scraper and SEO-tool bots are blockedPrivaTools is MIT-licensed and PRs are welcome.
1. Service — backend/app/services/my_tool_service.py
from ..utils.filenames import temp_output
def my_tool(input_path: str) -> str:
output_path = temp_output("my_tool", "pdf")
# processing logic: read input_path, write output_path
return str(output_path)
2. Route — add to an existing routes/*.py or create a new module. For one
PDF in and one file out, process_pdf_upload handles the whole lifecycle: it
checks and streams the upload to disk, runs the service off the event loop
under the heavy-work gate (run_bounded) and deletes both temporary files
after the response. This is backend/app/routes/grayscale.py:
from fastapi import APIRouter, File, UploadFile
from ..services import grayscale_service
from ..utils.upload_helper import process_pdf_upload
router = APIRouter()
@router.post("/grayscale")
async def grayscale_pdf(file: UploadFile = File(...)):
return await process_pdf_upload(
file,
grayscale_service.convert_to_grayscale,
output_filename="grayscale.pdf",
)
Bind extra form fields to the service with a lambda. Register a new router in
backend/app/main.py under /api, and in the api_v1.mount list to expose it
at /api/v1. Heavy routes also take request: Request and
@limiter.limit(EXPENSIVE_RATE_LIMIT), as routes/ocr.py does.
3. Tool entry — frontend/src/data/tools.ts (PDF) or non-pdf-tools.ts
{
slug: "my-tool", // the frontend calls /api/my-tool unless lib/tool-endpoints.ts maps it
icon: FileText, // any Lucide icon
name: "My Tool",
description: "Short description",
longDescription: "Detailed description for the tool page.",
seoTitle: "Do the Task to Any PDF Online – Free and Private", // 40–60 characters, no brand
metaDescription: "My Tool does the task to every page of a PDF in seconds. It is free, needs no sign-up, and adds no watermark to the result.", // 120–160 characters, ends with a period
synonyms: "other words people search for",
popularity: 42, // lower = higher up the listing
category: "edit", // organize | edit | optimize | security | to-pdf | from-pdf | advanced
accepts: ".pdf",
outputLabel: "output.pdf",
lastReviewed: "2026-09-18", // ISO date; move it only when this tool's copy changes
}
Non-PDF tools use the categories image, video-audio, developer, archive
and document-office. Set clientOnly: true for a tool that runs entirely in
the browser and byok: true for one that can use the visitor's own AI key.
frontend/src/test/tool-registry.test.ts checks the title, description,
synonyms and date rules. Add HowTo steps and FAQs in
backend/app/tool_content.py (then run
.venv/bin/python scripts/seo/export-tool-guides.py), and run
npm run gen:llms so the manifest and sitemap pick the tool up — the sitemap
reads that manifest, not a per-tool list in backend/app/routes/sitemap.py.
backend/app/seo_meta.py holds no tool copy either: it reads the manifest
npm run gen:llms writes (the build's tool-content.json, or the committed
frontend/public/tool-content.json without a build) and refuses to start if
neither is readable. GenericUI handles upload, a queue of up to 25 files and
download automatically; a dedicated component under
frontend/src/components/tool-ui/ must call emitToolRun from
lib/toolRun.ts when it succeeds or fails. CONTRIBUTING.md
lists the checks, and CLAUDE.md keeps the full list of places a
new slug touches.
npm --prefix frontend run build; some backend tests read the build), then run .venv/bin/python -m pytest backend/tests -q and the frontend checks listed in CONTRIBUTING.md. CI also checks review dates on pull requests and boots the Docker imagelastReviewed), steps and FAQ in backend/app/tool_content.py (then run export-tool-guides.py); run npm run gen:llms and commit the result, and add a line under [Unreleased] in CHANGELOG.md for a user-visible changeutm_ campaign tags that pass a filter against phone numbers, identifiers and tokens), one event per tool run (the tool and its category, single/batch/pipeline, the outcome, the file count and, for most failed runs, a fixed failure category — never file names, contents or error messages) and Google's scroll, outbound-link and video measurement. Browsers that identify themselves as automated or headless are not measured. It uses cookies and pseudonymous identifiers and Google receives your IP address, so it is not anonymous. Turn it off with the switch on the Privacy page. Advertising features and Google Signals are off, and there are no ad networks. A self-hosted copy sends nothing unless its operator sets MIT — free to use, modify, and distribute. See LICENSE for details.
Built with care for privacy
GA_BROWSER_TAG_ENABLED=truebackend/app/utils/cleanup.py and backend/app/main.py yourself