iMessage Exporter 5.0.1: Speckled Clarkia contains the following fixes and improvements:
- New Features
- Contacts-based conversation merging
- Combine phone numbers and email addresses belonging to one person, including linked Contacts cards on macOS and iOS
- Merge conversations split across those addresses, including group chats
- Preserve separate group chats with different names unless Messages explicitly links them
- Skip ambiguous identity matches when an address belongs to multiple Contacts cards
- Allow
--contacts-path(-n) to override the Contacts database in encrypted and unencrypted iOS backups
- Contacts-based conversation merging
- Performance
- Read message bodies and edit histories with message rows instead of fetching them separately for each message
- Parse body data directly from query results, avoiding intermediate buffers in the main decoding path
- Replace the separate payload-presence query with a flag in the message query
- Bug Fixes
- Fix inflated poll vote counts when participants change selections or Messages repeats vote updates for #823
- Fix null values in archived app-message payloads and render links as plain URLs when preview metadata is absent or null for #805
- Preserve recovered body components and edit history when text recovery fails
- Keep attachments and handwriting from recovered deleted messages in their conversation’s attachment directory for #827
- Route messages from linked chat rows without participant records to their conversation instead of the orphaned transcript
- Fix incorrect contact matches caused by country-code collisions and iOS search-index phone fragments
- Reject unmatched conversation filters even when date filters are supplied
- Reject out-of-range handwriting dimensions and handle empty text-rendering canvases
- Fix a performance regression where the bundled SQLite 3.54 update recompiled cached queries for every message for #839
- Enhancements
- Improve conversation naming and filtering
- Use one filename and attachment directory for every chat row in a merged conversation
- Choose consistent contact names and fallback addresses, honoring linked contacts’ preferred names
- List each participant once and improve long filename truncation and remaining-participant counts
- Match conversation filters against every Messages address belonging to a grouped participant
- Clarify diagnostic counts and report participants and conversations merged through Contacts
- Improve database and backup path errors for #829, #808, #647, #590, #493, and #359
- Distinguish missing paths, permission failures, invalid SQLite files, and databases without Messages data
- Suggest database and backup locations based on files found on disk
- Improve default home-directory resolution, including Windows support
- Improve conversation naming and filtering
- API Changes
- Breaking (migration guide)
- Decode message text, body components, and edit history during row loading; remove separate body-decoding calls
- Replace callback streaming and generic query/cache traits with prepared-statement iteration and concrete APIs
- Separate participant identity groups from stored addresses and use those groups for chat deduplication
- Return decoded timestamps in UTC and accept explicit timezones for date filtering and presentation
- Separate exported attachment paths and media types from database rows
- Revise diagnostic fields, error variants, and public module paths
- Ergonomic
- Re-export
chrono,plist, andrusqlitefromimessage_database
- Re-export
- Breaking (migration guide)
- Miscellaneous
- Exclude test fixtures from the published library package
- Recommend
cargo install --locked - Expand regression coverage, consolidate exporter tests, and enforce formatting in CI
- Update supported-version documentation
- Bump dependencies and build with latest
rustc
⚠️ Version 5.0 includes breaking API changes and changes to conversation grouping, filenames, and attachment directories. See the migration guide for replacement APIs, examples, and export behavior.