Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/components/feature.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
type Feature =
| "source"
| "web"
| "realtime"
| "scale"
| "native"
| "discover"
| "efficient";

interface Props {
icon: Feature;
}

const { icon } = Astro.props;

// These are Kixel's original hand-drawn icons from moq.pro.
const artwork: Record<Feature, string> = {
source: "box",
web: "globe",
realtime: "rocket",
scale: "stonk",
native: "puzzle",
discover: "link",
efficient: "battery",
};
---

<li class="flex items-start gap-3">
<span class="mt-0.5 flex h-9 w-11 shrink-0 items-center justify-center" aria-hidden="true">
<img src={`https://moq.pro/icons/${artwork[icon]}.svg`} class="h-9 w-11 object-contain" alt="" />
</span>
<span><slot /></span>
</li>
129 changes: 129 additions & 0 deletions src/pages/demo.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,132 @@ Click on any of them. That's what they're here for. Everything is open source!
</article>
</a>

## Build Your Own

Want something you can run from a terminal? These copy-paste examples use the same MoQ stack as the browser demos.

<div class="not-prose grid gap-4 sm:grid-cols-3 my-8">
<a href="#cli" class="group rounded-lg border border-slate-700 bg-slate-800/40 p-5 text-white no-underline transition-all hover:-translate-y-1 hover:border-green-500 hover:bg-blue-950">
<img src="https://moq.pro/icons/box.svg" class="mb-3 h-16 transition-transform group-hover:-rotate-3" alt="Hand-drawn box" />
<div class="mb-2 text-xl font-semibold">MoQ CLI</div>
<div class="text-sm font-light text-slate-300">Pull a live broadcast out of MoQ and play it with ffplay.</div>
</a>

<a href="#ffmpeg" class="group rounded-lg border border-slate-700 bg-slate-800/40 p-5 text-white no-underline transition-all hover:-translate-y-1 hover:border-green-500 hover:bg-blue-950">
<img src="https://moq.pro/icons/rocket.svg" class="mb-3 h-16 transition-transform group-hover:-rotate-3" alt="Hand-drawn rocket" />
<div class="mb-2 text-xl font-semibold">FFmpeg</div>
<div class="text-sm font-light text-slate-300">Encode a test pattern, webcam, or screen and publish it live.</div>
</a>

<a href="#gstreamer" class="group rounded-lg border border-slate-700 bg-slate-800/40 p-5 text-white no-underline transition-all hover:-translate-y-1 hover:border-green-500 hover:bg-blue-950">
<img src="https://moq.pro/icons/puzzle.svg" class="mb-3 h-16 transition-transform group-hover:-rotate-3" alt="Hand-drawn puzzle piece" />
<div class="mb-2 text-xl font-semibold">GStreamer</div>
<div class="text-sm font-light text-slate-300">Drop <code>moqsrc</code> and <code>moqsink</code> into a media pipeline.</div>
</a>
</div>

> **Everything under `/anon` is public and ephemeral.** Pick a unique broadcast name, do not publish anything private, and stop the command when you're done.

## CLI

The [`moq` CLI](https://doc.moq.dev/bin/cli) imports and exports common media containers over MoQ.
Install it with Homebrew or Cargo:

```bash
# macOS
brew install moq-dev/tap/moq

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

curl -fsSL https://doc.moq.dev/concept/standard/interop \
  | grep -F 'brew install moq-dev/tap/moq-cli'

Repository: moq-dev/moq.dev

Length of output: 153


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== demo.mdx line 101 context =="
sed -n '96,106p' src/pages/demo.mdx || true

echo "== exact formula references in docs =="
rg -n "brew install|moq-dev/tap" . --glob '!node_modules' --glob '!dist' --glob '!build' || true

echo "== fetch interop page title/headings and command blocks =="
curl -fsSL https://doc.moq.dev/concept/standard/interop \
  | python3 - <<'PY'
import re, sys
text = sys.stdin.read()
print(text[:10000])
print("\n--- brew install occurrences ---")
for i, line in enumerate(text.splitlines(),1):
    if "brew install" in line:
        print(f"{i}: {line}")
PY

Repository: moq-dev/moq.dev

Length of output: 1083


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== Homebrew formula presence/name if curl is available =="
python3 - <<'PY'
import json, sys, urllib.request
url = "https://formulae.brew.sh/api/formula.json"
try:
    data = json.load(urllib.request.urlopen(url, timeout=20))
except Exception as e:
    print("formulae json unavailable:", repr(e))
    sys.exit(0)
names = {f["name"] for f in data if isinstance(f, dict)}
print("cli:", "moq-cli" in names)
print("moq:", "moq" in names)
print("tap formulae:")
for f in data:
    if not isinstance(f, dict):
        continue
    name=f.get("name","")
    tap=f.get("tap","")
    if tap and "moq-dev" in str(tap):
        print(name, tap)
PY

Repository: moq-dev/moq.dev

Length of output: 398


🌐 Web query:

moq-dev/tap/moq-cli Homebrew formula

💡 Result:

To install the moq-cli command-line tool using Homebrew, you can use the official Homebrew tap provided by the moq-dev organization [1][2]. You can install it by running the following commands in your terminal: 1. Tap the repository: brew tap moq-dev/tap 2. Install the formula: brew install moq-dev/tap/moq-cli This formula is maintained by the moq-dev project to provide easy installation of their Media over QUIC tools [1][3]. It is automatically generated and updated via their release workflows [1]. Additional tools in the same tap include moq-relay, moq-clock, moq-token-cli, and moq-gst [1][2].

Citations:


🌐 Web query:

doc.moq.dev concept/standard/interop brew install moq-dev/tap

💡 Result:

The moq-dev project is an open-source implementation of Media over QUIC (MoQ), a next-generation live media protocol designed to provide real-time latency at scale [1][2]. Concept and Interoperability The project focuses on a protocol called "moq-lite," which is a forwards-compatible subset of the IETF's moq-transport draft [3][2]. The core philosophy behind moq-lite is to prioritize simplicity and immediate deployability, allowing it to function with any standard moq-transport relay, such as those provided by Cloudflare [3][2]. The documentation at doc.moq.dev explains these concepts, detailing how the protocol handles transport (using WebTransport, QUIC, or WebSockets) and media containers (like hang and cmaf) to achieve interoperability [4][3]. Installation via Homebrew The moq-dev/tap is a Homebrew tap that allows users to install various tools from the moq-dev workspace [5]. You can add the tap and install the available packages using the following commands: brew tap moq-dev/tap brew install moq-dev/tap/moq-relay brew install moq-dev/tap/moq-cli brew install moq-dev/tap/moq-clock brew install moq-dev/tap/moq-token-cli brew install moq-dev/tap/moq-gst These formulae are automatically generated from the moq-dev/moq GitHub repository [5]. Note that moq-dev is a distinct entity from other projects like moqtap, which has different installation instructions [6]. [5][1]

Citations:


Install the documented Homebrew formula.

The current MoQ installation command uses moq-dev/tap/moq, but the applicable Homebrew formula is moq-dev/tap/moq-cli. Use moq-cli so the macOS walkthrough can complete before the CLI examples.

Proposed fix
-brew install moq-dev/tap/moq
+brew install moq-dev/tap/moq-cli
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
brew install moq-dev/tap/moq
brew install moq-dev/tap/moq-cli
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/demo.mdx` at line 101, Update the Homebrew installation command in
the macOS walkthrough to use the moq-dev/tap/moq-cli formula instead of moq,
keeping the surrounding CLI setup instructions unchanged.


# Any platform with Rust
cargo install moq-cli
```

Then pull the always-on Big Buck Bunny broadcast out as fragmented MP4 and pipe it directly into `ffplay`:

```bash
moq --client-connect https://cdn.moq.pro/demo \
--broadcast bbb.hang export fmp4 \
| ffplay -
```

That's the whole loop: `moq` handles the live transport and media tracks, while FFmpeg handles decoding and playback.

## FFmpeg

Publish a generated video and audio test pattern. Replace `YOUR_NAME` with something unique so you don't fight another publisher for the same broadcast.

```bash
ffmpeg -re \
-f lavfi -i testsrc=size=1280x720:rate=30 \
-f lavfi -i sine=frequency=440 \
-c:v libx264 -preset veryfast -tune zerolatency -g 60 \
-c:a aac \
-f mp4 \
-movflags cmaf+separate_moof+delay_moov+skip_trailer+frag_every_frame - \
| moq --client-connect https://cdn.moq.pro/anon \
--broadcast YOUR_NAME.hang import fmp4
```

While it is running, open `/watch?name=YOUR_NAME.hang` on this site, or play it in another terminal:

```bash
moq --client-connect https://cdn.moq.pro/anon \
--broadcast YOUR_NAME.hang export fmp4 \
| ffplay -
```

Want a real camera instead? Replace the two generated inputs above with the input for your platform:

```bash
# macOS: first camera + first microphone
ffmpeg -f avfoundation -framerate 30 -i "0:0" ...

# Linux: first V4L2 camera + default ALSA input
ffmpeg -f v4l2 -framerate 30 -i /dev/video0 -f alsa -i default ...

# Windows: replace these names with devices from `ffmpeg -list_devices true -f dshow -i dummy`
ffmpeg -f dshow -i video="Integrated Camera":audio="Microphone" ...
```

FFmpeg device names vary, so use its device-list command before assuming the defaults are correct.

## GStreamer

The [`moq-gst` plugin](https://doc.moq.dev/bin/gstreamer) provides two normal GStreamer elements:

- `moqsink` publishes encoded audio and video.
- `moqsrc` subscribes to a broadcast and exposes one pad per rendition.

The quickest install is Nix, which bundles the plugin with GStreamer and the common codec plugins:

```bash
nix shell github:moq-dev/moq#moq-gst --command gst-inspect-1.0 moq
```

Watch the public demo, explicitly connecting both the video and audio pads:

```bash
nix shell github:moq-dev/moq#moq-gst --command gst-launch-1.0 -v -e \
moqsrc name=src url=https://cdn.moq.pro/demo broadcast=bbb.hang \
src.video_0 ! queue ! decodebin3 ! videoconvert ! autovideosink \
src.audio_0 ! queue ! decodebin3 ! audioconvert ! autoaudiosink
```

Or publish a live test pattern to your own public broadcast:

```bash
nix shell github:moq-dev/moq#moq-gst --command gst-launch-1.0 -v -e \
videotestsrc is-live=true ! videoconvert \
! x264enc tune=zerolatency ! h264parse ! mux.sink_0 \
audiotestsrc is-live=true ! audioconvert \
! avenc_aac ! aacparse ! mux.sink_1 \
moqsink name=mux url=https://cdn.moq.pro/anon broadcast=YOUR_NAME.hang
```

Open `/watch?name=YOUR_NAME.hang` while the pipeline is running. For a webcam or screen share, swap `videotestsrc` for your platform's source element such as `avfvideosrc`, `v4l2src`, `ximagesrc`, or `d3d11screencapturesrc`.

### Next Steps

- Embed the [publisher](/publish) or [player](/watch) in a web app.
- Try the full [CLI](https://doc.moq.dev/bin/cli) and [GStreamer](https://doc.moq.dev/bin/gstreamer) docs.
- [Run your own relay](https://doc.moq.dev/bin/relay/) instead of using the public namespace.
- Browse the [source code](https://github.com/moq-dev/moq) or ask questions in [Discord](https://discord.moq.dev).
31 changes: 17 additions & 14 deletions src/pages/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,36 @@
layout: "@/layouts/global.astro"
---

import Feature from "@/components/feature.astro";

<center>
<img src="/home/logo.svg" className="h-32" alt="Media over QUIC Logo" />
</center>

**Media over QUIC** is a live media protocol powered by [QUIC](https://quicwg.org/):
a super-charged TCP/UDP replacement that powers [HTTP/3](https://en.wikipedia.org/wiki/HTTP/3).
It's being developed by the [IETF](https://www.ietf.org/) and your _favorite_ big tech companies such as Google, Cisco, Akamai, Cloudflare, etc.
It's being developed by the [IETF](https://www.ietf.org/) and your _favorite_ big tech companies such as Google, Cisco, Akamai, etc.

MoQ supports **real-time latency**, scales via **generic CDNs**, and **works in browsers**.
It replaces [WebRTC](./blog/replacing-webrtc), [HLS/DASH](./blog/replacing-hls-dash), and [RTMP/SRT](./blog/on-a-boat) with one extensible protocol for **contribution**, mass **distribution**, multiple **latency targets**, and **generic** live tracks.
It replaces [WebRTC](./blog/replacing-webrtc), [HLS/DASH](./blog/replacing-hls-dash), and [RTMP/SRT](./blog/on-a-boat) with one extensible protocol for **contribution**, mass **distribution**, dynamic **latency targets**, and **generic** live tracks.

But seriously, <a href="/demo">try the demos already</a>. There's even a gameboy emulator. Don't pretend like you're not excited.
Holy, that's a lot of keywords, Batman. But seriously, <a href="/demo">try the demos already</a>. There's even a gameboy emulator. Don't pretend like you're not excited.

### Features
### Features

- 🔓 **Open Source**: Production-ready [Rust and TypeScript libraries](/source).
- 🌐 **100% Web**: Utilizes [WebTransport](https://developer.mozilla.org/en-US/docs/Web/API/WebTransport), [WebCodecs](https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API), [WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/WebAudio_API), WebEtc.
- ⚡ **Real-time**: Minimal latency by skipping less important media during congestion.
- 🚀 **Massive Scale**: Host your own CDN with [moq-relay](https://github.com/moq-dev/moq/tree/main/rs/moq-relay) or use [Cloudflare](/blog/first-cdn).
- 🎬 **Multi-Platform**: [Web](https://github.com/moq-dev/moq/tree/main/js/hang), [FFmpeg](https://github.com/moq-dev/moq/tree/main/rs/hang-cli), [GStreamer](https://github.com/moq-dev/gstreamer), [OBS](https://github.com/moq-dev/obs), and [native](/source) clients available.
- 🔍 **Discoverable**: Live notifications when broadcasts are published or finish.
- 💪 **Efficient**: No encoding or bandwidth usage until a viewer needs it.
- 🌍 **Compatible**: TCP fallback via [WebSocket](https://github.com/moq-dev/web-transport/tree/main/web-transport-ws), Safari fallback via [libav.js](https://github.com/Yahweasel/libav.js/).
- 🔧 **Customizable**: Hardware accelerated encoding, the rest is in your control.
<ul class="list-none pl-0">
<Feature icon="source">**Open Source**: Production-ready [Rust and TypeScript libraries](/source).</Feature>
<Feature icon="realtime">**Real-time**: Minimal latency by skipping less important media during congestion.</Feature>
<Feature icon="scale">**Massive Scale**: Host your own CDN with [moq-relay](https://doc.moq.dev/bin/relay/) or use [moq.pro](https://moq.pro).</Feature>
<Feature icon="discover">**Discovery**: Live broadcast and peer discovery without a central authority.</Feature>
<Feature icon="efficient">**Efficient**: No encoding or bandwidth usage until a viewer needs it.</Feature>
<Feature icon="web">**Web**: Utilizes [WebTransport](https://caniuse.com/webtransport), [WebCodecs](https://caniuse.com/webcodecs), and [WebAudio](https://caniuse.com/audio-api) in [Typescript](https://doc.moq.dev/lib/js/).</Feature>
<Feature icon="native">**Native**: [Rust](https://doc.moq.dev/lib/rs/) → [C](https://doc.moq.dev/lib/c/), [Python](https://doc.moq.dev/lib/py/), [Kotlin](https://doc.moq.dev/lib/kt/), [Swift](https://doc.moq.dev/lib/swift/), and [Go](https://doc.moq.dev/lib/go/), plus [GStreamer](https://doc.moq.dev/bin/gstreamer), [OBS](https://doc.moq.dev/bin/obs), and [FFmpeg](https://doc.moq.dev/bin/cli) integrations.</Feature>
</ul>

### *Standards
This website uses [moq-lite](https://doc.moq.dev/concept/layer/moq-lite), a subset of the *official* [moq-transport](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/) draft.
moq-lite is forwards compatible with moq-transport (draft-14+) and works with any MoQ CDN (ex. [Cloudflare](/blog/first-cdn)).
moq-lite is forwards compatible with moq-transport (draft-14+) and works with any MoQ CDN (ex. [moq.pro](https://moq.pro)).
The principles behind MoQ are fantastic, but standards are **SLOW** and involve too much arguing/bloat.
My goal is to get MoQ in __production now__, even if it's not a standard yet.

Expand All @@ -39,6 +41,7 @@ My goal is to get MoQ in __production now__, even if it's not a standard yet.
- The [docs](https://doc.moq.dev) and [Github](https://github.com/moq-dev/moq) if you're a nerd.
- The [discord](https://discord.moq.dev) if you want to chat with me or other unhinged developers.
- The [demos](/demo) if you seriously got this far without clicking on a link.
- The [Pro](https://moq.pro) offering if you don't want to self-host.

Contributions are welcome, of course.
But also feel free to just yoink the code, fork it, and make it your own.
Expand Down
4 changes: 2 additions & 2 deletions src/pages/publish.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ Publishing a **PUBLIC** broadcast. Pls don't do anything stupid.

## Features

- 🔓 **Open Source**: powered by the [@moq/publish](https://github.com/moq-dev/moq/tree/main/js/publish) library.
- 🔓 **Open Source**: powered by the [@moq/publish](https://doc.moq.dev/lib/js/@moq/publish) library.
- 🌐 **100% Web**: WebTransport, WebCodecs, WebAudio, WebWorkers, WebEtc.
- 🎬 **Modern Codecs**: Supports AV1, H.265, H.264, VP9, Opus, AAC, etc.
- 💬 **Automatic Captions**: Generated [in-browser](https://huggingface.co/docs/transformers.js/en/index) using WebGPU and [Whisper](https://github.com/openai/whisper).
- ⚡ **Real-Time**: Minimal latency by skipping unimportant media during congestion.
- 🚀 **Massive Scale**: Everything is deduplicated and distributed across a global CDN.
- 💪 **Efficient**: No encoding or bandwidth usage until a viewer needs it.
- 🔧 **Compatible**: TCP fallback via [WebSocket](https://github.com/moq-dev/web-transport/tree/main/web-transport-ws), Safari fallback via [libav.js](https://github.com/Yahweasel/libav.js/).
- 🔧 **Compatible**: TCP fallback via [WebSocket](https://doc.moq.dev/concept/layer/web-socket), Safari fallback via [libav.js](https://github.com/Yahweasel/libav.js/).

## Embed it

Expand Down
12 changes: 6 additions & 6 deletions src/pages/source.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ Everything is open source and broken into two repositories:
- [moq-dev/moq.dev](https://github.com/moq-dev/moq.dev): This website.

## Rust
Native code is written in [Rust](https://github.com/moq-dev/moq/tree/main/rs) and is split into a few notable crates:
Native code is written in [Rust](https://doc.moq.dev/lib/rs/) and is split into a few notable crates:

| crate | description |
| ----------------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| [moq-lite](https://docs.rs/moq-lite/latest/moq_lite/) | A generic pub/sub transport. This is a minimal reinterpretation of the IETF [MoqTransport draft](https://datatracker.ietf.org/doc/draft-ietf-moq-transport/). |
| [moq-relay](https://github.com/moq-dev/moq/tree/main/rs/moq-relay) | A Moq server that connects publishers to subscribers, caching and deduplicating any subscriptions. Note that MoQ does not support P2P; instead it utilizes relays to scale out to many subscribers. |
| [moq-relay](https://doc.moq.dev/bin/relay/) | A Moq server that connects publishers to subscribers, caching and deduplicating any subscriptions. Note that MoQ does not support P2P; instead it utilizes relays to scale out to many subscribers. |
| [moq-clock](https://github.com/moq-dev/moq/tree/main/rs/moq-clock) | It's a clock! Just to demonstrate that MoQ can be used for more than media. |
| [hang](https://docs.rs/hang/latest/hang/) | A media specific library built on top of moq-lite. This provides a JSON "catalog" that describes the media tracks and "container" that literally consists of a timestamp. The actual media decoding/encoding is left to the platform. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use the compound adjective media-specific.

Change A media specific library to A media-specific library.

Proposed fix
- A media specific library built on top of moq-lite.
+ A media-specific library built on top of moq-lite.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| [hang](https://docs.rs/hang/latest/hang/) | A media specific library built on top of moq-lite. This provides a JSON "catalog" that describes the media tracks and "container" that literally consists of a timestamp. The actual media decoding/encoding is left to the platform. |
| [hang](https://docs.rs/hang/latest/hang/) | A media-specific library built on top of moq-lite. This provides a JSON "catalog" that describes the media tracks and "container" that literally consists of a timestamp. The actual media decoding/encoding is left to the platform. |
🧰 Tools
🪛 LanguageTool

[grammar] ~21-~21: Use a hyphen to join words.
Context: ...s://docs.rs/hang/latest/hang/) | A media specific library built on top of moq-lit...

(QB_NEW_EN_HYPHEN)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/source.mdx` at line 21, Update the hang entry in the documentation
table to hyphenate the compound adjective as “media-specific,” changing only the
description text.

Source: Linters/SAST tools

| [hang-cli](https://github.com/moq-dev/moq/tree/main/hang-cli) | A client that integrates with ffmpeg to publish media. This pipes fMP4 over stdin, so it's not the most efficient... |
| [hang-gst](https://github.com/moq-dev/gstreamer) | A GStreamer plugin for publishing and consuming media. Separate repository to avoid GStreamer build dependency. |
| [hang-obs](https://github.com/moq-dev/obs) | An OBS plugin for publishing media. Separate repository to avoid OBS build dependency. |
| [hang-cli](https://doc.moq.dev/bin/cli) | A client that integrates with ffmpeg to publish media. This pipes fMP4 over stdin, so it's not the most efficient... |
| [hang-gst](https://doc.moq.dev/bin/gstreamer) | A GStreamer plugin for publishing and consuming media. Separate repository to avoid GStreamer build dependency. |
| [hang-obs](https://doc.moq.dev/bin/obs) | An OBS plugin for publishing media. Separate repository to avoid OBS build dependency. |
| [hang-wasm](https://github.com/moq-dev/moq/tree/main/hang-wasm) | An MoQ web client utilizing WebAssembly, WebCodecs, and WebTransport. Deprecated in favor of the Typescript implementation; see below for justification. |


Expand All @@ -36,7 +36,7 @@ There are some additional crates in other repositories that might be of interest


## Typescript
Web code is written in [Typescript](https://github.com/moq-dev/moq/tree/main/js) and is split into a few packages:
Web code is written in [Typescript](https://doc.moq.dev/lib/js/) and is split into a few packages:

| package | description |
| ------- | ----------- |
Expand Down
4 changes: 2 additions & 2 deletions src/pages/watch.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import WatchEmbed from "@/components/watch-embed.astro";

## Features

- 🔓 **Open Source**: powered by the [@moq/watch](https://github.com/moq-dev/moq/tree/main/js/watch) library.
- 🔓 **Open Source**: powered by the [@moq/watch](https://doc.moq.dev/lib/js/@moq/watch) library.
- 🌐 **100% Web**: WebTransport, WebCodecs, WebAudio, WebWorkers, WebEtc.
- 🎬 **Modern Codecs**: Supports AV1, H.265, H.264, VP9, Opus, AAC, etc.
- 💬 **Automatic Captions**: Generated [in-browser](https://huggingface.co/docs/transformers.js/en/index) using WebGPU and [Whisper](https://github.com/openai/whisper).
- ⚡ **Real-Time**: Minimal latency by skipping unimportant media during congestion.
- 🚀 **Massive Scale**: Downloaded from the nearest CDN edge.
- 💪 **Efficient**: No video is downloaded when minimized, or audio when muted.
- 🔧 **Compatible**: TCP fallback via [WebSocket](https://github.com/moq-dev/web-transport/tree/main/web-transport-ws), Safari fallback via [libav.js](https://github.com/Yahweasel/libav.js/).
- 🔧 **Compatible**: TCP fallback via [WebSocket](https://doc.moq.dev/concept/layer/web-socket), Safari fallback via [libav.js](https://github.com/Yahweasel/libav.js/).

## Embed it

Expand Down