Hey all,
It’s finally here: threads, edits, and private read receipts. v1.4 has been a little later than usual in the quarter because we wanted to make sure we nailed down all the core MSCs for threads before publishing the spec itself, but we’ve done that now and we’re excited about it.
Matrix 1.3 was just over 3 months ago, though with the relatively large features there and the colossal implementation effort of v1.4 we’re not expecting everyone to have implementations on day 1. Instead, as with all spec releases, we encourage implementations to gradually update over the next few months. We’re additionally planning to make v1.5 (Q4 2022) more of a maintenance update to help make the backlog a bit easier on everyone, though we might prioritize a couple cool features in there too :)
Matrix 1.4 sees 14 MSCs get merged, but we can’t possibly go into detail on them all here. We’ve instead focused on the 3 major features we’re excited about - check out the changelog at the end for the full picture.
🧵 Threads
Threads, a critical feature in terms of parity with other chat systems, have landed thanks to a whopping 6 MSCs: MSC3440, MSC3816, MSC3856, MSC3715, MSC3771, and MSC3773. It’s been a lot of iteration on the reference implementations to get threads this far, and we’re excited to see how the client implementations evolve to provide more structured and less noisy communication for everyone - keep us updated with TWIM posts, please!
Threads have involved changes to event relationships (which were fixed in v1.3), read receipts, and notification counts, resulting in several different models and ways of solving the problem. We think we’ve reached a point that works for conversational threads, though there’s work on the horizon for threads-only rooms, Twitter-style free-form threads, etc to cover more needs of users.
Currently, the demonstration implementation of threads in Synapse and Element is working its way out of the proof-of-concept and beta stages (which were sufficient to validate the MSCs) and are on their way to exiting beta. Keep an eye on the respective blogs for news about production-ready threads!
📝 Edits
Similar to reactions, err, aggregations, MSC2676 and its predecessors have been around for a long while. Edits have existed in the Element clients seemingly forever, and other clients have had troubles trying to implement the same feature: with it now in the spec, it should be a lot easier to bring edits into clients.
For edits, we’ve taken the route of making the MSC match reality, for better or worse. MSCs which improve or add functionality to the system are very much welcome - writing an MSC is relatively easy and helps the whole community.
👥 Private read receipts
Not everyone wants to broadcast that they’ve read a message, but also with read receipts tied into notifications those same people also probably don’t want stuck notifications. To address the problem, we’ve added a new m.read.private receipt type which behaves exactly like m.read, but is only visible to you.
We still have a rework of the notifications system in our long-term plan, but this should hopefully cover the privacy concerns for the time being :)
The full changelog
MSCs are how the spec changes in the way it does - adding, fixing, and maintaining features for the whole ecosystem to use. The blog post can’t cover them all, but that doesn’t make them any less important! Check out the full changelog below, and the Spec Change Proposals page for more information on how these MSCs got merged (hint: they submitted a proposal, which anyone can do - take a look at the Matrix Live episode where Matthew covers the proposal process).
Client-Server API
Removed Endpoints
Backwards Compatible Changes
- Add a
.m.rule.room.server_acl
push rule to matchm.room.server_acl
events, as per MSC3786. (#1190, #1201) - Add
Cross-Origin-Resource-Policy
(CORP) headers to media repository, as per MSC3828. (#1197) - Copy a room's
type
when upgrading it, as per MSC3818. (#1198) - Add
room_types
filter androom_type
response to/publicRooms
, as per MSC3827. (#1199) - Add
m.replace
relations (event edits), as per MSC2676. (#1211) - Add
m.read.private
receipts, as per MSC2285. (#1216) - Make
m.fully_read
optional on/read_markers
, as per MSC2285. (#1216) - Allow
m.fully_read
markers to be set from/receipts
, as per MSC2285. (#1216) - Add threading via
m.thread
relations, as per MSC3440, MSC3816, MSC3856, and MSC3715. (#1254) - Add per-thread notifications and read receipts, as per MSC3771 and MSC3773. (#1255)
Spec Clarifications
- Mention that the
/rooms/{roomId}/invite
endpoint will return a 200 response if the user is already invited to the room. (#1084) - Fix various typos throughout the specification. (#1135, #1161, #1164, #1170, #1180, #1215, #1238, #1243)
- Describe return codes for account data endpoints, and clarify that per-room data does not inherit from the global data. (#1155)
- Clarify that policy rule globs work like ACL globs. Contributed by Nico. (#1165)
- Clarify the format of some structures in the End-to-end encryption module. (#1166)
- Add HTML anchors for object definitions in the formatted specification. (#1174)
- Tweak the styling of
<code>
snippets in tables rendered from OpenAPI definitions. (#1179) - Update "API Standards" section to clarify how JSON is used. (#1185)
- Clarify that the "device_id", "user_id" and "access_token" fields are required in the response body of
POST /_matrix/client/v3/login
. (#1210) - Reinforce the relationship of refreshed access tokens to transaction IDs. (#1236)
- Clarify enum values by separating possible values with commas. (#1240)
Server-Server API
Backwards Compatible Changes
Spec Clarifications
- Add HTML anchors for object definitions in the formatted specification. (#1174)
- Tweak the styling of
<code>
snippets in tables rendered from OpenAPI definitions. (#1179) - Update "API Standards" section to clarify how JSON is used. (#1185)
Application Service API
Breaking Changes
- Replace homeserver authorization approach with an
Authorization
header instead ofaccess_token
when talking to the application service, as per MSC2832. (#1200)
Spec Clarifications
- Add HTML anchors for object definitions in the formatted specification. (#1174)
Identity Service API
Spec Clarifications
- Add HTML anchors for object definitions in the formatted specification. (#1174)
- Update "API Standards" section to clarify how JSON is used. (#1185)
Push Gateway API
Spec Clarifications
- Add HTML anchors for object definitions in the formatted specification. (#1174)
Room Versions
Spec Clarifications
- For room versions 1 through 10, clarify that events with rejected
auth_events
must be rejected. (#1137) - For room versions 2–10: correct a mistaken clarification to the state resolution algorithm. (#1158)
- For room versions 7 through 10: Clarify that
invite->knock
is actually a legal transition. (#1175)
Appendices
No significant changes.
Internal Changes/Tooling
Backwards Compatible Changes
- Add internal changes changelog section. (#1194)
Spec Clarifications
- Render HTML anchors for object definition tables. (#1191)
- Give rendered-data sections a background and some padding. (#1195)
- Fix rendering of shortcodes within the client-server API. (#1205)
- Fix the spacing of mapping types generated from the OpenAPI spec. (#1230)
The Foundation needs you
The Matrix.org Foundation is a non-profit and only relies on donations to operate. Its core mission is to maintain the Matrix Specification, but it does much more than that.
It maintains the matrix.org homeserver and hosts several bridges for free. It fights for our collective rights to digital privacy and dignity.
Support us