Skip to content

feat: add PDF message exports#42

Merged
momenbasel merged 5 commits into
momenbasel:mainfrom
AJV20:feat/message-pdf-exports
Jul 18, 2026
Merged

feat: add PDF message exports#42
momenbasel merged 5 commits into
momenbasel:mainfrom
AJV20:feat/message-pdf-exports

Conversation

@AJV20

@AJV20 AJV20 commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add PDF as a first-class message export format
  • Add a native CoreGraphics/CoreText transcript PDF writer with pagination and wrapping
  • Wire PDF into iMessage/SMS and WhatsApp export menus/save panels
  • Add regression coverage for PDF registration and writer integration

Verification

  • swift build
  • Scripts/regression/run.py (33 checks)
  • Scripts/build.sh
  • PDF smoke test generated a valid %PDF-1.3 file with multi-page output
  • Scripts/check-pr-scope.sh origin/main

@AJV20
AJV20 marked this pull request as draft July 7, 2026 11:35
@momenbasel
momenbasel merged commit 98c0b27 into momenbasel:main Jul 18, 2026
2 checks passed
@momenbasel

Copy link
Copy Markdown
Owner

Merged into main after fixing the one blocker: exportPDF built its reply-lookup map with Dictionary(uniqueKeysWithValues:), which traps on duplicate GUIDs - and GUIDs come from the untrusted sms.db, so a corrupted or merged backup would crash the app mid-export. Switched to Dictionary(_:uniquingKeysWith:) keeping the first occurrence, and forwarded cancellationCheck into the PDF path so large exports stay cancelable. Two smaller items left as follow-ups: timestamps render every 8th message, and a bubble whose in-line cards exceed a full page can drop trailing body text. Neither blocks the feature.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants