/platform
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
$ npx -y skills add software-mansion-labs/skills --skill platform --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/platform
Context preview
The summary Claude sees to decide when to auto-load this skill.
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
SKILL.md
platform.SKILL.mdname: 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_livestream` combines the audio-only and livestream discounts.
- **Peer** — a participant in a room. Can be a `webrtc` client, an `agent` (server-side program), or a `vapi` voice 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)
1. **Backend → Fishjam:** `createPeer(roomId)` authenticated with the **management token**. 2. **Fishjam → Backend:** returns `{ peer, peerToken }`. 3. **Backend → Client:** ships `peerToken` to the frontend (never the management token). 4. **Client → Fishjam:** `joinRoom({ peerToken })`. 5. **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 `webhookUrl` per 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_token` if 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_only` for voice apps (much cheaper). Use `livestream` only 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;
Read more
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_livestream` combines the audio-only and livestream discounts.
- **Peer** — a participant in a room. Can be a `webrtc` client, an `agent` (server-side program), or a `vapi` voice 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)
1. **Backend → Fishjam:** `createPeer(roomId)` authenticated with the **management token**. 2. **Fishjam → Backend:** returns `{ peer, peerToken }`. 3. **Backend → Client:** ships `peerToken` to the frontend (never the management token). 4. **Client → Fishjam:** `joinRoom({ peerToken })`. 5. **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 `webhookUrl` per 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_token` if 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_only` for voice apps (much cheaper). Use `livestream` only 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;
Software Mansion's set of skills for AI-assisted React Native development.
Repo: software-mansion-labs/skills
Other skills on software-mansion-labs-skills.
- /detour-onboarding
Complete onboarding guide for developers who are new to Detour, the open-source deferred deep linking SDK by Software Mansion. Use this skill whenever a user asks what Detour is, how to get started with Detour, how to set up deep linking with Detour, how to install the Detour
Open skill - /migrate-to-detour
Use when the user mentions migrating deep links, switching away from Branch or AppsFlyer, replacing their deep linking SDK, setting up Detour deep linking for the first time, or asks how Branch/AppsFlyer concepts map to Detour. Covers the complete migration end to end - Detour
Open skill - /expo-horizon
Software Mansion's guide for migrating Expo SDK apps to Meta Quest using expo-horizon packages. Use when adding Meta Quest or Meta Horizon OS support to an existing Expo or React Native project. Trigger on: Meta Quest, Horizon OS, Quest 2, Quest 3, Quest 3S, VR app,
Open skill - /fishjam
Software Mansion's Fishjam — hosted WebRTC platform for video, audio, and one-to-many livestreaming. MUST USE before writing, reviewing, or debugging ANY code that talks to a Fishjam instance from a backend (Node, Python) or a client (React web, React Native / Expo). Routes to
Open skill - /js-server-sdk
Node.js / TypeScript server SDK for Fishjam — backends that create rooms, mint peer tokens, listen to server notifications, and run agents. Use when writing a Node.js / Express / Fastify / Hono / NestJS backend that talks to Fishjam, sets up a webhook receiver, runs an AI agent,
Open skill - /python-server-sdk
Python server SDK for Fishjam — backends that create rooms, mint peer tokens, receive server notifications, and run voice agents. Use when writing a Python backend (FastAPI, Flask, Starlette, aiohttp) that talks to Fishjam, decorates a notification handler, decodes a Fishjam
Open skill

