Changelog
All notable changes to this project will be documented in this file.
0.18.0 - 2026-06-02
Changed
- [breaking]
SpaceRoom::new_from_knownandSpaceRoom::new_from_summaryare now asynchronous so we can properly check if they are DMs on demand instead of trusting the pre-computed value. Some other related functions are nowasynctoo. (#6561)
Fixed
- Remove the ability to reply to live location events. (#6563)
[0.17.0] - 2026-05-08
Bug fixes
- Fix a possible panic in
RoomList::entries_with_dynamic_adapters. (#6459) - Keep stopped
beacon_infolive location sessions visible inRoom::latest_event(), so room summaries still show the last live location sharing session after it ends. (#6437) - Allow setting a custom Sliding Sync connection ID and timeline limit on
RoomListService. (#6289) - Don’t show a “sent in clear” shield on live location timeline items in
encrypted rooms, since
beacon_infois a state event that cannot be encrypted by design. (#6308) - Include secondary relations when re-initializing a threaded timeline after a lag. (#6209)
- Ensure that the display name of a
Roomin aNotificationStatuscoming from aNotificationClientexcludes service members. (#6136) - Fix the
is_last_admincheck inLeaveSpaceRoomsince it was not accounting for the membership state. #6032 - [breaking]
LatestEventValue::Local { is_sending: bool }is replaced by [state: LatestEventValueLocalState] to represent 3 states:IsSending,HasBeenSentandCannotBeSent. (#5968) - Fix the redecryption of events in timelines built using the
TimelineFocusofPinnedEvents,Thread,Event. (#5955)
Features
SpaceRoomandNotificationItemnow have anis_dmfield to indicate whether the room is a DM room. (#6537)- Add a list of
declined_by: Vec<OwnedUserId>to theTimelineItemContent::RtcNotification, this will contain the list of users that have declined the call. (#6494) - [breaking] Add the
suggestedfield to theSpaceRoomstruct, which indicates whether a space’s admins have marked that sub-space/room as a “suggested” one to join. (6417) - Handle local echoes of redactions in the timeline. (#6250)
- [breaking] Remove support for
native-tlsand remove all feature flags for selecting TLS backend, asrustlsis the now the only supported TLS backend. (#6409) - Add
call_intenttoTimelineItemContent::RtcNotification(#6412) - Introduce a
ThreadListServicewhich offers reactive interfaces for rendering and managing the list of threads from a particular room. (#6311) - [breaking] Remove the
Room::load_thread_listin favor of the newThreadListService(#6311) - Add support for
MSC3489 live
location sharing through a new
TimelineItemContent::LiveLocationvariant. - The internal timeline unique ID may be recycled when an event is deduplicated from the timeline, so that embedders can notice that it’s the same item and avoid unnecessary re-rendering. (#6228)
- [breaking] Add
NotificationState.EventRedactedenum value, to handle the case where a notification resolves to a redacted event. (#6203) - [breaking] Extend
TimelineFocus::Eventto allow marking the target event as the root of a thread. (#6050) - [breaking] Remove
TimelineEventTypeFilterwhich has been replaced by the more genericTimelineEventFilter. (#6070) - Add
TimelineEventFilterfor filtering events based on their type or content. For content filtering, only membership and profile change filters are available as of now. (#6048) - Introduce
SpaceFilters as a mechanism for narrowing down what’s displayed in the room list (#6025) - Utilize the cache and include common relations when focusing a timeline on an event without requestion context. (#5858)
- [breaking]
EventTimelineItem::get_shieldnow returns a new type,TimelineEventShieldState, which extends the oldShieldStatewith a code forSentInClear, now that the latter has been removed fromShieldState. (#5959) - Add
SpaceService::get_space_roomto get a space given its id from the space graph if available. (#5944) - [breaking]: The new Latest Event API replaces the old API. All the
new_prefixes have been removed. The following methods are removed:EventTimelineItem::from_latest_event, andTimeline::latest_event. See the documentation ofmatrix_sdk::latest_eventto learn about the new API. (#5624) Room::load_event_with_relationsnow also calls/relationsto fetch related events when falling back to network mode after a cache miss. (#5930)- Expose
EventTimelineItem::forwarderandforwarder_profile, which, if present, provide the ID and profile of the user who forwarded the keys used to decrypt the event as part of an MSC4268 key bundle. (#6000)
Refactor
- Use
DmRoomDefinitionto check if a room should be considered part of theRoomCategory::PeopleorRoomCategory::Roomwhen using room list filters. (#6490) - [breaking]
AnyOtherStateEventContentChange::RoomAliaseswas removed. This state event type was removed from the Matrix specification a while ago, and support for it has been removed in Ruma. (#6414) - [breaking] Move
LiveLocationout ofTimelineItemContentand intoMsgLikeKindso it has access toMsgLikeContentreactions. (#6286) - [breaking] Rename
AnyOtherFullStateEventContenttoAnyOtherStateEventContentChangeto match the name change in the upstream types. (#6218) - [breaking] Remove
WithLockingfromEncryptionSyncService, the locking mechanism will be taken from the parentClientwithClient::cross_process_store_config. (#6160) - [breaking] The [
Timeline::pin_event] and [Timeline::unpin_event] methods have been moved to the SDK crate, in theRoomobject. Users can replace previous uses withtimeline.room().pin_event()etc. (#6106) - [breaking] Refactored
is_last_admintois_last_ownerthe check will now account also for v12 rooms, where creators and users with PL 150 matter. (#6036) - [breaking] The
SpaceServicewill no longer auto-subscribe to required client events when invoking thesubscribe_to_joined_spacesbut instead do it through its, now async, constructor. (#5972) - [breaking] The
SpaceService’sjoined_spacesmethod has been renamedtop_level_joined_spacesandsubscribe_to_joined_spacestospace_service.subscribe_to_top_level_joined_spaces(#5972) RoomListService::subscribe_to_roomsnow forgets previous subscriptions. (#6012)
[0.16.1] - 2026-05-08
No notable changes in this release.
[0.16.0] - 2025-12-04
Features
- [breaking]
TimelineBuilder::track_read_marker_and_receiptsnow takes a parameter to allow tracking to be enabled for all events (like before) or only for message-like events (which prevents read receipts from being placed on state events). (#5900)
[0.15.0] - 2025-11-27
Features
- Expose
is_spaceinNotificationItem, allowing clients to determine if the room that triggered the notification is a space. - [breaking] The
LatestEventValue::Localtype gains 2 new fields:senderandprofile. (#5885) - Add push actions to
NotificationItem. (#5835) - Add support for top level space ordering through
MSC3230 and
m.space_orderroom account data fields (#5799)
Refactor
Timeline::latest_eventwill return the latest event in the timeline, not the latest item of the timeline if it’s an event.TimelineFocusKind::Eventcan now handle both the existing event pagination and thread pagination if the focused event is part of a thread (#5678).- [breaking] The
Roomtype inroom_list_serviceis renamed toRoomListItem. (#5684)
Bug fixes
Timeline::latest_event_idwon’t take threaded events into account on live/event focused timelines ifhide_threaded_eventsis enabled. This fixes a bug inTimeline::mark_as_readthat incorrectly tried to send a read receipt for threaded events that aren’t really part of those timelines. (#5864)- Avoid replacing timeline items when the encryption info is unchanged. (#5660)
- Improvement performance of
RoomListby introducing a newRoomListItemtype (that replaces theRoomtype). (#5684)
[0.14.0] - 2025-09-04
Features
- Add a new [
SpaceService] that provides high level reactive interfaces for listing the user’s joined top level spaces as long as their children. (#5509) - Add
new_filter_low_priorityandnew_filter_non_low_priorityfilters to the room list filtering system, allowing clients to filter rooms based on their low priority status. The filters use theRoom::is_low_priority()method which checks for them.lowpriorityroom tag. (#5508) - [breaking] Refactor the
non_spacefilter into aspacefilter, favouring its use in combination with thenotfilter. (#5508) - [breaking] Space rooms are now being retrieved through sliding sync and
the newly introduced [
room_list_service::filters::new_filter_non_space] filter should be used to exclude them from any room list. (5479) - [breaking] [
Timeline::send_gallery()] now automatically fills in the thread relationship, based on the timeline focus. As a result, theGalleryConfig::reply()builder method has been replaced withGalleryConfig::in_reply_to, and only takes an optional event id (the event that is effectively replied to) instead of theReplytype. The proper way to start a thread with a gallery event is now thus to create a threaded-focused timeline, and then useTimeline::send_gallery(). (5427) - [breaking] [
Timeline::send_attachment()] now automatically fills in the thread relationship, based on the timeline focus. As a result, there’s a newmatrix_sdk_ui::timeline::AttachmentConfigtype in town, that has a simplified optional parameterreplied_toof typeOwnedEventIdinstead of theReplytype and that must be used in place ofmatrix_sdk::attachment::AttachmentConfig. The proper way to start a thread with a media attachment is now thus to create a threaded-focused timeline, and then useTimeline::send_attachment(). (5427) - [breaking] [
Timeline::send_reply()] now automatically fills in the thread relationship, based on the timeline focus. As a result, it only takes anOwnedEventIdparameter, instead of theReplytype. The proper way to start a thread is now thus to create a threaded-focused timeline, and then useTimeline::send(). (5427) Timeline::send()will now automatically fill the thread relationship, if the timeline has a thread focus, and the sent event doesn’t have a prefilledrelates_tofield (i.e. a relationship). (5427)
Refactor
- [breaking] The MSRV has been bumped to Rust 1.88. (#5431)
Bug fixes
- Correctly remove unable-to-decrypt items that have been decrypted but contain unsupported event types. (#5463)
[0.13.0] - 2025-07-10
Features
- Infer timeline read receipt threads for the
send_single_receiptmethod from the focus mode and associatedhide_threaded_eventsflag. (5325) - Add
NotificationItem::room_topicto theNotificationItemstruct, which contains the topic of the room. This is useful for displaying the room topic in notifications. (#5300) - Add
EmbeddedEvent::timestampandEmbeddedEvent::identifierwhich are already available in regular timeline items. (#5331) RoomListService::subscribe_to_roomsbecomesasyncand automatically callsmatrix_sdk::latest_events::LatestEvents::listen_to_room(#5369)
Refactor
- [breaking] The function provided to
TimelineBuilder::event_filter()must takeRoomVersionRulesas second argument instead of aRoomVersionId. Thedefault_event_filter()reflects that change. (#5337)
[0.12.0] - 2025-06-10
Refactor
- [breaking] [
TimelineItemContent::reactions()] returns anOption<&ReactionsByKeyBySender>instead ofReactionsByKeyBySender. This reflects the fact that some timeline items cannot hold reactions at all. NotificationItem::room_join_ruleis now optional to reflect that the join rule state event might be missing, in which case it will be set toNone. TheNotificationItem::is_publicfield has been replaced with a method that returns anOption<bool>, based on the same logic. (#5278)
Bug fixes
- Introduce
Timelineregions, which helps to remove a class of bugs in theTimelinewhere items could be inserted in the wrong regions, such as a remote timeline item before theTimelineStartvirtual timeline item. (#5000) NotificationClientwill filter out events sent by ignored users onget_notificationandget_notifications. (#5081)
Features
Timeline::send_single_receipt()andTimeline::send_multiple_receipts()now also unset the unread flag of the room if an unthreaded read receipt is sent. (#5055)Timeline::mark_as_read()unsets the unread flag of the room if it was set. (#5055)- Add new method
Timeline::send_galleryto allow sending MSC4274-style galleries. (#5125)
[0.11.0] - 2025-04-11
Bug fixes
Features
- [breaking] Optionally allow starting threads with
Timeline::send_reply. (#4819) - [breaking] Push
RepliedToInfo,ReplyContent,EnforceThreadandUnsupportedReplyItem(becomingReplyError) down into matrix_sdk. [Timeline::send_reply()] now takes an event ID rather than aRepliedToInfo.Timeline::replied_to_info_from_event_idhas been made private inmatrix_sdk. (#4842) - Allow sending media as (thread) replies. The reply behaviour can be configured
through new fields on [
AttachmentConfig]. (#4852)
Refactor
- [breaking] Reactions on a given timeline item have been moved from
[
EventTimelineItem::reactions()] to [TimelineItemContent::reactions()]; they’re thus available from an [EventTimelineItem] by calling.content().reactions(). They’re also returned by ownership (cloned) instead of by reference. (#4576) - [breaking] The parameters
event_idandenforce_threadon [Timeline::send_reply()] have been wrapped in areplystruct parameter. (#4880)
[0.10.0] - 2025-02-04
Bug fixes
Don’t consider rooms in the banned state to be non-left rooms. This bug was introduced due to the introduction of the banned state for rooms, and the non-left room filter did not take the new room state into account. (#4448)
Fix
EventTimelineItem::latest_edit_json()when it is populated by a live edit. (#4552)Fix our own explicit read receipt being ignored when loading it from the state store, which resulted in our own read receipt being wrong sometimes. (#4600)
Features
[breaking]
Timeline::send_attachment()now takes a type that implementsInto<AttachmentSource>instead of a type that implementsInto<PathBuf>.AttachmentSourceallows to send an attachment either from a file, or with the bytes and the filename of the attachment. Note that all types that implementInto<PathBuf>also implementInto<AttachmentSource>. (#4451)[breaking] Add an “offline” mode to the
SyncService. This allows theSyncServiceto attempt to restart the sync automatically. It can be enabled with theSyncServiceBuilder::with_offline_modemethod. Due to this addition, theSyncService::stopmethod has been made infallible. (#4592)
Refactor
Drastically improve the performance of the
Timelinewhen it receives hundreds and hundreds of events (approximately 10 times faster). (#4601, #4608, #4612)[breaking]
Timeline::paginate_forwardsandTimeline::paginate_backwardsare unified to work on a live or focused timeline.Timeline::live_paginate_*andTimeline::focused_paginate_*have been removed (#4584).[breaking]
Timeline::subscribe_batchedreplacesTimeline::subscribe.subscribehas been removed in #4567, andsubscribe_batchedhas been renamed tosubscribein #4585.
[0.9.0] - 2024-12-18
Bug fixes
- Add the
m.room.createand them.room.history_visibilitystate events to the required state for the sync. These two state events are required to properly compute the room preview of a joined room. (#4325)
Features
- Introduce a new variant to the
UtdCauseenum tailored for device-historical messages. These messages cannot be decrypted unless the client regains access to message history through key storage (e.g., room key backups). (#4375)
[0.8.0] - 2024-11-19
Bug fixes
Disable
share_pos()insideRoomListService.UtdHookManagerno longer re-reports UTD events as late decryptions. (#3480)Messages that we were unable to decrypt no longer display a red padlock. (#3956)
UtdHookManagerno longer reports UTD events that were already reported in a previous session. (#3519)
Features
- Add
m.room.join_rulesto the required state. EncryptionSyncServiceandNotificationare usingClient::cross_process_store_locks_holder_name.
Refactor
[breaking]
Timeline::editnow takes aRoomMessageEventContentWithoutRelation.[breaking]
Timeline::send_attachmentnow takes animpl Into<PathBuf>for the path of the file to send.[breaking]
Timeline::item_by_transaction_idhas been renamed toTimeline::local_item_by_transaction_id(always returns local echoes).
0.7.0
Initial release