Basically it steps through a folder with images, finds corners, user presses Space if ok, or adjusts corner if not (about 1 in 20 pages has a corner wrong). Undistort, contrast correct based on histogram, etc. happens automatically.
On the last page pressing Space creates a PDF.
My brother and I were digitizing medical bills for our mother and everything we tried to do this with out there was meh, cost money or both! It seems as soon as you need PDF anything it's $$$.
This is a throwaway tool as we're now more and more getting bills as digital files anyway.
My only input was specs, otherwise it's "vibe coded" if you want.
But consider that the Rust crate ecosystem is mature and my prof. background is computer graphics.
Oh, and I have an image manipulation crate that I wrote for work (closed source for now, unfortunately) that has corner pin with area filtering as a primitive.
I was just surprised how possible this is now.
This was earlier this year (Opus 4.8 was just out) and while we were photographing the pages with our smartphones Claude wrote the tool.
macOS: macos-26_arm version installs (with intervention to permit running), but crashes on launch. ------------------------------------- Translated Report (Full Report Below) ------------------------------------- Process: perspec [94673] Path: /Users/USER//Perspec.app/Contents/Resources/perspec Identifier: perspec Version: ??? Code Type: ARM-64 (Native) Role: Unspecified Parent Process: Exited process [94672] Coalition: com.adriansieber.Perspec [86355] Responsible Process: Perspec [94671] User ID: 501
Date/Time: 2026-08-04 12:50:37.5848 -0600 Launch Time: 2026-08-04 12:50:37.5821 -0600 Hardware Model: Mac13,1 OS Version: macOS 26.6 (25G72) Release Type: User
Crash Reporter Key: 9FD40ACB-279F-0F79-41E1-8B4D3B663EA7 Incident Identifier: 207F9047-B786-4C8C-8263-BA9C4DB370EB
Time Awake Since Boot: 320000 seconds
System Integrity Protection: enabled
Triggered by Thread: 0
Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000
Termination Reason: Namespace DYLD, Code 1, Library missing Library not loaded: /opt/homebrew//libwebp.7.dylib Referenced from: <47F30FA1-4AB9-310F-8988-5CABFEF76F5E> /Users/USER//Perspec.app/Contents/Resources/perspec Reason: tried: '/opt/homebrew//libwebp.7.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew//libwebp.7.dylib' (no such file), '/opt/homebrew//libwebp.7.dylib' (no such file) (terminated at launch; ignore backtrace)
Dyld Error Message: 1
> Before an image is saved, a "Buy License" banner is shown for 10 seconds.
I share the annoyance about phone detection previees over-promising. But I'm pleased this comes with perspective correction and lighting correction together.