Skip to content

MSC4519: MatrixRTC Transports Registry - #4519

Open
turt2live wants to merge 5 commits into
mainfrom
travis/msc/voip-transports-registry
Open

MSC4519: MatrixRTC Transports Registry#4519
turt2live wants to merge 5 commits into
mainfrom
travis/msc/voip-transports-registry

Conversation

@turt2live

@turt2live turt2live commented Jul 28, 2026

Copy link
Copy Markdown
Member

@github-project-automation github-project-automation Bot moved this to Tracking for review in Spec Core Team Workflow Jul 28, 2026
@turt2live turt2live added proposal A matrix spec change proposal. Process state. A-Client Server Client-Server API A-Process Related to the spec process itself (MSC process) kind:core MSC which is critical to the protocol's success needs-implementation This MSC does not have a qualifying implementation for the SCT to review. The MSC cannot enter FCP. matrix-2.0 Required for Matrix 2.0 (note: do not rename - used in reports/links) labels Jul 28, 2026
@turt2live turt2live moved this from Tracking for review to Ready for general review in Spec Core Team Workflow Jul 28, 2026
@turt2live
turt2live marked this pull request as ready for review July 28, 2026 06:08

@turt2live turt2live Jul 28, 2026

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.

Implementation requirements:

  • Transports endpoint: client
  • Transports endpoint: server

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.

This is effectively implemented by Synapse via MatrixRTC.

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.

Note

When ran in widget mode, Element Call cannot yet use the /transports endpoint because the widget API doesn't expose access to it. This is covered by #4515.

@turt2live turt2live added the A-VOIP Any VoIP or MatrixRTC related proposals label Jul 28, 2026

A new "MatrixRTC Transports" registry is created with the following information:

* A transport `type`. MUST be an [Opaque Identifier](https://spec.matrix.org/v1.19/appendices/#opaque-identifiers).

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.

Currently this proposal says, "Types not in the registry are not permitted," but I hope that the spec could eventually make room for unregistered, proprietary transports which might not be suitable for making public. This seems easiest to manage if we recommend the Common Namespaced Identifier Grammar.

Previously we were recommending CNIG without the namespacing requirements so that we could still have an un-namespaced livekit as in this MSC, but I & others on the Element VoIP team would be interested in your judgement on whether it would be preferable to keep the namespacing requirement, if we say type uses CNIG.

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.

Explicitly supporting proprietary transports doesn't really fit the Guiding Principles in my opinion. We can support namespacing, but I would still probably keep the limitation that only registered types can be used, at least until Matrix itself has a transport type that's part of the core specification.

Without a core transport type in the spec we run the risk of only having proprietary transports, which defeats the purpose of this registry.

A later MSC can remove the condition easily enough without it being a breaking change.

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.

(leaving open for further opinions, but mentally considering resolved for now)

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.

would using m.livekit really be that bad?

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.

m.livekit is fine in isolation, but opening up the registry to have unregistered custom types I feel would be a mistake.

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 we should switch to m.livekit because we already use the namespacing elsewhere in MatrixRTC (e.g. m.per_member) and we would probably want to allow extensibility at some point.

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.

#4195 has switch to m.livekit now.

@turt2live

turt2live commented Aug 3, 2026

Copy link
Copy Markdown
Member Author

MSCs proposed for Final Comment Period (FCP) should meet the requirements outlined in the checklist prior to being accepted into the spec. This checklist is a bit long, but aims to reduce the number of follow-on MSCs after a feature lands.

SCT members: please check off things you check for, and raise a concern against FCP if the checklist is incomplete. If an item doesn't apply, prefer to check it rather than remove it. Unchecking items is encouraged where applicable.

MSC authors: feel free to ask in a thread on your MSC or in the#matrix-spec:matrix.org room for clarification of any of these points.

  • Are appropriate implementation(s) specified in the MSC’s PR description?
  • Are all MSCs that this MSC depends on already accepted?
  • For each new endpoint that is introduced:
    • Have authentication requirements been specified?
    • Have rate-limiting requirements been specified?
    • Have guest access requirements been specified?
    • Are error responses specified?
      • Does each error case have a specified errcode (e.g. M_FORBIDDEN) and HTTP status code?
        • If a new errcode is introduced, is it clear that it is new?
  • Will the MSC require a new room version, and if so, has that been made clear?
    • Is the reason for a new room version clearly stated? For example, modifying the set of redacted fields changes how event IDs are calculated, thus requiring a new room version.
  • Are backwards-compatibility concerns appropriately addressed?
  • Are the endpoint conventions honoured?
    • Do HTTP endpoints use_underscores_like_this?
    • Will the endpoint return unbounded data? If so, has pagination been considered?
    • If the endpoint utilises pagination, is it consistent with the appendices?
  • An introduction exists and clearly outlines the problem being solved. Ideally, the first paragraph should be understandable by a non-technical audience.
  • All outstanding threads are resolved
    • All feedback is incorporated into the proposal text itself, either as a fix or noted as an alternative
  • While the exact sections do not need to be present, the details implied by the proposal template are covered. Namely:
    • Introduction
    • Proposal text
    • Potential issues
    • Alternatives
    • Dependencies
  • Stable identifiers are used throughout the proposal, except for the unstable prefix section
    • Unstable prefixes consider the awkward accepted-but-not-merged state
    • Chosen unstable prefixes do not pollute any global namespace (use “org.matrix.mscXXXX”, not “org.matrix”).
  • Changes have applicable Sign Off from all authors/editors/contributors
  • There is a dedicated "Security Considerations" section which detail any possible attacks/vulnerabilities this proposal may introduce, even if this is "None.". See RFC3552 for things to think about, but in particular pay attention to the OWASP Top Ten.

@turt2live

Copy link
Copy Markdown
Member Author

@mscbot fcp merge
@mscbot concern Dependency - Registries
@mscbot concern Coordinate FCP with MatrixRTC

@mscbot

mscbot commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

This FCP proposal has been cancelled by #4519 (comment).

Team member @mscbot has proposed to merge this. The next step is review by the rest of the tagged people:

Concerns:

  • Dependency - Registries
  • Coordinate FCP with MatrixRTC
  • Unclear why this needs a registry instead of the normal spec process

Once at least 75% of reviewers approve (and there are no outstanding concerns), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

See this document for information about what commands tagged team members can give me.

@mscbot mscbot added proposed-final-comment-period Currently awaiting signoff of a majority of team members in order to enter the FCP. Process state. disposition-merge Process state. unresolved-concerns This proposal has at least one outstanding concern. Process state. labels Aug 3, 2026
@turt2live turt2live moved this from Ready for general review to Ready for FCP ticks in Spec Core Team Workflow Aug 3, 2026
@turt2live turt2live added 00-weekly-pings Tracking for weekly pings in the SCT office. 00 to make it first in the labels list. and removed needs-implementation This MSC does not have a qualifying implementation for the SCT to review. The MSC cannot enter FCP. labels Aug 3, 2026
Comment thread proposals/4519-rtc-transports-registry.md Outdated
Comment thread proposals/4519-rtc-transports-registry.md Outdated

A new "MatrixRTC Transports" registry is created with the following information:

* A transport `type`. MUST be an [Opaque Identifier](https://spec.matrix.org/v1.19/appendices/#opaque-identifiers).

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.

would using m.livekit really be that bad?

Comment thread proposals/4519-rtc-transports-registry.md
Comment thread proposals/4519-rtc-transports-registry.md
Comment thread proposals/4519-rtc-transports-registry.md
Comment on lines +31 to +34
added when a new proposal is opened which introduce a transport. They by default have a `type` of `msc0000.{stable_type}`,
but MAY be extended upon per the MSC's "Unstable Prefix" section provided they maintain the `msc0000`
prefix. For example, if a proposal changes substantially after the registration was made, the proposal
might suggest using `msc0000.livekit.v2`.

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.

Is there a benefit to customizing the prefixing rules like this other than making identifiers a little shorter? I would have expected that we'd just use the existing prefixing rules.

Comment on lines +52 to +53
* The author opens a spec PR to register the `msc4195.livekit` unstable type, using the MSC URL as
the specification reference (specifically the "Unstable Prefix" section/components).

@Johennes Johennes Aug 19, 2026

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.

The unstable transport is registered manually via a spec PR here but further up it says

[...] unstable transports are automatically added when a new proposal is opened which introduce a transport.

Having the registry change automatically as MSCs are opened worries me a little. I also wonder if we actually need to register unstable types in the registry at all? It feels like while something is not stable, it shouldn't land in the registry just like normal MSCs don't land in the spec either without being accepted?

That would also avoid the clean-up step 12 months after the transport became stable.

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.

Registries are outside of the spec, so they need their own mechanisms to track unstable prefixes.

Comment on lines +59 to +60
**Note**: If the MSC is detailed enough, a link to the rendered Markdown in the spec proposals repo
is probably suitable too.

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.

Linking by SHA would be ok but linking by branch name (which is normally done for the [Rendered] links) would allow for further changes to the registry-spec without new MSCs. I think for stable transports, I'd prefer the registry to just contain the required spec text – just like the normal spec.

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.

I'm not following the concern here, sorry - linking to a branch name to get live updates is the desired behaviour.

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.

My concern is that the registry itself should be stable. It shouldn't change unexpectedly without a release. Anything that aims to enter the registry requires an MSC. While the MSC is unstable / unmerged, the MSC alone is sufficient to coordinate any early implementations. We don't need to track unstable transports in the registry – just like we don't track unstable features in the Matrix spec itself.

Comment on lines +98 to +104
### Exception: MSC4195

Because MSC4195 has been used to test the unstable implementation of MSC4143 and has no unstable
prefixes itself, `livekit` is registered as an unstable type instead of `msc4195.livekit`. When
MSC4195 becomes accepted, its type is to be upgraded to `stable` with relevant changes to the spec
link. No implementation changes would be required outside what they'd need to do to support MSC4143
becoming stable itself.

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.

Should this rather move into #4195? Otherwise both MSCs mutually depend on each other?

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.

This MSC is better positioned to state the namespacing requirements. Stating them in this way doesn't create a dependency on MSC4195 - it's just saying "if/when MSC4195 enters the registry, it uses this type".

Comment thread proposals/4519-rtc-transports-registry.md

@clokep clokep left a comment

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.

@mscbot concern Unclear why this needs a registry instead of the normal spec process

Comment on lines +18 to +19
The primary motivation for a registry is to allow transports such as [MSC4195](https://github.com/matrix-org/matrix-spec-proposals/pull/4195)
to land with relative stability, but without placing a dependency on LiveKit into the core spec.

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.

The spec has some optional modules, this sentence along with the potential issue of there not being many RTC transports makes this feel like overkill to have this be a registry?

@Johennes Johennes Aug 20, 2026

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.

Yeah, I think we need to improve the motivation a little. The concrete advantages of the registry I can currently think of are:

  • Releasing transports is not dependent on the spec release cycle
    This proposal doesn't currently clarify whether the registry will be released together with the spec or not though. See also https://github.com/matrix-org/matrix-spec-proposals/pull/4519/changes#r3813858452.
  • Transports can more easily be removed from the registry than from the main spec
    Homeservers declare support for entire spec versions. Even if a feature is removed, servers often retain their implementations to be able to declare support for older spec versions. This came up as a concern when discussing the integration of the LiveKit transport with the Synapse team.

Having said that, I acknowledge the concern that we may not have a lot of transports, however. The transports the VoIP team at Element can foresee right now are:

  • LiveKit (MSC4195)
    This is the only one we have today.
  • A cascading SFU transport where users connect to their local SFU only and SFUs federate
    @fkwp has made some explorations on this. It'll require a dedicated SFU implementation. If proven worthwhile, this would be an alternative (if not a full replacement) for the LiveKit transport. Currently, it seems likely that we'll work on this after Matrix 2.0.
  • A full-mesh transport where members connect to each other directly as in legacy VoIP
    This would be an alternative for small calls without LiveKit. Currently, it does not seem overly likely that we'll work on this in the near future unless somebody sponsors it.

It's difficult to predict what transports other people might come up with though.

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.

Transports can more easily be removed from the registry than from the main spec
Homeservers declare support for entire spec versions.

I don't buy this. If we add a capability for them then just rip it out and mark it as unsupported via the capability.

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.

@erikjohnston is the main proponent for not putting LiveKit into the spec, so I'd appreciate talking points from him that can be included in this MSC.

@clokep

clokep commented Aug 20, 2026

Copy link
Copy Markdown
Member

@mscbot concern Unclear why this needs a registry instead of the normal spec process

# MSC4519: MatrixRTC Transports Registry

[MSC4143](https://github.com/matrix-org/matrix-spec-proposals/pull/4143) describes the framework for
Real-Time Communication (RTC) applications to operate over Matrix. The MSC also allows for alternate

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.

Not really 'alternate': it needs a transport to work at all.

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.

…which does somewhat conflict with the registry msc's requirement that only optional functionality be in registries… I suppose it's optional in that you don't have to implement all of them, even if you have to implement one?

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.

"alternate" is in contrast to the specified transport itself, if any. We don't currently have that, so this might be confusing.

Comment thread proposals/4519-rtc-transports-registry.md
## Security considerations

Individual transports are expected to have their own security considerations. The presence of a
registry does not carry inherent security challenges, per MSC4518.

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.

I would argue that they very much do since they offer a way for protocol to become spec with little or no review.

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.

The review requirements are the same as any other MSC, so I'm not sure that holds true. It's also not a Security Consideration, but would rather be a Potential Issue.

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.

If a transport is added to the registry as soon as an MSC is created for it, doesn't that mean it's fair game to start using it as soon as you've created an MSC, regardless of whether anyone has looked at the MSC?

* Stability (`stable` or `unstable`).
* A link to the specification for that transport, per MSC4143.

`stable` transports are added/changed/removed through normal MSCs. `unstable` transports are automatically

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.

I have to admit I'm somewhat struggling with what the MSC really achieves since clients could implement an open MSC today, so this feels like just a way to bypass the review process, but then isn't that process there for a reason?

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.

With the idea that registries exist outside of the spec, we need to define the process by which the registry is updated/used. This includes defining how unstable types are reflected in the proposed endpoint and how experimental implementations are worked on. Without automatic registration, we'd need 2 MSCs before implementations could start using a new transport: one to define the transport (already required) and another to add that to the registry.

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.

Well my point is that if there was no registry, you could just create the MSC and then start using it unstable-prefixed as we do now?

@turt2live

Copy link
Copy Markdown
Member Author

For documentation: #4518 is no longer part of Matrix 2.0, but this MSC remains in scope (currently). Dependencies on MSC4518 will be removed in a later editorial pass, pending the outcome of further conversations around registries as a concept.

// GET /_matrix/client/v1/rtc/transports
// 200 OK
{
"rtc_transports": [

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.

We should rename this to just transports for parity with the m.rtc.member events from #4143.

@turt2live

Copy link
Copy Markdown
Member Author

This MSC is being removed from the Matrix 2.0 scope, so is being removed from FCP too.

@Johennes - the /transports endpoint will need to be returned to the original MSC it came from. This MSC can be left to bitrot.

@mscbot fcp cancel

See this post in the SCT Office for more information.

@mscbot mscbot added proposal-in-review Process state. and removed proposed-final-comment-period Currently awaiting signoff of a majority of team members in order to enter the FCP. Process state. disposition-merge Process state. labels Sep 1, 2026
@turt2live turt2live removed matrix-2.0 Required for Matrix 2.0 (note: do not rename - used in reports/links) 00-weekly-pings Tracking for weekly pings in the SCT office. 00 to make it first in the labels list. labels Sep 1, 2026
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 A-Process Related to the spec process itself (MSC process) A-VOIP Any VoIP or MatrixRTC related proposals kind:core MSC which is critical to the protocol's success proposal A matrix spec change proposal. Process state. proposal-in-review Process state. unresolved-concerns This proposal has at least one outstanding concern. Process state.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants