Language: Rust + TypeScript (monorepo) Maintainer: luke-curley GitHub: moq-dev/moq (was kixelated/moq-rs → kixelated/moq) Website: moq.dev Documentation: doc.moq.dev Slack: moq-rs (C09CG9V7A2Y) — shared channel, covers both this and moq-rs
Overview
Luke Curley’s original MOQ implementation, now a monorepo containing both Rust and TypeScript packages. Implements moq-lite, a simplified subset of the IETF moq-transport spec that prioritizes simplicity and practical deployment. Also includes Hang, a media-specific protocol layer on top of moq-lite (analogous to HLS/DASH) handling codecs, containers, and catalog management.
The project describes itself as “generic for any live data, not just media” though video streaming is the primary use case.
History
- 2022-06-29: Created as
kixelated/moq-rs— the original Rust MOQ implementation - 2023-05-24:
kixelated/moq-jscreated as a companion TypeScript library - ~2024-10: Mike English forked the codebase to create an IETF WG-aligned version (see moq-rs and moq-js)
- 2025-06-20:
kixelated/moq-jsarchived (“Moved to kixelated/moq. It’s much better now.“) - Later: Renamed/transferred to
moq-dev/moqas a combined Rust + TypeScript monorepo
The project diverged from strict IETF WG spec compliance when Luke pursued his own moq-lite design. It now has adapter shims for IETF MoQ WG drafts, enabling interop with IETF-aligned implementations.
Protocol
- moq-lite: Simplified transport protocol (Luke’s own spec, draft-lcurley-moq-lite-04)
- Hang: Media-specific encoding/streaming layer on top of moq-lite
- IETF adapter shims: Allow interop with IETF draft implementations (draft-14 through draft-17)
Rust Packages
moq-lite— core transport librarymoq-relay— server/relaymoq-token— authenticationmoq-native— QUIC helpers
TypeScript Packages (js/)
lite— browser-compatible moq-lite transporthang— Hang media layer (total rewrite, not derived from kixelated/moq-js)watch— viewer/subscriberpublish— publisherui-core— UI componentssignals,clock,common,token— supporting packages
Public Infrastructure
cdn.moq.dev/anon— browser pub/sub testing (QUIC + WebTransport)- Interop docs: doc.moq.dev/concept/standard/interop.html
Interop
- Registered in interop-runner as moq-dev-rs (Rust) and moq-dev-js (JS/Hang)
- v17 interop achieved with lorenzo-miniero’s imquic (2026-04-01): “Rust publisher, JS subscriber, so that counts as two interops”
- moq-dev-rs ←> libquicr: 6/6 pass in interop runner
- moq-dev-rs ←> moxygen: 6/6 pass in interop runner
Relationship to Cloudflare moq-rs
Both projects started from Luke’s original codebase. moq-rs (cloudflare/moq-rs) forked when Luke was not going to support the IETF WG specs directly. They are now considered sibling implementations — neither is upstream of the other. The codebases are “not too too dissimilar” on the Rust side, and ideas and code can flow back and forth. See moq-rs for the Cloudflare/IETF-aligned version.
Related
- moq-rs - Cloudflare’s IETF-aligned Rust sibling (cloudflare/moq-rs)
- moq-js - IETF-aligned JS sibling (video-dev/moq-js)
- interop-status - Cross-implementation testing
- interop-endpoints - Full endpoint listing