jabber 
- 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.el is an XMPP client for Emacs.
See the xmpp.org page for the full list of supported XEPs.
- Homepage
- Source:
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-rosterorC-x C-j C-rto get started.
Old versions
| jabber-0.15.0.0.20261005.4.tar.lz | 2026-Oct-05 | 331 KiB |
| jabber-0.15.0.0.20261002.0.tar.lz | 2026-Oct-02 | 329 KiB |
| jabber-0.14.0.0.20260930.30.tar.lz | 2026-Sep-30 | 327 KiB |
| jabber-0.14.0.0.20260927.27.tar.lz | 2026-Sep-27 | 327 KiB |
| jabber-0.14.0.0.20260907.4.tar.lz | 2026-Sep-08 | 316 KiB |
| jabber-0.13.2.0.20260901.5.tar.lz | 2026-Sep-03 | 305 KiB |
| jabber-0.13.1.0.20260824.8.tar.lz | 2026-Aug-24 | 300 KiB |
| jabber-0.12.5.0.20260802.22.tar.lz | 2026-Aug-02 | 297 KiB |
| jabber-0.11.1.0.20260702.1.tar.lz | 2026-Jul-02 | 250 KiB |
| jabber-0.10.10.0.20260612.57.tar.lz | 2026-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=1to 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 andjabber-avatar-setaccept 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-ownerreturns its connection. Direct symbol-property reads on WHO remain supported. jabber-read-jid-completingaccepts 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
… …