# Shade V5.0 — Voice & Video **Status:** Idea (post-V4.0 GA) **Effort:** XXL (4+ måneder) **Forrige:** V4.0 GA + V3.11 (P2P transport kreves) **Adresserer:** V2.1-tillegg "ShadeVoiceButton / ShadeVideoCall / ShadeBroadcaster" V5.0 er den dedikerte sanntids-releasen — alt VOIP og videostreaming samles her, *etter* at Shade 4.0 er GA-merket. Stacken under (ratchet, transport, observability, recovery, key transparency, WebRTC P2P) er låst i 4.0; 5.0 bygger uten å røre kjernekrypto- revisjonen. --- ## Mål E2EE sanntidskommunikasjon på Shade-stack: voice-calls, video-calls, broadcast/streaming — alt som "magic drop-in"-komponenter for konsumerende apper. ```tsx ``` --- ## Scope ### Inn - Ny pakke `@shade/voice` — 1:1 voice over WebRTC P2P. - Ny pakke `@shade/video` — 1:1 video, deler kjerne med voice. - Ny pakke `@shade/broadcast` — 1:N broadcast med relay-helper. - SFrame-style frame encryption — payload-keys ratchet'es per call, derivert fra Shade-session. - Codec: Opus (audio), AV1/VP9 (video) — WebRTC standard. - Widget-komponenter for hvert use case. - Key-rotation under loss: forward-secrecy per X frames eller hvert N sekund. ### Ut - Group-calls (≥ 3 deltakere) som første milestone — krever SFU + group key agreement; egen sak. - Replacement for native phone-app — vi tilbyr in-app calls. - Codec-implementasjon — vi bruker browser/native WebRTC. --- ## Design ### Frame-key derivasjon ```text callKey = X3DH(A, B) → HKDF("shade-call-v1") → callRatchetKey frameKey[i] = HKDF(callRatchetKey, "frame" || u64(i)) ``` `callRatchetKey` ratcheter forward hver N millisekund eller hver M frames; kompromittert frame = bare det vinduet eksponert. ### SFrame Følger IETF MLS/SFrame-mønstre: - Header er klartekst (codec-metadata). - Payload er AES-GCM med deterministisk nonce. - Mottaker dropper frames med out-of-window seq. ### Topologi - 1:1: P2P via V3.11. - Broadcast: relay-helper i `@shade/broadcast-relay` distribuerer ciphertext til subscribers — relay ser aldri plaintext. --- ## Leveranser ### Pakker - `@shade/voice` + `@shade/video` (delt kjerne i `@shade/realtime-core`). - `@shade/broadcast` + `@shade/broadcast-relay`. - Widgets: ``, ``, ``, ``. ### Tester - Unit: SFrame encrypt/decrypt + tamper. - Integration: 1:1 video 30 fps i 60 s; > 99 % frames levert; key rotation observert. - Loss recovery: 30 % packet loss → quality grace. - Adversarial: relay-DB-dump avslører ingen plaintext. ### Dokumentasjon - `docs/voice-video.md` — setup, codec-tradeoffs, broadcast-arkitektur. --- ## Akseptansekriterier - [ ] 1:1 video 60 fps + 1080p mellom to klienter samme LAN. - [ ] Frame-key kompromittering blokkerer maks 1 sekund forward data. - [ ] Broadcast 1:50 viewers fungerer med < 2 s end-to-end latency. --- ## Avhengigheter - **V4.0 GA** — kjerne-stacken må være ekstern-revidert og frosset før vi legger sanntid-protokoll oppå. - V3.11 — P2P transport (kommer i V4.0-vinduet). - V3.5 — Android-paritet hvis voice/video skal funke på mobile. --- ## Risiko - **Codec-quirks.** AV1 vs VP9 vs H.264 har ulik browser-støtte. - **Frame-key sync under loss.** Avansert; SFrame-spec er fortsatt under standardisering. - **Latency vs sikkerhet.** Hver ratchet-step legger på µs. --- ## Migrasjon Nye pakker. Ikke breaking — wire-formatene fra V4.0 holdes uendret; voice/video legger til egne envelope-typer i et reservert range som 4.0-clients ignorerer.