You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: AGENTS.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -324,6 +324,7 @@ Repo-specific design rules:
324
324
- Go Live chrome MUST stay operational and generic; do not surface the loaded script title or script preview subtitle in the Go Live header/session bar just because a script is open.
325
325
- Go Live back navigation MUST return to the actual previous in-app screen when known, and only fall back to library when there is no valid in-app return target; it must never hardcode teleprompter as the back target.
326
326
- Go Live local recording MUST capture the same composed program feed that the active live/record session publishes; recording a black frame or a different source than the current program feed is a regression.
327
+
- Go Live local recording artifacts MUST contain both decodable video and decodable audio from the real program feed, and their saved resolution/quality must match the active source or chosen output profile instead of silently degrading to a lower-quality fallback.
327
328
- Go Live recording status and runtime panels MUST show the real recording details the browser runtime knows, including the resolved output profile and live session/file telemetry when available; blank recording metadata during an active local recording is a regression.
328
329
- Go Live audio meters MUST show real browser audio activity for microphone, program, and recording paths; static placeholder bars or seeded fake levels in the Audio tab are regressions.
329
330
- Go Live MUST have one active browser-side broadcast spine per setup: choose LiveKit or VDO.Ninja for the upstream transport, but do not run both as the same session's primary publish path at once.
Copy file name to clipboardExpand all lines: docs/Features/GoLiveRuntime.md
+17-11Lines changed: 17 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ The current page layout is a production-style studio surface:
15
15
- right rail for the current live preview plus a larger stream, audio, and runtime panel that can comfortably show real output telemetry, metadata, and mix controls
16
16
- source-card `ON AIR` badges and the preview red live dot only turn on when recording or streaming is actually active; idle routing and armed sources stay visually non-live
17
17
- full-program mode collapses both side rails so the center canvas follows the design's focused monitor state
18
-
- destination cards are built from persisted local outputs plus a dynamic browser-stored `ExternalDestinations` list; seeded fake provider rows are forbidden
18
+
- destination cards are built only from the persisted browser-stored `ExternalDestinations` list; local recording is controlled from `REC` plus runtime metadata, not rendered as a fake destination row
19
19
20
20
The runtime now owns real browser media outputs for the composed program scene and the current audio bus:
21
21
@@ -24,19 +24,22 @@ The runtime now owns real browser media outputs for the composed program scene a
24
24
-`Go Live` builds one browser-side program stream from the scene camera cards by drawing the selected primary camera full-frame and then layering additional included cameras as positioned overlays on a canvas
25
25
- the scene `AudioBus` is mixed into one program audio track through `AudioContext`, delay, and gain nodes before the final program stream is published or recorded
26
26
- OBS browser output stays browser-only and exposes the composed program audio inside an OBS Browser Source environment
27
-
- LiveKit publishing uses the vendored browser SDK and publishes real composed `MediaStreamTrack` objects for video and audio
27
+
-`VDO.Ninja` publishing uses the vendored official browser SDK and publishes the same composed `MediaStream` that powers preview, recording, and OBS
28
+
-`LiveKit` publishing remains available only as an explicit optional managed-transport mode
28
29
- local recording uses the browser `MediaRecorder` API against the same composed program stream and prefers `showSaveFilePicker()` for real local file writing when the browser allows it, with download fallback otherwise
30
+
- saved local recording artifacts must decode into visible program video plus audible program audio; a black frame or silent file is a runtime regression even if metadata looks populated
29
31
- recording export profiles are honest browser probes only: the runtime checks `MediaRecorder.isTypeSupported()` and `MediaCapabilities.encodingInfo()` before choosing the resolved MIME type and falls back to a supported browser codec/container when the requested profile is unavailable
30
32
- stream start, stop, recording start, recording stop, and source switching update the active browser output session instead of only flipping local UI state
31
33
- the session timer and right-rail `Status` / `Runtime` cards are driven from live session/runtime state, not hardcoded demo telemetry
32
34
- active local recording surfaces resolved runtime metadata in the right rail, including the recording profile, save mode, and live captured file size when the browser exposes those details
- YouTube, Twitch, custom RTMP, and similar RTMP-style targets still persist credentials and routing in browser storage
38
+
- YouTube, Twitch, custom RTMP, and similar targets still persist credentials and routing in browser storage
37
39
-`Go Live` only exposes quick arm/disarm toggles and readiness summaries for those targets
38
40
- detailed destination credentials, ingest URLs, and provider-specific configuration live in `Settings`
39
-
- these targets do not publish directly from the browser runtime; they require an external relay or ingest layer outside this standalone WASM app, and `Go Live` must not mark the session live unless a direct browser live output actually starts
41
+
- direct browser publish is allowed only when the active standalone spine really supports it, with `VDO.Ninja` treated as the primary path for browser-driven `YouTube` / `Twitch` workflows
42
+
- custom RTMP remains visually constrained unless a real browser-compatible publish path is confirmed
40
43
41
44
## Broadcast Spine Decision
42
45
@@ -54,7 +57,8 @@ Current implementation focus:
54
57
55
58
- browser-local recording from the composed program feed
56
59
- OBS browser output
57
-
- LiveKit publishing in the current code path
60
+
-`VDO.Ninja` publishing in the current code path
61
+
-`LiveKit` kept only as an explicit optional managed mode
58
62
- no shipped universal browser-only path yet for every final platform target
59
63
60
64
Target rollout after this architecture pass:
@@ -118,13 +122,13 @@ sequenceDiagram
118
122
Settings->>Studio: Persist device preferences
119
123
Settings->>Scene: Persist scene cameras and audio bus
120
124
User->>Settings: Configure the active spine and browser-compatible publish targets
121
-
Settings->>Studio: Persist local outputs and external destination list
125
+
Settings->>Studio: Persist external destination list and recording/export preferences
122
126
User->>GoLive: Open Go Live
123
127
GoLive->>Studio: Load live routing settings
124
128
GoLive->>Scene: Load current scene sources
125
129
GoLive->>Sources: Render real scene cameras and mic status
126
130
GoLive->>Preview: Mount the current on-air scene camera
Platforms["YouTube / Twitch / RTMP<br/>only when the active spine exposes a real browser path"]
223
227
Obs["OBS browser audio bridge"]
224
228
225
229
Scene --> Factory
@@ -248,7 +252,7 @@ flowchart LR
248
252
-`Settings` must expose a visible CTA into `Go Live` so device setup and live routing stay discoverable as separate flows.
249
253
- the shared header shell must keep `Go Live` reachable from every non-`Go Live` routed page because it is a primary studio action
250
254
-`Go Live` may arm local recording and downstream relay targets at the same time, but only one upstream browser transport spine may be active for a session.
251
-
- hardcoded destination instances are forbidden; the external destination list must come from persisted browser settings and may contain zero, one, or many platform entries
255
+
- hardcoded destination instances are forbidden; the right-rail destination list must come from persisted external destinations only and may contain zero, one, or many platform entries
252
256
-`Go Live` must reuse the browser-composed scene and not invent a separate media graph.
253
257
-`Go Live` must auto-seed the first available browser camera into the scene when the scene is empty and devices are available.
254
258
-`Go Live` must show the selected program source in the center monitor and the currently on-air source in the right preview rail until the operator explicitly takes the selected source live.
@@ -262,13 +266,15 @@ flowchart LR
262
266
-`VirtualCamera` mode normalizes to OBS armed by default, so browser sessions keep the legacy desktop-capture workflow unless the user explicitly turns OBS off
263
267
- Camera source inclusion is persisted through `MediaSceneState`.
264
268
- Destination credentials and endpoints are persisted only in browser storage for this standalone runtime.
269
+
-`VDO.Ninja` browser publishing must use the vendored official SDK shipped in the repo, not a CDN copy.
265
270
- LiveKit browser publishing must use the vendored SDK shipped in the repo, not a CDN copy.
266
271
-`VDO.Ninja` is the default production upstream spine for the strict standalone browser mode; `LiveKit` is reserved for explicit optional managed-transport modes and must not quietly become a second co-equal default publish path.
267
272
- OBS browser integration must stay a thin browser bridge; no server relay or backend media graph is introduced.
268
-
- local recording must stay browser-local and use the same active program media session as OBS / LiveKit so record and source switching stay in sync
273
+
- local recording must stay browser-local and use the same active program media session as OBS / `VDO.Ninja` / optional `LiveKit` so record and source switching stay in sync
269
274
- local recording must prefer real local file writing through the File System Access API when the browser exposes it, but must fall back to browser download instead of pretending save-to-disk is universally available
270
275
- recording codec/container export must never advertise unsupported browser encoders as if they are guaranteed; the runtime must probe support and choose a real fallback profile
271
276
- local recording metadata shown in `Go Live` must come from browser runtime state, including honest file-size/save-mode/profile details when available, instead of placeholder labels or blank cards
277
+
- browser acceptance for local recording must verify the saved artifact itself, not only the in-page runtime metadata, so regressions such as black video or silent audio cannot hide behind populated telemetry
272
278
- the `Audio` tab must project real browser telemetry: the microphone row comes from a direct browser microphone monitor, while `Program` and `Recording` come from the mixed program audio feed and must fall back to idle instead of seeded percentages when no signal is active
273
279
- right-rail telemetry must never show fake packet-loss, jitter, ping, or upload metrics when the browser runtime does not actually own those measurements
274
280
- downstream platforms such as YouTube and Twitch may be shown as first-class live-publish targets when the chosen VDO-driven standalone path supports them; custom RTMP must stay visibly constrained unless a real browser-compatible path is confirmed
Copy file name to clipboardExpand all lines: docs/Features/VendoredStreamingSdkReleases.md
+5-2Lines changed: 5 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,8 +6,9 @@
6
6
7
7
-`livekit/client-sdk-js`
8
8
-`steveseguin/vdo.ninja`
9
+
-`steveseguin/ninjasdk`
9
10
10
-
The repo pins both SDKs to exact GitHub release tags and exact GitHub release URLs. The vendored files live under `src/PrompterOne.Shared/wwwroot/vendor/` so the browser runtime does not depend on floating CDN or `latest` endpoints.
11
+
The repo pins these runtime artifacts to exact GitHub release tags and exact GitHub release URLs. The vendored files live under `src/PrompterOne.Shared/wwwroot/vendor/` so the browser runtime does not depend on floating CDN or `latest` endpoints.
11
12
12
13
## Source Of Truth
13
14
@@ -20,6 +21,7 @@ The repo pins both SDKs to exact GitHub release tags and exact GitHub release UR
20
21
21
22
- LiveKit Client SDK JS: `v2.18.0`
22
23
- VDO.Ninja: `v29.0`
24
+
- VDO.Ninja SDK: `v1.3.18`
23
25
24
26
## Flow
25
27
@@ -51,4 +53,5 @@ flowchart LR
51
53
## Notes
52
54
53
55
- LiveKit does not ship the built browser bundle as a GitHub release asset in the current release format, so the sync flow builds the exact pinned release tag from the tagged source tarball and copies only the resulting browser artifacts into the repo.
54
-
- VDO.Ninja is vendored as a runtime JS tree from the exact pinned release source tarball because its browser runtime spans multiple JS entrypoints and runtime-loaded dependencies.
56
+
- VDO.Ninja is vendored as a runtime JS tree from the exact pinned release source tarball because its broader browser runtime spans multiple JS entrypoints and runtime-loaded dependencies.
57
+
- The official standalone browser publishing SDK comes from `steveseguin/ninjasdk` and is vendored from exact pinned GitHub release assets plus the matching license files from the release tarball.
0 commit comments