Skip to main content

Interactive CLI wrapper for imessage-exporter with contact name resolution and post-processing

Project description

imexp

An interactive CLI wrapper for imessage-exporter that adds contact name resolution and post-processing to your iMessage exports.

Features

  • Saved profiles — define client/project presets in config.ini and run imexp with no selector
  • Strict conversation filters — resolve exact handles locally before calling imessage-exporter
  • Selector preflight — inspect the resolved handles and matching chats before export
  • Exact selector mode — refuse exports when union filtering would broaden beyond the selected participant set
  • Interactive wizard — run imexp --wizard or imexp export --wizard for a guided export
  • Natural language dates — use phrases like "last 6 months" or "2 weeks ago"
  • Contact resolution — automatically maps phone numbers and emails to names from your macOS or iOS Contacts database
  • iOS backup support — auto-detects backups and lets you pick by device name/date
  • Post-processing — renames exported files and replaces raw handles with contact names
  • Export history — tracks your last export date to avoid duplicates

Requirements

  • Python 3.12+
  • macOS or Windows for the official wheels

macOS local Address Book lookups require macOS. iOS backup exports work on both macOS and Windows.

Installation

Install from PyPI:

pip install imexp

Official wheels bundle the matching imessage-exporter binary for:

  • macOS Apple Silicon
  • macOS Intel
  • Windows x86_64

Source installs do not bundle the exporter binary. For editable or source installs, either:

  • install imessage-exporter separately and keep it on PATH
  • point IMEXP_EXPORTER_PATH at a local binary

Example source install:

git clone https://github.com/code-switched/imexp.git
cd imexp
pip install -e .

Usage

Interactive mode

If you do not configure a default profile, running imexp or imexp export with no arguments starts the guided wizard:

imexp

To force the wizard even when a default profile exists:

imexp --wizard

The wizard prompts for:

  • Platform (macOS or iOS backup)
  • Date range (natural language supported)
  • Export location

Command-line mode

imexp export --start-date "2024-01-01" --end-date "2024-06-01" --format txt

Saved profiles

Profiles let you define the handles you care about for a client or project and reuse them across repositories.

Canonical example: data/config/imexp/config.example.ini

Example contents:

[export]
default_profile = client-a
output_dir = ./data/messages/sms

[profile.client-a]
handles =
    +15551234567
    client@example.com
names =
    Client Contact
    Alternate Contact Label
label = Client Contact
slug = client-contact
platform = macOS
format = txt
copy_method = full
use_caller_id = true

Then run:

imexp

Or select a profile explicitly:

imexp export --profile client-a --start-date "last 30 days"

By default, selector mode is union: any chat containing one of the selected handles is included because upstream filtering is participant-union based.

To make that safe for client-context exports, use:

imexp export --profile client-a --selector-preflight
imexp export --profile client-a --selector-mode exact

--selector-preflight prints the resolved handles plus the exact chat sets that would match. --selector-mode exact refuses the export if any matched chat would bring in participants outside the selected handle set.

Profile fields:

  • handles are the canonical selectors used for export filtering.
  • names are optional display aliases used only for filename normalization.
  • label is the human-friendly display name for that profile.
  • slug is the optional folder-name override. If omitted, it is derived from label or the profile key.

Strict filter behavior

--conversation-filter no longer passes raw free text straight through to upstream name matching.

  • Exact handles are normalized and matched locally first.
  • Exact contact names are matched case-insensitively and rewritten to canonical handles.
  • Ambiguous names fail and print the candidate handles.
  • No-match filters fail instead of broadening the export.

Examples:

imexp export --conversation-filter "+1 (555) 123-4567"
imexp export --conversation-filter "Alice Smith"

Relabel existing exports

Re-run contact resolution on a previous export:

imexp relabel --export-path ./data/messages/sms/2024-01-15-10-30-00

Common options

Option Description
--start-date Start date (natural language or YYYY-MM-DD)
--end-date End date (defaults to now)
--format Output format: txt, html (default: txt)
--platform macOS or iOS
--db-path Path to iOS backup or custom chat.db
--export-path Custom output directory
--selector-mode Selector safety mode: union or exact
--selector-preflight Print selector resolution and matching chats without exporting
--non-interactive Disable prompts for scripted use
-v, --verbose Enable debug logging

How it works

  1. Runs imessage-exporter with your specified options
  2. Loads contacts from macOS Contacts.app or iOS backup
  3. Post-processes exported files:
    • Renames files from phone numbers to contact names
    • Replaces raw handles in file contents with names
  4. Saves unknown number → name mappings to contacts.json for future exports
  5. Tracks export history in history.json for incremental exports

Configuration files

By default, repo-local files are stored under ./data/:

  • contacts.json — custom name overrides for unknown numbers
  • history.json — tracks last export date
  • config/imexp/config.ini — export defaults and saved profiles

See docs/dev/client-context.md for the design note behind the client-context workflow this tool is aiming at.

License

imexp is distributed under GPL-3.0-or-later.

The official wheels bundle the upstream imessage-exporter binary, which is also licensed under GPL-3.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

imexp-0.3.1.tar.gz (65.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

imexp-0.3.1-py3-none-win_amd64.whl (2.1 MB view details)

Uploaded Python 3Windows x86-64

imexp-0.3.1-py3-none-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

imexp-0.3.1-py3-none-macosx_10_12_x86_64.whl (1.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file imexp-0.3.1.tar.gz.

File metadata

  • Download URL: imexp-0.3.1.tar.gz
  • Upload date:
  • Size: 65.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for imexp-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1d219277edd4d93a0f56334ea80dfdf5fc43cf8426d98efaa8ae12c3d5f7e321
MD5 e0941ffe1e4450f8a7aaef78ba67b506
BLAKE2b-256 4f54aa433f655b1079ee4fb846f1e97847441eb457d409ffd843584eb9bd8b00

See more details on using hashes here.

Provenance

The following attestation bundles were made for imexp-0.3.1.tar.gz:

Publisher: release.yml on code-switched/imexp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file imexp-0.3.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: imexp-0.3.1-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for imexp-0.3.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8946689c27b116bd7ac74bac66cbea4c51f116e2546deb0de00fd101240db5c8
MD5 9115ad5d37b486a314b35a010786e106
BLAKE2b-256 21f816e5b0b8a27466e04ebdf05099e0962418a427db9d83487bc3a962e0512c

See more details on using hashes here.

Provenance

The following attestation bundles were made for imexp-0.3.1-py3-none-win_amd64.whl:

Publisher: release.yml on code-switched/imexp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file imexp-0.3.1-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: imexp-0.3.1-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for imexp-0.3.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4adaf6bb27d781f02fa1f64fc991ad2801375abfca20d9cde53fdbeb57ab81da
MD5 c77bf9195a8d9e93c5a43601f5fe31a4
BLAKE2b-256 04c0a6f5f7f1f2dfdd7fa0c9890fca819a63074da65610f6d91ce39ce9256b2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for imexp-0.3.1-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on code-switched/imexp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file imexp-0.3.1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for imexp-0.3.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e22cd87714a0488a87fd5bfeab43068f0821d0fcab56dc0dc5e00f4a732b9d53
MD5 bb6e50f1ab5c2d75b3995814fed85af8
BLAKE2b-256 68cb7c4dcd013a6923d04c904b8fc43583987033f91cc9656ca9b28585f06fdc

See more details on using hashes here.

Provenance

The following attestation bundles were made for imexp-0.3.1-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on code-switched/imexp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page