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 main via PR #25 (also folding in a RoQ demos refactor, PR #26); second open-source impl with draft-18 in main, a 6-day spec-to-main cycle.

Draft Support

  • draft-20 / draft-21 (merged to main 2026-10-01): PR #38 “Add support for MoQT v20/v21” (lminiero, opened Sep-28, merged Oct-1, +2,110/−704). moq.h now covers v16–v21 (IMQUIC_MOQ_VERSION_MAX = 21, demo default v21). It adds LOCATION_FILTER, FILL_PARAMETERS in 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, so main now carries draft-19 (previously the running relay was ahead of the repo). A first draft-19 build had been deployed to the lminiero.it:9000 POC relay for the July-18 Vienna Hackathon; the July-19 merge folded it into main, 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, but OBJECT_PROPERTY_FILTER / TRACK_PROPERTY_FILTER are 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_UPDATE for SUBSCRIBE_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), tracking main; 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 main and on the public relay (Oct 1, 2026). Miniero merged v20/v21 support (#38) and moved the lminiero.it:9000 relay to it, inviting testers in #moq ahead 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 new rendezvous-timeout case.
  • 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:9000 relay — 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 answers REQUEST_ERROR once the publisher is detected gone — reproduced by killing the publisher so no CONNECTION_CLOSE is sent), and TRACK_STATUS was 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; the AbsoluteRange gap pinned down — it reproduces only when the start group is 0, because the relay uses end_group == 0 as an “unbounded” sentinel; and duplicate NAMESPACE_DONE messages.
  • First draft-19 relay deployment in the ecosystem, then draft-19 merged to main — Miniero stood up a draft-19 build of the lminiero.it:9000 relay for the July-18 Vienna Hackathon and put out a call for draft-19 peers, then merged PR #32 to main July 19 (+1124/−211), making imquic the first tracked-repo implementation with draft-19 in main. Filter serialization/deserialization and the basic filters work; OBJECT_PROPERTY_FILTER / TRACK_PROPERTY_FILTER are 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’s moq-cli (moq-dev) published/subscribed against lminiero.it:9000 in 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-send captures webcam + mic and publishes audio (Opus) + video (H.264) LOC tracks; imquic-moq-loc-recv subscribes, 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 push2talk namespace 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 the loc-send demo 89d7221) and got media to work end-to-end against Jordi Cenzano’s moq-encoder-player — except that moq-encoder-player omits the private-properties block entirely while imquic expects the leading 0x00 count 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: 094c099 added a non-standard stream-closed event to imquic’s MoQ qlogs, and PR #34 fixed macOS socklen.)
  • Relay hardening — fixed a nested-namespace SUBSCRIBE_NAMESPACE / SUBSCRIBE_TRACKS notification bug found in interop testing (PR #30), plus follow-on NAMESPACE / NAMESPACE_DONE and LOC-sender crash fixes, and partial DYNAMIC_GROUPS / NEW_GROUP_REQUEST support 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