iMessage in Emacs
The why
Regular readers know the pattern by now: if something can be done in Emacs, I will eventually do it in Emacs.
Then why not have my iMessages living here as well?!
So I made timu-imessage – a package to read and send iMessages without leaving Emacs. Well… I told Claude Code what I wanted.
What does it do?
- A chat list with your entire message history, unread counts included.
- Conversation buffers that update live as messages arrive – with tapbacks, threaded replies and inline images.
- Full-text search across every message you ever received, in milliseconds.
- Sending from the minibuffer.
- Org integration: a single key captures the message at point with a link back to it.
It reads straight from the Messages database on your Mac. Sending goes through a small companion Shortcut.
Installation
Clone the repository, then:
(use-package timu-imessage
:load-path "/path/to/emacs-imessage"
:commands (timu-imessage timu-imessage-search timu-imessage-doctor)
:bind (("C-c i i" . timu-imessage) ;; or whatever keybindings you prefer
("C-c i s" . timu-imessage-search)))
You need Emacs 29.1+ with built-in SQLite, Full Disk Access for Emacs and the companion Shortcut from the shortcuts/ directory in the repo – double-click, confirm, done.
My favorite part: M-x timu-imessage-doctor checks all of the above for you and even opens the right System Settings pane for anything missing.
Usage
M-x timu-imessage opens the chat list, RET opens the conversation at point. In a conversation:
| Key | Action |
|---|---|
c |
Compose in the minibuffer and send |
a |
Open attachment of the message at point |
i |
Toggle inline images |
o |
Org-capture the message at point |
g |
Re-render from the database |
q |
Quit |
Bottom line
Does this thing really need to exist? No. Is it really cool, that I can prompt this in a few hours combined though? Damn right it is.
I have been using this for my messages for a little while now and it works like a charm.
Bonus: This beeing on a Mac and pulling from the Messages.app db, I get SMSs in here as well.
Feel free to give it a spin and give me some pointers!