All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.1.0 - 29th of January 2026
- Added a method to clear the remote device lists for all loaded backends.
- Added a new module "cli" to hold debug CLI functionality. The CLI module has additional dependencies that will only be installed when explicitly requested using "pip install omemo[cli]".
- Added the first CLI function "debug_encryption" to gather helpful information to debug encryption issues.
- Drop support for Python3.9 and PyPy3.10, add support for Python3.14
- Updated pylintrc with the newest options
- 2026 maintenance
2.0.0 - 25th of June, 2025
- Added three new abstract methods related to device label handling to
Backend. - Added device label signing and signature verification capabilities as per XEP-0384 version 0.9.0.
- Modified the public device list API to include a signature for device labels.
1.3.0 - 24th of June, 2025
- A new method
shutdownto gracefully quit internal tasks
- Removed type annotations from enum members in accordance with a new mypy rule
- Simplified the
JSONTypetype now that recursive aliases are properly supported
- Removed project.py and simplified version.py as part of the migration towards pyproject.toml
1.2.0 - 15th of October, 2024
- Slightly improved logging for less spam and more clarity
- Drop support for Python3.8, add support for Python3.13, bump PyPy test version to 3.10
- Internal housekeeping, mostly related to pylint
1.1.0 - 28th of September, 2024
- No changes; the last release should have been a new minor version.
1.0.5 - 25th of September, 2024
- A new method
refresh_device_liststhat callsrefresh_device_listfor all loaded backends.
1.0.4 - 14th of July, 2024
- Attempt to fix a storage data inconsistency where namespace support is stored for a device but activity information is not
1.0.3 - 9th of July, 2024
- Removed unnecessary complexity/flexibility by returning
Noneinstead ofAnyfrom abstract methods whose return values are not used - The bundle publishing logic in the signed pre key rotation did not correctly double the retry delay
- Log message improvements
- 2024 maintenance (bumped Python versions, adjusted for updates to pydantic, mypy, pylint, pytest and GitHub actions)
- Fixed a bug where a modified bundle might not be uploaded correctly
1.0.2 - 4th of November, 2022
- A new exception
BundleNotFound, raised by_download_bundle, to allow differentiation between technical bundle download failures and the simple absence of a bundle
- A small change in the package detection in setup.py led to a broken PyPI package
- Improved download failure exception semantics and removed incorrect raises annotations
1.0.1 - 3rd of November, 2022
- Python 3.11 to the list of supported versions
1.0.0 - 1st of November, 2022
- Complete rewrite of the library (and dependencies) to use asynchronous and (strictly) typed Python 3.
- Support for different versions of XEP-0384 via separate backend packages.
- Mostly following Keep a Changelog now (except for the date format).
0.14.0 - 12th of March, 2022
- Adjusted signature of the
SessionManager.encryptRatchetForwardingMessagemethod to accept exactly one bare JID + device id pair - Updated the license in the setup.py, which was desync with the LICENSE file
- Adjusted the copyright year
- Removed Python 3.4 from the list of supported Python versions
- Removed some mentions of Python 2 from the README
0.13.0 - 15th of December 2021
- Added a method to retrieve the receiving chain length of a single session form the
SessionManager
- The storage interface has been modified to use asyncio coroutines instead of callbacks.
- All methods of the session manager that returned promises previously have been replaced with equivalent asyncio coroutines.
- Dropped Python 2 support and removed a bit of Python 2 compatibility clutter
- Removed synchronous APIs
- Removed thread-based promise implementation in favor of asyncio futures and coroutines
0.12.0 - 28th of March, 2020
- The
JSONFileStoragenow encodes JIDs using hashes, to avoid various issues regarding the file system. WARNING, THERE ARE KNOWN ISSUES WITH THIS VERSION OF THE STORAGE IMPLEMENTATION. - Sending 12 byte IVs instead of 16 now.
SessionManager.encryptKeyTransportMessagenow receives the optional plaintext as a parameter directly, instead of using a callback to encrypt external data. If the plaintext is omitted, a shared secret is returned that can be used for purposes external to this library.- Switched to MIT license with the agreement of all contributors!
- Fixed the way key transport messages are sent and received to be compatible with other implementations.
0.11.0 - 13th of December, 2019
- Added a new method
resetTrust, which allows going back to the trust levelundecided.
- Merged the
trustanddistrustmethods intosetTrust. Storage.storeTrustmust now be able to handle the valueNonefor thetrustparameter.
- Removed the
SessionManagerAsyncIO, in preparation for the big Python 3 update coming soon™.
- Fixed a bug in the
SessionManager, where the contents of a parameter (passed by reference) were modified.
0.10.5 - 21st of July, 2019
- Fixed two bugs in the
JSONFileStorageimplementation. - Fixed a type issue in the
__str__of theTrustException. - Fixed a rare bug where sessions uncapable of encrypting messages would be stored.
0.10.4 - 1st of February, 2019
- Added an implementation of the storage using a simple directory structure and JSON files.
RatchetForwardingMessagesdo not require the recipient to be trusted any more, as they contain no user-generated content. See #22 for information.- Renamed
UntrustedExceptiontoTrustExceptionand added a fourth fieldproblemto get the type of problem (untrusted vs. undecided).
0.10.3 - 29th of December, 2018
- Added a method for requesting trust information from the storage at bulk. This can be overridden for better performance.
- Added a method for requesting sessions from the storage at bulk. This can be overridden for better performance.
- Added a public method to delete an existing session. This is useful to recover from broken sessions.
- Added a public method to retrieve a list of all managed JIDs.
- Added a stresstest, mostly to test recursion depth.
- Turned the changelog upside-down, so that the first entry is the newest.
- Modified
no_coroutinein the promise lib to use a loop instead of recursion. - Modified the promise constructor to run promises in threads.
0.10.2 - 29th of December, 2018
- Added methods to retrieve trust information from the
SessionManager:getTrustForDeviceandgetTrustForJID.
- Introduced an exception hierarchy to allow for more fine-grained exception catching and type checking.
- Most exceptions now implement
__str__to generate human-readable messages.
- Fixed a bug that tried to instantiate an object of the wrong class from serialized data.
0.10.1 - 27th of December, 2018
- Added CHANGELOG.
- Upon serialization the current library version is added to the serialized structures, to allow for seamless updates in the future.