# SFU relay (Janus VideoRoom) — lab preview **Post-alpha product path.** Lab stack: Janus on **cast02**, signaling on app nodes, coturn on cast02. ## Layout | Path | Role | |------|------| | `public/dashboard.php` | Room list / create (auth required) | | `public/lab.php` | **M0** browser E2E — screen-share publish + subscriber viewer | | `public/assets/sfu-lab.js` | WebRTC + Janus WS trickle client | | `public/api/rooms.php` | Room CRUD | | `public/api/join.php` | JSEP join relay (publisher / subscriber) | | `ac-deploy/.../smoke_sfu.sh` | Janus + health smoke | ## Lab E2E 1. Sign in on issues console (shared `ac_crash_sess`). 2. Open `/app/androidcast_project/sfu/dashboard` → create room → note **Janus room id**. 3. Open `/app/androidcast_project/sfu/lab` → publish screen share. 4. Second tab/browser → same lab URL → enter room id + **publisher feed id** → Subscribe. ## Milestones | Milestone | Scope | |-----------|--------| | **M0** | Browser lab (`lab.php`) — getDisplayMedia publish + subscribe | | **M1** | Android libwebrtc camera publish/subscribe (dev gate) | | **M2** | Android MediaProjection screen share + ICE from health (coturn) | | **M3+** | Cast encoder → SFU transport; education path; RBAC stats | ## Next (M3+) 1. Wire cast encoder → SFU publisher (replace P2P cast transport). 2. Education screen share on SFU path. 3. Session RBAC + stats → graphs. Android: **Developer settings → Enable Janus SFU relay lab → Open SFU lab** — **Publish screen share** (M2) or **Publish camera** (M1). See [ac-docs BUILD_DEPLOY](../../ac-docs/BUILD_DEPLOY.md) and cluster `deploy-janus-sfu.sh`.