PDFee: my own PDF app for macOS

A native PDF app I built with Claude Code to replace PDF Squeezer and Nitro PDF Pro: view, compress, fill, sign, redact and rearrange, 1 key per tool.

The PDFee app icon: a white PDF page with a red edelweiss and a red PDF band on a dark gradient square, with the name PDFee under it

25 Oct 2026

PDFee is the PDF app I built for my Mac. It replaces 2 paid apps, PDF Squeezer for compression and Nitro PDF Pro for forms and signatures, and it takes over from Preview as the app that opens my PDFs. It does only the jobs I actually do with PDFs: read them, shrink them, fill and sign forms, fix the page order, black out what must go, and check what changed between 2 versions.

I built it in 1 day with Claude Code: a round of 33 questions, a spec, a benchmark of compression engines, then the app, the tests and the QA. The name follows the -ee family of my other tools, next to Lastee: my own recent-files app for macOS and Filee: my own file manager for macOS.

The screenshots use a dummy contract. The names, companies, addresses and amounts in it are made up.

PDFee in dark mode with a sample service agreement: page thumbnails on the left, a tool bar with 1 key per tool, the form fields filled with a dummy name and company, a highlighted phrase, a tick, a handwritten signature and today's date placed on the signature line

Why I replaced 3 apps

Before I wrote a line, I counted what I really did with PDFs over 30 days:

What I found Value
Preview 2,637 PDF opens on record, 79 different PDFs in 30 days
PDF Squeezer 77 launches, 64 files compressed, 978 MB down to 298 MB
Nitro PDF Pro 10 documents, almost all forms to fill and sign
Memory when idle PDF Squeezer 139 MB, Nitro 133 MB, Preview 58 MB

3 apps for 1 file type. Preview to read, PDF Squeezer to shrink a deck before I email it, Nitro when a form needs a signature. Each one has its own window, its own shortcuts and its own idea of where the result goes. 2 of them are subscriptions through Setapp.

The numbers also showed what I don't use: no PDF creation from scratch, no conversion to Word, no cloud sync, no batch scripts in Nitro. So PDFee leaves all of that out.

What PDFee does

Read

  • Continuous pages at fit width, thumbnails with drag to reorder, find that ignores case and accents.
  • Auto-reload. When a script or an agent rewrites the open file, PDFee shows the new version in about 5 ms, on the same page and at the same zoom. This matters more than any other feature, because my agents now write a lot of the PDFs I read.
  • Page and zoom remembered for the last 500 documents.

Compress

  • 3 profiles: Strong (72 dpi), Medium (144 dpi) and Light (300 dpi). The Compress sheet runs all 3 at once and shows the real size of each result before I pick 1.
  • Drop files or folders on the Compress window, or use the Finder Quick Action "Compress with PDFee".
  • The original goes to the Trash and the compressed file takes its name. ⌘Z undoes a compression, and every replaced file stays in a backup for 30 days.

Fill and sign

  • Form fields as the PDF defines them, plus stamps for the forms that have no fields: text box (T), tick (X), today's date (D), my signature (S) and my initials (I).
  • My signature comes from a scan. I imported it once from a photo, and PDFee removed the paper background.
  • Save keeps the fields editable. Save Flattened Copy (⌥⌘S) burns everything into the page for sending.
  • Certificate signatures (⌃⌘S) from the keychain or a .p12 file, written as an incremental update so an earlier signature stays valid.

Mark up, edit and redact

  • Highlight (H), underline (U), strike through (K), notes (N), rectangles (R) and arrows (A).
  • Edit Text (E): click a line of the PDF and type the new text.
  • Redact (B): draw black boxes, then apply them on save. The page becomes an image with the boxes burnt in, plus an invisible text layer from Apple's OCR, so the page stays searchable without the redacted words.

Pages and files

  • Delete, rotate, reorder and insert pages, extract pages to Finder, split a file, merge files.
  • Compare With: a text diff of 2 versions, page by page. Good for the 2nd draft of a contract.
  • Make Searchable (OCR in German, English and French), Export Pages as Images, Add or Remove Password (AES-256).
  • ⌘K command centre: every command with its shortcut, searchable.

The same sample agreement in PDFee's light mode: white chrome, light grey page background, the same filled fields, highlight, signature and date

For scripts and agents

The pdfee command line gives my scripts and my Claude Code agents the same engine as the app:

pdfee compress deck.pdf --strong        # replaces the file, original to the Trash
pdfee fields form.pdf                   # the form fields as JSON
pdfee fill form.pdf data.json           # fill them from JSON
pdfee merge a.pdf b.pdf -o both.pdf
pdfee diff v1.pdf v2.pdf                # what changed between 2 versions
pdfee restore deck.pdf                  # back to the version before the last change

My email scripts now use it too: a PDF over 10 MB goes out as a compressed copy, and the original stays as it was.

Speed

Speed was the 1st goal, so every number has a budget, measured in the installed app against the app it replaces.

Benchmark chart, lower is better: opening a PDF with the app not running takes 619 ms in PDFee against 1,145 ms in Preview, a 2nd PDF 190 ms against 376 ms, compressing 12 PDFs takes 10.2 s against 27.1 s in PDF Squeezer, the result is 46.7 MB against 51.4 MB, and memory with 2 documents open is 224 MB against 285 MB in Preview

Metric Budget PDFee
Launch to first page drawn < 500 ms 334-410 ms
Reload after a script rewrites the file < 200 ms 5.5 ms
Save with form fields < 300 ms 10.8 ms
Thumbnails of the visible pages - 2.3 ms
CPU when idle ~ 0% 0.2%

My first memory budget was 80 MB. It was wrong: Apple's PDF engine alone takes about 150 MB once it draws a page, so the budget became "no more than Preview".

How the compression works

PDF Squeezer was the app to beat. Before I chose an engine, I ran 3 against it on 12 real PDFs from my own folders, 130 MB in total:

Engine Result
PDF Squeezer 51.4 MB in 27.1 s
Ghostscript 3 of the 12 files got bigger, 1 lost its text
Apple's built-in filter 31% smaller, 1 file failed
PDFee, Medium 46.7 MB in 10.2 s
PDFee, Strong 24.8 MB in 9.5 s

PDFee only touches the images. qpdf exports the file's structure as JSON, PDFee measures how large each image is actually drawn on its page, then re-encodes it with Apple's ImageIO at the resolution that size needs. A 4,000-pixel photo shown 6 cm wide doesn't need 4,000 pixels. Text, fonts, links, bookmarks and form fields stay byte for byte as they were.

Every write follows the same rule: write to a temp file, check it (the page count, and the text of the first 50 pages), then replace the original. A file that fails the check never replaces anything.

⚠️ WARNING: qpdf's --recompress-flate option looked like a free extra saving. On 1 of my test files it lost the text. PDFee never uses it.

QA

  • 20 unit tests and 150 end-to-end checks in 10 groups. The QA script runs the real app on generated test PDFs, in a scratch folder, with hidden windows. It never touches my files, my screen or the Trash, so it runs while I work.
  • A 2nd agent reviewed the code that saves and changes files, in 2 rounds. It found 18 bugs, and each one now has a check. The worst: ⌘Z after a later save could throw away saved work, a redaction deleted every other annotation on its page, and signing an already-signed PDF broke the 1st signature.
  • A 2nd PDF renderer checks the stamps. A signature on a rotated or cropped page must land where I placed it, so QA renders the saved file with Poppler, not only with PDFee.

What I gave up

  • PDF creation, conversion to Word and cloud sync. I never used them.
  • A drop on the Dock icon opens the file, it doesn't compress it. macOS sends a Dock drop and a Finder double-click as the same event. The Compress window takes drops instead.
  • Redaction replaces the page. A link from another page to a redacted page stops working.
  • Thumbnails show the page without its annotations. That keeps them fast.
  • Nobody else maintains it. That one is mine to carry.

What I learned

  • Measure the engines before you pick one. The best-known tool, Ghostscript, was the worst of the 3 on my real files.
  • macOS won't let a script change the default PDF app. The old API returns "no error" and changes nothing. The new one shows a confirmation that only an app with a window can display, so the pdfee default command hands the switch to the app, and I click once.
  • PDFKit has sharp edges on rotated pages. Drawing a page for a stamp or a snapshot needs the page's own transform first, or a signature on a rotated page moves and turns.
  • Agents change what a PDF app is for. My agents write many of the PDFs I read. Auto-reload on the same page and a command line for agents matter more to me than any editing tool.

Further reading

The 2 apps PDFee replaces:

The PDF toolkit under PDFee's compression:

The tool I built it with:

NicAI
Written by NicAI, Nic's AI assistant, for his personal knowledge base. Researched and drafted by the model, not hand-written by Nic. Verify anything you plan to act on.