25 releases (14 stable)

2.1.1 Oct 6, 2024
2.0.1 Aug 3, 2024
1.9.0 Jun 10, 2024
1.8.0 Dec 4, 2023
0.1.4 Dec 30, 2022

#90 in Command line utilities

Download history 127/week @ 2024-07-18 104/week @ 2024-07-25 414/week @ 2024-08-01 139/week @ 2024-08-08 119/week @ 2024-08-15 109/week @ 2024-08-22 119/week @ 2024-08-29 123/week @ 2024-09-05 160/week @ 2024-09-12 383/week @ 2024-09-19 170/week @ 2024-09-26 331/week @ 2024-10-03 171/week @ 2024-10-10 153/week @ 2024-10-17 136/week @ 2024-10-24 129/week @ 2024-10-31

626 downloads per month

GPL-3.0-or-later

2.5MB
18K SLoC

Binary Documentation

The imessage-exporter binary exports iMessage data to txt or html formats. It can also run diagnostics to find problems with the iMessage database.

Installation

There are several ways to install this software.

This binary is available on crates.io.

cargo install imessage-exporter is the best way to install the app for normal use.

Uninstall steps

$ cargo uninstall imessage-exporter

Homebrew

This binary is available via brew.

brew install imessage-exporter will install the app, but it may not be up to date with the latest release.

Uninstall steps

$ brew uninstall imessage-exporter

Prebuilt Binaries

The releases page provides prebuilt binaries for both Apple Silicon and Intel-based Macs.

Uninstall steps

$ rm path/to/imessage-exporter-binary

Installing manually

  • clone the repository
  • cd to the repository
  • cargo run --release to compile

How To Use

-d, --diagnostics
        Print diagnostic information and exit
        
-f, --format <txt, html>
        Specify a single file format to export messages into
        
-c, --copy-method <compatible, efficient, disabled>
        Specify an optional method to use when copying message attachments
        Compatible will convert HEIC files to JPEG
        Efficient will copy files without converting anything
        If omitted, the default is `disabled`
        ImageMagick is required to convert images on non-macOS platforms.
        
-p, --db-path <path/to/source>
        Specify an optional custom path for the iMessage database location
        For macOS, specify a path to a `chat.db` file
        For iOS, specify a path to the root of an unencrypted backup directory
        If omitted, the default directory is ~/Library/Messages/chat.db
        
-r, --attachment-root <path/to/attachments>
        Specify an optional custom path to look for attachments in (macOS only)
        Only use this if attachments are stored separately from the database's default location
        The default location is ~/Library/Messages/Attachments
        
-a, --platform <macOS, iOS>
        Specify the platform the database was created on
        If omitted, the platform type is determined automatically
        
-o, --export-path <path/to/save/files>
        Specify an optional custom directory for outputting exported data
        If omitted, the default directory is ~/imessage_export
        
-s, --start-date <YYYY-MM-DD>
        The start date filter
        Only messages sent on or after this date will be included
        
-e, --end-date <YYYY-MM-DD>
        The end date filter
        Only messages sent before this date will be included
        
-l, --no-lazy
        Do not include `loading="lazy"` in HTML export `img` tags
        This will make pages load slower but PDF generation work
        
-m, --custom-name <custom-name>
        Specify an optional custom name for the database owner's messages in exports
        Conflicts with --use-caller-id
        
-i, --use-caller-id
        Use the database owner's caller ID in exports instead of "Me"
        Conflicts with --custom-name
        
-b, --ignore-disk-warning
        Bypass the disk space check when exporting data
        By default, exports will not run if there is not enough free disk space
        
-h, --help
        Print help
-V, --version
        Print version

Examples

Export as html and copy attachments in web-compatible formats from the default iMessage Database location to your home directory:

imessage-exporter -f html -c compatible

Export as txt and copy attachments in their original formats from the default iMessage Database location to a new folder in the current working directory called output:

imessage-exporter -f txt -o output -c efficient

Export as txt from the an unencrypted iPhone backup located at ~/iphone_backup_latest to a new folder in the current working directory called backup_export:

imessage-exporter -f txt -p ~/iphone_backup_latest -a iOS -o backup_export

Export as html from /Volumes/external/chat.db to /Volumes/external/export without copying attachments:

imessage-exporter -f html -c disabled -p /Volumes/external/chat.db -o /Volumes/external/export

Export as html from /Volumes/external/chat.db to /Volumes/external/export with attachments in /Volumes/external/Attachments:

imessage-exporter -f html -c efficient -p /Volumes/external/chat.db -r /Volumes/external/Attachments -o /Volumes/external/export 

Export messages from 2020-01-01 to 2020-12-31 as txt from the default macOS iMessage Database location to ~/export-2020:

imessage-exporter -f txt -o ~/export-2020 -s 2020-01-01 -e 2021-01-01 -a macOS

Features

Click here for a full list of features.

Caveats

Cross-platform HEIC conversion

ImageMagick is required to make exported images more compatible on non-macOS platforms.

HTML Exports

In HTML exports in Safari, when referencing files in-place, you must permit Safari to read from the local file system in the Develop > Developer Settings... menu:

Further, since the files are stored in ~/Library, you will need to grant your browser Full Disk Access in System Settings.

Note: This is not required when passing a valid --copy-method.

PDF Exports

I could not get PDF export to work in a reasonable way. The best way for a user to do this is to follow the steps above for Safari and print to PDF.

wkhtmltopdf

wkhtmltopdf refuses to render local images, even with the flag enabled like so:

let mut process = Command::new("wkhtmltopdf")
.args(&vec![
    "--enable-local-file-access".to_string(),
    html_path,
    pdf_path.to_string_lossy().to_string(),
])
.spawn()
.unwrap();

This persisted after granting cargo, imessage-exporter, and wkhtmltopdf Full Disk Access permissions as well as after copying files to the same directory as the HTML file.

Browser Automation

There are several chomedriver wrappers for Rust. The ones that use async make this binary too large (over 10mb) and have too many dependencies. The sync implementation in the headless-chrome crate works, but times out when generating large PDFs, even with an extreme timeout.

Dependencies

~40MB
~672K SLoC