name: fishjam-platform description: "Fishjam platform fundamentals — domain model and auth shared by all SDKs. Covers glossary (room, peer, track, agent, streamer, viewer), the four room types (conference / audio_only / livestream / audio_only_livestream), two-tier auth (management vs peer tokens), Sandbox vs production, WebSocket-vs-webhook notifications and the 18-event taxonomy, REST endpoint list, and the end-to-end auth/join flow. Read this first for any Fishjam task. Trigger on: 'Fishjam', 'fishjam.io', 'fishjam.swmansion.com', 'fishjam dashboard', 'management token', 'peer token', 'sandbox API', 'useSandbox', 'room manager', 'livestream room', 'audio-only room', 'conference room', 'Fishjam ID', 'room types', 'auth flow', 'webhook', 'webhookUrl', 'FishjamWSNotifier', 'FishjamNotifier', 'notifier vs webhook', 'ServerMessage', 'peerAdded', 'peerConnected', 'roomCreated', 'refreshPeerToken', 'rest endpoint', 'OpenAPI', 'llms.txt'." license: MIT
Fishjam Platform
Software Mansion's hosted WebRTC streaming toolkit. Fishjam takes care of media servers, peer networking, and codec negotiation so applications can build video conferencing, audio chat, and one-to-many livestreaming with sub-second latency.
This sub-skill defines the domain model, auth, room types, and notifications that every SDK builds on. Read it first; then drop into the SDK sub-skill you need.
A production Fishjam app always has a backend (server SDK) + a client (client SDK). The backend mints peer tokens; the client uses them to connect. For prototyping you can skip the backend with the Sandbox API — see sandbox-vs-production.md.
Key concepts at a glance
- Room — a collection of peers exchanging tracks. Three primary room types:
conference(default, bidirectional),audio_only(75% cheaper, video silently dropped),livestream(one streamer, many viewers, <300 ms).audio_only_livestreamcombines the audio-only and livestream discounts. - Peer — a participant in a room. Can be a
webrtcclient, anagent(server-side program), or avapivoice agent. - Track — one audio or video stream from a peer (camera, mic, screen share, etc.). One peer can publish multiple tracks.
- Streamer / Viewer — livestream-room-specific peer roles (one streamer, many viewers).
- Fishjam ID — your instance identifier; goes in both backend and client config.
- Management Token — long-lived admin secret; backend only.
- Peer Token — 24h, scoped to one peer in one room; safe for clients.
Full definitions: glossary.md.
Room types
| Type | Direction | Cost | Use case |
|---|---|---|---|
conference |
many ↔ many | base | Meetings, classrooms, interactive webinars |
audio_only |
many ↔ many (audio only) | 75% off | Voice rooms, podcasts, town halls |
livestream |
one → many | 20% off | Live events, broadcasts, sports |
audio_only_livestream is 75% off the livestream rate (equivalently, 80% off conference) — the cheapest mode for one-to-many audio.
Detail + decision matrix: room-types.md.
Auth flow (5-step sketch)
- Backend → Fishjam:
createPeer(roomId)authenticated with the management token. - Fishjam → Backend: returns
{ peer, peerToken }. - Backend → Client: ships
peerTokento the frontend (never the management token). - Client → Fishjam:
joinRoom({ peerToken }). - Fishjam: completes the WebRTC handshake; the peer is now in the room.
Full diagram + token-refresh + livestream + MoQ tokens: auth-model.md.
Sandbox vs production
- Sandbox API — no-auth HTTP backend hosted by Fishjam. For prototyping only. Generated URL must never be shipped in a production build (anyone with it can create rooms on your behalf).
- Production — your own backend running a server SDK. Required for any real-world deployment.
Migration recipe: sandbox-vs-production.md.
Notifications: WebSocket or webhook?
Both deliver the same 18-event set surfaced by the SDKs (room/peer/track/streamer/viewer/channel lifecycle — the underlying protobuf ServerMessage carries additional oneof fields the SDKs intentionally ignore). Pick by deployment shape:
- Long-lived worker, single process →
FishjamWSNotifier/FishjamNotifier(persistent socket). - Serverless, scaled out, behind a load balancer → webhooks (set
webhookUrlper room, decode binary protobuf).
Detail: notifier-vs-webhook.md and notifications-taxonomy.md.
Key rules
- Management token never leaves the backend. If it leaks, regenerate it.
- Peer tokens expire 24 hours after creation. Refresh via
refreshPeerToken/refresh_peer_tokenif you need longer. - Sandbox API URL is not a secret in the cryptographic sense, but anyone holding it can create rooms — treat it like a dev credential and rotate from the Dashboard if exposed.
- Conference is the default room type. Use
audio_onlyfor voice apps (much cheaper). Uselivestreamonly when one peer broadcasts and others only watch. - Livestream rooms accept exactly one video track + one audio track. Additional tracks are silently dropped.
References
| File | When to read |
|---|---|
glossary.md |
Define a term (room, peer, track, agent, etc.) precisely. |
room-types.md |
Pick conference vs audio_only vs livestream. Cost matrix. Codec defaults. |
auth-model.md |
Token types, lifetimes, refresh, livestream / MoQ tokens, full auth flow. |
sandbox-vs-production.md |
Use the Sandbox API for dev; migrate to a real backend. |
notifier-vs-webhook.md |
Pick WebSocket notifier or webhook receiver. |
notifications-taxonomy.md |
All 18 SDK-surfaced server notification events with payload shapes. |
rest-endpoints.md |
Raw HTTP surface — flat endpoint list, auth header, deprecation header. |
lifecycle-flow.md |
End-to-end client↔backend↔Fishjam sequence. |
llms-and-docs.md |
Pointers to upstream docs, llms.txt, OpenAPI spec, protobuf, dashboard. |