2.3 KiB
2.3 KiB
Self-Hosted Live Edge
Mimir's self-hosted broadcast path keeps OBS optional. Starfire owns the final program frame and audio mix; Yggdrasil owns public byte distribution.
flowchart LR
A["Fensalir program texture"] --> B["Starfire NVENC encode"]
C["Faust/Mimir mix"] --> B
B --> D["SSH TCP forward"]
D --> E["Yggdrasil localhost RTMP ingest"]
E --> F["HLS segment ring"]
F --> G["streampixels.gamecult.org static HTTPS"]
G --> H["gamecult.org/livestream static viewer"]
Authority Map
- Owner:
Mimir.Broadcastowns the Starfire-side encoded push command. - Inputs: final program media, FFmpeg/NVENC capability, and the SSH-forwarded RTMP endpoint.
- Outputs: one CBR H.264/AAC RTMP stream to Yggdrasil.
- Derived state: Yggdrasil's HLS playlist and segments are derived from that encoded stream. They do not own composition, timing, or transcoding.
- Forbidden writers: Yggdrasil must not transcode the program stream in the first live edge. OBS is not the primary broadcast owner.
- Shared paths: synthetic smokes and real program pushes use the same RTMP URL:
rtmp://127.0.0.1:11935/live/mimir. - Deletion line: if a later CDN or WebRTC edge appears, keep this path as the simple origin proof or delete it. Do not keep two public stream authorities.
First Smoke
On Starfire, with an SSH local forward active to Yggdrasil's localhost RTMP port:
dotnet run --project .\src\Mimir.Broadcast\Mimir.Broadcast.csproj -- --smoke
dotnet run --project .\src\Mimir.Broadcast\Mimir.Broadcast.csproj -- --print-command
The default push target is:
rtmp://127.0.0.1:11935/live/mimir
The public HLS playlist is served on the existing Yggdrasil-routed StreamPixels domain:
https://streampixels.gamecult.org/mimir/live/hls/mimir.m3u8
The static viewer lives on the root GameCult site:
https://gamecult.org/livestream
Scaling Rule
Viewer capacity is approximately:
available Yggdrasil egress / encoded bitrate
Micro-optimizations count only when they improve target-host measurements: served Mbps, p95 segment latency, CPU, memory, syscalls, or stall rate on Yggdrasil. The first edge uses nginx static serving and kernel file paths so the hot path is byte distribution, not application code.