Language: C Organization: Meetecho Maintainer: lorenzo-miniero GitHub: meetecho/imquic POC relay: lminiero.it port 9000 (raw QUIC + WebTransport; draft-20/21 since Oct 1, 2026; earlier draft-18 from May 18 and draft-19 from July 18)
Overview
A C library for QUIC that includes MOQ Transport support alongside RTP over QUIC (RoQ). Built as part of the Janus WebRTC gateway ecosystem.
History
- 2026-05-18: Shipped IETF draft-18 — the second open-source implementation to do so (after moq-dev).
- 2026-05-20: draft-18 merged to
mainvia PR #25 (also folding in a RoQ demos refactor, PR #26); second open-source impl with draft-18 inmain, a 6-day spec-to-maincycle.
Draft Support
- draft-20 / draft-21 (merged to
main2026-10-01): PR #38 “Add support for MoQT v20/v21” (lminiero, opened Sep-28, merged Oct-1, +2,110/−704).moq.hnow covers v16–v21 (IMQUIC_MOQ_VERSION_MAX = 21, demo default v21). It addsLOCATION_FILTER,FILL_PARAMETERSin SUBSCRIBE (which replaces Joining FETCH, now gone), filters on FETCH and a FETCH serialization flag, treating v21 as v20 plus editorial changes. Known limits per Miniero: more than one FETCH per subscription (in SUBSCRIBE and again in REQUEST_UPDATE) is probably broken. Two same-day fixes (f749ea7,550a4dd) corrected FETCH object ordering after Aman Sharma’s testing; descending order was still reported broken on Oct-1. Not yet updated for draft-22’s Location Filter Type encoding. - draft-19 (merged to
main) — PR #32 “Add support for MoQT v19” (lminiero, opened July 8) merged July 19 (+1124/−211) — the first implementation PR explicitly targeting draft-19, somainnow carries draft-19 (previously the running relay was ahead of the repo). A first draft-19 build had been deployed to thelminiero.it:9000POC relay for the July-18 Vienna Hackathon; the July-19 merge folded it intomain, followed by relay fixes (“Allow REQUEST_UPDATE to PUBLISH as a subscriber”, FORWARD-related relay fixes, PUBLISH tweaks). The bulk of the draft-18 → -19 delta is the new filters: serialization/deserialization works and the basic filters function, butOBJECT_PROPERTY_FILTER/TRACK_PROPERTY_FILTERare currently ignored (open question on their intended semantics — echoed by ianswett’s moq-transport #1816 “Range filters only filter integer Properties” and Luke Curley’s July-19 stance that Hang will likely never implement filters). - draft-18 (since May 18, 2026) — partial: most of the wire-format changes from the draft-17 → draft-18 changelog (SUBGROUP_HEADER FIRST_OBJECT bit, FETCH ID delta encoding, PADDING message, SUBSCRIBE_TRACKS split from SUBSCRIBE_NAMESPACE, REQUEST_UPDATE on both, redirect via REQUEST_ERROR, new error codes); initially missing
REQUEST_UPDATEforSUBSCRIBE_NAMESPACE/SUBSCRIBE_TRACKS - draft-16 and draft-17 — prior supported set. (imquic tracks these internally as
0xff000010/0xff000011, carrying forward the pre-draft-15 numbering; the spec itself defines no numeric wire version from draft-15 onward — negotiation is ALPN-only,moqt-16/moqt-17. See moq-transport § ALPN Negotiation.) - Supports version negotiation - can offer all supported versions or pin to a specific one
- Previously supported draft-11 through draft-16; draft-14 was dropped when moving to v17
- Not all features of all versions are fully implemented
Public Infrastructure
- Relay at
lminiero.it:9000(raw QUIC and WebTransport), trackingmain; running draft-20/21 since Oct 1, 2026 (see Draft Support)
Recent Highlights
Day-by-day PR/issue history lives in the wiki log; this section keeps only durable milestones.
- Draft-20/21 on
mainand on the public relay (Oct 1, 2026). Miniero merged v20/v21 support (#38) and moved thelminiero.it:9000relay to it, inviting testers in#moqahead of the Seattle interop. The new filters and fill-FETCH path got immediate external testing, and the FETCH ordering bugs it found were fixed or under work within hours. Its interop-runner client also implements the newrendezvous-timeoutcase. - Prefix-based routing restored to the relay at the Sep-3 hackathon sweep. During the draft-18 interop hackathon’s Day-2 relay-conformance sweep (see interop-runner), afrind asked Miniero to add prefix-based announce routing back to the
lminiero.it:9000relay — the recurring relay-conformance gap, since moq-net clients register announce-interest with a root prefix — and Miniero landed it plus two fixes Aman Sharma found: a SUBSCRIBE for a published-then-released namespace hung forever (the relay forwarded it upstream to a departed publisher with no timeout handler; now answersREQUEST_ERRORonce the publisher is detected gone — reproduced by killing the publisher so noCONNECTION_CLOSEis sent), andTRACK_STATUSwas never answered. On Sep-4 Miniero reported the publisher-priority drop fixed, and the sweep surfaced three more relay bugs (mostly deferred to “Monday”): an object stream that never FIN-closes after PUBLISH_DONE; theAbsoluteRangegap pinned down — it reproduces only when the start group is 0, because the relay usesend_group == 0as an “unbounded” sentinel; and duplicateNAMESPACE_DONEmessages. - First draft-19 relay deployment in the ecosystem, then draft-19 merged to
main— Miniero stood up a draft-19 build of thelminiero.it:9000relay for the July-18 Vienna Hackathon and put out a call for draft-19 peers, then merged PR #32 tomainJuly 19 (+1124/−211), making imquic the first tracked-repo implementation with draft-19 inmain. Filter serialization/deserialization and the basic filters work;OBJECT_PROPERTY_FILTER/TRACK_PROPERTY_FILTERare ignored pending clarity on their semantics. The wiki’s first tracked draft-19 interop endpoint (vs moq-dev’s draft-19 client/relay support), though the official interop target remains draft-18 per afrind. On July 20 the relay achieved the ecosystem’s first cross-implementation draft-19 interop — Luke Curley’smoq-cli(moq-dev) published/subscribed againstlminiero.it:9000in forced draft-19 (76,804 bytes, 5.23 s,ffprobe-validated H.264) as well as forced draft-18. - Live-media LOC demos — PR #27 merged at the June 2026 London hackathon:
imquic-moq-loc-sendcaptures webcam + mic and publishes audio (Opus) + video (H.264) LOC tracks;imquic-moq-loc-recvsubscribes, decodes, and renders via SDL2. Replaces the prior moq-clock-only demos and uses MSF for the catalog. See moq-loc. - Push-to-talk conversational demo — PR #31 merged June 19, with a live web demo at lminiero.it/moqp2t/: every client subscribes to the
push2talknamespace and holding spacebar publishes an audio track carried over QUIC datagrams. Client side built on Moqtail, plus a native demo in the repo — the first publicly-reachable real-time conversational-media app over MoQ the wiki has tracked, exercising the PUBLISH-driven (vs SUBSCRIBE-driven) delivery pattern. - LOC updated to loc-04, and a private-properties interop mismatch surfaced — imquic PR #29 had added an explicit payload prefix for LOC private objects, resolving the omit-the-block-vs-write-a-zero-count encoding question surfaced while building the LOC demos. On 2026-08-25 Miniero updated imquic’s LOC properties to loc-04 (commit
8d26c94, plus an optional LOC codec-string property in theloc-senddemo89d7221) and got media to work end-to-end against Jordi Cenzano’smoq-encoder-player— except that moq-encoder-player omits the private-properties block entirely while imquic expects the leading0x00count byte, so his receiver mis-parses unless the block is skipped. He read LOC-04 §3.1.3 as ambiguous and asked Suhas for the correct interop behaviour when Secure Objects are not in use. See moq-loc. (Same day:094c099added a non-standard stream-closed event to imquic’s MoQ qlogs, and PR #34 fixed macOSsocklen.) - Relay hardening — fixed a nested-namespace
SUBSCRIBE_NAMESPACE/SUBSCRIBE_TRACKSnotification bug found in interop testing (PR #30), plus follow-on NAMESPACE / NAMESPACE_DONE and LOC-sender crash fixes, and partialDYNAMIC_GROUPS/NEW_GROUP_REQUESTsupport in the relay demo.
Interop
- Registered in interop-runner matrix; became a registered draft-18 endpoint (June 2026, advertising draft-18/17/16), one of the first two draft-18 registrations alongside Nokia’s
moqt-nr - First v17 interop achieved with moq-dev (moq-dev/moq, Rust publisher + JS subscriber) (2026-04-01)
- London hackathon (June 2026): cross-impl object exchange with Kota Yatagai’s Moqtopus — Kota fixed a reciprocal publisher priority-bit bug in imquic (PR #28) — and with Suhas Nandakumar’s quicr/moq-web
- Active interop testing at IETF 125 Shenzhen and Boulder hackathon
Related
- lorenzo-miniero - Maintainer
- interop-endpoints - Public relay endpoints
- interop-runner - Test framework