diff --git a/quest/README.md b/quest/README.md index 72961ce..aeeecaa 100644 --- a/quest/README.md +++ b/quest/README.md @@ -19,4 +19,5 @@ there first. A quest here that needs it waits on a pin quest, which ## Required - [m0: the studio](/quest/m0/README.md) - the native and wasm studio for creators who rely on OBS today -- [m1: viewers compose](/quest/m1/README.md) - viewers and a server compose a broadcast from its sources and a layout track +- [m1: after the studio ships](/quest/m1/README.md) - viewers and a server compose a broadcast from its sources and a layout track, plus studio features held past m0 +- [m2: later](/quest/m2/README.md) - work with no consumer yet diff --git a/quest/m0/README.md b/quest/m0/README.md index 716236c..d56814e 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -99,7 +99,6 @@ repository. - [Clap-to-measure sync delay](/quest/m0/sync-clap.md) - a clap sets a microphone's delay against its camera - [Audio filters](/quest/m0/audio-filters.md) - per-source noise suppression, gate, compressor, limiter, and plugins, configured from the studio - [Browser sources on macOS and Windows](/quest/m0/browser-source.md) - the out-of-process CEF pages Linux has, with shared GPU textures on the other desktops -- [Published independently](/quest/m0/publish-independently.md) - a source opts out of the program and publishes its own track for services that place it themselves - [Web studio](/quest/m0/web.md) - the full studio in wasm on WebGPU and WebCodecs, served from this repository - [Virtual camera](/quest/m0/vcam/README.md) - a canvas's program exposed as a system camera on Linux, Windows, and macOS - [Clean quit](/quest/m0/clean-quit.md) - quitting finishes every track and closes the relay session, so the broadcast's tail arrives @@ -107,6 +106,7 @@ repository. - [Premultiplied source sampling](/quest/m0/premultiply.md) - scaled transparent sources draw without edge fringes - [Deterministic browser source startup](/quest/m0/cef-startup.md) - CEF on the CPU path paints its first frame without the GPU fallback hang - [A browser renderer that dies on its first page](/quest/m0/browser-first-crash.md) - a renderer lost during the first navigation fails its source +- [Browser sources without an X display](/quest/m0/cef-headless.md) - CEF runs headless, so Wayland sessions and tests need no X server - [Signing identities are available](/quest/m0/signing.md) - the Apple and Windows code-signing credentials packaging and the macOS camera need - [Packaging](/quest/m0/packaging.md) - signed installers for macOS and Windows and a Flatpak for Linux - [The persistable portal restore token is pinned](/quest/m0/pin-portal-token.md) - moq-video's restore token, for Wayland sources diff --git a/quest/m0/cef-headless.md b/quest/m0/cef-headless.md new file mode 100644 index 0000000..28f6cfa --- /dev/null +++ b/quest/m0/cef-headless.md @@ -0,0 +1,32 @@ +# [S] Browser sources without an X display + +## Goal + +Browser sources run with no X server or `$DISPLAY` on both the CPU path and +the GPU (shared DMA-BUF texture) path, so the studio's CEF helper works under a +pure Wayland session without XWayland and `just render-sw` no longer needs +`xvfb-run`. Copy and paste under Interact still reach the desktop clipboard. + +## Plan + +From [moq-dev/studio#49](https://github.com/moq-dev/studio/pull/49), picked +2026-11-05 (maintainer, /quest-plan), m0 by the rule that fixes join m0. With +`--disable-gpu` alone CEF still fails with "Missing X server or $DISPLAY"; a +trial adding `--ozone-platform=headless` on the CPU path passed 10/10 runs +with no display at about 0.4 s, and the browser suite matched Xvfb. + +Check first, and record the result in the PR: +- Whether Copy and Cut under Interact still reach the desktop clipboard with + the headless platform; if not, the studio's own clipboard (egui) relays + them. +- Whether the GPU path can go headless too. If it cannot, land the CPU path + and rewrite this quest to the GPU path's remaining work, with what blocks + it. + +Then drop the `xvfb-run` wrapper from the `render-sw` recipe in the +`justfile` (the nightly job inherits it through the recipe), and say in +`README.md` that browser sources need no X server. + +## Required + +- [Deterministic browser source startup](/quest/m0/cef-startup.md) - the `--disable-gpu` CPU path this builds on diff --git a/quest/m1/compose/README.md b/quest/m1/compose/README.md index f8c9b08..bfe3fee 100644 --- a/quest/m1/compose/README.md +++ b/quest/m1/compose/README.md @@ -49,7 +49,7 @@ more encoder sessions than a consumer GPU has (decided 2026-11-03 on are not published to the relay by default: a source's own track encodes only while something in the studio uses it, such as an isolated recording or a replay, and reaches viewers only when the creator ticks -[Published independently](/quest/m0/publish-independently.md). The Delivery +[Published independently](/quest/m2/publish-independently.md). The Delivery and Cost bullets above, and this epic's parity goal, are deferred with it: a source published independently is left out of the program, so no picture a viewer composes from fetchable tracks matches the program today. When this diff --git a/quest/m1/compose/layout.md b/quest/m1/compose/layout.md index 017a940..df5f59c 100644 --- a/quest/m1/compose/layout.md +++ b/quest/m1/compose/layout.md @@ -49,5 +49,5 @@ their scene went on program, so the layout says when that was on the media clock, and a viewer that joins late lands at the same point of them. Only sources the creator publishes independently -([Published independently](/quest/m0/publish-independently.md)) have tracks a +([Published independently](/quest/m2/publish-independently.md)) have tracks a viewer can fetch; the rest reach viewers only in the program. diff --git a/quest/m2/README.md b/quest/m2/README.md new file mode 100644 index 0000000..f27c610 --- /dev/null +++ b/quest/m2/README.md @@ -0,0 +1,16 @@ +# m2: later + +## Goal + +Work with no consumer yet, held until m0 and m1 ship or until something needs +it. + +## Plan + +Opened 2026-11-05 (maintainer, /quest-plan) for publishing a source +independently, which no service uses yet. A quest moves up to m0 or m1 when a +consumer appears. + +## Required + +- [Published independently](/quest/m2/publish-independently.md) - a source opts out of the program and publishes its own track for services that place it themselves diff --git a/quest/m0/publish-independently.md b/quest/m2/publish-independently.md similarity index 92% rename from quest/m0/publish-independently.md rename to quest/m2/publish-independently.md index e51363a..1745073 100644 --- a/quest/m0/publish-independently.md +++ b/quest/m2/publish-independently.md @@ -22,6 +22,9 @@ mix on program) or while something reads its track, and naming a published source among those on program (`Publish::set_on_program` in `rs/moq-scene/src/publish.rs`) keeps it encoding. +Moved to m2 on 2026-11-05 (maintainer, /quest-plan): no service places +sources itself yet, so it waits behind m0 and m1. + Low priority: this is for services that move webcams and overlays themselves, and none exists yet. The option lives on the source, in the scene file, so it travels with the scene. The option and its effect on the program change what a