Repository navigation
Add a robotics page and production users #175
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
05692b3
Add a robotics page and production users
kixelated 7cdf609
Add Meta as a production user for live ingest
kixelated 05ad323
Note that Meta uses its own MoQ implementation
kixelated 727b50f
Name a few MoQ Alliance members on the homepage
kixelated 48d96f0
Robotics: qualify the per-viewer and latency claims
kixelated 912d804
Robotics: rebuild the page from the boat, Cars 2, and MoQ Boy posts
kixelated 038e3a4
Users: sharpen the robotics copy and label the redaction bars
kixelated 141d97e
Robotics: say the users list is only who told us
kixelated 9c2c519
Robotics: tighten the RTSP, RTP, backfill, and WebRTC claims
kixelated File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| --- | ||
| 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", 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. Uses its own implementation of the standard, not ours.', | ||
| 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 autonomous vessels. Transmits multiple cameras/qualities over Starlink.", | ||
| links: [ | ||
| { 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/" }, | ||
| ], | ||
| }, | ||
| { | ||
| name: "Evolve Robotics", | ||
| useCase: "robotics", | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| what: "Teleoperation", | ||
| 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-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: [] }, | ||
| ]; | ||
| --- | ||
|
|
||
| <div class={`not-prose grid gap-5 ${columns}`}> | ||
| { | ||
| users | ||
| .filter((user) => !useCase || user.useCase === useCase) | ||
| .map((user) => ( | ||
| <div class="card flex flex-col gap-2 p-5"> | ||
| <span class="label">{user.what}</span> | ||
| {user.name ? ( | ||
| <h3 class="text-[1.2rem] font-semibold text-white">{user.name}</h3> | ||
| ) : ( | ||
| <h3 class={`my-0.5 flex h-8 ${user.redacted} -rotate-1 items-center justify-center bg-black font-mono text-base tracking-[0.3em] text-white`}> | ||
| REDACTED | ||
| </h3> | ||
| )} | ||
| <p class="text-[0.9rem] leading-relaxed text-slate-400">{user.body}</p> | ||
| {user.links.length > 0 && ( | ||
| <div class="mt-auto flex flex-col gap-1 pt-2 text-[0.9rem]"> | ||
| {user.links.map((link) => ( | ||
| <a href={link.href} class="green-link"> | ||
| {link.text} | ||
| </a> | ||
| ))} | ||
| </div> | ||
| )} | ||
| </div> | ||
| )) | ||
| } | ||
| </div> | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,122 @@ | ||
| --- | ||
| 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're basically cameras with legs or wheels or pinchers or spinning blades or you get the idea. | ||
|
|
||
| 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. | ||
|
|
||
| <figure> | ||
|  | ||
| <figcaption>Arr, there be a kraken on the starboard bow.</figcaption> | ||
| </figure> | ||
|
|
||
| ## Pull, not Push | ||
| 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. | ||
|
|
||
| **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. | ||
| 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: | ||
| - 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, as long as the link recovers before the recorder's deadline. | ||
|
|
||
| <figure> | ||
|  | ||
| <figcaption>If I ever own a racing team, it's going to be called The Backfill Boyes</figcaption> | ||
| </figure> | ||
|
|
||
| ## 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. | ||
|
|
||
| <figure> | ||
|  | ||
| <figcaption>Like kittens, these pairs are bonded.</figcaption> | ||
| </figure> | ||
|
|
||
| ## 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. | ||
|
|
||
| <figure> | ||
|  | ||
| <figcaption>One uplink from the boat, any number of viewers.</figcaption> | ||
| </figure> | ||
|
|
||
| ## 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: 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. | ||
| 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. | ||
|
|
||
| <figure> | ||
|  | ||
| <figcaption>weapon of mass destruction?</figcaption> | ||
| </figure> | ||
|
|
||
| ## In Production | ||
|
|
||
| <Users useCase="robotics" /> | ||
|
|
||
| ## 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. | ||
|
|
||
| Want the long version? Read [On a Boat](/blog/on-a-boat) and the [Cars 2](/blog/cars2) post. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.