Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
043d584
build(deps-dev): bump the bun group across 1 directory with 2 updates…
dependabot[bot] Jun 24, 2026
a7c937e
feat(hang): compressed catalog track (catalog.json.z) (#1904)
kixelated Jun 24, 2026
7090bb3
feat(moq-native): unified client TLS verification + quiche backend su…
kixelated Jun 24, 2026
fbf706d
feat(flate): extract group-scoped DEFLATE into moq-flate / @moq/flate…
kixelated Jun 24, 2026
bdad42c
feat(moq-relay): reuse client TLS for outbound auth HTTP; make --clie…
kixelated Jun 24, 2026
94629e5
refactor(net): encapsulate Group.state behind non-blocking read metho…
kixelated Jun 24, 2026
c255e85
refactor(moq-json): gate group rolls on already-written deltas (#1909)
kixelated Jun 24, 2026
5bfe7bf
perf(moq-json): generate merge patches with a diffing serializer (+ b…
kixelated Jun 26, 2026
6b038df
feat(moq-net): add OriginProducer::dynamic + infallible OriginConsume…
kixelated Jun 26, 2026
4f2ce12
feat(moq-rtmp): RTMP/E-RTMP gateway + enhanced-RTMP FLV codecs on mai…
kixelated Jun 26, 2026
79e02bb
feat(moq-srt): bidirectional SRT/MPEG-TS gateway (+ timestamped ts::E…
kixelated Jun 26, 2026
2af9777
feat(moq-rtc): add WebRTC (WHIP/WHEP) gateway (#1916)
kixelated Jun 26, 2026
86ff316
fix(nix): give moq-relay's check phase a CA bundle via cacert (#1919)
kixelated Jun 26, 2026
72b2b25
[codex] fix moq-srt negative pacing offsets (#1922)
kixelated Jun 26, 2026
abc59c3
Backport moq-mux to main (adapted to main's moq-net, no wire/API brea…
kixelated Jun 26, 2026
791f82f
build(deps-dev): bump the uv group across 1 directory with 3 updates …
dependabot[bot] Jun 26, 2026
97e7914
build(deps): bump the github-actions group across 1 directory with 3 …
dependabot[bot] Jun 26, 2026
1dac0a5
fix(moq-mux): codec/container correctness fixes from #1918 review (#1…
kixelated Jun 26, 2026
3ce0331
[codex] Backport moq-hls to main (#1924)
kixelated Jun 26, 2026
3f355a1
[codex] Backport relay web embedding (#1930)
kixelated Jun 27, 2026
9206168
[codex] expose moq-rtc session runner (#1931)
kixelated Jun 27, 2026
02273a0
[codex] support relay HTTPS cert arrays (#1932)
kixelated Jun 27, 2026
060726e
build(deps-dev): bump the bun group with 6 updates (#1935)
dependabot[bot] Jun 28, 2026
404ec17
[codex] upgrade TypeScript 7 RC (#1938)
kixelated Jun 28, 2026
d71655a
Fix fMP4 zero-duration samples (#1933)
kixelated Jun 29, 2026
4c60c52
[codex] Route HLS CLI import through moq-hls (#1939)
kixelated Jun 29, 2026
c30f3cd
moq-mux: API cleanup before the semver bump (#1941)
kixelated Jun 29, 2026
1ea203d
build(deps): bump the cargo group across 1 directory with 18 updates …
dependabot[bot] Jun 29, 2026
68c9ebd
moq-mux: unify rendition selection behind select::Broadcast
kixelated Jun 29, 2026
10e634c
moq-mux: drop redundant non_exhaustive on select builders (#1944)
kixelated Jun 29, 2026
41ee136
demo/web: focus the watch tab instead of stats on `just web` (#1946)
kixelated Jun 29, 2026
ac2e9f6
moq-hls: preserve discontinuity sequence through fMP4 import (#1945)
kixelated Jun 29, 2026
d027f07
Merge main into dev
claude Jun 30, 2026
747f242
fix(moq-cli): adapt main's HLS import path to dev's moq-net API
claude Jun 30, 2026
e287eab
fix(moq-cli): enable moq-hls `server` feature for `hls export`
claude Jun 30, 2026
2b419cb
Merge remote-tracking branch 'origin/dev' into claude/merge-main-dev-…
claude Jun 30, 2026
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
2 changes: 1 addition & 1 deletion .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:
- if: runner.environment == 'github-hosted'
uses: DeterminateSystems/magic-nix-cache-action@908b263ff629f4cc17666315b7fd3ec127c6244d # main
- if: runner.environment == 'github-hosted'
uses: DeterminateSystems/flake-checker-action@9ee1c5473f1abdfb299f6c4f0fab813147c97fe3 # main
uses: DeterminateSystems/flake-checker-action@a0f068d37b542f3150564fbf1164fec2d958ee11 # main

# GitHub-hosted fallback caches Rust via the Actions cache. The self-hosted
# box runs the heavy Rust CI (clippy/doc/test) as crane derivations via
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-kt-ffi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ jobs:
- name: Set up Android SDK
uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1

- uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
- uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0

- name: Download per-target libs
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/update-flake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
run: dirname "$(command -v nix)" >> "$GITHUB_PATH"

- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@b83e0671a67dfd774680fb1beaa1497ef7e58bfc # main
uses: DeterminateSystems/update-flake-lock@fd9359ac79d0e912f1b4b947a48470b3e2799b56 # main
with:
pr-title: "Update flake.lock"
pr-labels: |
Expand Down
17 changes: 14 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,19 @@ This root file holds only cross-cutting rules that apply everywhere (writing sty
- Write the way you'd say it out loud, not the way a doc generator would. One short line is almost always enough. Skip throat-clearing like "This function is responsible for...".
- Comments must reflect the **current** state of the code, not its history. Don't write "X no longer does Y" or "this used to cascade". Describe what the code does today, or delete the comment. Migration context belongs in commit messages and PR descriptions, where it ages with the change rather than rotting in the source.

## Deprecation

Don't document deprecated flags, options, or APIs. User-facing docs (`/doc`), `--help`, and doc comments should describe only the current/canonical surface, so a reader is steered to the right thing and never learns the dead one. Keep the deprecated path *working* but invisible:

- A deprecated CLI flag stays a hidden alias (clap `alias = "..."`, or a separate `#[arg(..., hide = true)]` when it needs its own deprecation warning). No `--help` entry, no "deprecated, use X" note in the doc comment.
- A deprecated public item gets `#[doc(hidden)]` (Rust) / `@internal` or omission (JS) so it drops off the published docs.
- Remove the example invocations and prose that mention it from `/doc`.

The rename/removal rationale lives in the commit message and PR description, not in docs that users read. A runtime warning when someone *uses* the deprecated path is fine (it fires on use, it isn't documentation); a standing note that advertises the dead name is not.

## AI Attribution

LLM-authored prose visible to humans (PR descriptions, PR comments, review replies) should end with `(Written by Claude)` or similar. Do **not** tag code comments, doc comments, or `/doc` pages: source markers rot. Commit attribution lives in the `Co-Authored-By` trailer, not the commit body.
LLM-authored prose visible to humans (PR descriptions, PR comments, review replies) should end with the agent model, e.g. `(Written by GPT-5)`. Do **not** tag code comments, doc comments, or `/doc` pages: source markers rot. Commit attribution lives in the `Co-Authored-By` trailer, not the commit body.

## Refactor As You Go

Expand All @@ -111,7 +121,8 @@ Favor composable building blocks over one-off functions. A handful of orthogonal

Then future-proof what you do expose so additions don't force a breaking change:

- **Config structs consumers construct**: add `#[non_exhaustive]` and a `Default` or constructor. New optional fields then stay additive (callers build via `default()`/`new()` + field set, not struct literals). Prefer adding a field to an existing `#[non_exhaustive]` config over adding a function parameter.
- **Config structs consumers construct with `pub` fields**: add `#[non_exhaustive]` and a `Default` or constructor. New optional fields then stay additive (callers build via `default()`/`new()` + field set, not struct literals). Prefer adding a field to an existing `#[non_exhaustive]` config over adding a function parameter. This applies only when the struct exposes `pub` fields, since `#[non_exhaustive]` is what blocks the struct-literal path. A struct with all-private fields built through a builder (`default()` + chained `.with_x()` methods) already prevents struct literals, so `#[non_exhaustive]` is redundant there; don't add it.
- **Take an options struct/object, not positional parameters, whenever a function or constructor could plausibly gain more knobs later.** A single `Config`/options bag (Rust struct, TS interface) lets you add fields without changing the signature; positional params force a breaking change (or an awkward `(track, undefined, opts)` call) the moment a second option shows up. Reach for it even when there's only one option today: a lone `compression: bool` arg is a future breaking change waiting to happen, whereas `Config { compression }` absorbs the next field for free. This applies in both languages, not just where `#[non_exhaustive]` does.
- **Public enums that may gain variants**: add `#[non_exhaustive]` so external `match`es keep compiling.
- **Name by role, not by today's only implementation** (`capture::Config`, `publish_capture`, not `CameraConfig`/`publish_camera`) so a second implementation slots in without a rename. Don't bundle generic options under a specific-case name.
- **Namespace with modules; keep type names short.** Split a growing crate into role modules (`capture`, `encode`, `decode`) and let each own short, unprefixed names. The module already supplies the prefix, so `encode::Config` beats `EncoderConfig` and `encode::Producer` beats `VideoProducer`. But don't nest a module whose name echoes its main type: `encode::encoder::Encoder` stutters; re-export the type flat so it reads `encode::Encoder`. Re-export the public types at the role-module level (`pub use encoder::{Encoder, Config}`) and keep the file-level module (`mod encoder`) private.
Expand Down Expand Up @@ -195,4 +206,4 @@ Update them with `gh pr edit <num> --title "..." --body "..."` whenever the scop
- Bullet points in the "Summary" section that describe behavior the latest commits have changed or removed.
- The test-plan checklist getting out of date as new tests are added.

When you edit a PR description you authored, keep the `(Written by Claude)` marker so reviewers still know the body wasn't human-authored.
When you edit a PR description you authored, keep the agent model marker so reviewers still know the body wasn't human-authored.
Loading
Loading