Skip to content

Releases: ReagentX/imessage-exporter

Stream Orchid

Choose a tag to compare

@ReagentX ReagentX released this 18 Jun 22:57
f4021a1

iMessage Exporter 4.2.0: Stream Orchid contains the following fixes and improvements:

  • New Features
    • Inline sticker rendering for #755 and #756
      • Render Memoji, Genmoji, and custom stickers inline with surrounding message text in HTML exports
      • Scale inline-only sticker and emoji messages like jumbomoji
      • Resolve inline sticker attachments by file-transfer GUID instead of attachment row order
    • Digital Touch rendering for #344
      • Support taps, sketches, kisses, heartbeats, heartbreaks, fireballs, photos, and videos
      • HTML exports now render static Digital Touch frames as embedded SVG on a black 4:5 canvas
      • Photo Digital Touch messages render the photo backdrop with drawing overlays
      • Video Digital Touch messages render as embedded video players
      • TXT exports describe each effect with useful stroke, point, or beat metadata
    • Business Chat messages for #769 and #770
      • Render Quick Replies in HTML and TXT exports
      • Render Interactive Forms, including requests and submitted responses
      • Render List Pickers, including prompts and selected replies
    • Expanded Data Detector support
      • Parse structured currency amounts, postal addresses, package tracking numbers, flights, and unit/timezone conversions from DDScannerResult payloads
      • Preserve structured detector metadata for downstream crate consumers
  • Performance (≈+29%)
    • Optimize blob reads and database connection settings
    • Skip immediately discarded queries for tapbacks, poll votes, and poll updates
    • Cache resolved chat filenames
    • Increase base buffered-writer capacity
    • Pre-size date formatting buffers
  • Bug Fixes
    • Fix multi-attachment and inline-sticker pairing by matching body ranges to attachment rows by GUID
    • Preserve translated text, original text, and inline stickers in mixed HTML and TXT runs
    • Render edited Memoji / Genmoji history as inline images
    • Fix malformed empty-stroke handling in handwriting messages
    • Fix handwriting SVG file writes
    • Prevent Check In timestamp overflow
    • Add overflow handling to message parsing paths
    • Add plist UID recursion-limit handling
    • Fix index references in event parsing errors
    • Fix currency detection edge cases
    • Fix Digital Touch alpha conversion for SVG/CSS colors
    • Improve Digital Touch media kind matching in HTML exports
    • Remove CSS :has selector usage for broader HTML viewer compatibility
    • Improve resolved-contact percentage calculation
    • Correct busy-bar gating for attachment work
  • Enhancements
    • Refactor AttachmentManager into focused planning, target-resolution, mode, and execution modules
    • Reuse existing attachment outputs when rerunning exports against the same destination
    • Refactor temporary encrypted-backup database handling so cleanup happens after SQLite connections close
    • Add table and column existence checks for diagnostics on older database schemas
    • Centralize diagnostic count queries
    • Centralize URL/rich-link metadata handling behind shared helper traits
    • Centralize progress tracking logic
    • Migrate typedstream parsing to crabstep's foundation feature
    • Reorganize text-effect parsing into focused animation, style, and detected-data modules
    • Add dedicated Digital Touch models and SVG render pipeline
    • Add Business Chat parsing and rendering models behind the shared balloon-provider flow
  • API Changes
    • Breaking
      • Replace BubbleComponent::Text and BubbleComponent::Attachment with BubbleComponent::Run(Vec<AttributedRange>)
      • Replace TextAttributes with AttributedRange
        • Use AttributedRange::text(...), AttributedRange::attachment(...), or AttributedRange::inline_attachment(...)
        • Attachment ranges now carry attachment: Option<AttachmentMeta> and emoji_image
      • Move text-effect types into submodules:
        • message_types::text_effects::text_effect::TextEffect
        • message_types::text_effects::style::Style
        • message_types::text_effects::animation::Animation
        • message_types::text_effects::detected::unit::Unit
      • Replace digital_touch::from_payload with DigitalTouchMessage::from_payload
      • Replace the exported DigitalTouch alias with typed Digital Touch message models
      • Add guid to Attachment
      • Remove the unused typedstream error module
    • Ergonomic
      • Add BusinessMessage, QuickReply, FormRequest, FormResponse, ListPicker, and related model types
      • Add DigitalTouchMessage::render_svg() and DigitalTouchMessage::render_text()
      • Add DigitalTouchError
      • Add structured detected-data models:
        • DetectedAddress
        • DetectedCurrency
        • Flight
        • ShipmentTracking
        • Expanded Unit
      • Add ScannerResult and FromScannerResult helpers for Data Detector payload parsing
      • Add Attachment::is_animated_sticker()
      • Add HasUrl implementations for message types with URL-like payloads
      • Add translation helper methods used by shared rendering paths
  • Security
    • Add capped buffers for payload parsing
    • Reject oversized Digital Touch stroke counts before allocation
    • Add plist recursion-limit handling
    • Harden URL parsing logic
    • Prevent integer overflow in timestamp conversion paths
  • Miscellaneous
    • Update supported-features documentation
    • Update Digital Touch FAQ
    • Add substantial fixtures for Business Chat, Digital Touch, Data Detector, typedstream, inline sticker, translation, and edited-message cases
    • Significant new test coverage
    • Remove dead code
    • Clippy cleanups
    • Bump dependencies
    • Build with latest rustc

Chaparral Yucca

Choose a tag to compare

@ReagentX ReagentX released this 29 May 03:12
d6a4b00

iMessage Exporter 4.1.0: Chaparral Yucca contains the following fixes and improvements:

  • New Features
    • Rendering Engine
      • Migrate HTML and TXT exporters to an Askama-based template engine
        • Hard cutover: previous string-builder code path is fully removed
        • 20 HTML templates and 22 TXT templates created
        • Per-format logic split between typed Rust view models and Askama template files
        • Shared rendering primitives consolidated so export types consume identical message structures
        • New view-model / driver layer is format-agnostic
    • Interactive iOS backup decryption password input via #730 (contributed by @jmcp)
      • Using an encrypted iOS backup without -x now prompts interactively
      • -x still supported for non-TTY contexts
  • Bug Fixes
    • Disable progress bar when run headless for #738
      • Support both automatic TTY detection and manual suppression via --no-progress
    • Fix sticker attachments not incrementing the attachment index
    • Fix double-indentation on replies in TXT output
    • Fix SharePlay's embedded "Ended" line not receiving the per-line reply indent
    • Fix several balloon spacing inconsistencies:
      • Leading whitespace before ldtext in find_my/apple_pay
      • Trailing colon when ldtext is absent
      • Stray whitespace when app_name is omitted
    • Fix format_url rendering blank lines when primary/title/summary are empty strings
    • URL messages with a missing payload row are now rendered through the standard URL renderer
    • Normalize announcement wording across export types
    • Fix broken sticker conversion on Windows
    • Fix 1-indexed ffmpeg HEICS conversion assembly
    • Fix sticker offset reconstruction gaps
    • Error logs no longer clobber the progress bar
  • Enhancements
    • ffmpeg processing warning now fires for animated stickers in addition to videos
    • Per-frame ffmpeg loop replaced with a single ffmpeg invocation that consumes both image sequences and applies alphamerge across them
    • Resolve self/recipient names through a single resolver so announcements and edits treat the local user identically
    • File-not-found errors now identify the missing path and resolution mode
    • Add context to edited message parse errors
  • API Changes
    • Breaking

      • Remove Message::started_sharing_location() and Message::stopped_sharing_location() in favor of Message::shared_location_kind()
      • EditedEvent.text is now String
      • Remove Table::extract. Use Table::rows or Table::row instead.
      Migration details (click to expand)

      Multi-row iteration:

        // Before
        let rows = stmt.query_map(params, |row| Ok(Message::from_row(row)))?;
        for row in rows {
            let msg = Message::extract(row)?;
            // ...
        }
      
        // After
        for msg in Message::rows(&mut stmt, params)? {
            let msg = msg?;
            // ...
        }
      

      Single-row fetch:

        // Before
        let msg = Message::extract(stmt.query_row(params, |row| Ok(Message::from_row(row))))?;
      
        // After
        let msg = Message::row(&mut stmt, params)?;
      
    • Ergonomic

      • Add StickerDecoration enum and Attachment::get_sticker_decoration()
        • Consolidates get_sticker_source / get_sticker_source_application_name / get_sticker_effect dispatch into a single call returning a format-agnostic decoration
      • Add impl Display for Expressive<'_>
      • Derive Clone + Copy on BubbleEffect, ScreenEffect, and Expressive<'a>
      • Derive Default on URLMessage<'a>
      • Unify the exporter's MessageFormatter trait under a single RuntimeError return type
        • format_app, format_tapback, and format_message_into all return Result<_, RuntimeError>
        • RuntimeError gains a MessageError variant + From<MessageError> impl so ? composes end-to-end
        • RuntimeError now implements std::error::Error with source()
        • Every .map_err(...) wrapper site in the exporter crate eliminated
  • Security
    • HTML escaping is now applied uniformly at template render time via a new ChatEscaper
    • format_attributes now sanitizes HTML text on the no-attributes short-circuit
  • Miscellaneous
    • Reorganize exporter resources
    • Reduce allocations:
      • Attribute formatting now uses a single pre-allocated buffer with opens pushed in reverse and closes in forward order
      • Several String tag fields replaced with typed booleans
      • Redundant clones removed across the shared layer
    • Significant new test coverage
    • Remove dead and artificial tests covering code paths no longer reachable in the new architecture
    • Make unit tests run on PRs
    • Clippy cleanups
    • Bump dependencies
    • Build with latest rustc

Sand Verbena

Choose a tag to compare

@ReagentX ReagentX released this 17 Mar 23:49
cad1f39

iMessage Exporter 4.0.0: Sand Verbena contains the following fixes and improvements:

  • New Features
    • Support for jailbroken iOS filesystem data with --attachment-root (contributed by @iCrazeiOS)
    • Restructured diagnostics output
      • New diagnostics:
        • Recoverable deleted messages count
        • Message date range with human-readable time span
    • Improve chatroom participant deduplication using union-find
  • Performance (≈+8%)
    • Reduce dependency surface
      • Make protobuf-codegen optional behind proto-regen feature flag (-44 build dependencies for normal
        builds)
      • Remove indicatif dependency, replace with custom progress indicator (-7 transitive dependencies)
      • Remove filetime dependency (-2 transitive dependencies)
    • Refactor sanitization functions for improved performance
    • Cache from_guid query with prepare_cached
    • Optimize capacity allocation in handle and chat_handle_join caches
    • Defer clones in message body parsing
  • Bug Fixes
    • Fix incorrect contact matching on country codes for #671
    • Fix group removal/addition messages #670 and #681
    • Fix filename truncation panics on multi-byte UTF-8 characters using floor_char_boundary()
    • Fix estimated export space double-counting attachment sizes
    • Fix poll messages with no associated_message_guid being misclassified as poll updates
    • Fix is_from_me() incorrectly considering other_handle/share_direction on non-location-sharing messages
    • Fix file extension being added twice to attachment filenames
    • Remove duplicate fallback check and duplicate query in chat_handle_join diagnostics
    • Parameterize from_guid query to prevent SQL injection
    • Remove mismatched paragraph tag added to recovered messages
    • Use correct permissions when updating file metadata on Windows
    • Fix custom attachment path not applying to diagnostic runs
  • API Changes
    • Breaking
      • generate_text() replaced by parse_body() + apply_body() API
      • Table::stream() now propagates callback errors: Result<(), E> where E: From<TableError>
      • Diagnostic and Deduplicate traits removed; methods moved to inherent impls
      • run_diagnostic() methods return structured data types
      • Service::from() renamed to Service::from_name()
      • All Message::date() related signatures changed from &i64 to i64
      • date module functions now receive &DateTime instead of Result<&DateTime, MessageError>
      • get_sticker_effect() signature changed from Vec<u8> to &[u8]
      • util::output module removed
    • Ergonomic
      • Implement std::error::Error with source() chains for all error types
      • Table::extract() now has a default implementation
      • Chat::Properties fields made public
      • Derive PartialEq/Eq on most data types
  • Security
    • Introduce HtmlBuilder to separate trusted HTML structure from untrusted content
    • Sanitize Attachment metadata in HTML output
  • Miscellaneous
    • Support "Phone Number Changed" group action type
    • Deduplicate common exporter logic into shared.rs
    • Replace panic! with continue in Handle::build_person_id_lookup
    • Bump dependencies
    • Build with latest rustc

Chaparral Lotus

Choose a tag to compare

@ReagentX ReagentX released this 06 Feb 01:45
cdd5b73

iMessage Exporter 3.3.2: Chaparral Lotus contains the following fixes and improvements:

  • Bug Fixes
    • Improve backwards compatibility for #322 and #590
    • Fix handle filtering logic for #635
    • Add missing closing brackets for HTML audio tags for #641
    • Account for export path in filename length truncation for #661
    • Include backup root in contacts path for unencrypted iOS backups for #663
    • Support both StickerCache and Attachments directories when using the --attachment-root flag for #655
    • Fix incorrect contact matching on country codes for #671
    • Fix group removal/addition messages #670 and #681
  • Miscellaneous
    • Support Phone Number Changed group action type
    • Remove extraneous commas from some HTML attribute lists
    • Bump dependencies
    • Build with latest rustc

Chaparral Lotus

Choose a tag to compare

@ReagentX ReagentX released this 19 Jan 22:51
65f83c5

iMessage Exporter 3.3.1: Chaparral Lotus contains the following fixes and improvements:

  • Bug Fixes
    • Improve backwards compatibility for #322 and #590
    • Fix handle filtering logic for #635
    • Add missing closing brackets for HTML audio tags for #641
    • Account for export path in filename length truncation for #661
    • Include backup root in contacts path for unencrypted iOS backups for #663
    • Support both StickerCache and Attachments directories when using the --attachment-root flag for #655
    • Fix incorrect contact matching on country codes for #671
  • Miscellaneous
    • Remove extraneous commas from some HTML attribute lists
    • Bump dependencies
    • Build with latest rustc

Chaparral Lotus

Choose a tag to compare

@ReagentX ReagentX released this 15 Jan 03:41
d1d7d24

iMessage Exporter 3.3.0: Chaparral Lotus contains the following fixes and improvements:

  • Bug Fixes
    • Improve backwards compatibility for #322 and #590
    • Fix handle filtering logic for #635
    • Add missing closing brackets for HTML audio tags for #641
    • Account for export path in filename length truncation for #661
    • Include backup root in contacts path for unencrypted iOS backups for #663
    • Support both StickerCache and Attachments directories when using the --attachment-root flag for #655
  • Miscellaneous
    • Remove extraneous commas from some HTML attribute lists
    • Bump dependencies
    • Build with latest rustc

Desert Globemallow

Choose a tag to compare

@ReagentX ReagentX released this 17 Nov 15:41
d52323a

iMessage Exporter 3.2.1: Desert Globemallow contains the following fixes and improvements:

  • New Features
    • Support resolving iMessage handle details to Address Book names
      • Resolves #62, #64, #126, #233, #238, #278, #289, #601
      • Supports both macOS and iOS Address Book data
      • Automatic resolution on most systems, no command updates required
      • --conversation-filter now supports filtering by contact names in addition to numbers and emails
      • Export filenames use each contact’s phone number or email address
        • Prevents duplicate filenames when multiple contacts share the same name
  • Performance
    • Cache queries for attachments, message replies, and message votes in #624
      • +10% performance boost
  • Bug Fixes
    • Fix group chats splitting when changing service for #628
    • Improve handle deduplication logic for #233
    • Fix handle filtering logic for #635
  • API Changes
    • Unify errors under MessageError for message data
    • Cleanup AttachmentManager MIME type logic
    • Abstract data source management to new DataSource struct
      • Centralizes message database connection, contact index, and optional backup
  • Miscellaneous
    • Fixes for Rust 1.91
    • Bump dependencies
    • Build with latest rustc

Desert Globemallow

Choose a tag to compare

@ReagentX ReagentX released this 11 Nov 22:09
233fb76

iMessage Exporter 3.2.0: Desert Globemallow contains the following fixes and improvements:

  • New Features
    • Support resolving iMessage handle details to Address Book names
      • Resolves #62, #64, #126, #233, #238, #278, #289, #601
      • Supports both macOS and iOS Address Book data
      • Automatic resolution on most systems, no command updates required
      • --conversation-filter now supports filtering by contact names in addition to numbers and emails
      • Export filenames use each contact’s phone number or email address
        • Prevents duplicate filenames when multiple contacts share the same name
  • Performance
    • Cache queries for attachments, message replies, and message votes in #624
      • +10% performance boost
  • Bug Fixes
    • Fix group chats splitting when changing service for #628
    • Improve handle deduplication logic for #233
  • API Changes
    • Unify errors under MessageError for message data
    • Cleanup AttachmentManager MIME type logic
    • Abstract data source management to new DataSource struct
      • Centralizes message database connection, contact index, and optional backup
  • Miscellaneous
    • Fixes for Rust 1.91
    • Bump dependencies
    • Build with latest rustc

Foothill Clover

Choose a tag to compare

@ReagentX ReagentX released this 16 Sep 00:28
d704653

iMessage Exporter 3.1.0: Foothill Clover contains the following fixes and improvements:

  • New Features
    • iOS 26 and macOS Tahoe Support
      • Translated messages for #546
        • Support parsing translated data, source language, and translation language
      • Polls and Votes for #545
        • Render polls, poll updates, votes, and totals in exports
      • Support chat backgrounds for #547
        • Support chat background change announcement messages
        • Support new plist metadata
  • Bug Fixes
    • Support arbitrary key types in NSKeyedArchiver parser
    • Address #582
    • Improve backwards compatibility for #573
  • API Changes
    • Add poll and translation helper methods to Message struct
  • Miscellaneous
    • Reduce String allocations in exporter
    • Exporter trait updates
      • Move write_to_file to Exporter
      • Rename Writer to MessageFormatter
    • Fixes for Rust 1.89
    • Bump dependencies
    • Build with latest rustc

Sierra Bluecup

Choose a tag to compare

@ReagentX ReagentX released this 26 Jun 22:45
b20e008

Version 3.0.1 Sierra Bluecup contains the following fixes and improvements:

  • Use crabstep for typedstream deserialization
    • +5% performance boost
    • Fix overlapping format ranges in #567
    • Ensure Attachment metadata is correctly parsed for #570 and #477
      • Caused by an ordering error in the old BubbleComponent assembler
    • Correctly render malformed URL messages for #571
  • Optimizations
    • Avoid hashing message column names on row creation
      • +20% performance boost
    • Use cached SQL queries
      • +17% performance boost
    • imessage-exporter now exports messages faster than 100k/s!
  • API Updates
    • BubbleComponents now own their data
    • Add generate_text_legacy() for faster message parsing against older databases
    • Move GetBlob trait methods into to Table trait
  • Bug Fixes
    • Improve backwards compatibility for #573
  • Miscellaneous
    • Bump dependencies
    • Add some missing documentation
    • Build with latest rustc