From 05692b36b6857296d58fd76bdb75e4fe6fee036f Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 15 Oct 2026 10:08:16 -0700 Subject: [PATCH 1/9] Add a robotics page and production users A /robotics page explains why MoQ fits robots and lists who runs it: Saronic, Evolve Robotics, and two unnamed drone users. The same cards appear on the homepage under "Already in the wild", and the DEMOQED pip now points at the robotics page instead. Co-Authored-By: Claude Opus 5.5 --- src/components/users.astro | 55 ++++++++++++++++++++++++++++++++++++++ src/pages/index.astro | 18 ++++++++++--- src/pages/robotics.mdx | 34 +++++++++++++++++++++++ 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 src/components/users.astro create mode 100644 src/pages/robotics.mdx diff --git a/src/components/users.astro b/src/components/users.astro new file mode 100644 index 0000000..e9f54dd --- /dev/null +++ b/src/components/users.astro @@ -0,0 +1,55 @@ +--- +interface Props { + // Grid columns, since the reading column is too narrow for four across. + class?: string; +} + +const { class: columns = "sm:grid-cols-2" } = Astro.props; + +// Companies running MoQ in production. A null `name` renders as a redaction bar +// for users who can't be named yet; `redacted` sets the bar's width. +const users = [ + { + name: "Saronic", + what: "Autonomous boats", + body: "MoQ is the primary video system across its vessels. One uplink per boat, hundreds of viewers, and nothing sent when nobody is watching.", + links: [ + { text: "Their write-up", href: "https://medium.com/saronic-technologies/the-ground-moves-building-on-early-open-source-without-getting-burned-ba2af78beb78" }, + { text: "Corsair rescues two Army pilots", href: "https://www.navalnews.com/naval-news/2026/06/saronic-usv-rescues-two-u-s-army-pilots-downed-by-iran/" }, + ], + }, + { + name: "Evolve Robotics", + what: "Teleoperation", + body: 'Spoke about "MoQ beyond media" at DEMOQED, the first MoQ conference.', + links: [{ text: "evolverobotics.com", href: "https://evolverobotics.com/" }], + }, + { name: null, redacted: "w-32", what: "Drones", body: "That's all we're allowed to say.", links: [] }, + { name: null, redacted: "w-24", what: "Drones", body: "Also drones. Also can't say.", links: [] }, +]; +--- + +
+ { + users.map((user) => ( +
+ {user.what} + {user.name ? ( +

{user.name}

+ ) : ( +

+ )} +

{user.body}

+ {user.links.length > 0 && ( +
+ {user.links.map((link) => ( + + {link.text} + + ))} +
+ )} +

+ )) + } +
diff --git a/src/pages/index.astro b/src/pages/index.astro index 6338193..444f280 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,4 +1,5 @@ --- +import Users from "@/components/users.astro"; import Layout from "@/layouts/global.astro"; interface Post { @@ -39,7 +40,7 @@ const languages = [ // `icon` is hand-drawn art in public/icons/use-case/. const useCases = [ - { title: "Robotics", icon: "robotics", body: "Real-time teleoperation, with telemetry and control on the same relays as the video.", href: "/blog/on-a-boat" }, + { title: "Robotics", icon: "robotics", body: "Real-time teleoperation, with telemetry and control on the same relays as the video.", href: "/robotics" }, { title: "Voice and video AI", icon: "voice-video-ai", body: "Server-side media in Rust or Python, played back faster than real time in the browser.", href: "https://doc.moq.dev/concept/use-case/ai" }, { title: "Interactive", icon: "interactive", body: "Media down, input up. MoQ Boy is a Game Boy played by everyone watching at once.", href: "/boy" }, { title: "Conferencing", icon: "conferencing", body: "Browser publish and watch with a live roster, plus WebRTC for WHIP and WHEP clients.", href: "/blog/first-app" }, @@ -53,11 +54,11 @@ const useCases = [
- Oct 8 - DEMOQED, the first MoQ conference, in San Francisco + In prod + Saronic ships MoQ on its autonomous boats @@ -182,6 +183,15 @@ const useCases = [
+ +
+
+

Already in the wild.

+ Using MoQ? Tell us +
+ +
+
diff --git a/src/pages/robotics.mdx b/src/pages/robotics.mdx new file mode 100644 index 0000000..31b8a84 --- /dev/null +++ b/src/pages/robotics.mdx @@ -0,0 +1,34 @@ +--- +layout: "@/layouts/global.astro" +title: Robotics +description: MoQ streams video, telemetry, and control for robots on terrible networks. +--- + +import Users from "@/components/users.astro"; + +# Robotics + +Robots have a lot of cameras. +They also tend to be somewhere with a terrible network: cellular, satellite, mesh radio, or nothing at all. +And everybody wants to watch: the operator, the fleet dashboard, the guy in the back with an iPad. + +Existing protocols make the robot pay for every viewer, and for every frame nobody is watching. + +## Why MoQ + +- **Pull, not push.** A robot only sends the tracks somebody subscribed to. Nobody watching camera 7? Camera 7 doesn't touch the uplink. +- **One uplink, any number of viewers.** The robot publishes once to a relay, and the relay fans out. Viewer #100 costs the robot nothing. +- **Latency over quality.** When the link degrades, MoQ skips old frames instead of buffering them. An operator wants what's happening *now*. +- **More than video.** Telemetry, control, and logs are just more tracks on the same connection and the same relays. +- **Watch in a browser.** Operators open a tab. No plugins, no WebRTC signaling servers, no VPN to the robot. + +I wrote about the pull model in more detail in [On a Boat](/blog/on-a-boat). + +## In Production + + + +## Yours? + +Running MoQ on something that moves? [Tell us](mailto:me@kixel.me), we'd love to brag about it. +Or don't, and we'll add another black bar. From 7cdf609a60a805eafabef647c9e6917eb91e5640 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 15 Oct 2026 10:15:56 -0700 Subject: [PATCH 2/9] Add Meta as a production user for live ingest Cites their DEMOQED talk. Users now carry a use case, so the robotics page shows only robotics users while the homepage shows everyone. Co-Authored-By: Claude Opus 5.5 --- src/components/users.astro | 21 +++++++++++++++++---- src/pages/index.astro | 2 +- src/pages/robotics.mdx | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/components/users.astro b/src/components/users.astro index e9f54dd..c174b6e 100644 --- a/src/components/users.astro +++ b/src/components/users.astro @@ -2,15 +2,25 @@ interface Props { // Grid columns, since the reading column is too narrow for four across. class?: string; + // Only show users of this use case. + useCase?: string; } -const { class: columns = "sm:grid-cols-2" } = Astro.props; +const { class: columns = "sm:grid-cols-2", useCase } = Astro.props; // Companies running MoQ in production. A null `name` renders as a redaction bar // for users who can't be named yet; `redacted` sets the bar's width. const users = [ + { + name: "Meta", + useCase: "contribution", + what: "Live ingest", + body: 'Spoke about "Shipping MoQ for Instagram and Facebook Live Ingest" at DEMOQED, the first MoQ conference.', + links: [{ text: "DEMOQED program", href: "https://moqalliance.org/demoqed-2026/" }], + }, { name: "Saronic", + useCase: "robotics", what: "Autonomous boats", body: "MoQ is the primary video system across its vessels. One uplink per boat, hundreds of viewers, and nothing sent when nobody is watching.", links: [ @@ -20,18 +30,21 @@ const users = [ }, { name: "Evolve Robotics", + useCase: "robotics", what: "Teleoperation", body: 'Spoke about "MoQ beyond media" at DEMOQED, the first MoQ conference.', links: [{ text: "evolverobotics.com", href: "https://evolverobotics.com/" }], }, - { name: null, redacted: "w-32", what: "Drones", body: "That's all we're allowed to say.", links: [] }, - { name: null, redacted: "w-24", what: "Drones", body: "Also drones. Also can't say.", links: [] }, + { name: null, useCase: "robotics", redacted: "w-32", what: "Drones", body: "That's all we're allowed to say.", links: [] }, + { name: null, useCase: "robotics", redacted: "w-24", what: "Drones", body: "Also drones. Also can't say.", links: [] }, ]; ---
{ - users.map((user) => ( + users + .filter((user) => !useCase || user.useCase === useCase) + .map((user) => (
{user.what} {user.name ? ( diff --git a/src/pages/index.astro b/src/pages/index.astro index 444f280..2c2e943 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -189,7 +189,7 @@ const useCases = [

Already in the wild.

Using MoQ? Tell us
- +
diff --git a/src/pages/robotics.mdx b/src/pages/robotics.mdx index 31b8a84..6fc8556 100644 --- a/src/pages/robotics.mdx +++ b/src/pages/robotics.mdx @@ -26,7 +26,7 @@ I wrote about the pull model in more detail in [On a Boat](/blog/on-a-boat). ## In Production - + ## Yours? From 05ad323ef0f14dd8dba2c9782688a124a987cde9 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 15 Oct 2026 10:16:41 -0700 Subject: [PATCH 3/9] Note that Meta uses its own MoQ implementation Co-Authored-By: Claude Opus 5.5 --- src/components/users.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/users.astro b/src/components/users.astro index c174b6e..b032f19 100644 --- a/src/components/users.astro +++ b/src/components/users.astro @@ -15,7 +15,7 @@ const users = [ name: "Meta", useCase: "contribution", what: "Live ingest", - body: 'Spoke about "Shipping MoQ for Instagram and Facebook Live Ingest" at DEMOQED, the first MoQ conference.', + body: 'Spoke about "Shipping MoQ for Instagram and Facebook Live Ingest" at DEMOQED. Uses its own implementation of the standard, not ours.', links: [{ text: "DEMOQED program", href: "https://moqalliance.org/demoqed-2026/" }], }, { From 727b50fc9e092475e3c7efe9960e62e339c728ce Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Thu, 15 Oct 2026 13:50:17 -0700 Subject: [PATCH 4/9] Name a few MoQ Alliance members on the homepage Co-Authored-By: Claude Opus 5.5 --- src/pages/index.astro | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pages/index.astro b/src/pages/index.astro index 2c2e943..6d5bf96 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -38,6 +38,10 @@ const languages = [ { name: "C", icon: "c", href: "https://doc.moq.dev/lib/c/" }, ]; +// A few members of the MoQ Alliance. Most build their own MoQ stack, so they +// sit apart from the users above. +const alliance = ["Cloudflare", "Akamai", "AWS", "Fastly", "Cisco", "Intel", "Oracle", "Mux"]; + // `icon` is hand-drawn art in public/icons/use-case/. const useCases = [ { title: "Robotics", icon: "robotics", body: "Real-time teleoperation, with telemetry and control on the same relays as the video.", href: "/robotics" }, @@ -190,6 +194,13 @@ const useCases = [ Using MoQ? Tell us +
+

Building the standard with

+
+ {alliance.map((name) => {name})} + and the rest of the MoQ Alliance +
+
From 48d96f04b316086717f90f9fff2d633d272c070d Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 20 Oct 2026 13:56:52 -0700 Subject: [PATCH 5/9] Robotics: qualify the per-viewer and latency claims A media server already fans out, so the cost is pushing unwatched cameras. Skipping is the operator's latency choice; a recorder on the same stream backfills. Co-Authored-By: Claude Opus 5.5 --- src/pages/robotics.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/robotics.mdx b/src/pages/robotics.mdx index 6fc8556..6a6c493 100644 --- a/src/pages/robotics.mdx +++ b/src/pages/robotics.mdx @@ -12,13 +12,14 @@ Robots have a lot of cameras. They also tend to be somewhere with a terrible network: cellular, satellite, mesh radio, or nothing at all. And everybody wants to watch: the operator, the fleet dashboard, the guy in the back with an iPad. -Existing protocols make the robot pay for every viewer, and for every frame nobody is watching. +Connect viewers straight to the robot and it pays for every one of them. +Put a media server in the middle and the robot still pushes every camera, watched or not. ## Why MoQ - **Pull, not push.** A robot only sends the tracks somebody subscribed to. Nobody watching camera 7? Camera 7 doesn't touch the uplink. - **One uplink, any number of viewers.** The robot publishes once to a relay, and the relay fans out. Viewer #100 costs the robot nothing. -- **Latency over quality.** When the link degrades, MoQ skips old frames instead of buffering them. An operator wants what's happening *now*. +- **Each viewer picks its latency.** When the link degrades, the operator skips ahead to what's happening *now*. A recorder on the same stream waits, and backfills once the link recovers. - **More than video.** Telemetry, control, and logs are just more tracks on the same connection and the same relays. - **Watch in a browser.** Operators open a tab. No plugins, no WebRTC signaling servers, no VPN to the robot. From 912d804bd67b66d167d7d47e32003360926e14b7 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 20 Oct 2026 14:24:48 -0700 Subject: [PATCH 6/9] Robotics: rebuild the page from the boat, Cars 2, and MoQ Boy posts Co-Authored-By: Claude Opus 5.5 --- src/pages/robotics.mdx | 108 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 11 deletions(-) diff --git a/src/pages/robotics.mdx b/src/pages/robotics.mdx index 6a6c493..c14d228 100644 --- a/src/pages/robotics.mdx +++ b/src/pages/robotics.mdx @@ -9,21 +9,105 @@ import Users from "@/components/users.astro"; # Robotics Robots have a lot of cameras. -They also tend to be somewhere with a terrible network: cellular, satellite, mesh radio, or nothing at all. -And everybody wants to watch: the operator, the fleet dashboard, the guy in the back with an iPad. +They're basically cameras with legs or wheels or pinchers or spinning blades or you get the idea. -Connect viewers straight to the robot and it pays for every one of them. -Put a media server in the middle and the robot still pushes every camera, watched or not. +Teleoperation is becoming less and less relevant, but *something* still needs to monitor the little guys. +A human, a fleet dashboard, an AI model looking for trouble, a recorder for the post-mortem. +And they're all watching over the worst network you've ever seen. -## Why MoQ +
+ ![nine cameras on a boat](/blog/on-a-boat/kraken.png) +
Arr, there be a kraken on the starboard bow.
+
-- **Pull, not push.** A robot only sends the tracks somebody subscribed to. Nobody watching camera 7? Camera 7 doesn't touch the uplink. -- **One uplink, any number of viewers.** The robot publishes once to a relay, and the relay fans out. Viewer #100 costs the robot nothing. -- **Each viewer picks its latency.** When the link degrades, the operator skips ahead to what's happening *now*. A recorder on the same stream waits, and backfills once the link recovers. -- **More than video.** Telemetry, control, and logs are just more tracks on the same connection and the same relays. -- **Watch in a browser.** Operators open a tab. No plugins, no WebRTC signaling servers, no VPN to the robot. +## Pull, not Push +Existing contribution protocols (ex. WebRTC, SRT, RTSP, RTMP) are push-based. +The robot constantly transmits *everything* to a server, watched or not. +Not great when you've got 9 cameras and StarLink is expensive. -I wrote about the pull model in more detail in [On a Boat](/blog/on-a-boat). +**MoQ is pull-based.** +Each camera is a broadcast, split into tracks like `1080p`, `360p`, `audio` and `telemetry`. +Nothing is transmitted until somebody subscribes to a track. + +So by default, an AI model subscribes to the 360p track from every camera. +If it spots a kraken, then it subscribes to the 1080p track from that camera. +Camera 7 doesn't touch the uplink until somebody cares about camera 7. + +## Shit Networks +Robots tend to be somewhere with a terrible network: cellular, satellite, mesh radio, or nothing at all. +Your bandwidth will fluctuate, and *something* has to give. + +**You decide what gives.** +Every subscription has a priority, and they all cooperate over one QUIC connection. +Controls before audio before telemetry before the kraken cam before the rest of the cameras. +When the link degrades, the least important stuff waits. + +And it waits, it doesn't disappear. +Boring protocols like RTP give up on a frame after ~100ms, and it's gone forever. +MoQ sends the newest frames first and keeps the old ones in RAM, up to a TTL. + +Each subscriber decides how long it's willing to wait: +- The **operator** waits 100ms, skipping ahead to stay real-time. +- The **AI model** waits a second, because it'd rather see every frame. +- The **recorder** waits 30 seconds, backfilling once the link recovers. + +The result is a lossy live feed AND a pristine VOD, from the same stream. + +
+ ![Realtime vs Backfill](/blog/cars2/backfill.png) +
If I ever own a racing team, it's going to be called The Backfill Boyes
+
+ +## Bonded Pairs +Near the coast? Use cellular *and* satellite. + +QUIC supports path migration, so you can switch from WiFi to cellular to satellite without dropping the connection. +There's also a [multi-path extension](https://datatracker.ietf.org/doc/draft-ietf-quic-multipath/) that uses multiple paths at the same time. +It's [behind a feature flag](https://github.com/moq-dev/moq/blob/main/rs/moq-native/Cargo.toml) if you want to give it a spin. + +Or go up a layer and open multiple MoQ connections: P2P via [iroh](https://iroh.computer/), a self-hosted relay, a public CDN. +The robot announces its broadcasts on all of them, and every subscription takes the best available path. +Idle connections cost nothing, because nothing flows until somebody subscribes. + +
+ ![bonded pairs](/blog/on-a-boat/multipath.png) +
Like kittens, these pairs are bonded.
+
+ +## Fan Out +If 100 viewers subscribe to the same track, [moq-relay](https://doc.moq.dev/bin/relay/) merges them into a single upstream subscription. +The robot serves *at most* one copy of each track, no matter how many people are watching. + +Relays connect to each other and form a [cluster](https://doc.moq.dev/bin/relay/cluster/), handling discovery, routing, and failover. +Self-host a relay on the robot or the base station to keep everything on your network. +Then cluster it with a public CDN like [moq.pro](https://moq.pro) or [Cloudflare](/blog/first-cdn) when the whole world wants to watch. + +
+ ![relay fanout](/blog/on-a-boat/fanout.png) +
One uplink from the boat, any number of viewers.
+
+ +## Not Just Media +There's nothing special about media. +It's just timestamped, delta-encoded data, and so is everything else a robot produces. + +- The camera? **A track.** +- The GPS? **A track.** +- The joystick? **A track.** +- The killswitch? **A track**, and every robot in the fleet can subscribe to it. + +Stamp it all with the same clock and send it over the same connection, so you can put humpty back together on the other side. +WebRTC botches this: metadata needs a separate connection, and the browser doesn't expose timestamps. + +Controls work the same way, just backwards. +The operator publishes a `controls` track, and the robot subscribes to it. +Lockout, handoff, or anarchy is your application's call, not the relay's. +The [MoQ Boy](/blog/moq-boy) demo does exactly this, with a GameBoy standing in for the robot. + +
+ ![MoQ Boy](/blog/moq-boy/moqboy.png) +
weapon of mass destruction?
+
## In Production @@ -33,3 +117,5 @@ I wrote about the pull model in more detail in [On a Boat](/blog/on-a-boat). Running MoQ on something that moves? [Tell us](mailto:me@kixel.me), we'd love to brag about it. Or don't, and we'll add another black bar. + +Want the long version? Read [On a Boat](/blog/on-a-boat) and the [Cars 2](/blog/cars2) post. From 038e3a4f869d5948bd4200d8048a910b6b12effb Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 20 Oct 2026 14:34:08 -0700 Subject: [PATCH 7/9] Users: sharpen the robotics copy and label the redaction bars Co-Authored-By: Claude Opus 5.5 --- src/components/users.astro | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/users.astro b/src/components/users.astro index b032f19..27bc9e8 100644 --- a/src/components/users.astro +++ b/src/components/users.astro @@ -22,9 +22,9 @@ const users = [ name: "Saronic", useCase: "robotics", what: "Autonomous boats", - body: "MoQ is the primary video system across its vessels. One uplink per boat, hundreds of viewers, and nothing sent when nobody is watching.", + body: "MoQ is the primary video system across its autonomous vessels. Transmits multiple cameras/qualities over Starlink.", links: [ - { text: "Their write-up", href: "https://medium.com/saronic-technologies/the-ground-moves-building-on-early-open-source-without-getting-burned-ba2af78beb78" }, + { text: "Proof that I'm not lying", href: "https://medium.com/saronic-technologies/the-ground-moves-building-on-early-open-source-without-getting-burned-ba2af78beb78" }, { text: "Corsair rescues two Army pilots", href: "https://www.navalnews.com/naval-news/2026/06/saronic-usv-rescues-two-u-s-army-pilots-downed-by-iran/" }, ], }, @@ -32,11 +32,11 @@ const users = [ name: "Evolve Robotics", useCase: "robotics", what: "Teleoperation", - body: 'Spoke about "MoQ beyond media" at DEMOQED, the first MoQ conference.', + body: 'Using MoQ extensively for VR teleoperation. Spoke at Demoqed about their usage.', links: [{ text: "evolverobotics.com", href: "https://evolverobotics.com/" }], }, - { name: null, useCase: "robotics", redacted: "w-32", what: "Drones", body: "That's all we're allowed to say.", links: [] }, - { name: null, useCase: "robotics", redacted: "w-24", what: "Drones", body: "Also drones. Also can't say.", links: [] }, + { name: null, useCase: "robotics", redacted: "w-52", what: "Drones", body: "A major government contractor flying drone around with MoQ (cellular). That's all we're allowed to say.", links: [] }, + { name: null, useCase: "robotics", redacted: "w-44", what: "Drones", body: "Another defense contractor flying drones around, this time with Starlink. The drone controls are also transmitted via MoQ.", links: [] }, ]; --- @@ -50,7 +50,9 @@ const users = [ {user.name ? (

{user.name}

) : ( -

+

+ REDACTED +

)}

{user.body}

{user.links.length > 0 && ( From 141d97ee070151fff4222c245769e873dace4ddd Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 20 Oct 2026 14:36:40 -0700 Subject: [PATCH 8/9] Robotics: say the users list is only who told us Co-Authored-By: Claude Opus 5.5 --- src/pages/robotics.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/robotics.mdx b/src/pages/robotics.mdx index c14d228..4d93db6 100644 --- a/src/pages/robotics.mdx +++ b/src/pages/robotics.mdx @@ -115,6 +115,7 @@ The [MoQ Boy](/blog/moq-boy) demo does exactly this, with a GameBoy standing in ## Yours? +That's only the companies willing to tell me they're using the moq.dev libraries. Running MoQ on something that moves? [Tell us](mailto:me@kixel.me), we'd love to brag about it. Or don't, and we'll add another black bar. From 9c2c519dae8b0c7b30c112b21bd4a3f7236dc72e Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 20 Oct 2026 14:56:15 -0700 Subject: [PATCH 9/9] Robotics: tighten the RTSP, RTP, backfill, and WebRTC claims Co-Authored-By: Claude Opus 5.5 --- src/pages/robotics.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/robotics.mdx b/src/pages/robotics.mdx index 4d93db6..84941c0 100644 --- a/src/pages/robotics.mdx +++ b/src/pages/robotics.mdx @@ -21,7 +21,7 @@ And they're all watching over the worst network you've ever seen. ## Pull, not Push -Existing contribution protocols (ex. WebRTC, SRT, RTSP, RTMP) are push-based. +Existing contribution protocols (ex. WebRTC, SRT, RTMP) are push-based. The robot constantly transmits *everything* to a server, watched or not. Not great when you've got 9 cameras and StarLink is expensive. @@ -43,7 +43,7 @@ Controls before audio before telemetry before the kraken cam before the rest of When the link degrades, the least important stuff waits. And it waits, it doesn't disappear. -Boring protocols like RTP give up on a frame after ~100ms, and it's gone forever. +Real-time RTP stacks like WebRTC give up on a frame after a short deadline, and it's gone forever. MoQ sends the newest frames first and keeps the old ones in RAM, up to a TTL. Each subscriber decides how long it's willing to wait: @@ -51,7 +51,7 @@ Each subscriber decides how long it's willing to wait: - The **AI model** waits a second, because it'd rather see every frame. - The **recorder** waits 30 seconds, backfilling once the link recovers. -The result is a lossy live feed AND a pristine VOD, from the same stream. +The result is a lossy live feed AND a pristine VOD from the same stream, as long as the link recovers before the recorder's deadline.
![Realtime vs Backfill](/blog/cars2/backfill.png) @@ -97,7 +97,7 @@ It's just timestamped, delta-encoded data, and so is everything else a robot pro - The killswitch? **A track**, and every robot in the fleet can subscribe to it. Stamp it all with the same clock and send it over the same connection, so you can put humpty back together on the other side. -WebRTC botches this: metadata needs a separate connection, and the browser doesn't expose timestamps. +WebRTC botches this: data channels have their own congestion control that fights the media instead of cooperating with it. Controls work the same way, just backwards. The operator publishes a `controls` track, and the robot subscribes to it.