Skip to content

Releases: lenpr/PDFwringer

PDFwringer 0.2.3

Choose a tag to compare

@lenpr lenpr released this 30 Sep 22:17

PDFwringer 0.2.3 improves existing task flows without adding PDF operations, permissions, services, or dependencies.

  • About and public version descriptions show only the public version.
  • Larger native Back buttons respond across their entire label, including the chevron, and stay visible while options scroll.
  • Draggable dividers resize preview/list and options columns across all tools.
  • Close File uses the same navigation position as Back, replacing the small opposite-side X on the tool chooser.
  • Merge is available after opening one PDF, alongside the other tools. The current PDF is already in the list and the screen explains how to add another. Back returns to the original document; removing the last file leaves the list ready for Add Files.
  • The opening screen remains neutral: select one or more PDFs, then choose a tool. There is no task-specific Merge button or note. Opening several PDFs retains the existing direct merge flow.
  • Password Protection names the actual operation. Add password protection explains and asks consent for the current image-based-copy requirement; removing a password keeps the existing ordinary save path. Original PDFs remain unchanged.

Requires Apple silicon and macOS 27.0+. The download is Developer ID-signed, notarized, and stapled. Use SHA256SUMS.txt to verify it.

All 406 tests passed (339 fast, 61 corpus, 6 performance), including merge-return, security-scope, empty-list and navigation-guard regressions. Native interaction checks passed for the corrected landing, single-PDF Merge, Back-chevron clicks, divider dragging, and password consent/cancellation. Signed App Store validation and remaining release gates are documented in APP_STORE.md. The app has not been submitted for App Store review.

PDFwringer 0.2.1

Choose a tag to compare

@lenpr lenpr released this 30 Sep 21:32

PDFwringer 0.2.1 refines existing workflows without adding PDF operations, permissions, services, or dependencies.

  • Crop distinguishes pending guides from applied changes and saved copies. Saving cannot silently omit pending inputs; leaving protects unapplied work.
  • Color previews follow the selected page subset, identify updates, and handle unavailable previews without displaying a stale page.
  • Separate thumbnail navigation and inclusion controls make selection predictable. Invalid ranges explain the problem inline.
  • Prepared results clearly say they are not saved. Saved copies alone receive success styling; editing clears stale output links.
  • Scrollable options, wrapping feedback, consistent actions and progress, keyboard merge ordering, and named controls improve access and smaller-window usability.
  • Calmer motion, denser action cards, clearer filenames and landing guidance, and comfortable zoom controls preserve the app’s design.

Page navigation uses Command–Option arrows; add Shift for first/last. Ordinary arrow keys remain available for editing text.

Requires Apple silicon and macOS 27.0+. The downloadable app and DMG are Developer ID-signed, notarized, and stapled. SHA256SUMS.txt verifies the download.

All 402 tests passed (335 fast, 61 corpus, 6 performance), with targeted native interaction checks. The matching App Store candidate passed signed archive/export and Xcode Organizer validation; App Store listing, full accessibility/layout QA, and Store-installed testing remain release gates. The app has not been submitted for review.

PDFwringer 0.2.0

Choose a tag to compare

@lenpr lenpr released this 30 Sep 16:44

PDFwringer 0.2.0 brings the September hardening and compression improvements into a new public release.

  • Fit under… a specified upload limit, using the measured size of the complete result. Image-based compression requires an explicit choice.
  • Compare Original / Result before saving, with the same page and relative zoom.
  • Prepare → review → Save Result leaves the source and existing destination unchanged until you save. Changed destinations are refused safely.
  • Includes the PDF permission/encryption, cancellation, file publication, preview lifecycle, and password-retry fixes completed since the May release.

Requires Apple silicon and macOS 27.0 or later. Download PDFwringer.dmg and drag the app into Applications, or use brew upgrade --cask lenpr/tap/pdfwringer after updating the tap.

All 399 tests passed. The app and disk image are signed, notarized, and stapled. The separate 0.2.0 App Store candidate passed signing/export and Xcode Organizer validation; it has not been submitted for App Store review.

The earlier development builds and public versions are recorded in CHANGELOG.md. The May v0.1.16 release remains available as history.

v0.1.16

Choose a tag to compare

@lenpr lenpr released this 16 May 14:51

Historical download — May 2026. Superseded by PDFwringer 0.2.0, which includes the September hardening, password-retry fix, target-size compression, and original/result comparison. The current app requires Apple silicon and macOS 27.0+. This older release and its original asset are preserved as history. See CHANGELOG.md for the progression.

Security Hardening

  • Image export: atomic writes, symlink protection, path containment, output count/disk guards
  • Preview rendering: single-flight guard prevents resource exhaustion from rapid slider changes
  • Metadata flattening: temp file cleanup on all exit paths (cancellation, errors) via defer
  • Color adjustment: throws on all-pages-skipped instead of writing empty PDF
  • Thumbnail rendering: moved back to MainActor to prevent PDFKit thread-safety races
  • Encrypted PDFs: block silent deprotection in metadata save; warn in rotate/crop save
  • Multi-file import: async background loading prevents UI freeze on large batches
  • Metadata reading: truncate fields to 10K chars to prevent DoS from crafted PDFs
  • Heuristic scan: cap page sampling to 10 pages; guard against Inf/NaN numeric conversion
  • Split output: unique filenames on collision instead of silently overwriting existing files
  • Build system: sandbox entitlements applied in make app; README recommends signed builds

Test Improvements

  • Fixed flaky async tests: polling-based state wait instead of fixed sleep timers
  • 263 tests across 43 suites, all passing reliably under parallel load

v0.1.15

Choose a tag to compare

@lenpr lenpr released this 13 May 07:42

What's New

  • Export as Images — export PDF pages as JPEG or PNG at configurable DPI
  • Reorder Pages — drag-and-drop page reordering with reverse/reset
  • Image to PDF — drop image files (JPG/PNG/TIFF/HEIC) to convert to PDF

Improvements

  • App name now visible in title bar ("PDFwringer — filename.pdf")
  • Action cards reordered logically (most common operations first)
  • Cmd+O menu opens instantly (cached recent documents)
  • Security-scoped bookmarks for persistent Open Recent across restarts
  • Xcode project fixed (target renamed, test target added)

Security

  • File size guard (500 MB max) prevents memory exhaustion from PDF bombs
  • Page count guard (10,000 max) prevents rasterization hangs
  • Split output guard (5,000 max files) prevents disk exhaustion
  • Log sanitization: filenames and metadata no longer logged

Fixes

  • Fixed app appearing hidden in /Applications after brew install
  • Fixed duplicate "Export as Images" action card
  • Removed unreliable page numbers and watermark features

Tests

263 tests across 43 suites, including a 36-file real-world PDF fixture corpus.

v0.1.14

Choose a tag to compare

@lenpr lenpr released this 12 May 13:56

What's New

  • Cancel buttons on all long-running operations (compress, split, merge, color adjust)
  • Color adjust preview no longer blocks UI (renders off main thread)
  • Accessibility labels on crop margins, sort buttons, remove buttons, pages-per-file field
  • VoiceOver announcements when operations complete
  • Localized compression level and JPEG quality titles
  • Dynamic Type support in page thumbnail strip

Fixes

  • Fixed app appearing hidden/greyed-out in /Applications after install
  • Fixed temp file deletion ordering in metadata flattening (prevents potential data loss)
  • Fixed unused @Environment(.self) causing unnecessary UI re-renders
  • Fixed ForEach(enumerated()) anti-pattern in merge file list
  • Fixed strong self capture in background estimation task

Architecture

  • Extracted ColorAdjustViewModel (consistent MVVM pattern)
  • Extracted ColorPreset to Models layer
  • Deduplicated metadata attribute building in PDFMetadataEditor
  • Added operationTask/cancel() pattern to all ViewModels

v0.1.13

Choose a tag to compare

@lenpr lenpr released this 11 May 22:09

What's New

  • Compression fix — oversized PDF pages (iPhone photos, scanned docs) are now capped to A3 dimensions, preventing file inflation
  • Better JPEG quality defaults — "Good" quality now actually compresses (0.75 → 0.60), bringing results in line with competing tools
  • Instant size estimates — heuristic estimates appear immediately with "~" prefix while real values compute in the background
  • Red warnings — clear UI feedback when estimated output would exceed original file size
  • Code signing & notarization — make sign, make notarize, make dmg targets for distribution
  • Refactoring — MetadataEditor flattening now applies pixel cap; shared DocumentSaver helper

Install via Homebrew

brew tap lenpr/tap
brew install --cask pdfwringer

Requirements

  • macOS 26.0+ (Tahoe)
  • Apple Silicon (arm64)

v0.1.12

Choose a tag to compare

@lenpr lenpr released this 08 May 10:20

What's New

  • make dmg target — produces a drag-to-install disk image with Applications symlink and styled Finder window layout (icon view, app on left, Applications on right)
  • Documentation updated to reflect the new build target

Assets

  • PDFwringer.dmg — drag-to-install disk image
  • PDFwringer.zip — zipped app bundle

Requirements

  • macOS 26.0+ (Tahoe)
  • Apple Silicon (arm64)

PDFwringer v0.1.11

Choose a tag to compare

@lenpr lenpr released this 08 May 10:04

What's new

  • Fix CIContext allocation waste in color adjuster (reuse static instance)
  • Fix identity color-adjust path failing when destination already exists
  • Fix splitter producing empty output when all page indices are out of range
  • Source == destination guard on all save operations (prevents data loss)
  • Async annotation flattening with progress bar and cancellation support
  • Reduced memory usage in PDF merge (process one source at a time)
  • Accessibility labels on zoom buttons (VoiceOver)
  • make release target with -O -whole-module-optimization
  • make app now ad-hoc codesigns the bundle
  • Dynamic toolchain path detection for test builds (supports both Xcode and CommandLineTools)

Install

Download PDFwringer.zip or PDFwringer.dmg, extract, and drag to Applications.

Note: The app is ad-hoc signed (not notarized). On first launch, right-click → Open to bypass Gatekeeper.

Requirements

  • macOS 26.0+ (Tahoe)
  • Apple Silicon (arm64)

PDFwringer v0.1.6

Choose a tag to compare

@lenpr lenpr released this 07 May 21:20

v0.1.6 — Consistent Coral Accent

  • Unified coral accent color across the entire app (buttons, radio buttons, pickers, toggles, icons)
  • Replaced all .accentColor references with shared Color.coral extension
  • Added version number display in the top-right corner of the window
  • Updated documentation to reflect current architecture (132 tests, 12 suites)