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-dev branch behind the runner-registered moq-rs-draft-18 relay; the request-stream rework (PR #178, removes MAX_REQUEST_ID, moves requests to bidi streams) merged in the July-8 burst. SUBSCRIBE_NAMESPACE support (PR #187, itzmanish/Manish) merged to main July 19, and draft-18-dev was rebased onto main the 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 the moq-relay-ietf v0.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 on draft-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 inbound SUBSCRIBE_TRACKS support (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 on draft-18-dev. (Separately, the hackathon sweep diagnosed a moq-rs SUBSCRIBE_OK wire bug — its KeyValuePairs::encode writes 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-16 Subscribe Options varint from SUBSCRIBE_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-ietf v0.7.28 (Oct-6 23:14 UTC, release-please) — with moq-transport v0.16.4 / moq-api v0.2.15 / moq-pub v0.9.6 / moq-sub v0.4.17 / moq-clock-ietf v0.6.23 / moq-test-client v0.1.15 — the batch carrying the Oct-6 wake-up: the PR #254 SUBSCRIBE_NAMESPACE draft-18 wire fix, plus toolchain repairs (PR #249 replaces the abandoned hyper-serve with axum-server 0.7.3; PR #250 declares the moq-api serde-derive feature; PR #248 suppresses a double_must_use lint). Prior: moq-relay-ietf v0.7.26 (Aug-29, PR #212 release-please) — with moq-pub v0.9.4 / moq-sub v0.4.15 / moq-clock-ietf v0.6.21 / moq-test-client v0.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-pub v0.9.3 / moq-sub v0.4.14 / moq-clock-ietf v0.6.20 / moq-api v0.2.13 / moq-test-client v0.1.12), following the July-20 v0.7.24 (moq-native-ietf v0.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-14 main branch 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 from draft-18-dev)
  • All support raw QUIC and WebTransport on port 443
  • Interop relays have --mlog-serve for 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-dev branch (PR #176) auto-deploys to draft-18-interop.cloudflare.mediaoverquic.com:443 and is registered in the interop-runner as moq-rs-draft-18 — closing a long-standing two-draft gap (main stays draft-14). The follow-on PR #178 removes MAX_REQUEST_ID and moves requests onto bidi streams (cf. moq-transport Issue #1653); it merged in a July-8 burst that also shipped moq-relay-ietf v0.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-auth and moq-auth-cat crates (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-ietf v0.7.22 / moq-pub v0.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 main July 19, and draft-18-dev was rebased onto main the same day for the IETF-126 Hackathon relay — cut as moq-relay-ietf v0.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 the draft-18-interop.cloudflare.mediaoverquic.com:443 relay 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_OK arriving before or after the stream, and preserves upstream REQUEST_ERROR codes. 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 Options varint from SUBSCRIBE_NAMESPACE so 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 the moq-relay-ietf v0.7.28 release train (Oct-6) — the first tagged release since v0.7.26 (Aug-29).
  • Relay plumbing. A socket_wrapper hook to wrap the underlying UDP socket landed (PR #174, merged June 10); a proposed warm-cache-linger + upstream UNSUBSCRIBE scheme 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 main branch 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 the moq-relay-ietf v0.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-ietf v0.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