Media over QUIC (MoQ)
Relay-oriented transport for media and data workloads
MoQ is the relay-oriented transport option for workloads that don't fit simple peer-to-peer mesh behavior — broadcast patterns, fan-out, structured media delivery.
Availability
The public client accepts an explicit Draft 14 relay configuration. There is no anonymous production relay default, and construction remains side-effect free: the relay is opened only after an admitted peer advertises the matching mode.
When to use MoQ
MoQ is a better fit when you want:
- Broadcast or fan-out patterns
- Relay-based delivery
- Less reliance on direct peer-to-peer connectivity
const rtc = OpenRTC({
apiKey,
transports: {
moq: {
relayUrl: 'https://draft14-relay.example.com/moq',
accessToken: await shortLivedMoqToken(),
},
},
});
Pass short-lived relay authorization separately rather than appending credentials to relay URLs. Long-lived provider credentials must never be compiled into browser or mobile bundles.
transports.relay: false disables MoQ even when a moq configuration is
present, because MoQ is a relay route in the current public transport model.
The app manifest must also enable features.relay and features.moq; local
configuration cannot raise either server policy.
OpenRTC native and browser clients negotiate moq-transport-14. Public preview
endpoints can upgrade independently and are not drop-in relays; verify Draft 14
compatibility with the provider before enabling a hosted URL. Legacy Draft 7
endpoints are not compatible.
The configured relay must prove Draft 14 interoperability in the
operator-gated hosted lane. A provider's general public MoQ documentation may
describe a different protocol generation and is not compatibility evidence for
OpenRTC. Do not build application semantics around relay-side FETCH,
GOAWAY, or SUBSCRIBE_UPDATE; OpenRTC uses a live publish/subscribe subset
and keeps Iroh as the recovery path.
Relation to peer handles
MoQ carries Iroh packets, so application code stays on ordinary Iroh streams and named channels. The runtime handles physical carrier selection internally.