Your texting habits, exposed. A Spotify Wrapped-style visualization of your iMessage and WhatsApp history.
- Total messages + words – sent, received, per day
- Inner circle – top person + top 10 contacts (expandable)
- Group chats – overview + expandable top 10 groups on one slide
- Personality – diagnosis with starter %, reply time, sent/recv ratio, peak day/hour
- Who texts first – conversation initiator %
- Response time – how fast you reply
- 3AM bestie – late night conversations (midnight–5am)
- Busiest day – your wildest day with top 10 people from that day (expandable)
- Grind + marathon – longest streak of daily texting and biggest single-day 1:1 marathon
- Vibe check – who’s heating up (H2 > H1) vs ghosted (dropped after June)
- Biggest fan / Down bad – who texts you most vs who you text most
- Peak hours – most active day/hour
- Contribution graph – GitHub-style activity heatmap
- Top emojis – your most-used emoji lineup
curl -O https://raw.githubusercontent.com/kothari-nikunj/wrap2025/main/imessage_wrapped.pyThe script needs to read your Messages database:
System Settings -> Privacy & Security -> Full Disk Access -> Add Terminal
(Or iTerm/Warp if you use those)
python3 imessage_wrapped.pycurl -O https://raw.githubusercontent.com/kothari-nikunj/wrap2025/main/whatsapp_wrapped.pyThe script needs to read your WhatsApp database:
System Settings -> Privacy & Security -> Full Disk Access -> Add Terminal
(Or iTerm/Warp if you use those)
python3 whatsapp_wrapped.pyMerges stats from both platforms into a single unified report.
curl -O https://raw.githubusercontent.com/kothari-nikunj/wrap2025/main/combined_wrapped.pyThe script needs to read both message databases:
System Settings -> Privacy & Security -> Full Disk Access -> Add Terminal
(Or iTerm/Warp if you use those)
python3 combined_wrapped.pyThe combined script will:
- Analyze both iMessage and WhatsApp data
- Use your AddressBook to reconcile contacts across platforms
- Merge top contacts, group chats, and all other stats
- Show a platform breakdown slide
- Work even if you only have one platform installed
Your wrapped will open in your browser automatically.
# Use 2024 data instead of 2025
python3 imessage_wrapped.py --use-2024
python3 whatsapp_wrapped.py --use-2024
python3 combined_wrapped.py --use-2024
# Custom output filename
python3 imessage_wrapped.py -o my_wrapped.html
python3 whatsapp_wrapped.py -o my_wrapped.html
python3 combined_wrapped.py -o my_wrapped.htmlIf you don't have enough 2025 messages yet, the script will automatically fall back to 2024.
100% Local - Your data never leaves your computer
- No servers, no uploads, no tracking
- No external dependencies (Python stdlib only)
- All analysis happens locally
- Output is a single HTML file
You can read the entire source code yourself.
- macOS (uses local message databases)
- Python 3 (pre-installed on macOS)
- Full Disk Access for Terminal
- For WhatsApp: WhatsApp desktop app installed with chat history
The script reads your local chat.db (iMessage database) and AddressBook (Contacts) using SQLite queries.
The script reads your local ChatStorage.sqlite (WhatsApp database) using SQLite queries. WhatsApp stores contact names directly in the database.
The combined script reads both databases and merges the data:
- Uses AddressBook contacts to reconcile names across platforms
- Combines message counts, response times, and other stats
- Merges top contacts (deduplicating by name when possible)
- Shows platform breakdown with message counts per platform
- Works even if only one platform is available
All scripts analyze your message patterns, resolve identifiers to contact names, and generate a self-contained HTML file with an interactive gallery.
Q: Is this safe? A: Yes. The scripts only read local databases, write one HTML file, and make zero network requests. No data is sent anywhere.
Q: Why do I need Full Disk Access? A: Apple protects message databases. Terminal needs permission to read them.
Q: Can I run this on iOS? A: No, iOS doesn't allow access to message databases. macOS only.
Q: The names are showing as phone numbers A: The script tries to match identifiers to contact names. Some may not resolve if the formatting differs.
Q: Where is the WhatsApp database? A: WhatsApp stores its database at:
~/Library/Group Containers/group.net.whatsapp.WhatsApp.shared/ChatStorage.sqlite(current version)~/Library/Containers/com.whatsapp/Data/Library/Application Support/WhatsApp/ChatStorage.sqlite(older versions)
Get AI-generated summaries of your top 25 messaging relationships. Uses Claude Code to analyze your full message history and write personalized insights for each contact.
- Download the script:
curl -O https://raw.githubusercontent.com/kothari-nikunj/wrap2025/main/people_wrapped.py- Start Claude Code with permissions disabled (needed for file writes):
claude --dangerously-skip-permissions- In Claude Code, say:
Run python3 people_wrapped.py
-
Wait ~10 minutes for extraction + AI summaries
-
Open
people_wrapped_2025.htmlin your browser
The "trick" is that Claude Code itself generates the summaries - no API key needed:
- Script extracts your top 25 contacts from iMessage/WhatsApp
- Script prints instructions for Claude Code
- Claude Code reads the message files and writes personalized summaries
- Script builds a swipeable HTML report
- Personalized 3-4 paragraph summaries for each contact
- Direct quotes from your conversations
- Themes, inside jokes, memorable moments
- How the relationship evolved through the year
- Tone matched to relationship type (family, partner, friend, colleague)
Made by @nikunj
Not affiliated with Apple, Meta, Spotify, or WhatsApp.
MIT