jabber 
- Description
- XMPP/Jabber client
- Latest
- jabber-0.15.1.tar (.sig), 2026-Nov-01, 2.01 MiB
- Maintainer
- Thanos Apollo <public@thanosapollo.org>
- Other versions:
- development 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.tar.lz | 2026-Oct-02 | 329 KiB |
| jabber-0.14.0.tar.lz | 2026-Sep-05 | 316 KiB |
| jabber-0.13.2.tar.lz | 2026-Aug-28 | 301 KiB |
| jabber-0.13.1.tar.lz | 2026-Aug-07 | 298 KiB |
| jabber-0.13.0.tar.lz | 2026-Aug-05 | 298 KiB |
| jabber-0.12.5.tar.lz | 2026-Jul-28 | 274 KiB |
| jabber-0.12.4.tar.lz | 2026-Jul-26 | 273 KiB |
| jabber-0.12.3.tar.lz | 2026-Jul-25 | 266 KiB |
| jabber-0.12.2.tar.lz | 2026-Jul-13 | 262 KiB |
| jabber-0.12.1.tar.lz | 2026-Jul-11 | 261 KiB |
| jabber-0.12.0.tar.lz | 2026-Jul-08 | 256 KiB |
| jabber-0.11.1.tar.lz | 2026-Jun-26 | 250 KiB |
| jabber-0.11.0.tar.lz | 2026-Jun-14 | 247 KiB |
| jabber-0.10.10.tar.lz | 2026-May-30 | 187 KiB |
| jabber-0.10.9.tar.lz | 2026-May-15 | 186 KiB |
| jabber-0.10.8.tar.lz | 2026-May-11 | 185 KiB |
| jabber-0.10.7.tar.lz | 2026-May-09 | 191 KiB |
| jabber-0.10.6.tar.lz | 2026-Apr-30 | 190 KiB |
| jabber-0.10.1.tar.lz | 2026-Apr-03 | 183 KiB |
| jabber-0.10.0.tar.lz | 2026-Apr-02 | 180 KiB |
News
1. [0.15.1]
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. - Store a sender's reaction timestamp and reactions as one database change. A storage error or quit no longer leaves a partial snapshot whose newer timestamp makes the same live or archived update look stale on retry.
- Look up reply and reaction targets through the identity indexes instead of scanning a conversation's history, keeping room-ID precedence, the historical server-ID fallback and ambiguity checks unchanged.
- Stop exact archive replays from rewriting stored messages and their search index; thread views read only the messages they display.
- Let historical room archive messages stored without a room stanza ID be replied to and reacted to again: upgrading copies their room archive ID into the message when that ID is unambiguous within the room (#81).
- Keep that upgrade fast on large histories: identity changes no longer rewrite the search index, and Emacs reports when it upgrades the database.
- Store each archived message in its own short database transaction instead of holding one open across archive page requests, so a failed page no longer rolls back unrelated live messages or OMEMO state, and a retry decrypts from the restored state (#87).
- Stay in rooms where we are an admin or owner on Prosody. Its unavailable presence from the bare room JID, which lists absent affiliated members, no longer counts as our own departure; the room's own departure notices still come from our occupant JID and are still honoured.
- Stop announcing "has left the chatroom" on join for members who were never in the room; Prosody lists absent members with reserved nicknames that way.
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
… …