A keepsake from your texts

The Receipts

Turn your iMessage history with one person into a beautiful by-the-numbers page and a random-day diary. Your data never leaves your machine.

Demo The numbers below are completely fake — generated to show what the page looks like. Run it on your own messages to see your real receipts. Make your own ↓
By the Numbers

The receipts.

A random page

From the diary.

Activity

Every day, mapped.

fewer more · click any day
Greatest hits

Words & emojis.

Top emojis
    Most-used words
      When

      By hour, by weekday.

      Hour of day
      Day of week
      Make your own

      Run it on your texts.

      This is two small Python scripts that read your Mac's local Messages database and produce a single static HTML file with the same charts you see above — about your conversation with one person.

      🔒 Privacy: everything runs locally on your Mac. The scripts only read a copy of your messages DB and write static files to disk. Nothing is uploaded, no servers are involved, no analytics. The viewer page itself is just HTML + JS that loads a local data file.

      You'll need

      Steps

      1. Download the scripts:
      2. Copy your live Messages database to your Desktop so we never touch the original:
        cp ~/Library/Messages/chat.db ~/Desktop/chat_copy.db
      3. Export the conversation with one person (phone or email):
        python3 export_conversation.py --contact "+15551234567"
        This writes ./out/conversation.json and ./out/conversation.csv.
      4. Build the viewer data:
        python3 build_viewer.py
        This writes ./viewer/viewer-data.js.
      5. Drop the downloaded index.html into the same ./viewer/ folder, then serve it:
        cd viewer
        python3 -m http.server 4567
        Open http://localhost:4567.

      Older messages missing?

      If you only see recent history, your Mac may not have the older messages locally. Turn on Messages in iCloud on both iPhone and Mac and click Sync Now, or make a Finder backup of your iPhone and point the script at the sms.db file inside it (its hashed filename is 3d0d7e5fb2ce288813306e4d4636395e047a3d28).