Source access enforcement (the catalog): 10-source catalog + per-scene access matrix enforced by SceneAccessPolicy; Add-Source menu is one ItemsSource rebuilt per scene (Screen = Live-only, BG/Image/Text every scene), webcam row always present + greys out; Chatbox/Alerts/Socials are inert SourceType rows ready for their features; Text queued as a ship step (countdown + credits modes); Monetization notes socialBar free = YouTube + 1, unlimited with the paid key (79 tests passing)

This commit is contained in:
2026-08-10 12:17:03 -07:00
parent cc3b1c9234
commit ac22b1658f
8 changed files with 236 additions and 25 deletions
+54 -14
View File
@@ -109,29 +109,55 @@ Lifecycle: `created → ready → [testing] → live → complete` (transitional
12. ✅ The connected YouTube account's avatar/name shows in the top bar next to Start Stream (`SyncConnectedAccount`); the scenes list is content-height now (no dead space before SOURCES)
13.**Window capture** — absorbed into the Screen picker (no separate source type); dedicated window-as-source work is pending
14.**Scene compositing** — the D3DImage/MediaElement preview compositor (this task's requirement 5; the output compositor ships as TASK 4 ship step 1)
15.**Text source** — live text ("Starting soon", "Back in 5", handle, callout)
15.**Text source** — live text ("Starting soon", "Back in 5", handle, callout); a queued ship step carries its **countdown** + **credits** (scroll) modes (see below)
16.**Chat box** — YouTube live chat rendered *on* the stream so viewers read along in-video
17.**Background removal (milestone 2)** — ONNX Runtime + DirectML, MediaPipe Selfie Segmentation — deliberately NOT in this build
18.**Alerts** — Super Chat / membership / subscribe pop-ins; build after the six; **the one paid feature** (see Monetization in `ai.md`)
18.**Alerts** — Super Chat / membership / subscribe pop-ins; build after the six; unlocked by the one-time paid key (see Monetization in `ai.md`)
19.**The source catalog + access enforcement** — the 10-source catalog and per-scene matrix (the section below) live as `SceneAccessPolicy.Allows(sceneName, sourceType)`; the Add-Source menu is one `ItemsSource` (`AddSourceMenuItems`) rebuilt per scene from the policy (Screen is Live-only; BG/Image/Text every scene; the webcam row is always present and greys out once the active scene has one); Chatbox/Alerts/Socials are inert `SourceType` rows ready for their features — 79 tests passing
### The Minimal Source Set (design decision — do not expand casually)
### The Source Catalog & scene access (design decision — do not expand casually)
ytLlive is YouTube-only and 90% of users are casual. OBS's long source list is off-putting; we ship
the hot few and nothing esoteric. If a user needs more, they've graduated to OBS.
1. **Webcam** — the face cam. Non-negotiable.
2. **Screen** — the main event (game, slides, browser). One source; a picker chooses a monitor *or* a
window. (Window capture is absorbed here — no separate source type.)
3. **Background** — a full-canvas backdrop image. Fills the whole scene automatically, zero fiddling.
Kept separate from Image on purpose: same pixels, but this one needs no positioning.
4. **Image**a floating graphic/logo overlay (watermark, badge, corner branding). Free-positioned.
5. **Text** — live text ("Starting soon", "Back in 5", handle, callout). Casual streamers live on this.
1. **Screen capture** — the main event (game, slides, browser) as the Live scene's permanent backdrop
(`IsBackdrop`, schema v5/v6); the picker chooses a monitor *or* a window. **Live only** (policy).
2. **BG (Background)** — a full-canvas backdrop image. Fills the whole scene automatically, zero
fiddling. Kept separate from Image on purpose: same pixels, but this one needs no positioning.
3. **Image** — a floating graphic/logo overlay (watermark, badge, corner branding). Free-positioned.
4. **Text**live text ("Starting soon", "Back in 5", handle, callout). Casual streamers live on this.
Ships with two **modes**: **Countdown** (Starting/BRB) and **Credits** (Ending) — see the queued
Text ship step below. No new source types (KISS).
5. **Webcam** — the face cam. Non-negotiable. A singleton resource (`WebcamSceneConfig`, not a `Source`
type) usable in any scene.
6. **Chat box** — YouTube live chat rendered *on* the stream so viewers read along in-video. YT-native.
7. **Alerts** — Super Chat / membership / subscribe pop-ins. The dopamine source. **The one big lift**
(Super Chat event streaming + on-stream rendering/animation); build after the six. **Also the one
paid feature** — see Monetization in `ai.md`.
**Live / BRB / Chat scenes.**
7. **Alerts** — Super Chat / membership / subscribe pop-ins. The dopamine source. **All scenes**
alerts fire regardless of which scene is showing. Build after the six.
8. **socialBar** — the creator's social links as one bar (branded anchor icon + in-app drop-down).
**All scenes.** Free tier = the creator's YouTube channel + **one** more platform of their choice;
unlimited platforms come with the one-time paid key (see Monetization in `ai.md`).
Deliberately NOT supported: game capture, browser source, media playlist, VLC, color-key voodoo, MIDI.
**Per-scene access matrix** — enforced by `SceneAccessPolicy.Allows(sceneName, sourceType)`:
| Source | Starting | Live | BRB | Chat | Ending |
|--------|:---:|:---:|:---:|:---:|:---:|
| Screen capture (backdrop) | ❌ | ✅ | ❌ | ❌ | ❌ |
| BG / Image / Text | ✅ | ✅ | ✅ | ✅ | ✅ |
| Webcam | ✅ | ✅ | ✅ | ✅ | ✅ |
| Countdown (Text mode) | ✅ | — | ✅ | — | — |
| Chat box | — | ✅ | ✅ | ✅ | — |
| Alerts | ✅ | ✅ | ✅ | ✅ | ✅ |
| Credits (Text mode) | — | — | — | — | ✅ |
| socialBar | ✅ | ✅ | ✅ | ✅ | ✅ |
Countdown and Credits are **Text modes** (no new source types): the scene restrictions gate the
*mode*, applied when the Text ship step lands. Chatbox / Alerts / socialBar are inert `SourceType`
values until their features ship — the policy rows are live from today, the menu items arrive with
the features.
Deliberately NOT supported: game capture (absorbed into Screen), browser source, media playlist, VLC,
color-key voodoo, MIDI.
### Source memory model (design decision)
@@ -187,6 +213,20 @@ Preview shows the transition too (WYSIWYG). No wipes/slides/LUTs beyond the four
2. **Scenes list:** drag rows to reorder scenes
3. **Sources list:** drag rows to reorder sources (this *is* the z-order) — implemented
#### Queued ship step — Text source (countdown + credits modes)
**Goal:** make Text real — content + font/size/color/alignment rendered in the preview AND the output
compositor — then its two modes on top. Status item 15 above.
1.**Text core**`SourceType.TextOverlay` gains content + styling; the XAML preview renders it and
the output compositor rasterizes it (preview via `FormattedText`, output via a `frameFor` frame,
the `StaticPixelCache` pattern)
2.**Countdown mode** — a Text bound to a countdown timer ("Live in 2:30"); the mode is gated to
Starting/BRB per the access matrix
3.**Credits mode** — a Text that scrolls up on the Ending scene
Ships only when queued (the Good Dog Rule: one integration test per PR, no multi-test branches).
---
## TASK 4 — RTMP Ingest to YouTube