Language: C++ (mvfst-based)
Organization: Meta
Maintainer: alan-frindell, Joseph Beshay
GitHub: facebookexperimental/moxygen
Relay endpoint: fb.mvfst.net
Overview
Meta’s open-source C++ MOQ implementation built on their mvfst QUIC library. Includes relay, client, and protocol library. OpenMOQ maintains a fork (openmoq/moxygen) as a buffer repo for their planned moqx server.
History
- 2026-03-16: alan-frindell achieved 0-RTT subscribe with draft-16 + unidirectional control streams.
- 2026-06-09/10: draft-18 relay live at the London hackathon — afrind brought the relay up at
fb.mvfst.net:9448(QUIC + WebTransport) supporting versions 14/16/18, the first publicly-announced draft-18 relay endpoint. Known gaps at launch: no REDIRECT errors, no GOAWAY-on-request-stream, no PUBLISH_BLOCKED. afrind also shipped a draft-18 wire decoder (moqx/tools/moq_decode.py, openmoq/moqx PR #398) to help debug interop failures.
Draft Support
- Draft 14 and 16 supported
- Can negotiate draft 15
- qmux support on port 9449
Public Infrastructure
- QUIC relay:
moqt://fb.mvfst.net:9448/https://fb.mvfst.net:9448/moq-relay - QMux relay:
fb.mvfst.net:9449(TLS/TCP and QUIC) - WebSocket proxy:
wss://fb.mvfst.net:9450(proxying to TLS on 9449)
Recent Highlights
-
The conformance matrix reaches ten sections — and everyone fails Section 10 (Sep-25, 2026) — afrind’s
moq-testharness now runs 10 sections, adding 9. FETCH Ranges and 10. Joining FETCH to the eight used at the Sep-2 hackathon. The Sep-25 sweep: moxygen itself 75/76 (QUIC) and 74/76 (WT), moqx 68/76 and 70/76, Nokiamoqt-nr41/76 and 52/76, moq-rs 51/76 (WT only), imquic 25/76, and moq-dev, moqtail andstitcher-moqall failing the smoke test outright (“no subscribe”). Section 10 fails for every implementation including afrind’s own two relays — “I think the tool has some pending fixes.” Two durable facts came out of the thread with Luke Curley: the results are not published anywhere automatically (you fetch a prebuilt moxygen tree from OpenMOQ and run it yourself), and the suite refuses to run at all unless one object arrives with every bit correct — “if you can’t get one object through … it refuses to run the whole suite” — which is why moq-dev, lacking wire-level publisher priority, scores no partial credit. -
mlog gains probabilistic session sampling (Sep-25, 2026) — a
SamplingMLoggerFactory(#238) lets a deployment log a fraction of sessions rather than all or none, and a companion change stops MLog retaining object payload bodies — the two together make mlog viable to leave on in production. -
Conformance harness for the Sep-2 draft-18 hackathon: moxygen’s
moq-testconformance script is the de-facto draft-18 relay-conformance harness for the ecosystem — afrind runs it against every live relay registered in the interop-runner and posts the per-section pass matrix to Slack#moq. By Sep-1 it covered 10 sections, having gained Section 9 (FETCH Ranges) and Section 10 (Joining FETCH) (“new as of Monday”). At the Sep-2 hackathon it drove rapid fixes in moqtail (4/17 → 53/59) and moq-rs (Sections 1–7); moxygen’s own relay scored 74/76 quic · 75/76 WT — after afrind candidly reported it first failed its own suite over a real cross-country network (58/76 quic, 69/76 WT: “How embarrassing”), exposing network-timing bugs in the harness that local runs hid. The conformance tests are being folded into the runner itself (runner #103, OPEN). -
Transparent MoQ proxy at the edge (2026-09-01): a new
MoQProxyHandler(eed28e56) plus MoQ-proxy lifecycle management (94b0e93c) — a transparent MoQ proxy component — alongside an OSS-buildability push (exported/BB runtime libraries, OSS tests + CI coverage). -
Request-stream GOAWAY series (2026-08-21): @sandarsh landed a five-commit pass giving GOAWAY proper semantics on request streams — context-aware GOAWAY framing, admitting GOAWAY on established SUBSCRIBE/FETCH streams, a
MoQSession::requestStreamGoawayAPI (+224/−0), surfacing migration toTrackConsumer/FetchConsumer(+231/−0), and resetting the stream withGOING_AWAYafter a timeout. This is the relay-drain/migration path that moq-transport’s GOAWAY-restriction PR #1852 is specifying. -
Interop-client ALPN gap (Aug 2026): the moxygen relay negotiates draft-18 correctly, but the interop client binary’s
kInteropAlpnslackedmoqt-18, so draft-18-only relays failed the handshake — a configuration defect that showed up as protocol failures in the interop-runner matrix. Documented in runner PR #111; fixes tracked in issue #219 — englishm’s #221 addsmoqt-18, afrind’s #222 landed ALPN derivation, and gmarzot’s #223 (derive ALPNs,--versions, report the negotiated draft) is still OPEN. -
MoQMediaServer — a new server + binary with an
MoQMp4Receivertest client and CMake/OSS build wiring (@sandarsh, Aug 18–19), plus afrind fixes: routing SUBSCRIBE past publisher-less namespace nodes, emitting the subgroup End of Group bit, and resolving publisher priority from track property extensions. Day-by-day PR/issue history lives in the wiki log; this section keeps only durable milestones. -
Meta lands moxygen via an internal-diff (Phabricator) workflow — changes merge to
mainas direct commits, not GitHub PRs, so most GitHub PRs are mirrors that get closed unmerged even when the change actually ships. PR-based activity scans therefore understate real progress. -
The active relay/stats/TLS development line runs through the moqx fork rather than the upstream tree — afrind’s relay/stats hardening and gmarzot’s PKCS#12 TLS work land there. See openmoq.
-
qlog + visualization tooling: per-connection QLogger wiring (
HQServerTransportFactory::setQLoggerFactory) and an overhauled MoQ viz tool (NDJSON input, track-alias reconstruction, no CDN dependency). -
Wire-conformance tightening: a zero
DELIVERY_TIMEOUTis now a PROTOCOL_VIOLATION on draft ≤16 (the versions moxygen advertises). -
draft-18 REQUEST_UPDATE / FORWARD work (mid-July 2026, direct commits): subscriber-side
request_updatesfor SUBSCRIBE_TRACKS and SUBSCRIBE_NAMESPACE, Forward made updatable in REQUEST_UPDATE for SUBSCRIBE_TRACKS, and subgroup-reopen gated on v18 forward resume — the implementation side of the upstream FORWARD-on-REQUEST_UPDATE / INCLUDE_PROPERTIES cluster (ianswett’s moq-transport #1813). Breaks a weeks-long GitHub-visible quiet streak (consistent with the Phabricator-diff workflow above).
Interop
- Frequently used as the “reference relay” for interop testing; see interop-endpoints for the full endpoint listing.
Related
- moq-rs - Alternative relay implementation
- interop-endpoints - Full endpoint listing