# Live Streams — INGEST / watch-only — Dev Plan 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: **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 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. --- ## Decisions needed > **DECISION 1 — Listing scope. ✅ LOCKED: Option A (whitelisted hosts only).** > The Live tab lists only kind-30311 events whose host is a whitelisted/trusted > author, reusing the existing whitelist/WoT filter — no new moderation surface, > consistent with the main feed + Shorts. Accepted trade-off (maintainer): live > is sparse, so the tab may be empty when no whitelisted creator is streaming; > that's expected with a whitelist (ship a clear "no one you follow is live right > now" empty state). A broader "discover live" surface can come later. > **DECISION 2 — Chat level. ✅ LOCKED: read + post + zaps as the end state, > reached in phases.** Target is full participation (read chat, post chat, zap the > host). Phased so playback ships first and posting (a write path) lands cleanly: > - **Phase 3** — read-only kind-1311 chat **+ host zaps** (zaps via the existing > NWC/zap system; active participation from day one of chat). > - **Phase 3b** — **post chat**: sign/publish kind-1311 into the stream, behind > its own sub-flag (`FEATURE_LIVE_CHAT_POST` or similar), with a moderation > stance (rate-limit; you're publishing into someone else's stream — decide how > blocked/muted authors and your own outbound spam are handled). > Rationale (maintainer): end up at read+post+zaps; phasing keeps the write path > and its moderation questions out of the initial playback release. > **DECISION 3 — HLS playback dependency. ✅ LOCKED: Option A (hls.js, > lazy-loaded behind the flag).** Native `