FluxyChat

Platform

FluxyEdu

Classroom on one room. Polls, breakouts, attendance. Video is Cloudflare Realtime SFU.

Console: /edu. The classroom is a normal room. Polls and breakouts go to Worker HTTP, then fan out on the room WebSocket.

PieceAPI
PollPOST /polls, then GET /polls/:id. Close with POST /polls/:id/close. You cannot vote on a poll you created. Typed polls (pollType: typed) take POST /polls/:id/vote with { answer } (voteTypedPoll).
BreakoutCreate/list/close, plus join, move, end-all, time, broadcast (BBB graphql actions HOW, no SFU)
TimerGET /rooms/:id/timer plus activate / start / stop / reset / deactivate / time / mode. Fan-out edu.timer. Not an SFU clock.
AttendanceSDK sendAttendanceHeartbeat → attendance.heartbeat. Snapshot: GET /rooms/:id/capabilities/snapshot
Raise handSDK setRaiseHand → edu.hand.raised
WhiteboardYjs on the same room. Collab
Grading agentDraft only. A teacher publishes.

The live workspace on /edu runs those poll and breakout calls against the room you picked.

Live video is not a FluxyChat SFU. The Worker proxies Cloudflare Realtime SFU (POST /rooms/:id/realtime/sessions). LiveKit is a fallback if you set LIVEKIT_*. FERPA, COPPA, retention, and learner export are workspace settings. They are not defaults.