Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
27e6ed4
fix(moq-video): compile the MediaFoundation camera texture test (#4036)
kixelated Sep 24, 2026
0bb7b2d
feat(moq-video): encode and scale DMA-BUFs on VAAPI without a downloa…
Frando Sep 24, 2026
5246ab5
docs: fill release doc gaps (#4027)
kixelated Sep 24, 2026
8cda5d0
chore(rs): bump depended-on 0.0.x crates to 0.1.0 (#4033)
kixelated Sep 24, 2026
b32b7a7
fix(publish): keep audio held across a demand gap from rewinding the …
kixelated Sep 24, 2026
2e27b4b
feat(moq-video): one VAAPI render node for encode, decode and resize …
Frando Sep 24, 2026
7fbdba8
chore: release (#4013)
moq-bot[bot] Sep 24, 2026
d578104
build: ship the moq-cli crate as moq on Docker, Nix, and winget (#4030)
kixelated Sep 24, 2026
2296ee5
ci: stop paying for low-signal test runs (#4048)
kixelated Sep 24, 2026
b51e49b
docs(drafts): delete moq-pattern, fold request resolution into moq-cl…
kixelated Sep 24, 2026
cff7c7c
fix(moq-hls): align cursor discontinuities across renditions (#4065)
kixelated Sep 24, 2026
a8c9d71
perf(moq-json): track the window decode path only to explain a failur…
kixelated Sep 24, 2026
b99ad33
test(moq-tokio): fix websocket_forbidden port-collision flake (#4055)
kixelated Sep 24, 2026
4d85382
fix(net): a broadcast exists only while announced (#4021)
kixelated Sep 24, 2026
cddeded
docs(drafts): indent hang's text schema with spaces and refuse tabs (…
kixelated Sep 24, 2026
02a2aa1
feat(moq-uring): report a session's peer address and SNI to auth (#4056)
kixelated Sep 24, 2026
73baf5b
feat(libmoq): accept sessions as a server (#4046)
kixelated Sep 24, 2026
a11d4c8
fix(moq-json): reject trailing data after a window frame (#4029)
kixelated Sep 24, 2026
ead4063
docs(quest): plan moving watch playback into a worker (#4067)
kixelated Sep 24, 2026
89329b9
chore(quest): retire js-publish-discontinuity, delivered by #3982 (#4…
kixelated Sep 24, 2026
28b70e9
perf(json): track the error path only when a snapshot decode fails (#…
kixelated Sep 24, 2026
797d304
docs(quest): plan the JS per-frame retention fix (#4063)
kixelated Sep 24, 2026
86a9e0b
docs(quest): plan the JS and Rust track tail and session-death errors…
kixelated Sep 24, 2026
39e1789
fix(net): bound the moq-net loom models so the nightly finishes (#4071)
kixelated Sep 24, 2026
4df8436
docs(quest): plan follow-ups from the spawn-quests run (#4064)
kixelated Sep 24, 2026
b91dc25
feat(moq-hls): version init URLs by content hash and segment URLs by …
kixelated Sep 24, 2026
28dc034
docs(quest): plan data tracks in app sections and a catalog delay fie…
kixelated Sep 24, 2026
276d0dd
chore(quest): abandon js-broadcast-route (#4035)
kixelated Sep 24, 2026
5b8afc5
feat(cli): add `moq fetch` to read one group of a track (#3965)
kixelated Sep 24, 2026
10343fe
feat(net): an announce says whether its route entered here or from a …
kixelated Sep 24, 2026
2cd1f99
test(relay): run the drills over a seeded, impaired UDP path (#4054)
kixelated Sep 24, 2026
711ad27
fix(moq-hls): stamp discontinuities once in the timeline fanout (#4075)
kixelated Sep 24, 2026
eed6f0a
feat(ffi): disable or delay the WebSocket fallback (#3961)
kixelated Sep 24, 2026
a4a4dd5
docs(bindings): compile every binding doc sample against its wrapper …
kixelated Sep 24, 2026
6952fab
feat(relay): retag a live session's stats when a re-check moves its t…
kixelated Sep 24, 2026
dcacb48
fix(dart): release RustBuffers instead of leaking them (#4072)
kixelated Sep 24, 2026
41e1b5d
fix(ci): package moq-cli from the flake package named after its binar…
kixelated Sep 25, 2026
374c4ef
feat(gateway): expose the loop and handler the gateway binaries run (…
kixelated Sep 25, 2026
fa707c0
fix(net): keep a lost spliced group lost (#4077)
kixelated Sep 25, 2026
d4c9396
fix(publish): resume the audio capture context on a gesture (#3960)
kixelated Sep 25, 2026
5d6846d
feat(net): hide dot-named broadcasts from discovery (moq-lite-07) (#4…
kixelated Sep 25, 2026
f0fdb69
fix(flate): use zlib-rs so a sync flush always finishes (#4018)
kixelated Sep 25, 2026
cf0ef44
build: fold unit tests into `just check`, split CI into `just ci chec…
kixelated Sep 25, 2026
2299622
fix(moq-mux): every TS elementary stream re-anchors below the live ed…
kixelated Sep 25, 2026
7951981
chore: release (#4051)
moq-bot[bot] Sep 25, 2026
4a14d0c
perf(json): skip unchanged root entries in the snapshot diff (#4020)
kixelated Sep 25, 2026
54aa6c1
fix(interop): skip a dropped group in the native JS subscriber (#4092)
kixelated Sep 25, 2026
d5c327d
fix(net): use the registered IETF priority property and TRACK_STATUS/…
kixelated Sep 25, 2026
044ca57
feat(mux): measure encoder flush jitter per rendition (#3940)
kixelated Sep 25, 2026
66440a6
fix(moq-mux): order TS export by media time, not arrival (#4001)
kixelated Sep 25, 2026
f591b9c
chore(skills): keep quest agent scratch in the worktree (#4096)
kixelated Sep 25, 2026
98aced9
fix(moq-tokio): release the QUIC socket before Listener::close return…
kixelated Sep 25, 2026
d033726
fix(publish): re-base the audio encoder clock across a gap (#4101)
kixelated Sep 25, 2026
12dc957
docs(quest): fold handout revocation into origin narrowing (#4106)
kixelated Sep 25, 2026
67c2593
fix(net): FIN a lite group that ends exactly at the requested start f…
kixelated Sep 25, 2026
4c55710
feat(ffi): name the track an encoded audio or video publish writes (#…
kixelated Sep 25, 2026
1ca9283
fix(moq-gst): wait for the sink's reconnect loop to end on stop (#4074)
kixelated Sep 25, 2026
e0c3ef2
docs(quest): plan follow-ups from the next-16 quest run (#4105)
kixelated Sep 25, 2026
d78bf4e
fix(js): stop retaining a listener, reaction, or task per frame (#4085)
kixelated Sep 25, 2026
5dbfe60
feat(publish): advertise the page clock at the catalog root (#4082)
kixelated Sep 25, 2026
a342004
fix(net): end an IETF subscription from its PUBLISH_DONE (#4083)
kixelated Sep 25, 2026
aa2a47a
docs(quest): plan the VAAPI and PipeWire camera follow-ups (#4070)
kixelated Sep 25, 2026
a9fb0f5
feat(libmoq): advertise JSON tracks in the catalog, add binary data t…
bgreenway Sep 25, 2026
0d167f5
test(moq-tokio): dial the WebSocket fallback on its own ephemeral por…
kixelated Sep 25, 2026
75d615d
docs(quest): plan an on-demand binary delta stats flavor (#4016)
kixelated Sep 25, 2026
f822924
test(signals): assert retention on bookkeeping, not a GC heap count (…
kixelated Sep 25, 2026
fd31194
test(moq-tokio): bind reconnect and worker tests to their own ports (…
kixelated Sep 25, 2026
0beaad3
docs(quest): drop auth-embedder, completed on dev in #3943 (#4108)
kixelated Sep 25, 2026
fc46699
docs(quest): plan lite-07 announce compression (#4147)
kixelated Sep 25, 2026
3b4ad5b
fix(net): hold a parked track's warm cache until the upstream confirm…
kixelated Sep 25, 2026
0848a8a
chore(quest): drop Required bullets that have cleared (#4109)
kixelated Sep 25, 2026
3590e44
fix(net): deliver a track's tail up to its declared end (#4086)
kixelated Sep 25, 2026
fbbcb25
test(js): assert retention on reactions and listeners, not a GC heap …
kixelated Sep 25, 2026
5217cb8
feat(moq-mux): catalog delay measures cross-track encoder lateness (#…
kixelated Sep 25, 2026
051930d
feat(moq-mux): publish data tracks into an application's own catalog …
kixelated Sep 25, 2026
68c7334
fix(net): judge spliced staleness against the logical live edge (#4103)
kixelated Sep 25, 2026
94df86c
docs(quest): plan CI benchmark regressions and new benches (#4149)
kixelated Sep 25, 2026
f29895c
feat(moq-gst): opt pads fed by a local encoder into flush jitter (#4112)
kixelated Sep 25, 2026
2171c28
docs(stats): document the stats broadcasts as a wire contract (#3951)
kixelated Sep 25, 2026
abd91e1
fix(net)!: ship lite-07 as moq-lite-07-wip, off by default (#4148)
kixelated Sep 25, 2026
63e5c5f
chore: release (#4091)
moq-bot[bot] Sep 25, 2026
a2cb46c
ae
kixelated Sep 25, 2026
e173ddd
feat(ffi): advertise JSON tracks in the catalog, add binary data trac…
bgreenway Sep 25, 2026
e7491b9
quest: claim wildcard/demand
kixelated Sep 25, 2026
3216843
Merge origin/main into quest/m1/wildcard/demand
kixelated Sep 25, 2026
ec2f066
test(watch): pin wildcard-covered renditions to the announcement gate
kixelated Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude/skills/spawn-merge/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Read the /merge, /takeover, and /close skills before starting.
The goal is to evaluate the open PRs in the repository and decide which ones to merge.
Each merge is performed in parallel by a sub-agent.

Start by listing all open PRs.
Start by listing all open PRs that are ready for review (skip drafts).
An argument can be used to filter the PRs in scope.

One at a time, for each PR, interactively prompt the user if we should /merge, skip, or /close.
Expand Down
1 change: 1 addition & 0 deletions .claude/skills/spawn-quests/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Include a short summary and your recommendation.

Spawn a background sub-agent for each /start-quest.
Create a fresh worktree on the base `quest branch` prints, creating that line branch first if it is missing.
Agents share no writable files: each keeps its scratch files in its own worktree's `.scratch/`, and anything you hand every agent goes in its prompt, not a shared file.
Limit the concurrency to at most N agents in parallel, where N is half the number of physical CPU cores.

Monitor the sub-agents and report their final status, but do not monitor their PRs.
Expand Down
10 changes: 8 additions & 2 deletions .claude/skills/start-quest/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,18 @@ description: Start work on a quest.

Before you begin, read `quest/CLAUDE.md` completely.

Your goal is to implement the quest, or as much of it as possible, and create a PR.
Your goal is to implement the quest, or as much of it as possible, and create a draft PR.
The argument is the quest to work on.

If you are unsure on the best course of action, ask the user for direction.

Confirm the quest is ready and unclaimed.
Claim it as `quest/CLAUDE.md` describes: `quest branch` names the branch and its bases, missing line branches get a draft PR, and the quest branch gets an empty commit.

Implement the quest until it is complete, or some blocker is hit, then create a PR against the base.
Summarize the notable changes for the user.
Keep scratch files (PR body, logs, notes) in the worktree's gitignored `.scratch/`.
Never write to or clean up a directory other agents share, such as a session scratchpad.

When done, summarize any issues encounted, and suggest potential follow-up.
If you're happy with the outcome, switch the draft PR to ready for review.
If you want another set of eyes on it, keep it a draft.
28 changes: 28 additions & 0 deletions .github/scripts/package-binary.test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,31 @@ cmp "$binary" "$bare"
cmp "$binary" "$tmp/extracted/$name/bin/moq-relay"

echo "release assets package together without path collisions"

# Without --binary the script builds the flake package named after the binary:
# `.#moq` for the moq-cli crate, since `.#moq-cli` is a stub refusing the old name.
cat >"$tmp/bin/nix" <<'NIX'
#!/usr/bin/env bash
set -euo pipefail
[[ "$1 $3" == "build --out-link" && "$2" == *"#moq" ]] || {
echo "unexpected: nix $*" >&2
exit 1
}
mkdir -p "$4/bin"
printf '#!/usr/bin/env sh\necho moq\n' >"$4/bin/moq"
chmod 0755 "$4/bin/moq"
NIX
chmod 0755 "$tmp/bin/nix"

PATH="$tmp/bin:$PATH" "$WORKSPACE_DIR/rs/scripts/package-binary.sh" \
--crate moq-cli \
--bin moq \
--version 0.12.2 \
--target "$target" \
--output "$tmp/dist"

name="moq-cli-v0.12.2-$target"
tar -xzf "$tmp/dist/$name.tar.gz" -C "$tmp/extracted"
[[ "$("$tmp/extracted/$name/bin/moq")" == moq ]]

echo "a nix build packages the flake output named after the binary"
4 changes: 2 additions & 2 deletions .github/workflows/cache.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,13 @@ jobs:
# and the test artifacts (codegen + linked test binaries). They share
# little, and a PR usually needs both.
- name: Check
run: nix develop --command just check --all
run: nix develop --command just ci check --all
env:
MOQ_STRICT: 1

- name: Test
if: ${{ !cancelled() }}
run: nix develop --command just test all
run: nix develop --command just ci test --all
env:
MOQ_STRICT: 1
NEXTEST_PROFILE: ci
8 changes: 4 additions & 4 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Full history so `just check` can diff against origin/$GITHUB_BASE_REF.
# Full history so `just ci check` can diff against origin/$GITHUB_BASE_REF.
fetch-depth: 0

- uses: DeterminateSystems/nix-installer-action@1d87d45818068401a10cf16bdc5f00b24994a83f # main
Expand Down Expand Up @@ -77,7 +77,7 @@ jobs:
run: bash .claude/hooks/direnv.test.sh

- name: Check
run: nix develop --command just check
run: nix develop --command just ci check
env:
MOQ_STRICT: 1

Expand All @@ -97,7 +97,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Full history so `just test` can diff against origin/$GITHUB_BASE_REF.
# Full history so `just ci test` can diff against origin/$GITHUB_BASE_REF.
fetch-depth: 0

- uses: DeterminateSystems/nix-installer-action@1d87d45818068401a10cf16bdc5f00b24994a83f # main
Expand All @@ -120,7 +120,7 @@ jobs:
# NEXTEST_PROFILE picks up the longer hang timeout in .config/nextest.toml;
# without it a runner under load could trip the local one.
- name: Test
run: nix develop --command just test
run: nix develop --command just ci test
env:
MOQ_STRICT: 1
NEXTEST_PROFILE: ci
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
/.claude/tmp/
/.claude/worktrees/

# Per-worktree agent scratch (PR bodies, logs, notes); see the start-quest skill.
/.scratch/

# IDE
.idea

Expand Down
5 changes: 2 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ This file is split into nested `CLAUDE.md` files based on the language/situation
- Try to do stuff asynchronously. ex. ask about follow-ups while tests run.
- Try to recognize when you're stuck, or making minimal progress, and stop early.
- If the core problem is addressed, ship it instead of spinning your wheels on meaningless revisions.
- Benchmark any performance optimizations instead of relying on intuition.
- Add or extend a benchmark for any performance-sensitive change so later regressions show up, and measure optimizations instead of relying on intuition.

# Public API

Expand Down Expand Up @@ -83,8 +83,7 @@ Use the Nix dev shell so tooling matches CI.
direnv loads it automatically, but if not: `nix develop --command ...`.

```bash
just check # Lint and compile what the branch changed
just test # Test what the branch changed, same scope
just check # Lint, compile, and test what the branch changed
just fix # Auto-fix lint/formatting, same scope
```

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ When pushing additional commits to an existing PR, update the title and descript
When taking over someone else's PR, push commits on top of theirs so they keep credit.

Create a draft PR.
Switch it to "Ready for review" when you're finished and local `just check` and `just test` pass.
Switch it to "Ready for review" when you're finished and local `just check` passes.
Fix any merge conflicts and failing CI checks.

# AI
Expand Down
Loading
Loading