Changelog
All notable changes to this project will be documented in this file.
0.18.0 - 2026-06-02
Added
- Add
Room::compute_joined_service_membersto compute the number of joined service members in a room. This is needed for calculating display names ofSpaceRooms with service members. (#6561) - Add
RoomInfo::fully_read_event_idandRoom::fully_read_event_idto expose the user’sm.fully_readevent ID. (#6569)
Changed
Client::sync_onceacquires the state store lock when processing a sync and response and holds it until processing has completed. This mimics the behavior ofSlidingSync::sync_once. (#6555)- [breaking]
RoomInfoNotableUpdateReasonsis now au16to include aFULLY_READflag to notify on changes of them.fully_readmarker. (#6569)
[0.17.0] - 2026-05-08
Bug fixes
Filter out service members from
Room::heroes. This should be done by the homeservers, but some don’t. (#6535)Room keys are now rotated whenever the client fully reloads the member list by making a request to
/members, which prevents clients using keys that may have been shared under MSC4268 even if a gappy sync occurs. (#6339)Fix invited/knocked rooms disappearing from the room list after join → leave/kick → re-invite when using Sliding Sync. The SDK now always emits a room update so the room is surfaced correctly again. (#6126)
[breaking]
BaseClient::room_info_notable_update_senderhas moved intoBaseStateStore.BaseStateStore::derive_from_otherandBaseStateStore::get_or_create_roomno longer takes aroom_info_notable_update_senderargument. (#6130)[breaking] New
LatestEventValue::LocalHasBeenSentvariant to represent a local event that has been sent successfully. (#5968)
Features
- [breaking] Add
RoomSummary::active_service_membersfield to act as a cached value that will be computed when we sync members. RenameRoom::is_dmtoRoom::compute_is_dmsince it will now also store the computed active service members count in the new cached field.Room::active_service_membersis nowRoom::update_active_service_membersfor the same reason. (#6537) - [breaking] Enforce atomic and synchronized updates to
RoomInfo. RequiresStateStore::save_changesto acquire state store lock and replacesRoom::set_room_infowith an atomic version,Room::update_room_info, which is also synchronized by the state store lock. (#6478) - Add
RoomMember::is_service_memberthat automatically checks the room info and retrieves this info. (#6536) - [breaking] Add
DmRoomDefinitionenum, allowing clients to specify what a DM room should look like. ARoom::is_dmmethod was added to check if a room is a DM room too, using this definition. (#6490) - Add
Room::active_room_members, returning a list of all the service room members that are active in the room. (#6843) - Add support in the
MemoryStore’s implementation ofEventCacheStorefor having duplicate events in a room, where each duplicate is in a differentLinkedChunk. This is useful, e.g., when an event is in a room and a thread in that room. (#6200) - Add
StateStore::upsert_thread_subscriptions()method for bulk upserts. (#5848) - The
LatestEventValue::LocalHasBeenSentvariant gains a newevent_id: OwnedEventIdfield. (#5977) - [breaking]
RelationalLinkedChunk::apply_updatesreturns an error rather than panicking. This is necessary in order to ensure certain behaviors are disallowed. (#6061) - Add
RoomInfo::active_room_call_consensus_intent()method to get the call intent for the current call, based on what members are advertising. (#6274) - Add
Room::is_callto check for Call rooms (MSC3417) (#6315)
Refactor
- [breaking]
TtlStoreValuewas moved and renamed tomatrix_sdk_common::ttl::TtlValue. (#6463, #6484) - [breaking]
Gap::prev_tokenhas been renamed toGap::tokensince it’s now used for both the previous batch token and the next batch token. (#6236) - [breaking] Invite acceptance details are no longer stored in
RoomInfo, and the accessorsRoomInfo.invite_acceptance_details()andRoom::invite_acceptance_detailshave been removed. Instead, equivalent details are stored in the Crypto store, and, provided thee2e-encryptionfeature is enabled, are accessible viaBaseClient::get_pending_key_bundle_details_for_room. (#6199) - [breaking]
once_cellis no longer reexported from this crate. The types that were stabilized in the Rust standard library can be used instead in most cases. (#6194) - [breaking] All the
*StoreLockstructs use aCrossProcessLockConfignow instead of the previousholdervalue and so doesStoreConfigandBaseClient::clone_with_in_memory_state_store. Passing aCrossProcessLockConfig::MultiProcesswill keep the same behaviour we had where the client uses the cross process lock and usingCrossProcessLockConfig::SingleProcess` will disable the cross process lock. (#6061) - [breaking] The
StateStore::upsert_thread_subscriptionmethod has been removed in favor of a bulk methodStateStore::upsert_thread_subscriptions. - [breaking] The
message-idsfeature has been removed. It was already a no-op and has now been eliminated entirely. (#5963)
[0.16.1] - 2026-05-08
No notable changes in this release.
[0.16.0] - 2025-12-04
Security fixes
- Skip the serialization of custom join rules in the
RoomInfowhich prevented the processing of sync responses containing events with custom join rules. (#5924, Low, CVE-2025-66622, GHSA-jj6p-3m75-g2p3).
Refactor
- [breaking]
ServerInfohas been renamed toSupportedVersionsResponse, and itswell_knownfield has been removed. It is also wrapped in aTtlStoreValuethat handles the expiration of the data, rather than callingmaybe_decode(). Its constructor has been removed since all its fields are now public. (#5910)StateStoreData(Key/Value)::ServerInfohas been split into theSupportedVersionsandWellKnownvariants.
- [breaking] Upgrade Ruma to version 0.14.0. (#5882)
Client::sync_lockhas been renamedClient::state_store_lock. (#5707)
Features
- [breaking] The
EventCacheStore::get_room_events()method has received two new arguments. This allows users to load only events of a certain event type and events that were encrypted using a certain room key identified by its session ID. (#5817) ComposerDraftcan now store attachments alongside text messages. (#5794)
[0.14.1] - 2025-09-10
Security fixes
- Fix a panic in the
RoomMember::normalized_power_levelmethod. (#5635) ( Low, CVE-2025-59047, GHSA-qhj8-q5r6-8q6j).
[0.14.0] - 2025-09-04
Features
- Add
SyncResponse::RoomUpdates::is_emptyto check if there were any room updates. (#5593) - Add
EncryptionState::StateEncryptedto represent rooms supporting encrypted state events. Feature-gated behindexperimental-encrypted-state-events. (#5523) - [breaking] The
statefield ofJoinedRoomUpdateandLeftRoomUpdatenow uses theStateenum, depending on whether the state changes were received in thestatefield or thestate_afterfield. (#5488) - [breaking]
RoomCreateWithCreatorEventContenthas a new fieldadditional_creatorsthat allows to specify additional room creators beside the user sending them.room.createevent, introduced with room version 12. (#5436) - [breaking] The
RoomInfomethod now remembers the inviter at the time when theBaseClient::room_joined()method was called. The caller is responsible to remember the inviter before a server request to join the room is made. TheRoomInfo::invite_accepted_atmethod was removed, theRoomInfo::invite_detailsmethod returns both the timestamp and the inviter. (#5390)
Refactor
- [breaking] The
Strippedvariants ofRawAnySyncOrStrippedTimelineEvent,RawAnySyncOrStrippedStateandAnySyncOrStrippedStateuseStrippedStateinstead ofAnyStrippedStateEvent. (#5473) - [breaking] The
stripped_statefield ofStateChangesusesStrippedStateinstead ofAnyStrippedStateEvent. (#5473) - [breaking]
RelationalLinkedChunk::itemsnow takes aRoomIdinstead of an&OwnedLinkedChunkIdparameter. (#5445) - [breaking] Add an
IsPrefix = Falsebound to theget_state_event_static(),get_state_event_static_for_key()andget_state_events_static(),get_account_data_event_static()andget_room_account_data_event_staticmethods ofStateStoreExt. These methods only worked for events where the full event type is statically-known, and this is now enforced at compile-time. The matching non-staticmethods ofStateStorecan be used instead for event types with a variable suffix. (#5444) - [breaking]
SyncOrStrippedState<RoomPowerLevelsEventContent>::power_levels()takesAuthorizationRulesand a list of creators, because creators can have infinite power levels, as introduced in room version 12. (#5436) - [breaking]
RoomMember::power_level()andRoomMember::normalized_power_level()now useUserPowerLevelto represent power levels instead ofi64to differentiate the infinite power level of creators, as introduced in room version 12. (#5436) - [breaking] The
creator()methods ofRoomandRoomInfohave been renamed tocreators()and can now return a list of user IDs, to reflect that a room can have several creators, as introduced in room version 12. (#5436) - [breaking]
RoomInfo::room_version_or_default()was replaced withroom_version_rules_or_default(). The room version should only be used for display purposes. The rules contain flags for all the differences in behavior between all known room versions. (#5337) - [breaking]
MinimalStateEvent::redact()takesRedactionRulesinstead of aRoomVersionId. (#5337) - [breaking] The
event_idfield ofPredecessorRoomwas removed, due to its removal in the Matrix specification with MSC4291. (#5419)
[0.13.0] - 2025-07-10
Features
- The
RoomInfonow remembers when an invite was explicitly accepted when theBaseClient::room_joined()method was called. A new getter for this timestamp exists, theRoomInfo::invite_accepted_at()method returns this timestamp. (#5333) - [breaking] The
BaseClient::new()method now takes an additionalThreadingSupportparameter controlling whether the client is supposed to do extra processing for threads. Right now, it controls whether to exclude in-thread events from the room unread counts, but it may be expanded in the future to support more threading-related features. (#5325)
Refactor
- The cached
ServerCapabilitieshas been renamed toServerInfoand additionally contains the well-known response alongside the existing server versions. Despite the old name, it does not contain the server capabilities. (#5167) Room::join_ruleandRoom::is_publicnow return anOptionto reflect that the join rule state event might be missing, in which case they will returnNone. (#5278)
[0.12.0] - 2025-06-10
No notable changes in this release.
[0.11.0] - 2025-04-11
Features
- [breaking] The
Client::subscribe_to_ignore_user_list_changes()method will now only trigger whenever the ignored user list has changed from what was previously known, instead of triggering every time an ignore-user-list event has been received from sync. (#4779) - [breaking] The
MediaRetentionPolicycan now trigger regular cleanups with its newcleanup_frequencysetting. (#4603)Cloneis a supertrait ofEventCacheStoreMedia.EventCacheStoreMediahas a new methodlast_media_cleanup_time_inner- There are new
'staticbounds inMediaServicefor the media cache stores
event_cache::store::MemoryStoreimplementsClone.BaseClientnow has ahandle_verification_eventsfield which istrueby default and can be negated so theNotificationClientwon’t handle received verification events too, causing errors in theVerificationMachine.- [breaking]
Room::is_encryption_state_syncedhas been removed (#4777) - [breaking]
Room::is_encryptedis replaced byRoom::encryption_statewhich returns a value of the newEncryptionStateenum (#4777)
Refactor
- [breaking]
BaseClient::storeis renamedstate_store(#4851) - [breaking]
BaseClient::with_store_configis renamednew(#4847) - [breaking]
BaseClient::set_session_metadatais renamedactivate, andBaseClient::logged_inis renamedis_activated(#4850) - [**breaking]
DependentQueuedRequestKind::UploadFileWithThumbnailwas renamed toDependentQueuedRequestKind::UploadFileOrThumbnail. Under theunstable-msc4274feature,DependentQueuedRequestKind::UploadFileOrThumbnailandSentMediaInfowere generalized to allow chaining multiple dependent file / thumbnail uploads. (#4897) - [breaking]
RoomInfo::prev_statehas been removed due to being useless. (#5054)
[0.10.0] - 2025-02-04
Features
- [breaking]
EventCacheStoreallows to control which media content is allowed in the media cache, and how long it should be kept, with aMediaRetentionPolicy:EventCacheStore::add_media_content()has an extra argument,ignore_policy, which decides whether a media content should ignore theMediaRetentionPolicy. It should be stored alongside the media content.EventCacheStorehas four new methods:media_retention_policy(),set_media_retention_policy(),set_ignore_media_retention_policy()andclean_up_media_cache().EventCacheStoreimplementations should delegate media cache methods to the methods of the same name ofMediaServiceto use theMediaRetentionPolicy. They need to implement theEventCacheStoreMediatrait that can be tested with theevent_cache_store_media_integration_tests!macro. (#4571)
Refactor
- [breaking] Replaced
Room::compute_display_namewith the reintroducedRoom::display_name(). The new method computes a display name, or return a cached value from the previous successful computation. If you need a sync variant, consider usingRoom::cached_display_name(). (#4470) - [breaking]: The reexported types
SyncTimelineEventandTimelineEventhave been fused into a single typeTimelineEvent, and its fieldpush_actionshas been madeOptional (it is set toNonewhen we couldn’t compute the push actions, because we lacked some information). (#4568)
[0.9.0] - 2024-12-18
Features
- Introduced support for MSC4171, enabling the designation of certain users as service members. These flagged users are excluded from the room display name calculation. (#4335)
Bug fixes
- Fix an off-by-one error in the
ObservableMapwhen theremove()method is called. Previously, items following the removed item were not shifted left by one position, leaving them at incorrect indices. (#4346)
[0.8.0] - 2024-11-19
Bug fixes
- Add more invalid characters for room aliases.
- Use the
DisplayNamestruct to protect against homoglyph attacks.
Features
Add
BaseClient::room_key_recipient_strategyfieldAmbiguityCachecontains the room member’s user ID.[breaking]
Media::get_thumbnailandMediaFormat::Thumbnailallow to request an animated thumbnail They both take aMediaThumbnailSettingsinstead ofMediaThumbnailSize.Consider knocked members to be part of the room for display name disambiguation.
Client::cross_process_store_locks_holder_nameis used everywhere:StoreConfig::new()now takes across_process_store_locks_holder_nameargument.StoreConfigno longer implementsDefault.BaseClient::new()has been removed.BaseClient::clone_with_in_memory_state_store()now takes across_process_store_locks_holder_nameargument.BaseClientno longer implementsDefault.EventCacheStoreLock::new()no longer takes akeyargument.BuilderStoreConfigno longer hascross_process_store_locks_holder_namefield forSqliteandIndexedDb.Make
ObservableMap::streamworks onwasm32-unknown-unknown.Allow aborting media uploads.
Replace the
Notificationtype from Ruma inSyncResponseandStateChangesby a custom one.Introduce a
DisplayNamestruct which normalizes and sanitizes display names.
Refactor
[breaking] Rename
DisplayNametoRoomDisplayName.Rename
AmbiguityMaptoDisplayNameUsers.Move
event_cache_store/toevent_cache/store/inmatrix-sdk-base.Move
linked_chunkfrommatrix-sdktomatrix-sdk-common.Move
EventandGapintomatrix_sdk_base::event_cache.The ambiguity maps in
SyncResponseare moved toJoinedRoomandLeftRoom.Store::get_roomsandStore::get_rooms_filteredare way faster because they don’t acquire the lock for every room they read.Store::get_rooms,Store::get_rooms_filteredandStore::get_roomare renamedStore::rooms,Store::rooms_filteredandStore::room.[breaking]
Client::get_roomsandClient::get_rooms_filteredare renamedClient::roomsandClient::rooms_filtered.[breaking]
Client::get_stripped_roomshas finally been removed.[breaking] The
StateStoremethods to access data in the media cache where moved to a separateEventCacheStoretrait.[breaking] The
instantmodule was removed, use theruma::timemodule instead.
0.7.0
- Rename
RoomTypetoRoomState - Add
RoomInfo::stateaccessor - Remove
membersandstripped_membersfields inStateChanges. Room member events are now with other state events instateandstripped_state. StateStore::get_user_idstakes aRoomMembershipsto be able to filter the results by any membership state.StateStore::get_joined_user_idsandStateStore::get_invited_user_idsare deprecated.
Room::memberstakes aRoomMembershipsto be able to filter the results by any membership state.Room::active_membersandRoom::joined_membersare deprecated.
RoomMemberhas new methods:can_bancan_invitecan_kickcan_redactcan_send_messagecan_send_statecan_trigger_room_notification
- Move
StateStore::get_member_eventtoStateStoreExt StateStore::get_stripped_room_infosis deprecated. All room infos should now be returned byget_room_infos.BaseClient::get_stripped_roomsis deprecated. Useget_rooms_filteredwithRoomStateFilter::INVITEDinstead.- Add methods to
StateStoreto be able to retrieve data in batchget_state_events_for_keysget_profilesget_presence_eventsget_users_with_display_names
- Move
Session,SessionTokensand associated methods to thematrix-sdkcrate. - Add
Room::subscribe_info
0.5.1
Bug fixes
- #664: Fix regression with push rules being applied to the own user_id only instead of all but the own user_id