Language: Python (asyncio) Maintainer: Giovanni Marzot GitHub: gmarzot/aiomoqt Transport: gmarzot/aiopquic (Python/Cython bindings to picoquic)

Overview

Python async implementation of MOQ Transport, using aiopquic for the QUIC transport layer.

Draft Support

  • Dual draft-14 and draft-16 with ALPN-based negotiation (moq-00 for draft-14, moqt-16 for draft-16), since extended toward the current interop drafts
  • Latest release: v0.10.6 (released ~July 8, 2026; PyPI aiomoqt)
  • Interop tested against 6 relay implementations across both drafts
  • draft-18 SUBSCRIBE_OK parse bug (found 2026-08-13; fix landing in v0.11.0): v0.10.6 decodes the SUBSCRIBE_OK Track-Properties block with RFC 9000 varints instead of the LOC-style vi64, so it runs off the end of the message whenever a property value is ≥ 64 (e.g. TIMESCALE=1000, encoded 83 e8) — surfacing as “truncated trailing extensions block.” Root-caused by Giovanni Marzot after Steven Riedl (Pluto TV) hit it subscribing to a moq-dev relay (whose SUBSCRIBE_OK is spec-correct); the encode/decode fix is bound for aiomoqt v0.11.0 alongside aiopquic v0.4.0 (both in-flight). As of Aug-15 the fix is on Marzot’s dev branch, and debugging it “stimulated some additional bug finds in filter support” — Marzot will validate against Pluto’s public relay (among others) before cutting v0.11.0. Workaround on v0.10.6: MOQTMessage._tolerate_trailing_extensions = True completes the subscribe but skips the property.
  • v0.10.6 is session-fatal against moq-relay ≥ 0.14.8 (Aug-15): moq-dev’s relay got stricter at 0.14.8 (PR #2667: the session is closed on a malformed NAMESPACE), so aiomoqt v0.10.6’s draft-18 subscribe flow now fails the whole session (err=unexpected message) where older relays warned and continued. Reported by Steven Riedl (Pluto TV), who is upgrading Pluto’s public relay to 0.14.8 — another reason to validate v0.11.0 against a current relay before release.
  • relay_probe tooling (python -m aiomoqt.tools.relay_probe --url …): reports a relay’s transport (QUIC vs H3/WT), its accepted draft set, and RTT — used Aug-14 to resolve WebTransport-path discovery for fb.mvfst.net:9448 and moqx-main.ci.openmoq.org:4433 (both want /moq-relay, negotiate draft-14/16/18). Ships in the examples with v0.10.6.

Vienna Hackathon (IETF 126)

At the July-19 IETF-126 Vienna Hackathon, Giovanni Marzot ran a control-plane interop regression with aiomoqt v0.10.6 (CI run), reporting “good results” and logging the output to the ad-hoc interop wiki. Marzot also maintains the openmoq/moqx moq_decode.py decoder — used by other Hackathon participants (afrind) to debug wire-format errors — and landed a July-19 request_id cleanup (moqx PR #496) aligning it with draft-18.

Related Projects

  • aiopquic - Python/Cython bindings to picoquic (shared 2026-03-23)
  • Giovanni also created content for the moq-transport wiki (2026-03-31)

Related