From acf11fa91698357dad30b288d02c32cebc626cf3 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 27 Jun 2026 18:49:59 -0700 Subject: [PATCH 1/2] move staging site to new domain --- src/layouts/global.astro | 4 ++-- wrangler.jsonc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layouts/global.astro b/src/layouts/global.astro index ddbad23..1c57fcd 100644 --- a/src/layouts/global.astro +++ b/src/layouts/global.astro @@ -30,8 +30,8 @@ const fullDescription = description : "Media over QUIC is a new live media protocol designed for simplicity and scale. It uses new browser technologies like WebTransport and WebCodecs to deliver media with latency that rivals WebRTC."; const ogImage = new URL(frontmatter?.cover ?? "/layout/icon.png", siteUrl).toString(); -// pro.moq.wtf for staging builds, pro.moq.dev for live (and local dev). -const proUrl = import.meta.env.MODE === "staging" ? "https://pro.moq.wtf" : "https://pro.moq.dev"; +// moq.wtf for staging builds, moq.pro for live (and local dev). +const proUrl = import.meta.env.MODE === "staging" ? "https://moq.wtf" : "https://moq.pro"; --- diff --git a/wrangler.jsonc b/wrangler.jsonc index f4eed66..f0f9335 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -20,7 +20,7 @@ "staging": { "name": "moq-dev-staging", "route": { - "pattern": "moq.wtf", + "pattern": "new.moq.dev", "custom_domain": true } }, From 468afc0988ba969afb067a8f4a4b38b20ed5f88f Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 27 Jun 2026 18:52:33 -0700 Subject: [PATCH 2/2] update patch notes --- src/pages/blog/update-00.mdx | 86 ++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/pages/blog/update-00.mdx b/src/pages/blog/update-00.mdx index 8d63bc2..35884b3 100644 --- a/src/pages/blog/update-00.mdx +++ b/src/pages/blog/update-00.mdx @@ -2,7 +2,7 @@ layout: "@/layouts/global.astro" title: Update 00 author: kixelated -description: Update 00 notes +description: Multiple months of patch notes extrordinaire for your eyeballs. cover: "/blog/update-00/bbb.png" date: 2026-06-25 --- @@ -17,12 +17,12 @@ IDK my brain is so fried from talking to Claude all day. ## Hop-based Routing -Now you can [connect relays to each other](https://doc.moq.dev/bin/relay/) however you desire. +Now you can now arbitrarily connect [moq-relay](https://doc.moq.dev/bin/relay/) instances to each other to form a cluster. They'll gossip available broadcasts to each other and proxy any subscriptions automatically via the shortest path. -For example, I can host a relay in Denver and configure it with: +For example, I can host a relay at `https://denver.moq.dev` and configure it with: ```bash -moq-relay --cluster-connect chicago.moq.dev --cluster-connect seattle.moq.dev ... +moq-relay --cluster-connect "https://chicago.moq.dev" --cluster-connect "https://seattle.moq.dev" ... ``` Imagine relays are also configured to connect to their nearest neighbors. @@ -44,27 +44,25 @@ Every relay would connect to every other relay, which would have resulted in:\ Oh yeah and Your local relay (snug behind a firewall) can proxy all broadcasts to/from a public CDN: ```bash -moq-relay --cluster-connect https://cdn.moq.dev ... +moq-relay --cluster-connect "https://cdn.moq.dev" ... ``` -It'll work with any MoQ CDN that implements enough of the [`moq-transport`](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/) spec (*cough* not Cloudflare yet *cough*). +It'll work with any other MoQ CDN... once they implement enough of the [`moq-transport`](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/) spec (Cloudflare pls). But you'll need `moq-lite-03+` to establish multiple connections, otherwise a cycle will ruin your day. ## Standards -Speaking of standards, the IETF keeps marching forward, so I have to "support" every new draft version lul. - -**Supported:** +Speaking of standards, the IETF keeps marching forward, so I have to "support" every new draft version: - [moq-transport](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/) drafts 14-18. -- [qmux](https://datatracker.ietf.org/doc/draft-nandakumar-moq-qmux-moqt/) drafts 00-01 +- [qmux](https://datatracker.ietf.org/doc/draft-ietf-quic-qmux/) drafts 00-01 - [msf](https://datatracker.ietf.org/doc/draft-ietf-moq-msf/) drafts 00-01 - [loc](https://datatracker.ietf.org/doc/draft-ietf-moq-loc/) draft 01 -It takes forever to litigate every single addition/change in the IETF. -I'm trying my best [to publish extensions](https://www.ietf.org/archive/id/draft-lcurley-moq-probe-00.html), but it's such a drain on my time. +We don't support every single feature because some of them are dumb and it takes forever to litigate every single addition/change in the IETF. +I'm starting [to publish extensions](https://www.ietf.org/archive/id/draft-lcurley-moq-probe-00.html) for stuff we add on top, but it's such a drain on my time. -So instead the moq.dev libraries **prefer to negotiate:** -- moq-lite drafts 01-04 -- hang drafts 00-01 +Instead the moq.dev libraries **prefer to negotiate**: +- [moq-lite](https://datatracker.ietf.org/doc/draft-ietf-moq-lite/) drafts 01-04 +- [hang](https://datatracker.ietf.org/doc/draft-ietf-moq-hang/) drafts 00-01 moq-lite-05 is coming SOON with more stuff. @@ -89,14 +87,15 @@ We can import/export other formats without re-encoding, preserving the intent bu - Matroska/WebM - HLS - LOC -- TS +- MPEG-TS Going back to Transport Streams (gross) as an example. When you import a TS stream with `moq-mux`, we'll split A/V into MoQ tracks, but we'll also preserve "unknown" tracks with a special "ts" section. If you export the same stream to TS with `moq-mux`, we'll re-assemble the TS stream and reinsert the unknown tracks. This is a **REALLY BIG DEAL** for broadcast TV. -Your precious SCTE35 markers are preserved. +Your precious SCTE35 markers are preserved AND you're not wasting 5% of your bandwidth on 188-byte packets. + ur welcome ## CLI @@ -114,11 +113,12 @@ moq-cli subscribe --url https://cdn.moq.dev/anon --broadcast my-stream --format You can download all of the moq binaries (`moq-relay`, `moq-token`, etc) from your favorite package manager: - Homebrew -- .deb/.rpm - Docker - Nix -- ??? +- winget +- .deb/.rpm +For specific commands, [see the CLI docs](https://doc.moq.dev/bin/cli). Cool I guess? @@ -136,38 +136,38 @@ Each subsequent frame *within the same group* can reuse the previous frames as a Claude ran a benchmark over a synthetic stream of JSON sensor snapshots. The type of output you'd expect from a drone. -| Configuration | Bitrate saved | -| ---------------------------------------- | ------------- | -| DEFLATE per frame | 39% | -| JSON Merge Patch | 58% | -| JSON Merge Patch + DEFLATE per frame | 72% | -| DEFLATE per group | 89% | -| **JSON Merge Patch + DEFLATE per group** | **91%** | +Bitrate savings for different configurations: +| | No DEFLATE | DEFLATE per frame | DEFLATE per group | +| ---------------- | ---------- | ----------------- | ----------------- | +| No deltas | 0% | 39% | 89% | +| JSON Merge Patch | 58% | 72% | 91% | + I was surprised to see how important `Z_SYNC_FLUSH` is given it's not supported by the [browser implementation](https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API) and [is bugged](https://github.com/101arrowz/fflate/pull/286) in the most popular Javascript implementation. -Really the main benefit of JSON Merge Patch is to save some CPU cycles. +At this point, the main benefit of JSON Merge Patch is to save some CPU cycles. ## Backends We've used Quinn for the longest time, but now you can use other QUIC backends! Why? IDK different features and performance. -QUIC Backends (WebTransport + raw QUIC): -- quinn -- noq -- quiche (Cloudflare) -- iroh (p2p) +QUIC Backends (both WebTransport + raw QUIC): +- [quinn](https://github.com/quinn-rs/quinn) +- [noq](https://github.com/n0-computer/noq) +- [quiche](https://github.com/cloudflare/quiche) (Cloudflare) +- [iroh](https://github.com/n0-computer/iroh) (peer-to-peer) +- [WASM](https://github.com/moq-dev/web-transport/tree/main/rs/web-transport-wasm) -You can also use non-QUIC backends with Qmux! +You can also use non-QUIC backends with [Qmux](https://datatracker.ietf.org/doc/draft-ietf-quic-qmux/)! It emulates a QUIC connection, but over a reliable transport. -We do suffer more from head-of-line blocking but sometimes it be like that. +We do suffer more from head-of-line blocking so it's worse than QUIC, but sometimes it be like that. Non-QUIC Backends (Qmux): -- WebSocket +- WebSockets - TLS - TCP - Unix domain sockets -For example, I'm using unix domain sockets (or TCP) to run localhost workers without paying the TLS/UDP overhead tax. +I'm using WebSockets as a TCP fallback (when QUIC is not available) and unix domain sockets to avoid paying the TLS/UDP overhead tax on localhost. It's still Media over QUIC even if QUIC is not used... @@ -203,8 +203,8 @@ We full [monorepo](https://github.com/moq-dev/moq) now. `moq-ffi` uses Uniffi to generate async bindings for various languages. It's all the same Rust code under the hood, but IDK now you can use it on iOS/Android/whatever. - [MoQKit](https://fishjam.swmansion.com/blog/moq-boy-escaped-the-browser) uses it. + neat Supported: @@ -223,13 +223,13 @@ Oh and don't worry, we still have [C support](https://doc.moq.dev/lib/c/) via [` I'm almost done spinning up a PAID MoQ CDN. It's like a week or two away, **GET HYPED**. -As part of that, I actually have to make sure everything is production-ready, which means focusing on the boring stuff like: -- `mTLS`: relays can authorize via client certificates -- `TLS`: cert reloading and custom root CAs +As part of that, I actually have to make sure everything is production-ready, which means focusing on the boring stuff. +Stuff like making static configurations... dynamic. -And more of the static configuration is now possible via a REST API. -- `--auth-api`: authorize a user -- `--cluster-connect-api`: discover neighboring relay nodes +- `mTLS`: relays can authorize via client certificates +- `TLS`: cert reloading +- `--auth-api`: authorize a user via an API +- `--cluster-connect-api`: discover neighboring relay nodes via an API And finally my favorite one, but it deserves its own blog post later: - `.stats`: deliver MoQ metrics over MoQ