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