← Opera№ VII of VII
Native macOS · SwiftUI

CatActro

A PDF editor that is actually a Mac app, made of glass. No Electron, no web views, and undo works for every single edit.

Role
Designer & engineer
Year
2026
Stack
Swift · SwiftUI · PDFKit · AppKit
Target
macOS 26 Tahoe · Xcode 26
Design
Liquid Glass
Source
Private repository
i
The premise

Preview is too little. Acrobat is too much. So I wrote my own.

CatActro is a document-based Mac app in the full sense. It has tabs, autosave, version history, iCloud Drive, Share and Print, and every edit can be undone. It saves back into a standard PDF that Preview and Acrobat can still open. It's built for macOS 26 and uses Apple's new Liquid Glass design throughout.

ElectronWeb viewsSwiftUIPDFKitAppKit bridgeDocumentGroup

Press a key

The markup tools sit in a floating glass palette, and every tool has a single-key shortcut. Try them on this page. Esc returns to Select.

ii
The hard parts

Three decisions that make it feel native.

01 · State

Dirty tracking through undo

SwiftUI marks a ReferenceFileDocument as edited when an undo action is registered. Every page and annotation change goes through registerUndo, so undo and "unsaved changes" can never disagree.

02 · Input

Overlay, don't hijack

An annotation overlay takes a mouse event only when it needs it. Text selection, links and form fields keep PDFKit's own behaviour, so they work exactly as they do in Preview.

03 · Glass

Edge-to-edge under the toolbar

The palette uses GlassEffectContainer with .glassEffect(.regular.interactive()). The PDF scrolls under the toolbar, with insets taken from the window's contentLayoutRect.

Everything else it does

Pages
  • Glass sidebar with thumbnails, drag to reorder
  • Drop PDFs in from Finder to merge them
  • Rotate, insert, duplicate, delete, export a selection
Document
  • Search with a glass match navigator
  • Native form filling, unlock password-protected files
  • Inspector for comments, colours and metadata

Architecture

CatActro/
├── App/        CatActroApp (DocumentGroup), menu commands
├── Document/   PDFFileDocument — ReferenceFileDocument wrapping PDFDocument
├── Editor/     EditorState — every mutation, every one undoable
├── Canvas/     CanvasPDFView · AnnotationOverlayView · PDFCanvas
└── Views/      EditorView · ToolPalette · PageSidebar · InspectorView

Next on the roadmap: reusable signatures, OCR with Vision, and real redaction that removes the content instead of drawing a black box over it.