diff --git a/docs/live-ingest-plan.md b/docs/live-ingest-plan.md index 3e89f94f..def50e33 100644 --- a/docs/live-ingest-plan.md +++ b/docs/live-ingest-plan.md @@ -3,16 +3,17 @@ TODO ref: **#16** in `todo/TODO_2026-06-20_pre-launch.md` (watch-only). Publishing / "Go Live" is **#16c** — a separate, larger effort with its **own** config flag; it is explicitly **out of scope** for this doc. -Status: **PLANNING → needs a research spike (Phase 0)**. Not started. +Status: **DECISIONS LOCKED (D1–D5)** — Phase 0 research spike first (confirm tag +shapes + hls.js/CORS + default relays), then build. Not started. Live streams are **NIP-53 Live Activities** — a *different* NIP from short-form video (#16b / NIP-71). Kind **30311** is the live event (addressable, carries the `streaming` URL — usually HLS `.m3u8` — plus `status`, title, host `p` tags); kind **1311** is live chat. zap.stream and shosho.live publish these. -Scope of this feature: **discover live events, play the HLS stream, optionally -show read-only chat.** No broadcasting, no media hosting. Everything ships behind -a config flag that leaves **no trace** when off. +Scope of this feature: **discover live streams, play the HLS stream, chat +(read → post, phased), and zap the host.** No broadcasting, no media hosting. +Everything ships behind a config flag that leaves **no trace** when off. --- @@ -73,9 +74,15 @@ a config flag that leaves **no trace** when off. ## Config flags (off = no trace) -Add **`FEATURE_LIVE_INGEST`** to `config/instance-config.js` (default `false`), -threaded through `js/config.js` → `js/constants.js` like `FEATURE_NIP71_INGEST`. -(The separate `FEATURE_LIVE_PUBLISH` for #16c is **not** part of this doc.) +Flags introduced by this doc (both default `false`, threaded through +`js/config.js` → `js/constants.js` like `FEATURE_NIP71_INGEST`): +- **`FEATURE_LIVE_INGEST`** — the whole watch-only feature (tab, discovery, + playback, read chat, host zaps). +- **`FEATURE_LIVE_CHAT_POST`** — the Phase 3b write path (posting chat); only + meaningful when ingest is also on. Kept separate so an instance can allow + watching + reading chat without enabling outbound posting. + +(The `FEATURE_LIVE_PUBLISH` "Go Live" flag belongs to **#16c**, a separate doc.) When `FEATURE_LIVE_INGEST` is off, all of the following must be absent: 1. **Sidebar tab** — the "Live" link is not rendered in `components/sidebar.html`. @@ -85,7 +92,9 @@ When `FEATURE_LIVE_INGEST` is off, all of the following must be absent: 4. **Route** — `#view=live` falls back to the default view. 5. **HLS library** — hls.js is dynamically imported only inside the live player, so it never loads when the flag is off (keeps the bundle/network clean). -6. **Config surface** — the two flags are the only footprint. +6. **Chat-post UI** — the compose box (Phase 3b) is absent unless BOTH + `FEATURE_LIVE_INGEST` and `FEATURE_LIVE_CHAT_POST` are on. +7. **Config surface** — the flags above are the only footprint. > **Management UI note:** a **"Live" sub-tab in profile → My Videos** (alongside > Videos / Shorts, reusing the admin sub-tab pattern) is for managing the user's @@ -141,8 +150,9 @@ chat message. Read-only ingest = subscribe by `#a`, render newest. (`js/services/playbackService.js`) sets `videoEl.src` for URL/WebTorrent; HLS needs hls.js attached to the `