jabber.el is an XMPP client for Emacs, originally written in 2003. Development slowed over the years, though contributors kept the package working across Emacs releases.
I took over as maintainer with the goal of modernizing the protocol support.
Now, jabber.el is the most XEP-complete text-based client in existence.
What Changed
For those, like me, who count XEPs like Pokemon:
- OMEMO encryption (XEP-0384) via a C dynamic module wrapping picomemo
- OMEMO media sharing (XEP-0454)
- OpenPGP for XMPP (XEP-0373) using Emacs’ built-in EPG
- Stream Management (XEP-0198) with session resume
- Message Archive Management (XEP-0313)
- Message Carbons (XEP-0280)
- Delivery Receipts (XEP-0184) and Chat Markers (XEP-0333)
- Message Correction (XEP-0308), Replies (XEP-0461), Moderation (XEP-0424/0425)
- Chat State Notifications (XEP-0085)
- Client State Indication (XEP-0352)
- Blocking Command (XEP-0191)
- HTTP File Upload (XEP-0363)
- Direct TLS (XEP-0368) with dual SRV lookup
- Real Time Text (XEP-0301)
- PubSub (XEP-0060)
- Bookmarks (XEP-0402 with XEP-0048 fallback)
- SQLite message storage replacing flat-file history
- MUC Self-Ping (XEP-0410)
Almost caught them all
No other text-based XMPP client has this level of protocol coverage. jabber.el now rivals Dino and Gajim, the major graphical clients.
OMEMO
OMEMO requires a Signal Protocol implementation. That means C.
jabber-omemo-core.c is 763 lines wrapping picomemo through Emacs'
dynamic module API. The Elisp layer handles XMPP integration: PubSub
bundle publishing, stanza encryption, session persistence in SQLite, and
trust management.
It also provides AES-256-GCM for OMEMO media sharing (XEP-0454).
Why Emacs
Emacs is not just the editor I write jabber.el in. It is the runtime, the test harness, and the application.
I develop in the same instance where I chat. Fix a bug, eval changes, and the fix is live in my running session. Seconds, not minutes.
Emacs provides most of what a chat client needs out of the box: SQLite for storage, GnuTLS for encryption, EPG for OpenPGP, EWOC for list display, Transient for menus.
Distribution is through NonGNU ELPA, which handles everything.
jabber.el is just an M-x package-install RET jabber RET away from
install.
Why XMPP
XMPP is the only federated, open-standard messaging protocol that works in practice. I use it for all my daily communication. My friends are on WhatsApp, Discord and IRC – gateways bridge these networks transparently.
One client, one interface, every chat network I need.
More on the gateway setup I use in a future post.
What’s Next
- XEP-0444 Message Reactions
- OMEMO 0.8+ (picomemo supports both; the C layer is ready)
- Roster rework – flat, query-based contact list sorted by activity