Extract, query, and analyse your Mac iMessage history
Project description
iMessage Analysis
Ask questions about your entire iMessage history — from an AI agent, the terminal, or a Python notebook. Works on Mac.
What it does
- Ask your AI — connect to Claude, Codex, Cursor, or ChatGPT and ask things like "Who do I text most?" or "What did Alice and I talk about last month?"
- Search and query — run any question against your messages from the terminal
- Python notebooks — load your message data into pandas for custom analysis
- Always current — syncs only new messages each run, so it stays fast
- Real names — reads your Contacts to show names instead of phone numbers
Quickstart
With Claude Code, Codex, or Cursor
1. Install the skills package:
npx skills add DecisionNerd/imessage-analysis
2. Run the setup command inside your AI tool:
/imessage-analysis-install
This installs the binary, connects it to your AI tool, and walks you through the first sync — including a note about using Apple Terminal the first time so macOS can ask for Contacts permission.
3. Ask anything:
"Who have I texted most this year?" "Give me a deep dive on Alice" "Who's been waiting on a reply from me?"
With Claude Desktop, ChatGPT, or any other AI tool
curl -fsSL https://raw.githubusercontent.com/DecisionNerd/imessage-analysis/main/scripts/install.sh | bash
Detects and connects to Claude Desktop, Cursor, Claude Code, and Codex automatically. See MCP setup for manual steps.
From the terminal only
1. Give Terminal permission to read your messages:
System Settings → Privacy & Security → Full Disk Access → enable Terminal
2. Install:
brew tap DecisionNerd/tap
brew install imessage-analysis
3. Run your first sync from Apple Terminal.app (not iTerm2 or other terminals — macOS needs this to ask for Contacts permission the first time):
imessage-analysis sync
4. Start exploring:
imessage-analysis status
imessage-analysis top-contacts --limit 10
imessage-analysis time-series --year 2024
imessage-analysis reactions --received
imessage-analysis search-contacts alice
imessage-analysis query "SELECT year, COUNT(*) AS n FROM messages GROUP BY year ORDER BY year"
Use with Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"imessage": { "command": "imessage-mcp" }
}
}
Use with Python
pip install imessage-analysis
import imessage_analysis
df = imessage_analysis.top_contacts().to_pandas()
df = imessage_analysis.query("SELECT * FROM messages WHERE year = 2024").to_pandas()
Note:
imessage_analysis.sync()picks up new messages but won't resolve contact names — that requires runningimessage-analysis syncfrom the terminal at least once.
Installation
| Method | Command |
|---|---|
| Homebrew | brew tap DecisionNerd/tap && brew install imessage-analysis |
| Cargo | cargo install --git https://github.com/DecisionNerd/imessage-analysis |
| PyPI | pip install imessage-analysis |
| Claude Code / Codex / Cursor | npx skills add DecisionNerd/imessage-analysis |
Requires macOS. Rust 1.70+ for source builds. Python 3.11+ for the Python package.
Documentation
| Installation | Full Disk Access, Homebrew, source, Python |
| CLI reference | All commands and flags |
| AI agent setup | Connecting to Claude, Codex, Cursor, ChatGPT |
| Python package | API reference, notebook examples |
| Data model | All 22 output columns |
| Contact resolution | Contacts.app + TOML overrides |
| Architecture | How it works under the hood |
| Releasing | Tagging, Homebrew formula update |
Contributing
- Fork the repo and create a branch
cargo test --all— all tests must passcargo clippy -- -D warningsandcargo fmt- Open a pull request — CI runs automatically
This project uses Conventional Commits.
Attribution
Inspired by the foundational work of Yorgos Askalidis, who first documented how to access and analyse the macOS iMessage database. See his original Python implementation and write-ups:
This is a separate, ground-up Rust rewrite that extends the concept with a native CLI, AI agent integration, and Python bindings.
License
Copyright (C) 2026 David Spencer. Released under the GNU General Public License v3.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 Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file imessage_analysis-0.1.3-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: imessage_analysis-0.1.3-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 39.4 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27f78050de2b6ab0ce2b37bce06efb204ba14b145226169db4787ee803bc5aeb
|
|
| MD5 |
f95ff7622b86f445f4990e4272f103e0
|
|
| BLAKE2b-256 |
4bc1b0eb8180d933fdc5ab474cd105b19a917ea84ac862f73a836b192394f18c
|
Provenance
The following attestation bundles were made for imessage_analysis-0.1.3-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
publish-pypi.yml on DecisionNerd/imessage-analysis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
imessage_analysis-0.1.3-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
27f78050de2b6ab0ce2b37bce06efb204ba14b145226169db4787ee803bc5aeb - Sigstore transparency entry: 1673994298
- Sigstore integration time:
-
Permalink:
DecisionNerd/imessage-analysis@a75d4a7c02f22a5052cbf3d799814e48fb0f8525 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/DecisionNerd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@a75d4a7c02f22a5052cbf3d799814e48fb0f8525 -
Trigger Event:
workflow_dispatch
-
Statement type: