{"id":51560870,"url":"https://github.com/mithun-srinivas/doxdock","last_synced_at":"2026-07-15T16:01:38.988Z","repository":{"id":370404264,"uuid":"1294621605","full_name":"mithun-srinivas/DoxDock","owner":"mithun-srinivas","description":"Free, open-source PDF \u0026 image tools that run 100% in your browser — merge, split, compress, convert, edit \u0026 sign. No uploads, no sign-up, fully private and offline.","archived":false,"fork":false,"pushed_at":"2026-07-11T10:46:55.000Z","size":653,"stargazers_count":15,"open_issues_count":30,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-11T12:13:07.143Z","etag":null,"topics":["client-side","compress-pdf","document-tools","edit-pdf","image-tools","javascript","merge-pdf","no-upload","offline-first","open-source","pdf","pdf-to-word","pdf-tools","privacy","pwa","react","self-hosted","split-pdf","tailwindcss","vite"],"latest_commit_sha":null,"homepage":"https://doxdock.vercel.app/ideology.html","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mithun-srinivas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["mithun-srinivas"]}},"created_at":"2026-07-09T04:18:24.000Z","updated_at":"2026-07-11T10:55:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mithun-srinivas/DoxDock","commit_stats":null,"previous_names":["mithun-srinivas/doxdock"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mithun-srinivas/DoxDock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mithun-srinivas%2FDoxDock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mithun-srinivas%2FDoxDock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mithun-srinivas%2FDoxDock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mithun-srinivas%2FDoxDock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mithun-srinivas","download_url":"https://codeload.github.com/mithun-srinivas/DoxDock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mithun-srinivas%2FDoxDock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35392296,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-12T02:00:06.386Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-side","compress-pdf","document-tools","edit-pdf","image-tools","javascript","merge-pdf","no-upload","offline-first","open-source","pdf","pdf-to-word","pdf-tools","privacy","pwa","react","self-hosted","split-pdf","tailwindcss","vite"],"created_at":"2026-07-10T11:00:14.136Z","updated_at":"2026-07-12T13:00:50.677Z","avatar_url":"https://github.com/mithun-srinivas.png","language":"JavaScript","funding_links":["https://github.com/sponsors/mithun-srinivas"],"categories":[],"sub_categories":[],"readme":"# DoxDock\n\n**Offline-first document \u0026 image tools that run 100% in your browser. Nothing you open ever leaves your machine.**\n\nDoxDock is a collection of ~20 everyday PDF and image utilities — merge, split, compress, convert, watermark, extract text, and more — built on one hard rule: **your files never get uploaded anywhere.** Every operation runs client-side, on your device, using your browser's own CPU. No servers, no accounts, no analytics, no network.\n\nIt exists for the moment you have a sensitive PDF — a contract, a payslip, a medical scan — and just need to _do one thing_ to it without handing it to a random online converter. Read the [ideology letter](https://doxdock.vercel.app/ideology.html) for the why.\n\n\u003e **Runs entirely in your browser — no uploads, no network.**\n\n\u003cimg width=\"1723\" height=\"982\" alt=\"image\" src=\"https://github.com/user-attachments/assets/e8212de6-c403-42c4-b02e-172e4d4ec2fd\" /\u003e\n\n---\n\n## Why it's \"provably local\" — and how to verify\n\nMost \"free online PDF tools\" upload your file to a server you know nothing about. DoxDock is the opposite, and it's built so you don't have to take our word for it:\n\n1. **A strict Content-Security-Policy forbids network access.** `index.html` ships a CSP with `connect-src 'self'` — the browser will _refuse_ any outbound `fetch`/`XHR`/`WebSocket` to any host but its own origin. If a future change tried to phone home, the browser would block it.\n2. **Everything is bundled locally.** Fonts (system stack), icons (inline SVG), the pdf.js worker, and all WebAssembly are served from the app itself. There are no CDN links, no external fonts, no trackers.\n3. **It's an installable PWA that works offline.** After the first load, a service worker caches everything. Pull your network cable / turn off Wi-Fi — every tool still works.\n\n### Verify it yourself (30 seconds)\n\n- Open DevTools → **Network** tab, then use any tool. You'll see requests only to your own origin (in dev, `localhost`) — never an external domain.\n- Or: load the app once, go **fully offline** (airplane mode / disconnect), and reload. Everything keeps working.\n- Or: read the source. It's MIT-licensed and small. `connect-src 'self'` is in [`index.html`](index.html); the pdf.js worker is bundled in [`src/lib/pdfjs.js`](src/lib/pdfjs.js).\n\nWe persist only **non-sensitive UI state** (your theme and last-used tool) in `localStorage`. File contents are never written to storage and never transmitted.\n\n---\n\n## Quick start\n\n```bash\n# install\nnpm install\n\n# dev server (http://localhost:5173)\nnpm run dev\n\n# production build -\u003e dist/\nnpm run build\n\n# preview the production build\nnpm run preview\n```\n\nRequirements: Node 18+. No backend, no environment variables, no services to run — it's a static site.\n\n### Verify the offline build\n\n```bash\nnpm run build\nnpm run preview\n# open the URL, then disconnect your network and use the app.\n# In DevTools → Network, confirm zero requests leave your origin.\n```\n\n---\n\n## Supported operations\n\nOperations whose client-side result has inherent limits are labelled honestly in the UI **and** here.\n\n### PDF\n\n| Tool | What it does | Caveats |\n|---|---|---|\n| Images → PDF | Combine images into one PDF, ordered, with page-size/orientation options | — |\n| PDF → Images | Export each page as PNG or JPEG (ZIP download) | — |\n| Merge PDFs | Combine multiple PDFs, drag to reorder | Encrypted PDFs unsupported |\n| Split PDF | Extract page ranges or explode into single pages | Encrypted PDFs unsupported |\n| Rotate PDF | Rotate all or selected pages by 90/180/270° | — |\n| Organize PDF | Reorder / delete pages via thumbnails | — |\n| Edit PDF | Overlay text, drawings, highlights, shapes, images, and white-out; flatten on export | Adds content on top; does not re-flow existing text |\n| Compress PDF | Re-encode page images + strip metadata; before/after size | **Results vary.** \"Re-encode pages\" rasterizes (text becomes non-selectable); text-only PDFs barely compress — use \"strip metadata\" for those. |\n| Watermark PDF | Text stamp, centered or tiled, with opacity/angle | — |\n| Add Page Numbers | Stamp page numbers with position/format options | — |\n| Extract Text | Output plain text or Markdown | Text-based PDFs only; **no OCR** for scans |\n| PDF → Word | Extract text into an editable `.docx` | **Text only** — complex layout, tables, and images are not preserved; no OCR |\n| Word → PDF | Convert `.docx` to PDF | **Approximate layout** — headings/lists/bold kept; exact fonts, images, columns, tables not reproduced |\n| Fill PDF Form | Fill AcroForm fields and optionally flatten | Only PDFs with real form fields |\n\n### Image\n\n| Tool | What it does | Caveats |\n|---|---|---|\n| Compress Image | Quality slider, before/after size | PNG is lossless — convert to JPEG/WebP for big savings |\n| Resize Image | By dimensions or percentage, keep aspect ratio | — |\n| Convert Image Format | PNG ↔ JPEG ↔ WebP | — |\n| Crop Image | Interactive drag-to-crop | — |\n| Strip Image Metadata | Remove EXIF/GPS by re-encoding | — |\n| Rotate / Flip Image | 90° steps + horizontal/vertical flip | — |\n\n### Convert\n\n| Tool | What it does | Caveats |\n|---|---|---|\n| Markdown → PDF | Render Markdown text or `.md` file to PDF | Common Markdown subset |\n| HTML → PDF | Render HTML markup or `.html` file to PDF | **Approximate layout** — CSS/images not reproduced |\n\n---\n\n## Tech stack\n\n- **React + plain JavaScript (JSX)** + **Vite**\n- **Tailwind CSS** (the \"Aurora\" theme — deep slate with a mint→sky glow, light + dark)\n- **vite-plugin-pwa** for the offline/installable service worker\n- Client-side libraries, all bundled locally (no CDN): `pdf-lib`, `pdfjs-dist` (worker bundled), `jspdf`, `docx`, `mammoth`, `browser-image-compression`, `fflate` (zip). Plus the browser **Canvas** and **Web Crypto** APIs.\n\nNo dependency makes network calls at runtime. Heavy work (pdf.js rendering, image compression) runs in web workers to keep the UI responsive.\n\n## Architecture\n\nDoxDock uses a **plugin/registry** architecture. Each operation is a self-contained folder under `src/operations/\u003cid\u003e/` with metadata, a component, and pure helpers. A central registry auto-discovers them via `import.meta.glob` and lists them in a searchable, categorized sidebar with a Cmd/Ctrl+K command palette. Adding a tool = drop in one folder. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Contributing\n\nPRs welcome — especially new operations. See [CONTRIBUTING.md](CONTRIBUTING.md) for a step-by-step guide. The one rule that can never break: **no runtime network requests.**\n\n## License\n\n[MIT](LICENSE) © 2026 Mithun Srinivas\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmithun-srinivas%2Fdoxdock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmithun-srinivas%2Fdoxdock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmithun-srinivas%2Fdoxdock/lists"}