damofer/inkognitopdf

TypeScript

0

35 commits

updated Oct 18, 2026

See the code

See what people are saying

SourceMessageScoreDate

A free PDF editor that works entirely in your browser: edit, sign, scan and OCR without uploading your files anywhere (r/coolgithubprojects)

Hi, I'm the developer. I wanted a PDF editor where my files never get uploaded, so everything happens client-side: editing text, signing, scanning and OCR. It's a PWA, so you can install it and use it offline, and it shows up in "Open with" for PDFs. Live version:…

1

Oct 18, 2026

I built an open-source PDF editor in React that runs entirely in the browser (pdf.js + pdf-lib + Tesseract.js) (r/reactjs)

I wanted a PDF editor where my files never get uploaded to someone's server, so I built one. It's called InkognitoPDF: you can edit text, scan, run OCR and sign PDFs, and everything happens client-side. **Try it:** [https://inkognitopdf.com/app/](https://inkognitopdf.com/app/) **Code…

2

Oct 18, 2026

I built an Apache-2.0 PDF editor and scanner that runs 100% in the browser, so your files are never uploaded (r/SideProject)

Hi r/SideProject Most free PDF tools ask you to upload contracts, IDs and bank statements to someone else's server. I wanted one where that simply can't happen, so I built InkognitoPDF and released it under Apache-2.0. Everything runs client-side: React, pdf.js, pdf-lib and Tesseract for OCR.…

1

Oct 18, 2026

README

InkognitoPDF

InkognitoPDF in 20 seconds: a “free” PDF editor that charges when you download, and InkognitoPDF, which edits, signs, scans, merges, compresses and protects PDFs for free, with no account and without files leaving your device.

English · Español

Edit, scan and sign PDFs without them ever leaving your device.
A free, private PDF editor and document scanner that runs entirely in your browser.

Open the app → · Website · Apache-2.0

The editor with a form open

Privacy promise

  • Your files never leave your device. Opening, editing, OCR, signing, redacting, merging, compressing, encrypting and saving all happen in the browser. There is no server that receives documents, signatures or certificates.
  • Works offline. It is an installable PWA; the OCR models and fonts are cached the first time they are used.
  • No accounts and no ads.
  • Usage measurement is optional. Anonymous usage counts (Google Analytics through Firebase) are sent only if the visitor accepts them, and they never include file names, text or any content: see the closed list of events in src/analytics/events.ts. Without consent, the app makes no request to Google.

Features

Edit textChange the text already in the PDF, keeping its font, size, color and weight. Add text, images and whiteout.
AnnotateHighlight, underline, strike out, notes, free text, drawing, lines, arrows, rectangles and ellipses, saved as standard annotations.
FormsFill in AcroForm fields, create new ones of six types, and flatten the form.
SignDrawn, typed or photographed signatures; digital PAdES signatures with a certificate created on the device or imported from a .p12; several signers in order, with an optional audit page; signature verification.
ScanPhotograph paper with the phone: page detection, perspective correction and a clean black-and-white "photocopy" filter.
OCRRecognize the text of scans in English and Spanish (Tesseract.js) so it can be searched, selected and copied.
Edit scanned textReplace a recognized line inside the scanned image, matching the paper and the ink.
Secure redactionMark areas or search for words or patterns, then really remove the text, images, annotations and metadata underneath.
Merge and splitOpen several PDFs as one, insert PDFs, reorder pages by dragging, split by ranges or every N pages, or extract pages (ZIP for several files).
CompressMake files smaller: images are scaled down to what their page needs and encoded again, with three levels and the size before and after.
PasswordsOpen protected PDFs (RC4 and AES, up to AES-256) and save with an AES-256 password; optional print and copy restrictions, which the app explains are only advisory.
PagesRotate, delete and insert blank pages.
TemplatesResumes, cover letters, invoices, quotes, payment requests, receipts and letters ready to fill in, with a live preview, colors, fonts and paper size; download the PDF or keep editing it in the app.
Write documentsWrite from scratch as in Word or Google Docs: headings, lists, bold, colors, highlight, alignment, images and page breaks, with page breaks shown as you type; the result is a PDF with real text, to download, sign or add to the open PDF.
LanguagesEnglish and Spanish, on desktop and on phones.

Screenshots

SignSecure redactionSplit
Signing panelRedaction marksSplit panel
PhoneAnnotate on a phoneScanner
Phone editorAnnotation tools on a phoneScanner filter step

All pictures use synthetic sample documents. They are regenerated with npm run build and node scripts/readme-images.mjs.

Quick start

Requirements: Node.js 24 or newer.

npm install          # dependencies, installed locally
npm run dev          # development server
npm test             # unit tests (Vitest)
npm run test:e2e     # end-to-end tests (Playwright; builds first)
npm run build        # production build with the offline service worker, in dist/

Other scripts: npm run lint, npm run typecheck, npm run format:check, and npm run fixtures to regenerate the synthetic test PDFs.

The end-to-end tests use the Chrome installed on the machine. When openssl and qpdf are available, the tests also check signatures and files with them.

Deploying

The build in dist/ is a static site: the landing page at / and the app at /app/. firebase.json has the Firebase Hosting configuration (rewrites and cache headers). To deploy your own copy, create a Firebase project, put its id in .firebaserc and run npx firebase-tools deploy --only hosting. No secret is needed to build or deploy. The web configuration in src/analytics/firebase.ts identifies the public web app and is not a secret.

Project structure

index.html        landing page (texts from src/i18n, written in by the build)
app/index.html    the app
src/
  landing/        landing page script and styles
  editor/         editor UI: tools, panels, saving, split panel
  engine/         writing PDFs with pdf-lib: text edits, fonts, forms, redaction, merge and split
  model/          document state, operations and undo history
  viewer/         rendering with pdf.js: pages, text layer, thumbnails, zoom
  scan/           scanner: page detection, perspective, black-and-white filter (Web Worker)
  ocr/            OCR with Tesseract.js and the selectable text layer
  sign/           signatures: drawing, PAdES, verification, several signers
  storage/        opening files (the original is never modified), ZIP
  analytics/      consent and the closed list of usage events
  support/        donation links
  templates/      templates: layout engine, PDF rendering and the catalog
  writer/         writing documents: editor (ProseMirror), page layout and PDF
  i18n/           Spanish (reference) and English texts
tests/            unit tests and synthetic fixtures
e2e/              end-to-end tests (Playwright)
scripts/          asset copying, fixtures, icons, screenshots
public/brand/     logo and icons

Tech stack

ComponentLicenseUsed for
ReactMITInterface
pdf.js (pdfjs-dist)Apache-2.0Rendering, text layer
pdf-lib and @pdf-lib/fontkitMITWriting PDFs
Tesseract.js and its English and Spanish dataApache-2.0OCR in the browser
PKI.js, asn1jsBSD-3-ClauseCMS, X.509 and PKCS#12 for signatures
Arimo, Tinos, Cousine, Carlito, Caladea, Dancing Script, Great Vibes, CaveatOFL-1.1Substitute and handwriting fonts
Firebase Analytics (optional, with consent)Apache-2.0Anonymous usage counts
Vite, Vitest, Playwright, TypeScript, ESLint, PrettierMIT / Apache-2.0Build and tests

Full list and notes: THIRD_PARTY_NOTICES.md.

Contributing

Issues and pull requests are welcome. A few rules keep the project what it is:

  • Everything stays on the device. No feature may send documents or their content to a server.
  • Clean-room code. Write your own code; do not copy code, assets or text from proprietary PDF products.
  • Open licenses only. New dependencies must be compatible with Apache-2.0 (no GPL or AGPL).
  • Both languages. Every visible text goes in src/i18n/es and src/i18n/en.
  • Phones too. Controls work with touch and are at least 44 px tall.
  • Tests stay green. Run npm test, npm run test:e2e, npm run lint and npm run format:check before opening a pull request. Test documents must be synthetic: never real personal files.

License

Copyright 2026 David Mogollon. Licensed under the Apache License 2.0. See also NOTICE.

Support the project

InkognitoPDF is free. If it is useful to you, you can support its development:

Thank you!

damofer/inkognitopdf

TypeScript

0

35 commits

updated Oct 18, 2026

See the code

See what people are saying

SourceMessageScoreDate

A free PDF editor that works entirely in your browser: edit, sign, scan and OCR without uploading your files anywhere (r/coolgithubprojects)

Hi, I'm the developer. I wanted a PDF editor where my files never get uploaded, so everything happens client-side: editing text, signing, scanning and OCR. It's a PWA, so you can install it and use it offline, and it shows up in "Open with" for PDFs. Live version:…

1

Oct 18, 2026

I built an open-source PDF editor in React that runs entirely in the browser (pdf.js + pdf-lib + Tesseract.js) (r/reactjs)

I wanted a PDF editor where my files never get uploaded to someone's server, so I built one. It's called InkognitoPDF: you can edit text, scan, run OCR and sign PDFs, and everything happens client-side. **Try it:** [https://inkognitopdf.com/app/](https://inkognitopdf.com/app/) **Code…

2

Oct 18, 2026

I built an Apache-2.0 PDF editor and scanner that runs 100% in the browser, so your files are never uploaded (r/SideProject)

Hi r/SideProject Most free PDF tools ask you to upload contracts, IDs and bank statements to someone else's server. I wanted one where that simply can't happen, so I built InkognitoPDF and released it under Apache-2.0. Everything runs client-side: React, pdf.js, pdf-lib and Tesseract for OCR.…

1

Oct 18, 2026

README

InkognitoPDF

InkognitoPDF in 20 seconds: a “free” PDF editor that charges when you download, and InkognitoPDF, which edits, signs, scans, merges, compresses and protects PDFs for free, with no account and without files leaving your device.

English · Español

Edit, scan and sign PDFs without them ever leaving your device.
A free, private PDF editor and document scanner that runs entirely in your browser.

Open the app → · Website · Apache-2.0

The editor with a form open

Privacy promise

  • Your files never leave your device. Opening, editing, OCR, signing, redacting, merging, compressing, encrypting and saving all happen in the browser. There is no server that receives documents, signatures or certificates.
  • Works offline. It is an installable PWA; the OCR models and fonts are cached the first time they are used.
  • No accounts and no ads.
  • Usage measurement is optional. Anonymous usage counts (Google Analytics through Firebase) are sent only if the visitor accepts them, and they never include file names, text or any content: see the closed list of events in src/analytics/events.ts. Without consent, the app makes no request to Google.

Features

Edit textChange the text already in the PDF, keeping its font, size, color and weight. Add text, images and whiteout.
AnnotateHighlight, underline, strike out, notes, free text, drawing, lines, arrows, rectangles and ellipses, saved as standard annotations.
FormsFill in AcroForm fields, create new ones of six types, and flatten the form.
SignDrawn, typed or photographed signatures; digital PAdES signatures with a certificate created on the device or imported from a .p12; several signers in order, with an optional audit page; signature verification.
ScanPhotograph paper with the phone: page detection, perspective correction and a clean black-and-white "photocopy" filter.
OCRRecognize the text of scans in English and Spanish (Tesseract.js) so it can be searched, selected and copied.
Edit scanned textReplace a recognized line inside the scanned image, matching the paper and the ink.
Secure redactionMark areas or search for words or patterns, then really remove the text, images, annotations and metadata underneath.
Merge and splitOpen several PDFs as one, insert PDFs, reorder pages by dragging, split by ranges or every N pages, or extract pages (ZIP for several files).
CompressMake files smaller: images are scaled down to what their page needs and encoded again, with three levels and the size before and after.
PasswordsOpen protected PDFs (RC4 and AES, up to AES-256) and save with an AES-256 password; optional print and copy restrictions, which the app explains are only advisory.
PagesRotate, delete and insert blank pages.
TemplatesResumes, cover letters, invoices, quotes, payment requests, receipts and letters ready to fill in, with a live preview, colors, fonts and paper size; download the PDF or keep editing it in the app.
Write documentsWrite from scratch as in Word or Google Docs: headings, lists, bold, colors, highlight, alignment, images and page breaks, with page breaks shown as you type; the result is a PDF with real text, to download, sign or add to the open PDF.
LanguagesEnglish and Spanish, on desktop and on phones.

Screenshots

SignSecure redactionSplit
Signing panelRedaction marksSplit panel
PhoneAnnotate on a phoneScanner
Phone editorAnnotation tools on a phoneScanner filter step

All pictures use synthetic sample documents. They are regenerated with npm run build and node scripts/readme-images.mjs.

Quick start

Requirements: Node.js 24 or newer.

npm install          # dependencies, installed locally
npm run dev          # development server
npm test             # unit tests (Vitest)
npm run test:e2e     # end-to-end tests (Playwright; builds first)
npm run build        # production build with the offline service worker, in dist/

Other scripts: npm run lint, npm run typecheck, npm run format:check, and npm run fixtures to regenerate the synthetic test PDFs.

The end-to-end tests use the Chrome installed on the machine. When openssl and qpdf are available, the tests also check signatures and files with them.

Deploying

The build in dist/ is a static site: the landing page at / and the app at /app/. firebase.json has the Firebase Hosting configuration (rewrites and cache headers). To deploy your own copy, create a Firebase project, put its id in .firebaserc and run npx firebase-tools deploy --only hosting. No secret is needed to build or deploy. The web configuration in src/analytics/firebase.ts identifies the public web app and is not a secret.

Project structure

index.html        landing page (texts from src/i18n, written in by the build)
app/index.html    the app
src/
  landing/        landing page script and styles
  editor/         editor UI: tools, panels, saving, split panel
  engine/         writing PDFs with pdf-lib: text edits, fonts, forms, redaction, merge and split
  model/          document state, operations and undo history
  viewer/         rendering with pdf.js: pages, text layer, thumbnails, zoom
  scan/           scanner: page detection, perspective, black-and-white filter (Web Worker)
  ocr/            OCR with Tesseract.js and the selectable text layer
  sign/           signatures: drawing, PAdES, verification, several signers
  storage/        opening files (the original is never modified), ZIP
  analytics/      consent and the closed list of usage events
  support/        donation links
  templates/      templates: layout engine, PDF rendering and the catalog
  writer/         writing documents: editor (ProseMirror), page layout and PDF
  i18n/           Spanish (reference) and English texts
tests/            unit tests and synthetic fixtures
e2e/              end-to-end tests (Playwright)
scripts/          asset copying, fixtures, icons, screenshots
public/brand/     logo and icons

Tech stack

ComponentLicenseUsed for
ReactMITInterface
pdf.js (pdfjs-dist)Apache-2.0Rendering, text layer
pdf-lib and @pdf-lib/fontkitMITWriting PDFs
Tesseract.js and its English and Spanish dataApache-2.0OCR in the browser
PKI.js, asn1jsBSD-3-ClauseCMS, X.509 and PKCS#12 for signatures
Arimo, Tinos, Cousine, Carlito, Caladea, Dancing Script, Great Vibes, CaveatOFL-1.1Substitute and handwriting fonts
Firebase Analytics (optional, with consent)Apache-2.0Anonymous usage counts
Vite, Vitest, Playwright, TypeScript, ESLint, PrettierMIT / Apache-2.0Build and tests

Full list and notes: THIRD_PARTY_NOTICES.md.

Contributing

Issues and pull requests are welcome. A few rules keep the project what it is:

  • Everything stays on the device. No feature may send documents or their content to a server.
  • Clean-room code. Write your own code; do not copy code, assets or text from proprietary PDF products.
  • Open licenses only. New dependencies must be compatible with Apache-2.0 (no GPL or AGPL).
  • Both languages. Every visible text goes in src/i18n/es and src/i18n/en.
  • Phones too. Controls work with touch and are at least 44 px tall.
  • Tests stay green. Run npm test, npm run test:e2e, npm run lint and npm run format:check before opening a pull request. Test documents must be synthetic: never real personal files.

License

Copyright 2026 David Mogollon. Licensed under the Apache License 2.0. See also NOTICE.

Support the project

InkognitoPDF is free. If it is useful to you, you can support its development:

Thank you!