Skip to content

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fawk PDF Tools

Self-hosted, client-side PDF desk — redact, annotate, sign, fill forms, batch merge/split, and inspect documents right in your browser. Built as a fast, privacy-first Stirling-PDF alternative.

Fawk PDF Tools Hero Fawk PDF Desk Interface


Why Fawk PDF Tools?

Server-side PDF editors often round-trip sensitive documents to remote APIs or run heavy backend Java containers. Fawk PDF Tools runs 100% client-side inside your web browser using WebAssembly and JavaScript (pdf.js + pdf-lib). Your documents never leave your machine unless you explicitly connect to your own Nextcloud instance.

Key Features

  • True Redaction: Select regions on any page and export a flattened PDF where underlying text streams under black boxes are destroyed.
  • Page Organize: Rotate pages 90° CW/CCW, delete unwanted pages, or reorder pages with one-click page management controls.
  • Annotations & Image Insert: Add highlights, free-text callouts, sticky notes, or paste images/screenshots (Ctrl+V) onto document pages.
  • Signatures & Stamps: Draw ink signatures, type custom webfont signatures, load PKCS#12 client certificates, or apply preset office stamps (CONFIDENTIAL, APPROVED, PAID, FAWK).
  • Form Filling: Fill PDF form fields interactive or auto-flatten upon export.
  • Batch Toolbox: Merge multiple PDFs, split ranges, add watermarks, sanitize metadata, or password-protect files locally.
  • Document Inspector: Instant WASM/pdf.js classification (Text-based vs Scanned) with one-click Markdown extraction.
  • Homelab / Nextcloud Sync: Optional WebDAV open/save integration to sync edited documents directly with your self-hosted Nextcloud (FAWKCLOUD).
  • IndexedDB Recent Cache & Undo: Reopen recent files offline; full session Undo/Redo (Ctrl+Z / Ctrl+Y).

Keyboard Shortcuts

Shortcut Action
Ctrl+Z / Ctrl+Y Session Undo / Redo (redactions, annotations, signatures, images)
Ctrl+S Export / download current PDF
Ctrl+F Open Find toolbar
F3 / Shift+F3 Next / previous search match
[ / ] or PageUp / PageDown Previous / next page
R Quick rotate current page 90° CW
Ctrl+V Paste image from clipboard onto current page

Quick Start (Development)

Prerequisites

  • Node.js 22+
  • npm 10+

Run Locally

# Clone the repository
git clone https://github.com/FAWK-TECH/fawkpdf.git
cd fawkpdf/app

# Install dependencies
npm install

# Start local dev server
npm run dev

Open http://localhost:5173 in your browser.


Docker Deployment (Self-Hosted)

Serve the SPA with static Nginx using Docker Compose:

cd deploy/public
docker compose up -d --build

Access the app at http://localhost:8080.

For custom reverse proxy setups or Nextcloud WebDAV proxy rules, see deploy/README.md.


Honest Limitations

We believe in complete transparency about what Fawk PDF Tools can and cannot do:

  1. Redaction Model: Redaction works via page raster-flattening (exportScale conversion), which replaces the redacted page with a flattened image stream to guarantee text under black boxes cannot be extracted. It is not an inline PDFium content-stream vector editor.
  2. Large Documents: Documents over 100+ pages load page 1 immediately while remaining pages render in the background. Extremely large PDFs (200MB+) are bound by browser heap limits.
  3. Encryption Strength: PDF password protection uses standard pdf-lib encryption. Do not rely on it as bank-grade AES-256 vault encryption.
  4. No Full Acrobat Text Reflow: PDF layout modifications operate on existing pages and overlays. Full reflow / paragraph re-wrapping is out of scope.

Tech Stack

  • Framework: React 19, TypeScript, Vite
  • PDF Engine: pdf.js v6, pdf-lib v1.17
  • Crypto & PKCS#12: @signpdf, node-forge
  • Icons: Lucide React
  • Styling: Modern Vanilla CSS with dark mode tokens

Verification & Testing

Run automated redaction stream destruction tests:

cd app
npm run verify:redaction

This harness executes EditEngine.load(), asserts lastExportMethod === 'raster_flatten', asserts /DCTDecode embedded JPEG stream presence, verifies unredacted page stream preservation, and asserts text under redaction boxes is 100% destroyed in exported PDF streams.


License

MIT License © 2026 Fawk

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages