published 12/20/2025

Hash Tag Community

There’s been a LOT of new contributions to the project thanks primarily to the Montevideo Tech Summer Camp. It is my job as the official MoQ #influencer to give everyone a shoutout.

Just a reminder: I’ll be in sunny Uruguay for the summer camp week. You too can fly out and have awkward conversations with me, in person. There’s still time to sign up. Probably.

I should have asked before posting. Too late now. Who even reads these blog posts live?

moq-dev

But first, some arbitrary renaming to break workflows. No more typing kixelated, kixelated, kixelated like a beatlejuice knockoff.

I created a moq-dev Github organization to reflect the community’s newfound professionalism.

There’s also a new @moq NPM organization. However, I’ve yet to publish working packages under these sick new names yet because of yet another obscure bundler bug. The Javascript ecosystem is an absolute mess.

I will keep renaming stuff until morale improves.

OBS

bpmedley, emilsas, and pangaea managed to get an OBS plugin working. That’s right, now you can use OBS with MoQ! 🎉

Like most media libraries, OBS is written in C++ because they’re a fan of SEGMENTATION FAULT. But I’m a fan of the crab instead, so I created a generic Rust/C binding called libmoq. You can use this static library to both publish and consume MoQ from your favorite C/C++ application.

I’m working on proper documentation but until then, a quick overview:

mfw

This is literally the user experience.

Unfortunately, we need to patch OBS literally to just add MoQ to the UI. If you’re a closet OBS maintainer and/or interested in helping out, join the Discord.

And more stuff is coming! Don’t close your eyes!

UI stuff

It’s no secret that I loathe frontend development. I only do it because someone has to, and because I have a savior complex. The MoQ ecosystem is full of backend nerds who don’t even know the difference between null and undefined.

🎵🎶 All I want for Christmas, is a frontend engineer 🎵🎶

And that’s right, my Christmas wish has been granted, hallelujah! 🎄

There are plenty of remaining issues if you’re bored and know the difference between null and undefined. Please I beg you. I’ll literally merge anything, even if you just change the color of a button.

mfw

Just like my mom always told me: “You don’t have to be pretty so long as you’re functional.”

iroh

Way back when I said:

I’d also love to get MoQ running over Iroh for peer-to-peer action if anybody wants to help.

Frando heeded the call and made iroh-live. That’s right, now you can use P2P with MoQ! 🎉

Iroh is a peer-to-peer protocol that utilizes QUIC. It’s simpler and yet more powerful than the common alternative: WebRTC data channels. I’m a CDN stan because of the improved QoE and scale, but it’s hard to beat the cost savings of P2P.

iroh-live also includes native capture and encoding support so you don’t have to use the aforementioned ffmpeg/gstreamer/obs integrations. I think it’s a great step towards getting MoQ on more platforms, and I’d love to see this functionality yoinked contributed to the moq repo. ;)

Unfortunately, there’s no P2P support for browsers yet. But I think with a few small tweaks, it’s possible to use a CDN for web browsers and iroh for P2P compatible clients. In fact, I just got word that Frando has a draft PR that adds iroh support to moq-relay for this very purpose. celebration emoji

I’m blushing at my decision to over-engineer the moq-lite API. The ability to fanout/discover via multiple connections/CDNs is a huge win for MoQ. Tracks do not get transmitted over the network until requested, which makes P2P viable.

HLS/DASH/CMAF/HAM

For some reason, the media industry really love acronyms. And big bunnies.

But the media industry REALLY loves adding LL- in front of an existing protocol to say “this is the really, really low latency one I swear”.

Unfortunately, LL-HLS and LL-DASH are not quite low latency enough, so we need some way to convert them to MoQ. sebastianpiq has added a way to convert a HLS playlist into a MoQ stream. That’s right, now a megacorp can take their existing HLS infrastructure and put MoQ branding on it! 🎉

It still needs quite a bit more work, like adding the aforementioned LL-HLS support. The next steps are CMAF passthrough and MSE playback so said megacorp can support DRM and legacy devices. Finally, I have a super secret plan to serve HLS from a generic MoQ relay to make megacorp adoption even easier.

I know, it’s not exactly the most exciting stuff, but welcome to megacorp. Money trumps personal satisfaction.

Go + Java

It’s no secret that there are plenty of other MoQ implementations in development (Cloudflare, Google, Akamai, etc). However none are as personally exciting as these two:

Why are these two special?

Because they implement the moq-lite draft, my minimal subset of the official IETF moq-transport draft. The IETF standard keeps churning, adding fringe and yet somehow mandatory features. I’m still committed to being compatible with the standard, but there’s no way I’m spending my limited time on this earth implementing every junk feature in the draft.

My advice: If you’re interested in MoQ, you should start with moq-lite. Focus on getting it running in production, either by forking my terrible code, or by writing your own terrible code. It’s going to be at least another 4 years before the relevant RFCs are released, so you have plenty of time to converge later.

Fun fact: My first (and second) MoQ implementations were written in Go. I’m a crab now.

Asymmetric Authentication

Last but not least, einrobin added support for public keys (Rust and Typescript) using JWK. That’s right, you can now use Ed25519 or RSA authentication! 🎉

Okay, this section is mostly for the cryptography nerds. I hate that I have to type out “cryptography” now thanks to “crypto” bros.

When a user connects to the relay, they pass a token (JWT) in the URL. Eventually, the token will be in the Authorization header, but it’s not yet supported by WebTransport. This token is signed by an issuer (ex. hang.live) and verified by the relay (ex. cdn.moq.dev).

There’s two types of keys you can use to sign/verify the token:

So yeah, if you choose to use an asymmetric key, the CDN can’t forge requests. Hurray? Hurray!

FIN

It’s tiring being an influencer. This project is my legacy, and I greatly appreciate all of the help from the #community.

Just a reminder that I’m unemployed (on purpose) and available for unpaid consulting gigs if you, or your megacorp, are interested in MoQ. Message me on Discord if you, or your CTO, or your intern, want to schedule a call and exchange business cards.

Written by @kixelated. @kixelated