Language: Rust Organization: Cloudflare Maintainer: Mike English (@englishm) GitHub: cloudflare/moq-rs (was englishm/moq-rs) Slack: moq-rs (C09CG9V7A2Y) — shared channel, covers both this and moq-dev
Overview
Cloudflare’s Rust implementation of IETF MoQ Transport. Provides both relay and client functionality, strictly following the IETF MoQ working group specifications. One of the most active implementations in the ecosystem.
History
Timeline:
- 2022-06-29: Luke Curley creates
kixelated/warp(Go implementation) - 2023-04–05: Luke rewrites from Go to Rust (PR #15, May 22)
- Mid-2023: Mike English begins collaborating closely with Luke — near-daily discussions on codebase design and the evolving IETF MoQ Transport spec. Mike’s contributions include early containerized relay deployments (Fly.io, GKE), the first MoQT client publisher (moq-pub), an exploration of C FFI for ffmpeg (englishm/libmoq), and an update to support draft-ietf-moq-transport-04. See Mike’s pre-fork commits.
- 2024-10-07: Luke publishes his “Fork” blog post, stepping away from the IETF WG to focus on moq-lite/Transfork
- 2024-10-15: Mike creates
englishm/moq-rs(fork of Luke’s repo) to maintain IETF WG alignment - Later: Transferred to Cloudflare as
cloudflare/moq-rs
The two projects are now considered sibling implementations — neither is upstream of the other. See moq-dev for Luke’s original project.
Key Contributors
- Mike English (@englishm) — Maintainer. Joined during the Go→Rust transition as a close collaborator.
- Manish (@itzmanish) — Cloudflare developer, currently working on draft-16 support (PR #170)
- Jacob (@nnazo) — Cloudflare developer working on the MoQ relay service
- Scott Godin (@sgodin) — Did the bulk of the draft-07 → draft-14 message migration
- Zafer Gurel (@zafergurel) — Substantial early contributions to moq-transport protocol messages; went on to create moqtail
- See the full contributors page
Draft Support
- main branch: draft-14 (IETF WG spec) — current production deployment
- draft-18:
draft-18-devbranch behind the runner-registeredmoq-rs-draft-18relay; the request-stream rework (PR #178, removesMAX_REQUEST_ID, moves requests to bidi streams) merged in the July-8 burst. SUBSCRIBE_NAMESPACE support (PR #187, itzmanish/Manish) merged tomainJuly 19, anddraft-18-devwas rebased ontomainthe same day to prep the Vienna Hackathon relay. Relay draft-18 restoration — PR #211 (Jacob/@nnazo, “Restore relay work for draft-18 and port missing session layer,” +12164/−778) merged Aug 18, bringing the relay role — which had lagged on draft-14/16 while the client tracked draft-18 — back onto draft-18 and porting the missing session layer, with unit-test coverage from PR #156 (+950/−71). The queued release-please round (PR #212) merged Aug-29, cutting themoq-relay-ietfv0.7.26 train (see Latest release below). Follow-on draft-18 relay work landed Aug-28: PR #220 “treat peer-forwarded PUBLISH_NAMESPACE as discovery-only” (+430/−14), PR #222 “Add rendezvous timeout support” (nnazo, +2010/−158), PR #217 “correlate logs by MoQ session” (itzmanish, +1675/−192), and PR #221 TrackName test fixes. Pre-hackathon draft-18 conformance push (Aug 31 → Sep 1): driven by afrind’s moxygen conformance run (see interop-runner), mike-english landed three large fixes ondraft-18-dev— PR #224 “support draft-18 subgroup modifiers” (+1568/−165, Aug-31 02:39 UTC), PR #225 “preserve draft-18 datagram semantics” (+1141/−575), and PR #226 “await publish terminal delivery” (+1763/−293, Sep-01), and PR #227 “preserve ordered rendezvous teardown” (nnazo, +4308/−738, Sep-01). After #224 the moxygen conformance run showed the relay passing Section 1 tests 1–3 on both QUIC and WebTransport (up from failing before SUBSCRIBE completed on Aug-30); English then landed a datagram fix (Aug-31 23:35) and afrind’s Sep-1 re-run reported the relay passing conformance Sections 1 and 2, with Section 3 now the front (“Section 3 had some troubles, I’m checking”). At the Sep-2 draft-18 interop hackathon the relay reached Sections 1–7 passing — 43/59 on both QUIC and WebTransport (afrind: “CF passes section 1-7”), failing only Section 8 (PUBLISH) and Section 10 (Joining FETCH), after four Sep-2 fixes: PR #228 “preserve subgroup fanout”, PR #229 “preserve subgroup object status”, PR #230 (rendezvous-timeout interop scenario), and PR #231 “reject duplicate namespace requests locally”. Sep-3 added inboundSUBSCRIBE_TRACKSsupport (PR #232, +2004/−39) and a follow-on surfacing SUBSCRIBE_OK params / PUBLISH_DONE details / clean subgroup close (PR #233, +263/−19) — both mike-english ondraft-18-dev. (Separately, the hackathon sweep diagnosed a moq-rsSUBSCRIBE_OKwire bug — itsKeyValuePairs::encodewrites a spurious “Number of Extensions” count varint before the trailing Track Extensions, which draft-16 Fig. 12 defines as a bare count-less KVP run; symmetric decode means moq-rs interops with itself but not with moxygen. Diagnosed by Marzot, headed upstream; see discussions-2026-09.) The umbrella draft-18 PR #176 stays OPEN. Oct-6 wire interop fix: after ~5 quiet weeks the relay woke up and PR #254 (+181/−265) removed the leftover draft-16Subscribe Optionsvarint fromSUBSCRIBE_NAMESPACE, aligning it with draft-18 §10.18 (Request ID | Track Namespace Prefix | Parameters) — the old field broke interop in both directions against any conformant draft-18 peer. It shipped in the v0.7.28 release train below (see Latest release). - draft-16: the long-open community rewrite (PR #170, itzmanish) merged July 8; its follow-on PUBLISH message support (PR #181, +4049/−624) merged July 9
- Latest release:
moq-relay-ietfv0.7.28 (Oct-6 23:14 UTC, release-please) — withmoq-transportv0.16.4 /moq-apiv0.2.15 /moq-pubv0.9.6 /moq-subv0.4.17 /moq-clock-ietfv0.6.23 /moq-test-clientv0.1.15 — the batch carrying the Oct-6 wake-up: the PR #254SUBSCRIBE_NAMESPACEdraft-18 wire fix, plus toolchain repairs (PR #249 replaces the abandonedhyper-servewithaxum-server0.7.3; PR #250 declares themoq-apiserde-derive feature; PR #248 suppresses adouble_must_uselint). Prior:moq-relay-ietfv0.7.26 (Aug-29, PR #212 release-please) — withmoq-pubv0.9.4 /moq-subv0.4.15 /moq-clock-ietfv0.6.21 /moq-test-clientv0.1.13 — the batch carrying the Aug-28 draft-18 relay work (discovery-only peer-forwarded PUBLISH_NAMESPACE [#220], rendezvous-timeout support [#222], session-correlated observability [#217]). Prior: v0.7.25 (July 31) shipped the relay upstream-retention fix (moq-pubv0.9.3 /moq-subv0.4.14 /moq-clock-ietfv0.6.20 /moq-apiv0.2.13 /moq-test-clientv0.1.12), following the July-20 v0.7.24 (moq-native-ietfv0.10.0, PR #190) and July-19 v0.7.23 SUBSCRIBE_NAMESPACE batches. Bug issue #191 (dmorn) — the relay retains an upstream track subscription after the last downstream subscriber leaves — was fixed July 30 by PR #196 (release upstream subscriptions for idle cached tracks) and backported to the draft-14mainbranch July 31 by PR #198 (+1986/−163), with a companion ordering fix PR #197 (wait for upstream subscription before sending SUBSCRIBE_OK, +477/−55) — all cut in v0.7.25 - Historical branches: draft-04, 05, 06, 07
Public Infrastructure
- Anycast relays:
draft-14.cloudflare.mediaoverquic.com:443(draft-14)draft-07.cloudflare.mediaoverquic.com:443(draft-07, deprecated)
- Interop relays (with mlog capture):
interop-relay.cloudflare.mediaoverquic.com:443(draft-14)draft-16-manish.cloudflare.mediaoverquic.com:443(draft-16, WIP)draft-18-interop.cloudflare.mediaoverquic.com:443(draft-18, auto-deployed fromdraft-18-dev)
- All support raw QUIC and WebTransport on port 443
- Interop relays have
--mlog-servefor debugging:/<connection-id>over HTTPS
NAB Show 2026
Cloudflare’s moq-rs relay network is a key component in multiple NAB demonstrations:
- Wowza + Cloudflare: Live CMAF-to-MoQ demo at booth W2300
- Bitmovin Player Web X: Sub-second playback tested against Cloudflare’s 330+ city relay network
Recent Highlights (as of September 2026)
Day-by-day PR/issue history lives in the wiki log; this section keeps only durable milestones.
- draft-18 landed and a registered relay went live. PR #173 (“Start work on draft-18”, englishm) opened on the London hackathon floor June 9 and merged June 11. A rolling
draft-18-devbranch (PR #176) auto-deploys todraft-18-interop.cloudflare.mediaoverquic.com:443and is registered in the interop-runner asmoq-rs-draft-18— closing a long-standing two-draft gap (mainstays draft-14). The follow-on PR #178 removesMAX_REQUEST_IDand moves requests onto bidi streams (cf. moq-transport Issue #1653); it merged in a July-8 burst that also shippedmoq-relay-ietfv0.7.21. - Pluggable AuthHook / relay authorization. PR #169 (englishm) proposed an AuthHook trait for intra-scope relay authorization; PR #171 (Suhas) implemented it with new
moq-authandmoq-auth-catcrates (C4M — CAT for MoQ). Thibault Meunier’s review pushed the trait toward issuer-aware challenge/reply so it also fits PrivacyPass. Both OPEN as the shared coordination venue. - draft-16 rewrite + PUBLISH support. Manish (@itzmanish) closed his 155-day-old PR #131 and reopened it as PR #170 (“[Rewrite] Draft-16 migration”), the underlying draft-16 baseline (merged July 8). Its large follow-on PR #181 (“Publish message support”, +4049/−624) merged July 9, adding native PUBLISH-message handling and triggering a
moq-relay-ietfv0.7.22 /moq-pubv0.9.0 release round. - Namespace pub/sub and qlog alignment. PR #157 (Suhas) added Publish/Subscribe Namespace support with a new relay
subscriber_registry; PR #163 (mike-english) aligned mlog qlog output with draft-pardue-moq-qlog-moq-events-03. - draft-18 SUBSCRIBE_NAMESPACE + Vienna Hackathon prep. PR #187 (Manish) landed SUBSCRIBE_NAMESPACE on
mainJuly 19, anddraft-18-devwas rebased ontomainthe same day for the IETF-126 Hackathon relay — cut asmoq-relay-ietfv0.7.23 (+ moq-pub v0.9.1 / moq-sub v0.4.12 / moq-clock-ietf v0.6.18 / moq-test-client v0.1.10). At the Hackathon thedraft-18-interop.cloudflare.mediaoverquic.com:443relay was “back to the initial draft-18 features + PUBLISH and SUBSCRIBE_NAMESPACE” (mike-english), though testers (Miniero, Kota Yatagai) still saw SUBSCRIBE not reaching the publisher — an in-progress gap Mike is debugging for Friday’s interop report. - Passthrough (cache-free) FETCH in the relay (2026-09-29). PR #236 (itzmanish, +2,946/−61, 19 files), the repo’s first merge in a month, lets the relay proxy a standalone FETCH it cannot answer from cache. It allocates a fresh upstream FETCH per request over the pooled relay connection, copies the FETCH stream bytes through unchanged, handles
FETCH_OKarriving before or after the stream, and preserves upstreamREQUEST_ERRORcodes. This is the cacheless-relay rule Will Law stated on Slack on Sep-18. Still unsupported: Joining FETCH, cache-backed responses and exact-PUBLISH origins. The tests use draft-16 FETCH framing. Unreleased; v0.7.26 remains the latest tag. - Oct-6 wake-up — SUBSCRIBE_NAMESPACE draft-18 wire fix + v0.7.28 (2026-10-06/07). After ~5 weeks quiet since the Sep-29 passthrough-FETCH merge, the repo landed six PRs. The durable one is PR #254 (+181/−265), which drops the stale draft-16
Subscribe Optionsvarint fromSUBSCRIBE_NAMESPACEso the message matches draft-18 §10.18 — a two-way interop regression against any conformant draft-18 peer. It shipped (with toolchain repairs #248/#249/#250) in themoq-relay-ietfv0.7.28 release train (Oct-6) — the first tagged release since v0.7.26 (Aug-29). - Relay plumbing. A
socket_wrapperhook to wrap the underlying UDP socket landed (PR #174, merged June 10); a proposed warm-cache-linger + upstreamUNSUBSCRIBEscheme for propagating downstream interest loss is under review (PR #180, OPEN). - Relay upstream-retention fix — merged, then shipped. PR #196 (mike-english, +1740/−150, merged July 30) releases upstream subscriptions for idle cached tracks and stops FIN-ing subgroup streams mid-object — fixing the issue #191 bug where the relay held an upstream subscription after the last downstream subscriber left (the same relay-lifecycle class as moqtail issue #332). It was then backported to the draft-14
mainbranch July 31 (PR #198, +1986/−163) with a companion ordering fix (PR #197 wait for upstream subscription before sending SUBSCRIBE_OK, +477/−55) and shipped as themoq-relay-ietfv0.7.25 release train (July 31) — the repo’s first tagged release since July 20 and a durable correctness gain on the recurring post-Vienna relay-resource-lifecycle front. - draft-18 relay hardening + v0.7.26 (Aug-28/29). After ~7 quiet days the relay woke up again for pre-hackathon prep: PR #220 makes a peer-forwarded PUBLISH_NAMESPACE discovery-only (a relay-mesh clustering behavior), PR #222 adds rendezvous-timeout support (Jacob/@nnazo), and PR #217 adds session-correlated log observability (Manish/@itzmanish). The queued release-please round (PR #212) then merged, cutting the
moq-relay-ietfv0.7.26 train (Aug-29) — the first tagged release since July 31.
Interop
- Registered in interop-runner as moq-rs (draft-14), moq-rs-draft-16, and moq-rs-draft-18
- moq-rs-draft-16 ←> moxygen: 12 pass in interop runner
Related
- moq-dev - Luke Curley’s original project (moq-dev/moq), sibling implementation
- moq-js - IETF-aligned JavaScript companion (video-dev/moq-js)
- interop-status - Cross-implementation testing
- interop-endpoints - Full endpoint listing