{ "repository": "OpenVibers/OpenRestream", "stage": "alpha", "code": true, "wave": "W7", "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)", "runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, node-media-server 2.7.4, ffmpeg", "port": 4500, "rtmpPort": 1936, "domain": "openre.stream", "contracts": "openvibe-contracts v0.419.0", "sdk": "openvibe-sdk v0.161.0", "shared": "openvibe-shared v4.241.0", "protocols": { "rtmp": "ingest ported (openre-rtmp-ingest)", "restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)", "webrtc": "worker ported (workers/webrtc.js + workers/webrtc/{sfu,sdp,signaling}.js, run by openre-webrtc@): WHIP (RFC 9725) ingest by key on the mediasoup SFU, browser broadcasters over /b/ and viewers over /w/, loopback RTP egress for restream/recording/thumbnails, recording through Media's RTP ingest; generations/leases/drain; refuses to start in production without MEDIASOUP_ANNOUNCED_IP", "jsmpeg": "worker ported (workers/jsmpeg.js): MPEG-TS POST admission by key, WS viewers, loopback data tap, restream (re-encode), generations/drain; no recording (parity)" }, "capabilities": [ "openre.stream.read", "openre.stream.write", "openre.key.rotate", "openre.session.read", "openre.session.end", "openre.output.read", "openre.output.write", "openre.resource.read" ], "capabilitiesRegistered": true, "resourceRoutes": [ "GET /api/v1/resources", "GET /api/v1/resources/:ovrn" ], "livePatch": "applied in Live f0ca18b and deployed; Live wired on 2026-09-23 (OPENRE_URL and the openre.session.* subscription, docs/cutover.md phase A); every Live slot keeps ingest_authority=live until its per-slot cutover (phase B), so no broadcaster uses OpenRestream yet", "deployed": true, "deployment": "Deployed with `sudo ovhost deploy openre` (OpenVibe.Host strategy release-layout since the 2026-09-27 cutover; deploy/scripts/deploy.sh wraps deploy, rollback and plan, and hands workers/status/prune to deploy/scripts/workers.sh): API + coordinator on 127.0.0.1:4500, RTMP ingest public on 0.0.0.0:1936 (ingest.openre.stream, DNS-only; reachable from outside since 2026-09-23), Live wired (OPENRE_URL, openre.session.* subscription), preflight all PASS, restore drill passed. No slot switched yet: every slot is still ingested by Live until the per-slot cutover (docs/cutover.md phase B).", "features": [ "stream definitions owned by a Network subject, with typed references", "ingest keys hashed at rest, shown once, rotation with grace", "RTMP ingest workers with generations, leases and drains that survive API deploys", "RTMP/RTMPS/SRT restream with output health and a circuit breaker", "SSRF-checked destinations with sealed keys", "recording requests to OpenVibe.Media", "HTTP-FLV playback descriptors", "outbox events openre.session.*, openre.output.*, openre.recording.requested, openre.key.rotated", "migration from Live without importing old keys", "restore-drill read-only mode", "per-actor limits (openvibe-sdk/limits)" ], "updated": "2026-11-13" }