Releases: ReagentX/imessage-exporter
Release list
Stream Orchid
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:5canvas - 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
DDScannerResultpayloads - Preserve structured detector metadata for downstream crate consumers
- Parse structured currency amounts, postal addresses, package tracking numbers, flights, and unit/timezone conversions from
- Inline sticker rendering for #755 and #756
- 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
:hasselector usage for broader HTML viewer compatibility - Improve resolved-contact percentage calculation
- Correct busy-bar gating for attachment work
- Enhancements
- Refactor
AttachmentManagerinto 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
typedstreamparsing tocrabstep'sfoundationfeature - 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
- Refactor
- API Changes
- Breaking
- Replace
BubbleComponent::TextandBubbleComponent::AttachmentwithBubbleComponent::Run(Vec<AttributedRange>) - Replace
TextAttributeswithAttributedRange- Use
AttributedRange::text(...),AttributedRange::attachment(...), orAttributedRange::inline_attachment(...) - Attachment ranges now carry
attachment: Option<AttachmentMeta>andemoji_image
- Use
- Move text-effect types into submodules:
message_types::text_effects::text_effect::TextEffectmessage_types::text_effects::style::Stylemessage_types::text_effects::animation::Animationmessage_types::text_effects::detected::unit::Unit
- Replace
digital_touch::from_payloadwithDigitalTouchMessage::from_payload - Replace the exported
DigitalTouchalias with typed Digital Touch message models - Add
guidtoAttachment - Remove the unused
typedstreamerror module
- Replace
- Ergonomic
- Add
BusinessMessage,QuickReply,FormRequest,FormResponse,ListPicker, and related model types - Add
DigitalTouchMessage::render_svg()andDigitalTouchMessage::render_text() - Add
DigitalTouchError - Add structured detected-data models:
DetectedAddressDetectedCurrencyFlightShipmentTracking- Expanded
Unit
- Add
ScannerResultandFromScannerResulthelpers for Data Detector payload parsing - Add
Attachment::is_animated_sticker() - Add
HasUrlimplementations for message types with URL-like payloads - Add translation helper methods used by shared rendering paths
- Add
- Breaking
- 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
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
- Migrate HTML and TXT exporters to an Askama-based template engine
- Interactive iOS backup decryption password input via #730 (contributed by @jmcp)
- Using an encrypted iOS backup without
-xnow prompts interactively -xstill supported for non-TTY contexts
- Using an encrypted iOS backup without
- Rendering Engine
- Bug Fixes
- Disable progress bar when run headless for #738
- Support both automatic TTY detection and manual suppression via
--no-progress
- Support both automatic TTY detection and manual suppression via
- 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
ldtextinfind_my/apple_pay - Trailing colon when
ldtextis absent - Stray whitespace when
app_nameis omitted
- Leading whitespace before
- Fix
format_urlrendering blank lines whenprimary/title/summaryare 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
ffmpegHEICS conversion assembly - Fix sticker offset reconstruction gaps
- Error logs no longer clobber the progress bar
- Disable progress bar when run headless for #738
- Enhancements
ffmpegprocessing warning now fires for animated stickers in addition to videos- Per-frame
ffmpegloop replaced with a singleffmpeginvocation that consumes both image sequences and appliesalphamergeacross 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()andMessage::stopped_sharing_location()in favor ofMessage::shared_location_kind() EditedEvent.textis nowString- Remove
Table::extract. UseTable::rowsorTable::rowinstead.
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)?; - Remove
-
Ergonomic
- Add
StickerDecorationenum andAttachment::get_sticker_decoration()- Consolidates
get_sticker_source/get_sticker_source_application_name/get_sticker_effectdispatch into a single call returning a format-agnostic decoration
- Consolidates
- Add
impl Display for Expressive<'_> - Derive
Clone + CopyonBubbleEffect,ScreenEffect, andExpressive<'a> - Derive
DefaultonURLMessage<'a> - Unify the exporter's
MessageFormattertrait under a singleRuntimeErrorreturn typeformat_app,format_tapback, andformat_message_intoall returnResult<_, RuntimeError>RuntimeErrorgains aMessageErrorvariant +From<MessageError>impl so?composes end-to-endRuntimeErrornow implementsstd::error::Errorwithsource()- Every
.map_err(...)wrapper site in the exporter crate eliminated
- Add
-
- Security
- HTML escaping is now applied uniformly at template render time via a new
ChatEscaper format_attributesnow sanitizes HTML text on the no-attributes short-circuit
- HTML escaping is now applied uniformly at template render time via a new
- 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
Stringtag 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
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
- New diagnostics:
- Improve chatroom participant deduplication using union-find
- Support for jailbroken iOS filesystem data with
- Performance (≈+8%)
- Reduce dependency surface
- Make
protobuf-codegenoptional behindproto-regenfeature flag (-44 build dependencies for normal
builds) - Remove
indicatifdependency, replace with custom progress indicator (-7 transitive dependencies) - Remove
filetimedependency (-2 transitive dependencies)
- Make
- Refactor
sanitizationfunctions for improved performance - Cache
from_guidquery withprepare_cached - Optimize capacity allocation in
handleandchat_handle_joincaches - Defer clones in message body parsing
- Reduce dependency surface
- 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_guidbeing misclassified as poll updates - Fix
is_from_me()incorrectly consideringother_handle/share_directionon non-location-sharing messages - Fix file extension being added twice to attachment filenames
- Remove duplicate fallback check and duplicate query in
chat_handle_joindiagnostics - Parameterize
from_guidquery 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 byparse_body()+apply_body()APITable::stream()now propagates callback errors:Result<(), E> where E: From<TableError>DiagnosticandDeduplicatetraits removed; methods moved to inherentimplsrun_diagnostic()methods return structured data typesService::from()renamed toService::from_name()- All
Message::date()related signatures changed from&i64toi64 datemodule functions now receive&DateTimeinstead ofResult<&DateTime, MessageError>get_sticker_effect()signature changed fromVec<u8>to&[u8]util::outputmodule removed
- Ergonomic
- Implement
std::error::Errorwithsource()chains for all error types Table::extract()now has a default implementationChat::Propertiesfields made public- Derive
PartialEq/Eqon most data types
- Implement
- Breaking
- Security
- Introduce
HtmlBuilderto separate trusted HTML structure from untrusted content - Sanitize
Attachmentmetadata in HTML output
- Introduce
- Miscellaneous
- Support "Phone Number Changed" group action type
- Deduplicate common exporter logic into
shared.rs - Replace
panic!withcontinueinHandle::build_person_id_lookup - Bump dependencies
- Build with latest
rustc
Chaparral Lotus
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
StickerCacheandAttachmentsdirectories when using the--attachment-rootflag 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
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
StickerCacheandAttachmentsdirectories when using the--attachment-rootflag 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
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
StickerCacheandAttachmentsdirectories when using the--attachment-rootflag for #655
- Miscellaneous
- Remove extraneous commas from some HTML attribute lists
- Bump dependencies
- Build with latest
rustc
Desert Globemallow
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-filternow 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
- Support resolving iMessage handle details to Address Book names
- Performance
- Cache queries for attachments, message replies, and message votes in #624
- +10% performance boost
- Cache queries for attachments, message replies, and message votes in #624
- Bug Fixes
- API Changes
- Unify errors under
MessageErrorfor message data - Cleanup
AttachmentManagerMIME type logic - Abstract data source management to new
DataSourcestruct- Centralizes message database connection, contact index, and optional backup
- Unify errors under
- Miscellaneous
- Fixes for Rust 1.91
- Bump dependencies
- Build with latest
rustc
Desert Globemallow
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-filternow 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
- Support resolving iMessage handle details to Address Book names
- Performance
- Cache queries for attachments, message replies, and message votes in #624
- +10% performance boost
- Cache queries for attachments, message replies, and message votes in #624
- Bug Fixes
- API Changes
- Unify errors under
MessageErrorfor message data - Cleanup
AttachmentManagerMIME type logic - Abstract data source management to new
DataSourcestruct- Centralizes message database connection, contact index, and optional backup
- Unify errors under
- Miscellaneous
- Fixes for Rust 1.91
- Bump dependencies
- Build with latest
rustc
Foothill Clover
iMessage Exporter 3.1.0: Foothill Clover contains the following fixes and improvements:
- New Features
- iOS 26 and macOS Tahoe Support
- Bug Fixes
- API Changes
- Add poll and translation helper methods to
Messagestruct
- Add poll and translation helper methods to
- Miscellaneous
- Reduce String allocations in exporter
- Exporter trait updates
- Move
write_to_filetoExporter - Rename
WritertoMessageFormatter
- Move
- Fixes for Rust 1.89
- Bump dependencies
- Build with latest
rustc
Sierra Bluecup
Version 3.0.1 Sierra Bluecup contains the following fixes and improvements:
- Use
crabstepfortypedstreamdeserialization - Optimizations
- Avoid hashing
messagecolumn names on row creation- +20% performance boost
- Use cached SQL queries
- +17% performance boost
imessage-exporternow exports messages faster than 100k/s!
- Avoid hashing
- API Updates
BubbleComponents now own their data- Add
generate_text_legacy()for faster message parsing against older databases - Move
GetBlobtrait methods into toTabletrait
- Bug Fixes
- Improve backwards compatibility for #573
- Miscellaneous
- Bump dependencies
- Add some missing documentation
- Build with latest
rustc