Personal PDF editing suite — a desktop app that covers what Adobe Acrobat does, wearing a Windows 98 skin with phosphor-green accents.
Copyright © 2026 William Brooks Parker. All rights reserved. HermosaPDF is proprietary software distributed under the terms of LICENSE.md. Third-party open-source components are listed in NOTICE.md.
The original Python scripts that used to live in this repo are preserved under archive/.
Grab the latest installer from the v0.1.0 release:
HermosaPDF_0.1.0_x64-setup.exe(NSIS) — smaller, recommended for personal installHermosaPDF_0.1.0_x64_en-US.msi(MSI) — for group-policy / enterprise deploy
The installer is unsigned, so Windows SmartScreen may warn on first run — More info → Run anyway.
- Organize — rotate, delete, insert blank, extract, merge, split, and drag-reorder pages. Each page keeps a stable identity label so thumbnails stay readable after moves.
- Annotate — freehand draw, text boxes, sticky notes, and e-signatures (draw / type / upload) with Konva-based resize handles. Annotations flatten into the PDF on save.
- Convert — PDF ↔ images (PNG/JPEG), PDF → text, bundle images into a PDF.
- OCR — Tesseract.js with a pre-scan that skips pages that already have selectable text. Output is an invisible text layer, not a duplicate.
- AI (Claude) — summarize, Q&A against the doc, extract fields to JSON, flag PII. Model tier selector defaults to Haiku 4.5; pick Sonnet 4.6 or Opus 4.7 when needed. Prompt caching on the document block.
- Encrypted PDF support — every open round-trips through Rust's
lopdfso owner-password PDFs and malformed XRefs just work. - Win98 chrome — custom title bar, menu bar, status bar, chunky scrollbars, phosphor-green highlights.
- Tauri v2 — Rust backend, system WebView2 on Windows
- React 19 + TypeScript + Vite — UI
- pdfjs-dist — rendering
- pdf-lib — page manipulation + flatten
- lopdf (Rust) — decryption + structural normalization
- konva + react-konva — annotation overlay
- tesseract.js — OCR
- @anthropic-ai/sdk — Claude API
- keyring (Rust) — OS-keychain storage for the Anthropic key
- zustand — state management
[Disk .pdf]
│ readFile (tauri-plugin-fs)
▼
[Raw bytes]
│ pdf_decrypt ◄── lopdf (Rust)
▼
[Normalized + decrypted bytes]
│ │
▼ ▼
[pdfjs render] [pdf-lib edit]
│ │
▼ ▼
[Canvas (Viewer + [New bytes → pdfjs reload]
Thumbnails + │
Konva annotations)] ▼
[writeFile save]
- Chrome
- index.html · src/main.tsx · src/App.tsx · src/App.css
- src/components/TitleBar.tsx — custom Win98 title bar (decorations off)
- src/components/MenuBar.tsx — File / Edit / View / Tools / Help
- src/components/StatusBar.tsx — bottom strip with state / page / zoom / filename
- Viewer & editing
- src/components/Toolbar.tsx — open / save / page nav / zoom / merge / split / OCR / export / AI toggle
- src/components/Thumbnails.tsx — left sidebar with hover actions, right-click menu, drag-reorder
- src/components/Viewer.tsx — main page render + Konva overlay
- src/components/ContextMenu.tsx — shared menu component
- src/components/AnnotationLayer.tsx — Konva stage on top of the page
- src/components/AnnotationTools.tsx — select / freehand / text / sticky / sign
- src/components/SignatureModal.tsx — draw / type / upload + saved library
- src/components/OcrProgressModal.tsx
- src/components/AiPanel.tsx — Summary / Q&A / Extract / Redact tabs
- src/components/ApiKeyModal.tsx
- Library
- src/lib/pdf.ts — pdfjs + pdf-lib helpers; flatten on save
- src/lib/store.ts — zustand state + all edit actions
- src/lib/annotations.ts — types + signature persistence
- src/lib/convert.ts — PDF↔image + PDF→text + images→PDF
- src/lib/ocr.ts — Tesseract runner + pre-scan
- src/lib/ai.ts — Claude wrapper (summarize / ask / extract / redact)
- src/lib/keyboard.ts — global shortcuts
- src/lib/devtools.ts — inspect/reload menu items
- src-tauri/src/main.rs
- src-tauri/src/lib.rs — Tauri builder, plugin registration
- src-tauri/src/pdfops.rs —
pdf_decrypt,pdf_is_encrypted,open_devtools - src-tauri/src/ai.rs —
ai_set_api_key,ai_get_api_key,ai_clear_api_key(viakeyring) - src-tauri/tauri.conf.json
- src-tauri/capabilities/default.json
- src-tauri/.cargo/config.toml — pinned MSVC linker on Windows
See CLAUDE.md for the architecture invariants and Windows-specific gotchas, and PLAN.md for what's shipped vs deferred.
- Node.js 20+
- Rust via rustup
- Visual Studio 2022 Build Tools with "Desktop development with C++" workload
- Windows 11 SDK (install via the VS Installer if not already present)
npm install
npm run tauri devFirst tauri dev compiles the Rust dependencies (including lopdf + keyring);
subsequent runs are fast.
npm run tauri buildOutput: src-tauri/target/release/bundle/nsis/*.exe and bundle/msi/*.msi.
- ✅ Phase 1 — PDF viewer with thumbnails, open/close, zoom, paging
- ✅ Phase 2 — Page ops (rotate, delete, insert, extract, merge, split, reorder)
- ✅ Phase 3a — Freehand / text / sticky annotations + flatten on save
- ✅ Phase 4 — E-signatures (draw / type / upload, resize, flatten)
- ✅ Phase 5a — PDF ↔ images, PDF → text, images → PDF
- ✅ Phase 6 — OCR via Tesseract with pre-scan
- ✅ Phase 7 — AI document analysis (Claude summarize / Q&A / extract / redact)
Deferred / nice-to-have — see PLAN.md: text-selection highlight layer (Phase 3b), Word/HTML → PDF (Phase 5b), multi-select thumbnails, interactive redaction UI, code signing, auto-update.