Web Core SDK
Last updated Aug 25, 2026
2026-10-19
RealtimeKit Web Core 2.0.4
Fixes
- Fixed a device selection priority issue in mobile browsers that caused "Headset earpiece" to be selected instead of the speaker.
- Fixed a resource leak that kept the audio activity reporter running after a participant left a meeting.
- Fixed an issue where a waitlisted participant's request disappeared from the host's waitlist after the participant reconnected.
2026-10-12
RealtimeKit Web Core 2.0.3
Enhancements
- When the signaling WebSocket disconnects but the media connection remains healthy, audio, video, and screen sharing continue without restarting. This avoids media dropouts and reduces reconnection time from 20–30 seconds to a fraction of a second.
- The SDK now establishes the signaling connection and fetches participant details in parallel, reducing meeting initialization time.
- Web Core API, signaling, logging, and call-statistics traffic now use
api.realtime.cloudflare.com. With Web Core 2.0.3, you no longer need to separately allowlistapi-silos.realtime.cloudflare.com,da-collector.realtime.cloudflare.com, orsocket-edge.realtime.cloudflare.com. Refer to the Network allowlist for all required domains. - Participant order, pinned participants, selected views, pagination, and manual media subscriptions are now preserved during reconnection.
Fixes
- Fixed participants losing audio or video from others after reconnecting.
- Fixed transient signaling failures interrupting SDK initialization or meeting joins. The meeting object is now created even if the initial signaling attempt fails, and join requests are retried automatically.
- Fixed Picture-in-Picture closing during temporary disconnections. It now remains active during reconnection, and its pin and hand-raise icons use the configured design system colors.
- Fixed an issue where an error thrown by a customer's callback for an SDK event stopped other listeners from running. The SDK now calls each listener for an SDK event independently. If a customer's callback throws an error, the remaining listeners still run.
- Fixed participant grids flickering, temporarily appearing empty, or displaying duplicate or stale tiles during mass reconnections.
2026-08-24
RealtimeKit Web Core 2.0.2
Enhancements
- Generated API documentation now identifies class names correctly, providing more accurate type suggestions for TypeScript users.
- Starting a recording that is already in progress now returns error code
1005instead of the generic error code1000. If youronErrorcallback handles error code1000for this case, update it to handle1005.
Fixes
- Fixed a Babel transpilation error that could occur when consuming ES2015 builds containing
RequestError. - Fixed session recovery after SFU timeouts. Participants can now continue hearing and seeing others after a transient SFU API timeout.
- Fixed bulk media consumer creation batching to support participant grids with up to 100 participants per page, increased from 24 per page.
2026-07-17
RealtimeKit Web Core 2.0.1
Fixes
- Fixed ES5 builds containing
VERSION_PLACEHOLDERin the bundle instead of the actual SDK version. - Fixed SDK initialization failure when the initial socket connection attempt failed, which also prevented plugin store creation. The SDK now retries store creation based on the socket connection state.
2026-06-18
RealtimeKit Web Core 2.0.0
Compatibility: Works best with RealtimeKit Web UI Kit 2.0.0 or later.
This is a major breaking release. Several deprecated APIs have been removed and the plugin APIs have been completely redesigned. Review the migration guide below carefully before upgrading.
Plugin APIs — complete redesign
Plugins are no longer fetched from the server automatically. You now provide plugin configurations at SDK init time via defaults.plugins.
Before (v1.x):
// plugins were loaded via API in SDK internally
const meeting = await RealtimeKitClient.init({
authToken,
});
// Server-hosted plugins were auto-populated
const plugin = meeting.plugins.all.get(pluginId);
// Plugin rendered in an iframe managed by the SDK
plugin.addPluginView(iframeElement, 'plugin-main');
// Permissions checked via meeting.self.permissions.plugins.canStart / canClose
After (v2.0):
A plugin component is any HTMLElement. You can use a custom element, a framework component mounted to a container, or an iframe. The following example embeds a collaborative text editor as a plugin:
const editor = document.createElement('iframe');
editor.src = 'https://rustpad.io/#WKLJaD';
editor.style.width = '100%';
editor.style.height = '100%';
editor.style.border = 'none';
const meeting = await RealtimeKitClient.init({
authToken,
defaults: {
plugins: [
{
id: 'collaborative-editor', // SDK prefixes this with {meetingId}: to create the namespaced plugin.id
name: 'Collaborative Editor',
icon: 'https://example.com/editor.png',
permissions: {
canActivate: true,
canDeactivate: true,
},
component: editor,
},
],
},
});
// Plugin is registered and available
const plugin = meeting.plugins.all.get(pluginId);
// Activate — state is synced across all participants
await plugin.activate();
For a complete guide on building custom plugins, refer to Build your own plugins. If you need to record plugin content, you must build a custom recording app.
Key changes:
- New type exports:
ClientPluginConfig,ClientPluginPermissions. - Plugin
idis now namespaced: the SDK prefixes your providedidwith{meetingId}:to create the internalpluginId. - Plugin activation and deactivation state is now synced via a collaborative store (
__rtk_plugins__) instead of dedicated socket messages. - Plugins now have a
componentproperty (anyHTMLElement) instead of iframe-based rendering viaaddPluginView. - Per-plugin permissions (
plugin.permissions.canActivate/plugin.permissions.canDeactivate) replace the old globalmeeting.self.permissions.plugins.canStart/meeting.self.permissions.plugins.canClose.
Removed plugin APIs:
plugin.addPluginView(iframe, viewId)— pass anHTMLElementascomponentinClientPluginConfiginstead.plugin.removePluginView(viewId)— handled automatically by the UI Kit.plugin.enable()— useplugin.activate().plugin.disable()— useplugin.deactivate().plugin.sendIframeEvent()— removed. Communicate directly with your component.plugin.baseURL— removed. Plugins are no longer server-hosted.plugin.picture— useplugin.icon.plugin.description,plugin.organizationId,plugin.tags,plugin.type,plugin.staggered,plugin.private,plugin.published,plugin.createdAt,plugin.updatedAt— removed. No longer applicable.plugin.config(PluginConfig) — removed. No plugin manifest concept.meeting.self.permissions.plugins.canStart— useplugin.permissions.canActivate.meeting.self.permissions.plugins.canClose— useplugin.permissions.canDeactivate.modules.devTools.plugins(local dev plugin config) — usedefaults.pluginswith acomponentpointing to your local element.
Removed deprecated APIs
Client:
meeting.joinRoom()— usemeeting.join().meeting.leaveRoom()— usemeeting.leave().
Chat:
meeting.chat.getMessagesByUser(userId)— usemeeting.chat.fetchPublicMessages()with appropriate filters.meeting.chat.getMessagesByType(type)— usemeeting.chat.fetchPublicMessages()with appropriate filters.meeting.chat.getMessages(timestamp, size, reversed)— usemeeting.chat.fetchPublicMessages()ormeeting.chat.fetchPrivateMessages().meeting.chat.searchMessages(query, filters)— usemeeting.chat.fetchPublicMessages()ormeeting.chat.fetchPrivateMessages().meeting.chat.pinned(getter) — usemeeting.chat.fetchPinnedMessages().
Permissions (meeting.self.permissions):
permissions.produceVideo— usepermissions.canProduceVideo.permissions.produceAudio— usepermissions.canProduceAudio.permissions.produceScreenshare— usepermissions.canProduceScreenshare.permissions.waitingRoomType— usepermissions.waitingRoomBehaviour.permissions.canChangeParticipantRole— usepermissions.canChangeParticipantPermissions.permissions.canChangeTheme— removed (always returnedfalse).permissions.canPresent— check individualcanProduceAudio,canProduceVideo,canProduceScreenshare.permissions.requestProduce— check individual media permissions forCAN_REQUESTvalues.permissions.acceptPresentRequests— usepermissions.acceptStageRequests.permissions.maxScreenShareCount— usemeeting.self.config.maxScreenShareCount.PermissionPreset.fromResponse()— usePermissionPreset.init().PermissionPreset.default()— usePermissionPreset.init().
Participants:
meeting.participants.disableAudio(participantId)— usemeeting.participants.joined.get(participantId).disableAudio().meeting.participants.disableVideo(participantId)— usemeeting.participants.joined.get(participantId).disableVideo().meeting.participants.kick(participantId)— call kick on the participant directly.participant.clientSpecificId— useparticipant.customParticipantId.
Connected Meetings:
meeting.connectedMeetings.supportsConnectedMeetings— removed. Permission checks are now granular viameeting.self.permissions.connectedMeetings.
Enhancements
- Faster reconnection: Socket-only disconnects (where WebRTC transports remain healthy) now skip full transport re-setup. Producers are re-registered and existing consumers are remapped, significantly reducing reconnection time.
- Participants stay visible during reconnection: Participant tiles remain in the grid during a socket blip instead of disappearing and reappearing, providing a seamless experience.
- Double audio fix: Fixed an issue where other participants could hear double audio from a reconnected participant, caused by stale producers not being cleaned up.
- Socket reconnection resilience: Socket now supports up to 50 reconnection attempts with exponential backoff and jitter (up from 10), providing up to approximately four minutes of retry coverage when the internet is down.
- Store improvements:
StoreManagernow supportsrefresh(name)to re-fetch store data from the server, and reserved store names (__rtk_plugins__) are protected from user creation.
Fixes
- Fixed socket failing to reconnect if left disconnected for 30 seconds.
2026-05-28
RealtimeKit Web Core 1.5.1
Compatibility: Works best with RealtimeKit Web UI Kit 1.2.0 or later.
Features
- Added a dedicated error code
0014for media (WebRTC) connection failures during room join, making it easier to distinguish media failures from socket and signaling failures.
Enhancements
- Init and join failures from
Client.init()andmeeting.join()now surface specific error codes and descriptive messages instead of generic or stacked errors. - Telemetry logs are now compressed using gzip when the browser supports the
CompressionStreamAPI, achieving approximately a 10:1 compression ratio. Older browsers and React Native fall back to uncompressed JSON with smaller batch sizes.
Fixes
- Fixed a regex-based issue where the Safari video middleware flag was incorrectly removed, potentially breaking video processing on Safari.
- Fixed an issue where
ClientErrorobjects were wrapped inside each other when the SDK retried failed API requests. This caused nested error messages, duplicateonErrorcallbacks, and redundantwindowerror events.
