MSC4496: Calendar Events, Invites, and Availability in Matrix#4496
MSC4496: Calendar Events, Invites, and Availability in Matrix#4496MTRNord wants to merge 1 commit into
Conversation
Signed-off-by: MTRNord <MTRNord@users.noreply.github.com>
There was a problem hiding this comment.
Implementation requirements:
- Client (ideally multiple)
- Server
| - [MSC1767](https://github.com/matrix-org/matrix-spec-proposals/pull/1767) – Extensible events | ||
| (required for `m.text` fallback blocks in all event types). | ||
| - [MSC2674](https://github.com/matrix-org/matrix-spec-proposals/pull/2674) – Event | ||
| relationships (required for recurrence overrides and RSVP threading). | ||
| - [MSC2676](https://github.com/matrix-org/matrix-spec-proposals/pull/2676) – Message edits | ||
| (required for cancellation and event updates). |
There was a problem hiding this comment.
These MSCs are all accepted into the spec. Typically these are not listed as "hard dependencies."
There was a problem hiding this comment.
Will update that. It has been a while since I wrote an MSC and much less so one of this size :)
| - [MSC1840](https://github.com/matrix-org/matrix-spec-proposals/pull/1840) – Typed rooms / | ||
| `m.room.type` (required for the `m.calendar` room type). |
There was a problem hiding this comment.
This MSC was rejected. The type field was introduced in MSC1772, which is, again, accepted.
| Matrix currently has no first-class representation of calendar data. Users who wish to schedule | ||
| events with others over Matrix must either use an out-of-band calendar system and paste details | ||
| into chat, or rely on bespoke application-layer solutions that do not interoperate. This creates | ||
| friction, breaks privacy (invites often travel via corporate email even when both parties use | ||
| Matrix), and prevents Matrix from serving as a complete communication stack for organisations. A | ||
| general, privacy-respecting, federated calendaring primitive in Matrix would fill this gap while | ||
| also enabling transparent interop with the iCalendar/CalDAV ecosystem that the majority of the | ||
| world already uses. |
There was a problem hiding this comment.
I still do not understand the use case for this feature. A more fleshed-out rationale (there is interesting value here in e.g. federation and E2EE) would be useful besides just "it's not Matrix."
There was a problem hiding this comment.
Will update that in the next days.
The gist is this perspective I am coming from:
- I want something I can use at work that replaces Teams entirely -> Calendaring is missing currently
- Calendaring in Teams/Outlook is also deeply integrated and not just CalDAV bolted on.
- I want to be able to share events in a group, invite someone via matrix where I don't know their email and I want proper RVSP
- I do recognize that the internet mainly will use CalDAV or CalDAV adjacent protocols. There will be no time where everyone is using Matrix. Therefor I want a solution that is compatible with that and allows easy conversion in either direction (hence the appendix)
- Additionally in an enterprise setting you likely still have to use email invites so having a bridge possibility here is useful.
As probably is obvious I am coming a lot from the Teams/Enterprise usecase and much less so from a personal usecase here. I don't think it is something everyone wants or needs in their client and that's perfectly reasonable. I can also see partial implementations like event calendars like discourse features for example.
E2EE is "free" in matrix. So that section for the most part exists just for clarity that it is possible to be used without too much effort.
The endpoints for availability are so that there is less information leak. Sure you could do this client side as well but then you cant easily make the homeserver hide hidden events from the other side. This way it is a bit easier to preserve privacy which imho is very important for a calendar. However, I did not want to implement all of CalDAV in matrix. That feels like the wrong direction. Hence historically matrix used bridges to map to third party networks. CalDAV I consider a third party network here. So I kept the API surface in matrix to the absolute bare minimum and instead tried to do as much as possible just using events.
That all being said I will bring this properly into the MSC itself as soon as I get the time :)
| _This proposal introduces a general-purpose calendaring system for Matrix, covering event | ||
| creation and sharing, invite/RSVP flows, attendee tracking, location and video conference | ||
| attachments, recurrence, and user availability. It is intended to supersede the earlier | ||
| attempt in MSC1116 and to incorporate the community feedback that drove that proposal toward | ||
| an iCalendar-compatible semantic model. It deliberately avoids a meetings-specific scope so | ||
| that higher-level applications (including video conferencing schedulers) can build on top._ |
There was a problem hiding this comment.
Linkifying might help readability here.
| _This proposal introduces a general-purpose calendaring system for Matrix, covering event | |
| creation and sharing, invite/RSVP flows, attendee tracking, location and video conference | |
| attachments, recurrence, and user availability. It is intended to supersede the earlier | |
| attempt in MSC1116 and to incorporate the community feedback that drove that proposal toward | |
| an iCalendar-compatible semantic model. It deliberately avoids a meetings-specific scope so | |
| that higher-level applications (including video conferencing schedulers) can build on top._ | |
| _This proposal introduces a general-purpose calendaring system for Matrix, covering event | |
| creation and sharing, invite/RSVP flows, attendee tracking, location and video conference | |
| attachments, recurrence, and user availability. It is intended to supersede the earlier | |
| attempt in [MSC1116] and to incorporate the community feedback that drove that proposal toward | |
| an iCalendar-compatible semantic model. It deliberately avoids a meetings-specific scope so | |
| that higher-level applications (including video conferencing schedulers) can build on top._ | |
| [MSC1116]: https://github.com/matrix-org/matrix-spec-proposals/pull/1116 |
| 2. **Extensible events throughout.** All event types defined here use the content-block model | ||
| from [MSC1767](https://github.com/matrix-org/matrix-spec-proposals/pull/1767). Clients | ||
| without calendar support can render a meaningful `m.text` fallback. The relationship between | ||
| this MSC and encryption is discussed in §7. |
There was a problem hiding this comment.
Given that extensible events are still unreleased, this fallback will only work in future clients while current clients would probably just not display the events at all?
| "state_key": "", | ||
| "content": { | ||
| "m.text": [{ "body": "Personal calendar", "mimetype": "text/plain" }], | ||
| "org.matrix.msc4496.calendar_info": { |
There was a problem hiding this comment.
I think for readability, the snippets shouldn't include the unstable prefixes. The section at the very end can just provide the mapping.
| "m.text": [{ "body": "Personal calendar", "mimetype": "text/plain" }], | ||
| "org.matrix.msc4496.calendar_info": { | ||
| "color": "#3c82f6", | ||
| "timezone": "Europe/Berlin" |
There was a problem hiding this comment.
What are the semantics of timezone, especially for shared / group calendars?
| "content": { | ||
| "m.text": [{ "body": "Personal calendar", "mimetype": "text/plain" }], | ||
| "org.matrix.msc4496.calendar_info": { | ||
| "color": "#3c82f6", |
There was a problem hiding this comment.
Would color not rather be something to be determined on the displaying client? What if I display two calendars that happened to pick the same color value?
| For virtual locations, `uri` is a plain HTTPS URL rather than a `geo:` URI. Clients SHOULD | ||
| display virtual locations as clickable links. |
There was a problem hiding this comment.
I think the spec may not have to be concerned with how clients display the content. A CLI client may not even be able to display clickable links.
| at least one `via` entry when constructing this block; a `conference` block without a `via` | ||
| array SHOULD be treated as unresolvable and clients SHOULD disable the join button rather | ||
| than silently failing. The call room is managed independently of the calendar event; this | ||
| MSC does not specify how it is created. Clients SHOULD display the room name with a fallback to the room ID and |
There was a problem hiding this comment.
What does "display the room name with a fallback to the room ID" mean?
| "conference": { | ||
| "type": "m.call", | ||
| "room_id": "!callroom:example.com", | ||
| "via": ["example.com", "matrix.org"], | ||
| "label": "Join call" | ||
| } |
There was a problem hiding this comment.
MatrixRTC can have several slots per room. Maybe we should include the slot_id from m.rtc.slot here, too? Also, since MatrixRTC has its own m.call application type and will probably have further application types in future, maybe the type here should be something more generic such as m.rtc?
Rendered
Implementations:
Signed-off-by: MTRNord support@midnightthoughts.space