iMessage Exporter 4.20: 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