{"id":49136389,"url":"https://github.com/qrcommunication/gigapdf","last_synced_at":"2026-07-01T23:01:44.605Z","repository":{"id":329307297,"uuid":"1118545921","full_name":"QrCommunication/gigapdf","owner":"QrCommunication","description":"Self-hostable open-source WYSIWYG PDF editor — edit text, images \u0026 forms in the browser, with a complete REST API and embeddable widget. Next.js + FastAPI, AGPLv3.","archived":false,"fork":false,"pushed_at":"2026-06-27T00:51:30.000Z","size":14940,"stargazers_count":0,"open_issues_count":16,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T02:18:30.836Z","etag":null,"topics":["docker","document-management","fabricjs","fastapi","nextjs","ocr","open-source","pdf","pdf-api","pdf-editing","pdf-editor","pdf-forms","pdf-generation","pdf-tools","pdfjs","python","react","self-hosted","typescript","wysiwyg"],"latest_commit_sha":null,"homepage":"https://giga-pdf.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/QrCommunication.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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}},"created_at":"2025-12-17T23:28:03.000Z","updated_at":"2026-06-27T00:46:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/QrCommunication/gigapdf","commit_stats":null,"previous_names":["ronylicha/gigapdf","qrcommunication/gigapdf"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/QrCommunication/gigapdf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QrCommunication%2Fgigapdf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QrCommunication%2Fgigapdf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QrCommunication%2Fgigapdf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QrCommunication%2Fgigapdf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/QrCommunication","download_url":"https://codeload.github.com/QrCommunication/gigapdf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QrCommunication%2Fgigapdf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35025983,"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-01T02:00:05.325Z","response_time":130,"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":["docker","document-management","fabricjs","fastapi","nextjs","ocr","open-source","pdf","pdf-api","pdf-editing","pdf-editor","pdf-forms","pdf-generation","pdf-tools","pdfjs","python","react","self-hosted","typescript","wysiwyg"],"created_at":"2026-04-21T22:09:13.269Z","updated_at":"2026-07-01T23:01:44.598Z","avatar_url":"https://github.com/QrCommunication.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"branding/logo-stacked-dark.svg\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"branding/logo-stacked-light.svg\" /\u003e\n    \u003cimg src=\"branding/logo-stacked-light.svg\" alt=\"GigaPDF\" width=\"160\" /\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eGigaPDF\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eThe self-hostable WYSIWYG PDF editor — edit text, images, forms and\n  pages in your browser, with a complete REST API.\u003cbr\u003e\n  Powered by an in-house, zero-dependency Rust\u0026nbsp;→\u0026nbsp;WebAssembly PDF engine.\u003cbr\u003e\n  Open source, source-available under PolyForm Noncommercial 1.0.0\n  (commercial licensing available).\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/QrCommunication/gigapdf/blob/main/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-PolyForm--Noncommercial--1.0.0-blue.svg\" alt=\"License: PolyForm-Noncommercial-1.0.0\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/QrCommunication/gigapdf/blob/main/TRADEMARK.md\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/trademark-protected-orange.svg\" alt=\"Trademark Protected\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/QrCommunication/gigapdf/actions/workflows/ci.yml\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/QrCommunication/gigapdf/ci.yml?branch=main\u0026label=CI\" alt=\"CI\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/QrCommunication/gigapdf/actions/workflows/security.yml\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/QrCommunication/gigapdf/security.yml?branch=main\u0026label=security%20audit\" alt=\"Security Audit\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/QrCommunication/gigapdf/stargazers\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/QrCommunication/gigapdf\" alt=\"GitHub Stars\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://giga-pdf.com\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/cloud-giga--pdf.com-green\" alt=\"Cloud\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#why-gigapdf\"\u003eWhy GigaPDF?\u003c/a\u003e •\n  \u003ca href=\"#the-engine\"\u003eThe Engine\u003c/a\u003e •\n  \u003ca href=\"#quick-start-self-hosting\"\u003eQuick Start\u003c/a\u003e •\n  \u003ca href=\"#cloud-vs-self-hosting\"\u003eCloud vs Self-hosting\u003c/a\u003e •\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Why GigaPDF?\n\n- **A real PDF engine, not a viewer overlay** — GigaPDF reads and rewrites the\n  PDF content stream directly through its own\n  **[gigapdf-lib](https://github.com/QrCommunication/gigapdf-lib)** engine\n  (Rust, compiled to WebAssembly). Editing a paragraph actually re-flows the\n  document — it doesn't just paint a sticker on top of it.\n- **Zero third-party processing dependencies** — Office conversion, HTML → PDF,\n  OCR, font embedding, rasterization, digital signatures and encryption are all\n  built in. **No LibreOffice, no Tesseract, no Chromium, no Poppler, no MuPDF.**\n  Your `docker compose` is the whole stack.\n- **True WYSIWYG editing** — Edit text, images, shapes and forms directly in the\n  PDF, with full font re-embedding for pixel-accurate output.\n- **Self-hostable from day one** — `docker compose up` and you're running. No\n  cloud lock-in, no telemetry; your documents stay on your infrastructure\n  (OCR and AI search included — nothing is sent to a third party).\n- **API-first design** — A complete, OpenAPI-documented REST API so you can\n  embed PDF editing and processing into your own apps.\n\n## The Engine\n\nThe heart of GigaPDF is **gigapdf-lib**, a from-scratch PDF engine written in\nRust and compiled to WebAssembly. It manipulates the PDF format at its lowest\nlevel and ships in a single self-contained `.wasm` — no native system binaries.\n\n| Capability | What it does |\n|---|---|\n| **Document editing** | Content-stream level text add/edit/remove, shapes, images, opacity, z-order — real edits, not a cosmetic overlay |\n| **Redaction** | Physically removes the underlying content stream (not a black box on top) |\n| **Digital signatures** | PKCS#7 / `adbe.pkcs7.detached` with your own X.509 certificate, RSA keygen included |\n| **Encryption** | Standard Security Handler — read \u0026 write RC4, AES-128 and AES-256 |\n| **Fonts** | TrueType / CFF / Type1 parsing, CID embedding, `ToUnicode` CMaps (no tofu), faithful re-embedding |\n| **OCR** | Server-side, in-house — turns scans into searchable text with **no Tesseract** |\n| **Office ⇄ PDF** | Native Word/Excel/PowerPoint/OpenDocument import \u0026 export — **no LibreOffice** |\n| **HTML / URL → PDF** | Built-in HTML+CSS layout and rendering engine — **no Chromium/Playwright** |\n| **Rasterization** | In-house PNG renderer (vectors + TrueType/CFF glyphs) for previews and thumbnails |\n| **Crypto** | Dependency-free MD5, RC4, AES, SHA-256/512, RSA — no OpenSSL |\n\nAll of it is auditable, runs on your own infrastructure, and carries no\nAGPL/GPL system-binary baggage.\n\n## Quick start (self-hosting)\n\nGigaPDF can be self-hosted in two ways: **Docker** (recommended) or\n**native** (bare-metal / VPS).\n\n### Option 1 — Docker (recommended)\n\nPrerequisites: Docker 24+ with the Compose plugin.\n\n```bash\ngit clone https://github.com/QrCommunication/gigapdf.git\ncd gigapdf\ncp .env.example .env             # edit values, especially LEGAL_*\ncp apps/web/.env.example apps/web/.env.local\ndocker compose up -d\n# App at http://localhost:3000\n```\n\nThe compose stack starts six services:\n\n| Service | Image / build | Port |\n|---|---|---|\n| `postgres` | `postgres:17-alpine` | 5432 |\n| `redis` | `redis:8-alpine` | 6379 |\n| `api` | FastAPI backend (`Dockerfile.api`) | 8000 |\n| `celery-worker` + `celery-beat` | Background jobs (`Dockerfile.api`) | — |\n| `web` | Next.js frontend (`Dockerfile.web`) | 3000 |\n| `admin` | Admin dashboard (`Dockerfile.admin`) | 3001 |\n\nThe images are based on **Debian bookworm**. All PDF, OCR, Office conversion,\nfont processing and HTML rendering run inside the in-house **gigapdf-lib**\nRust → WASM engine — **no third-party system binaries are installed or\nrequired** (no LibreOffice, Tesseract, Chromium, Poppler or fontforge).\n\n\u003e ⚠️ **Self-hosters must configure `NEXT_PUBLIC_LEGAL_*` env vars** in\n\u003e `apps/web/.env.local` for LCEN compliance. The web app refuses to start in\n\u003e production mode without them. See `apps/web/.env.example`.\n\n### Option 2 — Native (bare-metal / VPS)\n\nPrerequisites:\n\n- **Node.js 24** + **pnpm 10**\n- **Python 3.12** + venv (backend API, `requirements.txt`)\n- **PostgreSQL 17** and **Redis 8**\n\nBuild and install:\n\n```bash\ngit clone https://github.com/QrCommunication/gigapdf.git\ncd gigapdf\n\n# Backend (FastAPI + Celery)\npython3.12 -m venv venv \u0026\u0026 source venv/bin/activate\npip install -r requirements.txt\n\n# Frontend (Next.js web + admin + shared packages)\npnpm install \u0026\u0026 pnpm build\n```\n\nRun the services behind a reverse proxy. The repository ships systemd units\n(`deploy/systemd/`) and an Nginx configuration (`deploy/nginx.conf`) whose\nrouting pattern is:\n\n- `/api/pdf/*` and `/api/auth/*` → **Next.js** (`:3000`, where the PDF engine runs)\n- `/api/*`, `/socket.io/*`, `/webhooks/*` → **FastAPI** (`:8000`)\n- `/admin` → admin dashboard (`:3001`)\n- everything else → Next.js web (`:3000`)\n\nSee [`docs/guides/INSTALLATION.md`](docs/guides/INSTALLATION.md) and\n[`docs/guides/DEPLOYMENT.md`](docs/guides/DEPLOYMENT.md) for the full\nwalkthrough.\n\n## Cloud vs Self-hosting\n\n| | Cloud (giga-pdf.com) | Self-hosted |\n|---|---|---|\n| **Setup** | Zero config | Docker / Kubernetes |\n| **Updates** | Automatic | Manual (`git pull`) |\n| **Support** | Email / SLA | Community (GitHub Discussions) |\n| **Cost** | Subscription | Free (your infra cost) |\n| **Data residency** | EU (Scaleway, Paris) | Wherever you host |\n| **Customization** | Configuration only | Full code access |\n\nThe cloud version is operated by [QR Communication SAS](https://qrcommunication.com).\nThe self-hosted version uses the exact same code base.\n\n## Features\n\n### PDF editing\n- **Visual WYSIWYG editor** — Canvas-based editing with drag-and-drop and\n  professional navigation: native scrolling while zoomed, cursor-anchored\n  Ctrl+wheel zoom, 50–400% presets, Fit page / Fit width (Ctrl+0 / Ctrl+1),\n  Space or middle-click panning\n- **Text manipulation** — Add, edit, format text (bold, italic, underline,\n  alignment); edits re-flow the underlying content stream\n- **Faithful fonts** — Automatic identification of the PDF's fonts with\n  on-demand Google Fonts download through a server-side proxy\n  (`/api/fonts/google`, DB + IndexedDB cache, no client request ever reaches\n  Google); the downloaded font is embedded in the final PDF\n- **Images \u0026 shapes** — Insert, move, resize, restyle and delete images and\n  vector shapes; opacity and z-order are baked into the document\n- **Annotations** — Highlights, comments, stamps, freehand drawings\n- **Form designer** — Design and fill interactive PDF forms: text, multiline,\n  date, checkbox, radio groups and dropdowns with editable options; required /\n  read-only fields, defaults, max length and tab-order reordering; Design /\n  Fill modes with highlighting of the document's existing fields and flattening\n  after filling\n- **Layers \u0026 multi-selection** — Persistent layer groups with per-element\n  visibility and locking; batch-edit opacity, colors and alignment across a\n  multi-selection\n\n### Document operations\n- Page management (add, remove, reorder, rotate, duplicate, extract)\n- Merge \u0026 split documents — including **universal merge**\n  (`POST /api/pdf/merge-universal`): any combination of PDF, Word, Excel,\n  PowerPoint, OpenDocument, images, HTML, text and RTF files is accepted; each\n  is converted automatically before merging\n- Compression with the achieved ratio shown before applying\n- Encryption \u0026 password protection (RC4 / AES-128 / AES-256), and unlocking\n- **Digital signatures (PKCS#7)** with your own P12/PFX certificate —\n  processed in memory only, never stored\n- **Redaction** — content is physically removed from the PDF, not just masked\n- Watermarking (single page or whole document)\n- PDF/A conversion\n- **OCR** — server-side text recognition on scans and images, built on\n  state-of-the-art PaddleOCR models run through an in-house runtime (no\n  Tesseract, no third-party service): a dozen printed scripts — Latin, Cyrillic,\n  Arabic, Hebrew, Indic (Devanagari, Tamil, Telugu, Kannada) and CJK — plus\n  opt-in Latin (French included), Cyrillic and Greek handwriting; with a\n  \"searchable PDF\" mode that adds an invisible text layer to image-only pages\n- Conversion (HTML → PDF, URL → PDF; Word, Excel, PowerPoint and OpenDocument\n  ⇄ PDF — import `.doc`/`.docx`/`.xls`/`.xlsx`/`.ppt`/`.pptx`/`.odt`/`.ods`/`.odp`/`.rtf`/`.md`/`.csv`/`.txt`/`.html`,\n  export DOCX/XLSX/PPTX/ODT/ODP/RTF/HTML/Markdown/text and EPUB; images ⇄ PDF;\n  all processed natively by gigapdf-lib)\n- Sharing (email invitations, public links) and a document detail page with\n  version history, one-click restore and activity history\n\n### Document management\n- Trash with restore — deleted documents are recoverable for 30 days, then\n  purged automatically\n- Tags with filtering and autocomplete\n- Full-text search across document names and content (PostgreSQL `tsvector` +\n  GIN index)\n- **Semantic document search** (`GET /api/v1/search/semantic`) — vector search\n  across document contents, with embeddings computed **locally** on your own\n  infrastructure (no external AI service)\n- **Global command palette** (Ctrl/Cmd+K) — navigate to any tool or page and\n  trigger semantic search from anywhere in the app\n- Real thumbnails generated at upload and refreshed after editing\n- Document duplication, folder organization \u0026 renaming\n- Parallel uploads (3 concurrent)\n\n### Public site \u0026 localization\n- Bilingual app — interface in French and English; public pages are served\n  under locale-prefixed URLs (French by default, English under `/en/*`) with\n  per-page canonical and `fr`/`en`/`x-default` hreflang\n- **36 PDF tools** with a \"Features\" mega-menu listing them all by category,\n  available on every page of the marketing site\n- 48 SEO guide pages (36 PDF tools, 10 professions, 2 hubs) written in both\n  languages with localized slugs and JSON-LD structured data\n  (SoftwareApplication, HowTo, FAQPage)\n\n### Developer tools\n- **REST API** — Complete OpenAPI spec, see `docs/api/`\n- **Webhooks** — Document lifecycle events\n- **Real-time collaboration** — WebSocket-based: live element sync on the\n  canvas, multiple cursors\n\n## Architecture\n\nGigaPDF is a pnpm + Turbo monorepo:\n\n```\napps/\n  web/        Next.js 16 frontend + PDF API routes (/api/pdf, /api/auth, /api/fonts)\n  admin/      Admin dashboard (Next.js 16)\n  mobile/     Expo / React Native app\npackages/\n  pdf-engine/ TypeScript layer that drives the gigapdf-lib WASM engine\n  canvas/     Fabric.js editor canvas\n  editor/     React editor components\n  embed/      Embeddable widget\n  billing/    Stripe integration (optional)\n  api/        TypeScript API client\n  ui/         Shared UI components (shadcn-based)\n  ...\n```\n\n- **Frontend**: Next.js 16, React 19, Fabric.js, better-auth, Prisma, Zustand,\n  TanStack Query, Tailwind CSS v4.\n- **Backend**: FastAPI (Python 3.12), Celery + Celery Beat, Socket.IO,\n  PostgreSQL 17 (with `pgvector`), Redis 8, offline `fastembed` embeddings,\n  Stripe for billing.\n- **PDF engine**: [gigapdf-lib](https://github.com/QrCommunication/gigapdf-lib)\n  — Rust compiled to WebAssembly, zero third-party dependency, consumed from\n  `packages/pdf-engine` and the `/api/pdf/*` routes.\n\nSee [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for details.\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Read [CONTRIBUTING.md](CONTRIBUTING.md)\n2. Sign your commits with DCO: `git commit -s` (every commit, no exceptions)\n3. Read the [Code of Conduct](CODE_OF_CONDUCT.md)\n\n## Security\n\nFound a vulnerability? **Do not open a public issue.** See [SECURITY.md](SECURITY.md)\nfor the private reporting process (GitHub Security Advisory or\ncontact@qrcommunication.com).\n\n## License \u0026 Trademark\n\nGigaPDF has **two distinct licensing regimes**:\n\n### Code: PolyForm Noncommercial 1.0.0 (source-available)\n\nThe source code is source-available under [PolyForm Noncommercial 1.0.0](LICENSE):\nfree to use, study, modify and redistribute for any **noncommercial** purpose.\n**Commercial use requires a separate license** — contact QR Communication at\n\u003ccontact@qrcommunication.com\u003e to discuss it.\n\n### Name \u0026 logo: Trademarks of QR Communication SAS\n\nThe \"GigaPDF\" name and logo are trademarks of **QR Communication SAS**.\n**Forks with code modifications must rebrand entirely** (different name,\ndifferent logo, different domain). See [TRADEMARK.md](TRADEMARK.md) for details.\nLogo assets are in [`branding/`](branding/) under [CC-BY-ND 4.0](branding/LICENSE).\n\n## About\n\nGigaPDF is built and maintained by [QR Communication](https://qrcommunication.com),\na Paris-based company.\n\n- 🌐 **Cloud version**: https://giga-pdf.com\n- 💬 **Discussions**: https://github.com/QrCommunication/gigapdf/discussions\n- 📧 **Contact**: contact@qrcommunication.com\n- 🐛 **Issues**: https://github.com/QrCommunication/gigapdf/issues\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqrcommunication%2Fgigapdf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqrcommunication%2Fgigapdf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqrcommunication%2Fgigapdf/lists"}