ELPA Logo NonGNU-devel ELPA: jabber

jabber Atom Feed

Description
XMPP/Jabber client
Latest
jabber-0.15.0.0.20261007.5.tar (.sig), 2026-Oct-07, 1.98 MiB
Maintainer
Thanos Apollo <public@thanosapollo.org>
Other versions:
release version
Website
https://git.thanosapollo.org/emacs-jabber/about/
ELPA's Repository
CGit or Gitweb
All Dependencies
fsm (.tar)
keymap-popup (.tar)

To install this package from Emacs, use package-install or list-packages.

Full description

1. About

jabber.svg

jabber.el is an XMPP client for Emacs.

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

2. Requirements

  • Emacs 29.1 or later, compiled with dynamic module support
  • fsm 0.2.0 or later
  • keymap-popup 0.2 or later

2.1. OMEMO encryption (optional)

OMEMO end-to-end encryption uses a native C module built from the vendored picomemo source. Build dependencies: a C compiler, pkg-config, and Mbed TLS 3.0 or later (mbedcrypto).

Build the module from the ELPA package directory:

cd /path/to/elpa/jabber-VERSION
make module

The resulting jabber-omemo-core.so (or .dylib on macOS) lands beside the Elisp files and is loaded automatically. If the module is missing, OMEMO use signals OMEMO module not compiled; if it exists but cannot be loaded, Jabber warns and continues without OMEMO.

If the Emacs that loads the module cannot see the library directory used at build time (for example a Nix development shell, or an Emacs linked against a different C library), link Mbed TLS statically:

make module MBED_STATIC=1

This needs libmbedcrypto.a and leaves the C library as the module's only runtime dependency. The repository's Nix development shell sets it by default; pass MBED_STATIC= to link dynamically there.

3. Installation

jabber.el is available via NonGNU ELPA. That is the only supported install path.

(use-package jabber
  :ensure t
  :config
  (setq jabber-account-list
        `(("user@example.org"
           (:password . ,(auth-source-pass-get 'secret "xmpp/example.org")))))
  (jabber-modeline-mode 1)
  :bind-keymap (("C-x C-j" . jabber-global-keymap))
  :hook (kill-emacs . jabber-disconnect))

4. Configuration

4.1. Authentication

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

(setq jabber-account-list '(("user@example.org")
                             ("second@account.org")))

4.2. SOCKS5 proxy

An account can connect through an unauthenticated SOCKS5 proxy:

(setq jabber-account-list
      '(("user@example.org"
         (:proxy . (:type socks5 :host "127.0.0.1" :port 9050)))))

The destination hostname is sent to the proxy rather than resolved locally. Proxy connections bypass SRV lookup and use the JID domain on port 5222, or :network-server and :port when those are configured. STARTTLS is supported. Direct TLS discovery, proxy authentication, and other proxy protocols are not supported for proxied accounts.

4.3. Bug references

(add-hook 'jabber-chat-mode-hook #'bug-reference-mode)

;; Customize references
(setq jabber-bug-reference-alist
      '(("jabber-el@conference\\.hmm\\.st"
         "\\(#\\([0-9]+\\)\\)"
         "https://todos.thanosapollo.org/r/emacs-jabber/%s")))

5. Basic commands

  • Use M-x jabber-roster or C-x C-j C-r to get started.

Old versions

jabber-0.15.0.0.20261005.4.tar.lz2026-Oct-05 331 KiB
jabber-0.15.0.0.20261002.0.tar.lz2026-Oct-02 329 KiB
jabber-0.14.0.0.20260930.30.tar.lz2026-Sep-30 327 KiB
jabber-0.14.0.0.20260927.27.tar.lz2026-Sep-27 327 KiB
jabber-0.14.0.0.20260907.4.tar.lz2026-Sep-08 316 KiB
jabber-0.13.2.0.20260901.5.tar.lz2026-Sep-03 305 KiB
jabber-0.13.1.0.20260824.8.tar.lz2026-Aug-24 300 KiB
jabber-0.12.5.0.20260802.22.tar.lz2026-Aug-02 297 KiB
jabber-0.11.1.0.20260702.1.tar.lz2026-Jul-02 250 KiB
jabber-0.10.10.0.20260612.57.tar.lz2026-Jun-12 199 KiB

News

1. Unreleased

1.1. Fixes

  • Leave the published OMEMO device list and bundles unchanged when fetching our own device list fails; distinguish authoritative empty lists from errors.
  • Preserve binary OMEMO module inputs on Neomacs runtimes that reject unibyte strings through the native string-copy API; keep GNU Emacs behavior unchanged.
  • Load the OMEMO module into any Emacs 28+ module interface, not only the one it was compiled against; disable OMEMO with a warning when the module cannot be loaded instead of failing to open chats.
  • Add MBED_STATIC=1 to link Mbed TLS into the module; the Nix development shell uses it so modules survive store garbage collection.

2. [0.15.0]

2.1. Changed

  • Synchronize server blocklists before fetching peer OMEMO keys; ignore stale blocklist replies and recheck blocked recipients before sending.
  • Verify received OpenPGP messages against the expected sender's signing key.
  • Test the declared minimum Emacs, pinned upstream Emacs and Thanos Emacs fork.

2.2. Fixes

  • Preserve chat drafts, undo history and reply navigation while updating the transcript; failed sends cannot restore stale text over a newer draft.
  • Keep popup help bindings and user keymap customizations across Lisp reloads.
  • Preserve encrypted attachment bytes under compressed filename suffixes.
  • Keep connection attempts, transport callbacks and queued stanza order attached to the session that owns them.
  • Retain archive query outcomes and pagination progress until storage commits; preserve unfetched history and reject conflicting message identities.
  • Preserve OMEMO trust and sessions on identity conflicts; keep encrypted room recipients attached to the current membership snapshot.
  • Preserve reply targets, retractions, reactions and receipt boundaries during live-message and archive replay.
  • Stop link-preview scanning from revisiting rejected URLs.
  • Exclude development administration files from ELPA archives.
  • Speed up archive duplicate lookup with indexed message identities instead of scanning a contact's history; preserve ambiguous-message and archive-UID checks.
  • Upgrade existing message databases non-destructively with origin-ID and room-ID indexes while retaining message, archive and encryption state.
  • Drop rejected incoming message corrections silently, including missing or ambiguous archive targets, instead of flooding *Messages*.
  • Keep contact names, presence, subscriptions, avatars and resource capabilities separate for each connection, including completion and background chat alerts.
  • Keep unread activity and subscription prompts attached to their originating account when several accounts share a contact or room.
  • Scope service-discovery observations and pending room errors to their connection; capability retries retain the advertising account and node.
  • Keep named resources independently selectable, preserving resource case.
  • Reclaim retired discovery observations when storing new observations, without clearing other live accounts or globally verified capabilities.

2.3. Extension compatibility

  • Restart Emacs disconnected before first using this version. Existing live global-symbol rosters and pending-room tables are not migrated by reloading Lisp files.
  • jabber-jid-symbol, the roster/display/bookmark name helpers and jabber-avatar-set accept a final optional connection argument. Pass it when reading or writing automatic roster metadata. Without it, these APIs use only supplied symbols or legacy accountless data, never a guessed account.
  • Presence hooks and title callbacks keep their existing arities. Their WHO argument is an account-scoped symbol; jabber-jid-owner returns its connection. Direct symbol-property reads on WHO remain supported.
  • jabber-read-jid-completing accepts the connection as its seventh argument. An explicitly selected empty account does not fall back to other rosters.
  • Activity entries now retain connection/JID pairs internally. Existing custom

… …