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-00for draft-14,moqt-16for 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, encoded83 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 = Truecompletes 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_probetooling (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 forfb.mvfst.net:9448andmoqx-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
- interop-runner - Testing framework