Skip to content

Releases: conversejs/converse.js

14.0.0 (2026-06-26)

Choose a tag to compare

@jcbrand jcbrand released this 26 Jun 08:25
v14.0.0
c9d0c14

🔒 This release adds support for OMEMO:2 encryption. 🔒

  • #1472: feat(omemo): remember the per-chat encryption (on/off) state across chat-close and re-login

  • #2097: fix(omemo): surface an error for an undecryptable OMEMO message instead of silently dropping it when it carries no fallback body

  • #2336: fix(omemo): hide the encryption toggle on an untrusted device, where OMEMO can't be used

  • #2606: fix(omemo): hiding media now also hides decrypted OMEMO media instead of re-rendering it

  • #2632: fix(omemo): preserve the original filename when downloading a received encrypted image

  • #4041: fix: strip trailing slashes from assets_path to prevent double-slash asset URLs

  • #4076: fix(omemo): don't send encrypted MUC messages to banned (outcast) or non-affiliated occupants

  • Remove client-compress and use browser APIs

  • feat(pubsub): Add new API methods to create, subscribe and unsubscribe.

  • feat(version): Add XEP-0092 Software Version support and show the server's software version in the profile modal

  • feat: add support for OMEMO 2 (urn:xmpp:omemo:2), using Stanza Content Encryption (XEP-0420)

  • fix(omemo): Detect omemo:2-only contacts as OMEMO-capable

  • fix(omemo): Enable self-healing of abandoned or unpublished bundle

  • fix(omemo): Gracefully handle contact device listed but bundle not published

  • fix(theme): Clear the background class list before setting theme attributes.

  • fix: Prior theme CSS class is not removed when changing the theme dynamically.

  • fix: isTrustedIdentity in OMEMO store wasn't properly loading the identity

  • fix: broadcast presence when the chat status (show) is cleared

  • fix: the idle status flag could never be cleared, leaving stale idle presence after the user became active again

  • refactor: Drop deprecated Karma test runner and Jasmine testing library and use Vitest instead.

Backwards incompatible changes

  • OMEMO now uses a WebAssembly crypto module (libomemo). If you serve Converse under a strict Content-Security-Policy, you must add 'wasm-unsafe-eval' to your script-src directive, otherwise OMEMO fails to initialize with a WebAssembly.instantiate() CSP error. This token is much narrower than 'unsafe-eval' (it permits WASM compilation only).
    See the security docs for the recommended CSP.
  • api.modal.show no longer takes a modal instance as first parameter
  • The CJS build has been removed. Only ESM builds are produced. If you include Converse via a <script> tag, you must add type="module": <script type="module" src="converse.js"></script>. Any inline scripts calling converse.initialize() must also use type="module".
  • #2405: Hide the trusted device login checkbox when persistent browser storage is unavailable.

14.0.0-beta.4 (2026-06-22)

Pre-release

Choose a tag to compare

@jcbrand jcbrand released this 22 Jun 14:04
v14.0.0-beta.4
253b322
  • Bump libomemo.js to version 2.0.2
  • fix(omemo): Enable self-healing of abandoned or unpublished bundle
  • fix(omemo): Gracefully handle contact device listed but bundle not published
  • fix(theme): Clear the background class list before setting theme attributes.
  • feat(pubsub): Add new API methods to create, subscribe and unsubscribe.

14.0.0-beta.3 (2026-06-19)

Pre-release

Choose a tag to compare

@jcbrand jcbrand released this 19 Jun 09:54
v14.0.0-beta.3
0e5c633
  • Bump libomemo.js to version 2.0.1

14.0.0-beta.2

14.0.0-beta.2 Pre-release
Pre-release

Choose a tag to compare

@jcbrand jcbrand released this 18 Jun 13:09
v14.0.0-beta.2
df74085
  • Remove client-compress and use browser APIs

14.0.0-beta.1

14.0.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@jcbrand jcbrand released this 18 Jun 11:42
v14.0.0-beta.1
63ed37e
  • #1472: feat(omemo): remember the per-chat encryption (on/off) state across chat-close and re-login
  • #2097: fix(omemo): surface an error for an undecryptable OMEMO message instead of silently dropping it when it carries no fallback body
  • #2336: fix(omemo): hide the encryption toggle on an untrusted device, where OMEMO can't be used
  • #2606: fix(omemo): hiding media now also hides decrypted OMEMO media instead of re-rendering it
  • #2632: fix(omemo): preserve the original filename when downloading a received encrypted image
  • #4041: fix: strip trailing slashes from assets_path to prevent double-slash asset URLs
  • #4076: fix(omemo): don't send encrypted MUC messages to banned (outcast) or non-affiliated occupants
  • feat: add support for OMEMO 2 (urn:xmpp:omemo:2), using Stanza Content Encryption (XEP-0420)
  • fix: isTrustedIdentity in OMEMO store wasn't properly loading the identity
  • fix: broadcast presence when the chat status (show) is cleared
  • fix: the idle status flag could never be cleared, leaving stale idle presence after the user became active again

Backwards incompatible changes

  • api.modal.show no longer takes a modal instance as first parameter
  • The CJS build has been removed. Only ESM builds are produced.
    If you include Converse via a <script> tag, you must add type="module":
    <script type="module" src="converse.js"></script>.
    Any inline scripts calling converse.initialize() must also use type="module".
  • #2405: Hide the trusted device login checkbox when persistent browser storage is unavailable.

13.0.1 (2026-05-27)

Choose a tag to compare

@jcbrand jcbrand released this 27 May 19:00
v13.0.1
7457bb8
  • Fix attribution bug where wrong JID is applied to message based on reactions
  • Strip xmpp: prefix and query params from MUC JID entered in join modal

13.0.0 (2026-05-20)

Choose a tag to compare

@jcbrand jcbrand released this 20 May 06:53
v13.0.0
  • #1855: Use default or locked domain when adding contacts or starting new chats
  • #2311: Strip locked MUC domain from room address input to avoid mangled JIDs
  • #2398: Add support for XEP-0444: Message Reactions (see XEP-0444)
  • #2740: Add autocomplete of possible XMPP servers when registering a new account
  • #2857: Fix underscores and other styling directives inside URLs being mistakenly treated as emphasis markers
  • #2929: Add XMPP providers autocomplete when adding contacts (new autocomplete_providers_url setting)
  • #3023: Fix empty roster group name treated as a valid group instead of "Ungrouped"
  • #3382: Fix audio player accessibility for screen reader users (NVDA, JAWS)
  • #3502: Fix custom emoji shortnames overlapping with built-in emoji shortnames
  • #3815: Removal of boomark leads to new bookmark named Symbol(lit-nothing)
  • #3824: Dates and times are not translated
  • #3829: Rich text from LibreOffice Calc is sent as screenshots
  • #3830: The message textarea blocks undo of the pasted text
  • #3839: Fix contacts menu displayed off-screen in fullscreen mode
  • #3863: Shift unescapeHTML helper function (used to set isOnlyEmoji on a message) to converse-headless
  • #3885: Don't show contact approval alerts when allow_contact_requests is false (e.g. anonymous mode)
  • #3886: Don't show OMEMO padlock icon when libsignal is not available (e.g. anonymous mode)
  • #3889: MUC join: Use room jids localpart as name in case name or identity not found
  • #3710: Fix autocomplete adding a trailing space when selecting a group name with the mouse
  • #3916: Add support for XEP-0461 Message Replies, allowing users to reply to specific messages
  • #3939: Don't show invitations to groupchats in which the user is already present
  • #3941: add adhoc completed command result and text-multi as merged lines of text
  • #3989: properly display occupant hats in details dialog
  • Don't render unfurls for retracted messages.

12.0.0 (2025-08-28)

Choose a tag to compare

@jcbrand jcbrand released this 28 Aug 15:32
  • #3581: Don't unnecessarily regenerate pot and po files
  • #3700: Fix exception that occurs when optional cp attribute is missing
  • #3714: Don't include maxstanzas if no value is available
  • #3719, #3770: Handle connection._sasl_mechanism not being defined
  • #3730: QR Code doesn't work on dark backgrounds
  • #3764: Create an ESM build for @converse/headless
  • #3769: Various OMEMO fixes
  • #3791: Fetching pubsub node configuration fails
  • #3792: Node reconfiguration attempt uses incorrect field names
  • Add approval banner in chats with requesting contacts or unsaved contacts
  • Add mongolian as a language option
  • Breaking: Strophe.shims has been removed. Instead, just use the globals.
  • Create ESM builds of converse.js and converse-headless.js
  • Moved jsdom and ws from optionalDependencies to peerDependencies
  • New API method api.disco.entities.find to return all entities that implement a specific feature.
  • Regional locales weren't being applied.
  • Registration: Use https://providers.xmpp.net instead of https://compliance.conversations.im
  • Replace webpack with rspack
  • Set up a test runner for @converse/headless so that the headless tests use the headless build
  • Show approval alert in chats with unsaved contacts
  • Some fixes regarding manually resized chats in overlayed view mode.
  • Update controlbox to not show logo, navbar and version while connecting
  • Updated translations
  • bugfix: Don't show closed MUCs in the rooms list
  • bugfix: dragresize resistance not applied

11.0.1 (2025-06-09)

Choose a tag to compare

@jcbrand jcbrand released this 09 Jun 13:23
v11.0.1
  • #3672: Images not rendering
  • #3676: Flyout box is not positioned correctly on mobile devices in "overlayed" mode
  • #3689: Chat view not accesible for certain widths in "fullscreen" mode
  • Remove modal from the DOM when it's closed
  • Fix login form style for classic theme
  • Fix css for the headlines feed
  • Properly handle OGP metadata that doesn't have an image
  • Fix TypeError which prevents logging out
  • Fix auto zoom in when input message in ios safari
  • Add a service discovery browser to the settings modal
  • Add a modal to view blocked XMPP addresses
  • Check for PubSub config-node-max feature before using the max value

11.0.0 (2025-05-21)

Choose a tag to compare

@jcbrand jcbrand released this 21 May 08:18
v11.0.0

Note: The Desktop version of Converse can be downloaded here:
https://github.com/conversejs/converse-desktop/releases

Github Issues

  • #122: Set horizontal layout direction based on the language
  • #317: Add the ability to render audio streams. New config option fetch_url_headers
  • #690: Allow setting a custom name and the group for an existing contact
  • #698: Add support for MUC private messages
  • #1021: Message from non-roster contacts don't appear in fullscreen view_mode
  • #1038: Support setting node config manually
  • #1057: Removed the mobile view mode. Instead of setting view_mode to mobile, set it to fullscreen.
  • #1174: Show MUC avatars in the rooms list
  • #1181: Show OMEMO fingerprint as QR code
  • #1195: Add actions to quote and copy messages
  • #1303: Display non-contacts who sent us a message somehow in fullscreen
  • #1349: XEP-0392 Consistent Color Generation
  • #1700: Deleted pending contacts reappear after page reload
  • #1810: Create clickable link to load older MAM messages if there is no scrollbars.
  • #2118: Show reflected message in MUC
  • #2335: Support list virtualization of the message history
  • #2383: Add modal to start chats with JIDs not in the roster
  • #2586: Add support for XEP-0402 Bookmarks
  • #2623: Merge MUC join and bookmark, leave and unset autojoin
  • #2716: Fix issue with chat display when opening via URL
  • #2844: Contact stays in "pending contacts"
  • #2940: Avoid gaps in history when new message is received before MAM query is made
  • #2980: Allow setting an avatar for MUCs
  • #3033: Add the muc_grouped_by_domain option to display MUCs on the same domain in collapsible groups
  • #3038: Message to self from other client is ignored
  • #3038: Support showing yourself in the left sidebar. Adds new config option show_self_in_roster.
  • #3100: fixed width .box-flyout breaks responsive design in embedded, mobile viewport mode.
  • #3155: Some ad-hoc commands not working
  • #3155: Some adhoc commands aren't working
  • #3299: Registration fails when a password contains an &
  • #3300: Adding the maxWait option for debouncedPruneHistory
  • #3302: debounce MUC sidebar rendering
  • #3305: New config option muc_search_service
  • #3307: Fix inconsistency between browsers on textarea outlines
  • #3337: Correctly display multiline nested quotes
  • #3340: Save draft messages when switching channels
  • #3362: Don't create empty nick element in bookmarks
  • #3386: Registration form is not fetched
  • #3464: Missing localization: the online status is not localized
  • #3476: better UI for form "fixed" fields
  • #3478: MUC participant status indicator misplaced
  • #3510: MUC's configuration panel loads endlessly, if it's jthe second one you want to configure
  • #3529: Unbookmarked channels no longer change their name when clicked with an unread indicator (or text icon)
  • #3579: Changing nickname in a groupchat once, forbids to change nickname in another groupchat afterwards
  • #3589: Hats namespace change

Bugfixes

  • Fix: MUC occupant list does not sort itself on nicknames or roles changes
  • Fix: refresh the MUC sidebar when participants collection is sorted
  • Fix: room information not correctly refreshed when modifications are made by other users
  • Fix: prevent busy-loop when session resumption fails
  • Fix: unhandled exception on new message arriving when user has not permitted playing audio in the browser
  • Fix: incorrect unread messages counter badge on the application icon after switching to new XMPP user
  • Fix: unhandled exception in disconnect function when controlbox is not shown by UI
  • Fix: "Click to mention..." title was misplaced in MUC occupant list.
  • Fix: removing the "add to contact" button in occupant modal in singleton mode (as there is no roster).
  • Fix: trying to use emojis with an uppercase letter breaks the message field.
  • Fix: renaming getEmojisByAtrribute to getEmojisByAttribute.
  • Fix: replace duplicated Romanian strings with correct values

Changes and features

  • Upgrade to the latest versions of XEP-0424 and XEP-0425 (Message Retraction and Message Moderation).
    Converse loses the ability to retract or moderate messages in the older format,
    so you might need to upgrade your XMPP server's implementation of these as well.
  • Embed the Spotify player for links to Spotify tracks. New config option embed_3rd_party_media_players.
  • Add support for XEP-0191 Blocking Command
  • Upgrade to Bootstrap 5
  • Add an occupants filter to the MUC sidebar
  • Change contacts filter to rename the anachronistic Online state to Available.
  • Enable reuse_scram_keys by default.
  • New loadEmojis hook, to customize emojis at runtime.
  • Add new themes Cyberpunk and Nordic and remove the old Concord theme.
  • Improved accessibility.
  • New "getOccupantActionButtons" hook, so that plugins can add actions on MUC occupants.
  • Update the "Add MUC" modal to add validation and to allow specifying only the MUC name and not the whole address.
  • MUC occupants badges: displays short labels, with full label as title.
  • New config option stanza_timeout
  • New config option lazy_load_vcards
  • New config option enable_roster_versioning
  • New config option rtl_langs for specifying languages for which
    Converse's UI should be shown in right-to-left order.

Default config changes

  • Make fullscreen the default view_mode.
  • Set auto_register_muc_nickname default to 'unregister' so that your
    nickname is automatically registered with a MUC upon entering and
    unregistered upon explicitly leaving the MUC (by closing it).
  • The allow_non_roster_messaging setting now defaults to true.

Breaking changes:

  • Removed the autocomplete_add_contact config setting. Auto-complete is now always enabled.
  • Remove the old _converse.BootstrapModal in favor of _converse.BaseModal which is a web component.
  • The connection is no longer available on the _converse object. Instead, use api.connection.get().
  • Add a new exports attribute on the _converse object which is meant for
    providing access for 3rd party plugins to code (e.g. classes) from
    converse.js. Some classes that were on the _converse object, like
    CustomElement are not on _converse.exports.
  • The windowStateChanged event has been removed. If you used it, rely on the
    visibilitychange event on document instead.
  • api.modal.create no longer takes a class, instead it takes the name of a custom DOM element.
  • getAssignableRoles and getAssignableAffiliations are no longer on the _converse object, but on the Occupant instance.
  • Removed the chatBoxFocused and chatBoxBlurred events.
  • Changed the signature of the api.contacts.add API method.
  • The deprecated API method api.settings.update has been removed. Use
    api.settings.extend instead.
  • Removed the default_state config option.