
Fishjam Release Notes: 0.30.0
by Adrian Czerwiec • Aug 27, 2026 • 3 min read

Fishjam 0.30.0 is out! 🎉 This release takes compositions out of beta, adds recordings on top of them, and brings native VoIP calling to React Native.
Compositions are live
Compositions — the managed Smelter cloud we’ve been writing about — are now available to every Fishjam account. The Fishjam ID and the management token you already use works for the Composition API too.
A composition takes any number of inputs — a Fishjam room, a WHIP or RTMP stream — and renders them into a single output you can push over WHIP or RTMP, for example straight into a Fishjam livestream. What ends up on screen is described in React: you write a template with Smelter’s component library and the hooks from @fishjam-cloud/composition (usePeers, useSpeakingState, eventBus, …), upload the bundle to our server using @fishjam-cloud/composition-cli and then register the output of the composed stream. Your backend can send events to a running composition to switch scenes, show a caption or toggle a badge, and the template reacts live.
Getting a room in is a single call: forwardRoomTracks(roomId, compositionUrl) on the server SDK links the room to the composition server-to-server, so every peer’s tracks arrive as inputs and new peers show up in the layout as they join.
The tooling ships with it:
CompositionClientin@fishjam-cloud/js-server-sdk0.30.0 covers the whole Composition API: create, start, reset and delete compositions, register inputs and outputs, upload template outputs, images and fonts, and send events.@fishjam-cloud/composition— the React hooks and event bus your templates are built on.@fishjam-cloud/composition-cli—npx @fishjam-cloud/composition-cli init my-templatescaffolds a template project, which is later bundled and uploaded to handle your composition.
To see it all together, start with the composition example: peers join a room, their tracks are forwarded into a composition, and an editable template lays them out for a livestream audience. Composition support in the Python Server SDK is not part of this release — use the JS SDK or the REST API for now.
Record your compositions
Anything a composition renders can now be recorded. Create a recording that points at a composition output and Fishjam starts capturing right away. Stop it when you’re done via REST API or our server SDKs.
Any updates about your recordings are delivered to the webhook URL you configured in the dashboard in 0.29.0. Both server SDKs — @fishjam-cloud/js-server-sdk and fishjam-server-sdk for Python — gained methods to create, get, list, stop and delete recordings, plus the notifiers also handle the recording messages.
Native VoIP calls in React Native
@fishjam-cloud/react-native-client 0.30.0 adds VoIP calling. Incoming calls ring through the platform’s own call UI — CallKit on iOS, Core Telecom on Android — over the lock screen, even when the app is backgrounded or was killed hours ago. A VoIP push wakes the app, the OS shows its call screen, and the moment the user answers, control returns to your code: join the Fishjam room, publish media, report back.
Setup is declarative: enable android.enableVoIP and ios.enableVoIPBackgroundMode in the config plugin, optionally tune the ring and answer timeouts. On Expo iOS, install the new @fishjam-cloud/ios-expo-voip package, which hooks the AppDelegate so cold-start pushes and Siri or Recents intents reach the SDK; bare React Native is covered too. Read the VoIP calls guide, clone the voip-call example, or read why we built it in What to Use Instead of react-native-callkeep in 2026.
Get started
Update our SDKs to version 0.30.0 to pick up these changes, and grab your management token from the dashboard to create your first composition. For detailed implementation guides and API references, check out our documentation.
Happy vibing!


