Skip to content

MSC4496: Calendar Events, Invites, and Availability in Matrix#4496

Open
MTRNord wants to merge 1 commit into
matrix-org:mainfrom
MTRNord:matrix-caldav
Open

MSC4496: Calendar Events, Invites, and Availability in Matrix#4496
MTRNord wants to merge 1 commit into
matrix-org:mainfrom
MTRNord:matrix-caldav

Conversation

@MTRNord

@MTRNord MTRNord commented Jun 26, 2026

Copy link
Copy Markdown
Member

Rendered

Implementations:

  • Client: none
  • Server: none
  • Bridge: none
  • SDK: none

Signed-off-by: MTRNord support@midnightthoughts.space

Signed-off-by: MTRNord <MTRNord@users.noreply.github.com>
@MTRNord MTRNord changed the title MSC 4496: Calendar Events, Invites, and Availability in Matrix MSC4496: Calendar Events, Invites, and Availability in Matrix Jun 26, 2026
@turt2live turt2live added proposal A matrix spec change proposal. Process state. A-Client Server Client-Server API kind:feature MSC for not-core and not-maintenance stuff needs-implementation This MSC does not have a qualifying implementation for the SCT to review. The MSC cannot enter FCP. labels Jun 26, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implementation requirements:

  • Client (ideally multiple)
  • Server

Comment on lines +714 to +719
- [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).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These MSCs are all accepted into the spec. Typically these are not listed as "hard dependencies."

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will update that. It has been a while since I wrote an MSC and much less so one of this size :)

Comment on lines +720 to +721
- [MSC1840](https://github.com/matrix-org/matrix-spec-proposals/pull/1840) – Typed rooms /
`m.room.type` (required for the `m.calendar` room type).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This MSC was rejected. The type field was introduced in MSC1772, which is, again, accepted.

Comment on lines +10 to +17
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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."

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 :)

Comment on lines +3 to +8
_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._

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linkifying might help readability here.

Suggested change
_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

Comment on lines +29 to +32
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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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": {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Comment on lines +189 to +190
For virtual locations, `uri` is a plain HTTPS URL rather than a `geo:` URI. Clients SHOULD
display virtual locations as clickable links.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does "display the room name with a fallback to the room ID" mean?

Comment on lines +200 to +205
"conference": {
"type": "m.call",
"room_id": "!callroom:example.com",
"via": ["example.com", "matrix.org"],
"label": "Join call"
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Client Server Client-Server API kind:feature MSC for not-core and not-maintenance stuff needs-implementation This MSC does not have a qualifying implementation for the SCT to review. The MSC cannot enter FCP. proposal A matrix spec change proposal. Process state.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants