Last week, CommCon 2026 in Düsseldorf became one of the first conferences in the real-time communications space to be live-streamed using MOQ. In the weeks leading up to it, I built the streaming setup from scratch: reading IETF drafts, getting an OBS plugin to publish over MOQ, and writing a custom browser player to receive and play back the stream.
This post describes how I did it, the problems I ran into along the way, and what I'd do differently. It's aimed at developers who want to use MOQ today, using the available tools and projects where possible. MOQ tooling is still young and moving fast, so some of this will date quickly, but the decisions and trade-offs are likely to stay relevant for a while.
Why MOQ?
I first got excited about MOQ after watching Ali C. Begen's talk "Streaming Bad: Breaking Latency with MOQ" at RTC.On 2025, followed by Luke Curley's "MoQ: Not Another Tech Demo" at Demuxed 2025. The promise is genuinely compelling:
- Sub-second latency at CDN scale
- On-demand replay using the same relay infrastructure as the live stream
- Seamless rewind: fetch older objects from the relay, then jump back to the live edge in the same player
- Natural insertion points for AI processing mid-stream, since you're handling individual media objects
On the other hand, the IETF draft is still in flux, and there are only a handful of open-source projects at various stages of maturity. To our knowledge, nobody had live-streamed a conference in the real-time communications space using MOQ before, so we decided we’d give it a try at CommCon 2026.
The stack
Before writing a single line of code, you need to make three decisions: what will publish the stream, what will relay it, and what will play it back. These three components need to agree on a MOQ draft version, and that choice will constrain everything downstream.
Publisher: OBS + moq-obs plugin
Since we planned on receiving an NDI feed from the venue’s AV setup, publishing from OBS was the obvious choice here. I used the moq-obs plugin, which required building both the OBS fork and the plugin from source. The plugin publishes separate video and audio tracks over MOQ.
Constraints to be aware of:
- 720p cap: the plugin doesn't support higher resolutions at the time of writing
- H.264 Annex B video. This turns out to matter a lot (more on this below)
- Raw AAC-LC audio: one frame per MOQ object, no init object
- The plugin targets MOQ draft 15+, which creates friction if your relay is on an older draft
- Catalog format changes: upgrading libmoq from 0.2.9 to 0.2.13 changed both the catalog format and broke compatibility with older relays. I ended up pinning to an earlier commit.
Relay: Cloudflare
Cloudflare operates MOQ relay infrastructure across its network: every Cloudflare server is potentially a MOQ relay. The appeal is obvious: you get a global CDN without deploying or maintaining anything yourself.
The relay is currently an alpha release and it comes with trade-offs: Cloudflare's relay is on MOQ draft 14, and not all message types are supported. This fact cascades through your entire stack. It means:
- Your publisher and subscriber must be compatible with draft 14
- Although described in draft 14, the FETCH message type is not currently supported by Cloudflare, which eliminates any VOD or rewind capability
- Similarly, the SUBSCRIBE_NAMESPACE message type is not supported, which means you need to rely on the catalog for track discovery
- You have no visibility into what's happening on the relay side, which makes debugging publisher/relay interactions very difficult
If I did this again, I'd be tempted to deploy my own relay, for example using the MOQtail relay. You lose the global network, but you gain full control over the draft version, supported features, and the ability to actually debug what's happening between the publisher and the relay. The Cloudflare black box caused me a lot of confusion over audio issues that may or may not have been draft incompatibilities.
However, deploying one or two instances of a relay is not the same as having a CDN. Tech demos are easy if you control all the parts, but our purpose for CommCon was really to show what's currently possible with the tools available out there. Not using the Cloudflare CDN would mean giving up on one of the main selling points of MOQ.
Player: MOQtail + custom code
I used MOQtail as the MOQ client library, which handles the WebTransport connection and the MOQ protocol message exchange with the relay (subscribe, unsubscribe, object delivery). The media handling (building video frames, decoding audio, syncing playback) is all custom code, and that's where the real work was.

