Orientation page for MOQ interoperability. The live numbers are not kept here — they live on the pages below, which are updated on every wiki refresh.

Where to look

  • interop-runner — the automated nightly matrix: current cut, daily deltas, registered endpoints, and the interop target draft. This is the authoritative source for pass/fail counts.
  • interop-endpoints — public relay endpoints you can point a client at.
  • interim-meetings — scheduled interop events, including the 2026-09-02 virtual interop hackathon on draft-18.

This page previously duplicated the runner’s matrix and drifted badly out of date (it asserted a draft-16 target and a 105-cell matrix months after both had changed). The duplicated tables were removed on 2026-08-22; what remains is the durable, non-numeric material.

Interop target

The interop target is a WG decision, distinct from the newest published draft:

  • Current automated target: draft-18. Reaffirmed by Alan Frindell on Slack (July 18) — implementers are welcome to try draft-19, but draft-18 is the target. Still true of the nightly interop-runner as of the 2026-09-22 cut.
  • Seattle interim (Oct 12–15) target: draft-18 + draft-22 — decided at interim-2026-moq-24 (2026-09-21), superseding the draft-20 target set at interim-23 on Sep-8. Martin Duke announced it on Slack the same hour: “we declared draft-22 (along with -18) to be the Interop target. -22 is functionally identical to -20 except the ALPN, so there should be no practical difference.” Because -21 and -22 are structural/editorial revisions of draft-20’s wire, the interim-23 wire-freeze is unaffected; what changed is the ALPN and the fact that draft-18 stays a first-class target rather than a best-effort one. The interim-24 minutes (posted 2026-09-28) confirm the decision. draft-22 was published 2026-10-01 (21:36 UTC), eleven days before interop opens. It is not quite wire-identical to -20/21: LOCATION_FILTER now carries an explicit Location Filter Type instead of a length-inferred field set (#1953), so implementations moving 20/21 → 22 need that change plus the moqt-22 ALPN (see moq-transport). As of the Oct-2 nightly the interop-runner still targets draft-18 and no endpoint declares draft-21 or -22 on main; runner PR #134 (Oct-1) is the first to declare -21/-22 (for stitcher-moq).
  • Named successor: draft-22. The interim-2026-moq-21 minutes (posted 2026-08-14) state “Draft 22 will be published as the next official interop target”, after draft-20 and draft-21 (the editorial-meeting output). Note: the minutes billed draft-20 as “a purely-editorial cut”, but the published draft-20 is not — it carries the fill-fetch replacement of Joining FETCH, PUBLISH_STATE_NOTIFY, the Type Flags bitfield respec and more (see moq-transport). Implementations retargeting 18 → 20 for Seattle should budget for real wire work.
  • draft-20 is the target for the Seattle hybrid interim (Oct 12–15), per Mike English’s Aug-21 hackathon announcement. Superseded twice: interim-23 (Sep-8) confirmed draft-20, then interim-24 (Sep-21) replaced it with draft-18 + draft-22.

Note that the newest published revision (transport-22, 2026-10-01) runs ahead of the automated interop target — so an implementation on draft-19 is “ahead”, not “current”. See moq-go for what that currently costs an implementation in the runner.

Known interop issues

  • Properties Type collision (#1550 in moq-transport, #10 in LOC) — property type IDs conflict between moq-transport-17 and loc-01.
  • Track Properties parsing — implementations handle the length prefix differently. See track-properties.
  • PUBLISH_NAMESPACE behavior — relay behaviour around namespace announcements confuses some implementations (Daiki Matsui’s report, 2026-03-23). Still live as a spec question: issue #1800 is scheduled for the Aug-24 interim and issue #1854 is labeled BLOCKED.
  • Interop-client ALPN gaps — moxygen’s interop client binary lacked moqt-18 in kInteropAlpns, so draft-18-only relays failed the handshake even though the moxygen relay negotiates draft-18 correctly; moqx likely shares the gap. Documented in runner PR #111, with fixes in flight (moxygen 223). A reminder that a matrix cell can fail for handshake-configuration reasons rather than protocol ones.
  • Transport asymmetry — on recent cuts the remote-quic transport outperforms docker for several draft-18 pairings, and xquic over docker fails broadly. Transport choice, not just draft version, moves results.

Media wire format interop

moq-media-interop (draft-cenzano-moq-media-interop-03, Jordi Cenzano) defines the concrete media wire format for LOC-based media interop — how H.264 video, Opus/AAC-LC audio, and text are packaged into MOQT objects with extension headers. It is the format Meta’s moxygen relay uses.

The draft expired 2026-04-23 with no -04 published. LOC media-interop testing currently relies on what is already implemented rather than on a live specification. See moq-media-interop.

Live vs automated interop

The two are complementary and give different signals:

  • Automated (the nightly interop-runner) — broad, repeatable, but short-clip based. It catches handshake and basic data-plane regressions.
  • Live / human-run (hackathons, ad-hoc sessions) — narrower but deeper. The Vienna Hackathon surfaced things the matrix could not, e.g. Yu You’s conformance client scoring 4/7 against the Cloudflare draft-18 relay because it rejected the upstream PUBLISH flow.
  • Results from live sessions are gathered on the ad-hoc interop reports wiki.

Steven Riedl (Pluto TV) has argued for closing the gap between the two — continuously-running live channels with mid-stream joiners “surface different behavior than short test clips” — and Mike English has signalled broader data-plane test coverage as a planned runner improvement for the Sep-2 hackathon.

Related