About

jabber.el is an XMPP client for Emacs.

See the xmpp.org page for the full list of supported XEPs.

Requirements

  • Emacs 29.1 or later, compiled with dynamic module support

OMEMO encryption (optional)

OMEMO end-to-end encryption requires building a native C module. You need a C compiler, pkg-config, and libmbedtls (the development headers). On first load, Emacs will prompt to build the module automatically.

Installation

jabber.el is available via NonGNU ELPA.

You can install it via M-x package-install RET jabber

package-vc (Emacs 30+)

(use-package jabber
  :ensure nil
  :vc (:url "https://git.thanosapollo.org/emacs-jabber/"
            :branch "master"
            :rev :newest
            :lisp-dir "lisp")
  :custom
  (jabber-account-list '(("[email protected]")))
  :config
  (jabber-modeline-mode 1)
  :bind-keymap (("C-x C-j" . jabber-global-keymap))
  :hook (kill-emacs . jabber-disconnect))

GNU Guix

The repository ships a guix.scm that builds straight from the current working tree, so you never need to update hashes or pin a commit. Whatever is checked out is what gets installed. Picomemo is fetched as a pinned input by guix.scm, so the optional OMEMO submodule does not need to be initialised.

git clone https://git.thanosapollo.org/emacs-jabber/
cd emacs-jabber

One-shot install into your user profile:

guix package -f guix.scm

A development shell with all build dependencies:

guix shell -D -f guix.scm

To use emacs-jabber from a Guix Home configuration, load the package definition and reference it from your services:

(use-modules (gnu home)
             (gnu home services)
             (gnu home services guix)
             (gnu services)
             (guix channels)
             (guix gexp))

(define emacs-jabber-git
  (load "/path/to/emacs-jabber/guix.scm"))

(home-environment
 (packages (list emacs-jabber-git)))

Re-run guix home reconfigure after pulling new commits and the package will be rebuilt from the updated checkout.

Configuration

Accounts are configured via jabber-account-list. The simplest form uses auth-source ~/.authinfo.gpg for passwords:

(setq jabber-account-list '(("[email protected]")
                             ("[email protected]")))

With pass (password-store):

(setq jabber-account-list
      `(("[email protected]"
         (:password . ,(auth-source-pass-get 'secret "xmpp/example.org/user")))))

Basic commands

KeyCommand
M-x jabber-connectConnect (prompts for account)
C-x C-j C-cConnect all accounts
C-x C-j C-dDisconnect
C-x C-j C-rOpen roster buffer
C-x C-j C-jStart or switch to a chat
C-x C-j C-mJoin/switch to a MUC (groupchat)
C-x C-j C-bSwitch to a chat buffer