Skip to main content
Archived changelog entries from 2025. For the latest updates, see the changelog.
SIP/PSTN join-time permissions, React Native New Architecture support, recording and telephony improvements.

Overview

This month, we’ve shipped join-time permissions for SIP/PSTN users across our client SDKs. React Native developers can now build with the New Architecture enabled. We’ve also fixed some recording and telephony bugs.Complete release history for our client SDKs is available in our Github release notes:

daily-js

View full release notes →

0.80.0

  • Added support for setting permissions for SIP/PSTN users at join time.
  • Removed the use of STUN from Xirsys.
  • Updated dependencies to resolve security vulnerabilities.

react-native-daily-js

View full release notes →

0.77.0

  • Added support for setting permissions for SIP/PSTN users at join time.
  • Fixed a build issue when using React Native’s New Architecture.
  • Removed the use of STUN from Xirsys.
  • Updated dependencies to resolve security vulnerabilities.

daily-python

View full release notes →

0.19.3

  • Added an option to ignore audio level when creating a custom audio track.

0.19.2

  • Fixed a segmentation fault that could occur on exit when a custom audio source was still writing data.

Media Services

Recording

  • Fixed a bug where a failed session asset image URL could cause a recording composition to crash.

Telephony

  • Fixed a bug to correctly extract the displayName from custom SIP headers for dial-in participants.
Meeting move aware recording and streaming, new call transfer webhooks, improved telephony features, and platform-wide bug fixes.

Overview

Mobile SDKs now support canReceive permissions and improved connection reliability. The Python SDK gets powerful custom audio track capabilities. Meeting move aware recording is enabled by default, we’ve added call transfer webhooks, and transcription saves are now more resilient.Complete release history for our client SDKs is available in our Github release notes:

daily-js

View full release notes →

0.79.0

  • Improved Krisp error handling.
  • Removed a client-side limit on max_live_streams.
  • Disabled Redux DevTools in production builds.

react-native-daily-js

View full release notes →

0.76.0

  • Removed a client-side limit on max_live_streams.
  • Disabled Redux DevTools in production builds.

daily-android

View full release notes →

0.31.0

  • Added support for the canReceive permission to manage which media tracks remote participants can receive.
  • Improved connection reliability by retrying signaling channel connections and using an alternate WebSocket URI format.
  • Fixed a bug where custom ICE server configurations were not being applied.

daily-ios

View full release notes →

0.31.0

  • Added support for the canReceive permission to manage which media tracks remote participants can receive.
  • Improved connection reliability by retrying signaling channel connections and using an alternate WebSocket URI format.

daily-python

View full release notes →

0.19.1

  • Fixed an audio renderer issue that caused garbled audio with remote stereo tracks.
  • Added handling for meeting session ID changes that occur mid-call.

0.19.0

  • Introduced CustomAudioTrack for use as an additional custom track or as the main microphone input.
  • Added support for displayName, userId, video, codecs, and permissions in start_dialout().
  • Added sample_rate and callback_interval_ms arguments to set_audio_renderer() for more control over audio data.
  • Updated add_custom_audio_track() and update_custom_audio_track() to accept a CustomAudioTrack instance.
  • Switched to using system-level root certificates on all platforms.
  • Fixed a bug where blocking virtual microphones could fail to send audio.

0.18.2

  • Fixed an installation issue on macOS versions older than 15.0.
  • Corrected type hints for remove_custom_track().

0.18.1

  • Improved connection reliability by retrying signaling channel connections and using an alternate WebSocket URI format.
  • Fixed a bug with virtual microphone completion callbacks.

Media Services

Recording

  • Meeting move aware recording and streaming is now enabled by default. This feature (previously in pre-beta) automatically resumes recordings and live streams when meetings are transferred between servers during maintenance or failovers, eliminating gaps in recorded content.

Telephony

  • Introduced new webhooks to track call transfer status: calltransfer.triggered, calltransfer.initiated, calltransfer.answered, and calltransfer.complete.
  • Added support for passing custom SIP headers during pinless dial-in, which are now available in the sipHeaders object in the webhook payload.
  • Added canReceive permission controls for dial-in and dial-out participants via the startDialOut() API and room properties.
  • On-demand SIP dial-out endpoints are now the default behavior, improving resource efficiency.

Transcription

  • Transcripts are now saved to storage every two minutes by default, improving data resilience.
  • The /transcript and /transcripts API endpoints now include roomName, participantMinutes, and isVttAvailable for more detailed information.
  • Fixed a race condition that could cause duplicate transcription messages when participant settings were updated rapidly.
Stability fixes for ejection logic and network states, Python custom audio tracks, enhanced recording webhooks, improved telephony features, and performance diagnostics for slow joins.

Overview

We’ve shipped stability improvements across the board this month. Key fixes include meeting ejection logic, network state calculations, and slow join diagnostics. The Python SDK now supports custom audio tracks, and raw tracks recordings now include instance IDs in webhooks.Complete release history for our client SDKs is available in our Github release notes:

daily-js

View full release notes →

0.78.0

  • Fixed ejection logic to prevent incorrect ejections or joins when a user’s local clock is out of sync. ⚠️ Note: Participants can no longer join if eject_after_elapsed is set to a negative value.
  • Fixed an OverconstrainedError on Chrome that occurred when providing an invalid audio deviceId.
  • Fixed an issue where unhandled errors during Krisp initialization could cause problems when joining a call.
  • Reverted a change that disabled background effects on Windows when software WebGL is in use. Instead, a video-processor-warning is now logged, as this scenario can significantly reduce video frame rates.
  • Improved networkState calculations by removing recvPacketLoss, which could be misleading.
  • Added instanceId to webhooks for raw tracks recordings.
  • Added performance logging for enumerateDevices() to help identify slow join times, especially on Firefox when the tab is not in focus.
  • Removed the beta feature warning from testCallQuality().

react-native-daily-js

View full release notes →

0.75.0

  • Fixed ejection logic to prevent issues caused by mismatched local clock times. ⚠️ Note: Participants can no longer join if eject_after_elapsed is set to a negative value.
  • Improved networkState calculation by removing recvPacketLoss from the formula.
  • Added instanceId to webhooks for raw tracks recordings.
  • Added performance logging for enumerateDevices() to help diagnose slow join times.

daily-python

View full release notes →

0.18.0

  • Introduced support for creating, updating, and removing custom audio tracks. You can now use CallClient.add_custom_audio_track(), CallClient.update_custom_audio_track(), and CallClient.remove_custom_audio_track() for advanced audio manipulation.
  • Improved canReceive permission support to ensure track states ("off", offReasons) update correctly when permissions are granted or revoked.
  • Audio and video renderer callbacks (set_audio_renderer(), set_video_renderer()) now receive the audio or video source as the last argument.
  • Reduced “no subscription for consumer” and “Failed to close consumer” log messages from error to debug, as these often occur during normal participant disconnections.

Media Services

Recording

  • Instance ID in Webhooks: The recording.ready-to-download and raw-tracks-recording-error webhooks now include an instance_id to uniquely identify raw tracks recording sessions.
  • Fixed an issue to ensure the instanceId is correctly propagated for raw tracks recordings from the initial API call through to the final webhook event.

Telephony

  • dialin.ready Webhook: Introduced the dialin.ready webhook event, which notifies you when a room’s SIP endpoint is ready to receive an inbound call.
  • origin Field in Dial-Out Webhooks: Dial-out webhook events now include an origin field, specifying the PSTN number or SIP URI that initiated the call.
  • Default SIP Codec: Added a domain-level property to set default codecs for SIP/PSTN calls. Opus is now the default codec for all dial-in calls.
  • On-Demand SIP Endpoints: SIP endpoints for dial-out are now created on-demand when startDialOut() is called, improving resource efficiency and room creation reliability.
  • Error Messaging: Enhanced error messages for dial-in/out configurations during room creation.
New canReceive permission, dynamic track constraints, revamped network stats, enhanced telephony features (caller ID, SIP fixes), improved platform stability and compatibility (reconnection, ICE, and more), and security updates.

Overview

As we close out the first quarter, recent updates across the Daily ecosystem deliver major new features and bug fixes. We’ve introduced the canReceive permission for fine-grained media control, revamped network statistics (networkState, networkStateReasons) while deprecating older metrics, enhanced telephony capabilities (caller ID, SIP stability, API improvements), refined recording composition, and fixed bugs across the platform.Complete release history for our client SDKs is available in our Github release notes:

daily-js

View full release notes →

0.77.0

Introduced canReceive Permission

We extended the available permissions to include canReceive, which allows meeting owners to control the media tracks of others in the session. This feature enables use cases like “warm transfers” (e.g., ensuring a customer doesn’t hear an agent before the handoff is complete) and other scenarios requiring selective visibility or audibility within a call. See the participant permissions documentation for details.

Improved Network Quality Statistics

We introduced two new fields in the object returned by getNetworkStats() to provide more accurate network quality data: networkState and networkStateReasons. These replace the deprecated threshold and quality fields, offering a more reliable assessment based on send/receive packet loss, round-trip time, and available outgoing bitrate.

Bug fixes and improvements

  • Fixed proxyUrl support in dailyConfig.
  • Optimized background effects on Windows by disabling them when hardware acceleration is unavailable.
  • Updated internal dependencies to resolve security vulnerabilities.
  • Simplified recordings_bucket response in room() method for enhanced security.

0.76.0

Bug fixes and performance improvements

  • Updated Krisp noise cancellation library to v2.2.1.
  • Fixed switching back from custom video track to device track via setInputDevicesAsync().
  • Fixed iceTransportPolicy configuration to correctly override domain defaults.
  • Added enable_dialout to TypeScript definitions for DailyRoomInfo.

0.75.2

Bug fixes

  • Fixed unnecessary video track re-acquisition during input settings updates.

0.75.1

Bug fixes

  • Fixed video constraint preservation when changing devices.
  • Removed console error for null deviceId in setInputDevicesAsync.

0.75.0

Enhanced Participant Type for Dial-in/out

The participant object now includes specific participantType values to identify telephony participants: sip-dial-in, sip-dial-out, pstn-dial-in, and pstn-dial-out. This allows for clearer identification of how participants joined via SIP or PSTN dial-in/out.

Dynamic Input Track Constraints

Introduced support for dynamically customizing media track constraints during a call using updateInputSettings(). This allows changing camera resolution, frame rate, or switching between front and rear cameras without rejoining. The previous constraint-setting methods (userMediaAudioConstraints, userMediaVideoConstraints, and setBandwidth trackConstraints) are now deprecated.

Bug fixes and improvements

  • Fixed track event reliability for rapid muting/unmuting and custom tracks.
  • Fixed track event participant info on leave.
  • Improved Krisp initialization error handling.
  • Fixed ondevicechange undefined error on certain systems.
  • Updated Banuba SDK to eliminate need for 'unsafe-eval' CSP directive with avoidEval: true.
  • Updated minimum supported version to 0.64.0.

react-native-daily-js

View full release notes →

0.74.0

Introduced canReceive Permission

Added support for the new canReceive permission for granular control over which media tracks participants receive. See the participant permissions documentation for details.

Improved Network Quality Statistics

Introduced networkState and networkStateReasons fields in getNetworkStats(), replacing deprecated threshold and quality metrics.

Bug fixes and improvements

  • Added caller ID support for SIP PSTN transfers in sipCallTransfer().
  • Fixed proxyUrl support.
  • Updated dependencies for security fixes.
  • Simplified recordings_bucket response in room() method.

0.73.0

Bug fixes

  • Fixed switching from custom video track back to device track.
  • Fixed iceTransportPolicy configuration override.
  • Added enable_dialout to TypeScript definitions.

0.72.1

Reverted Erroneous API Changes

Reverted unintended deprecation notices for updateInputSettings() and dynamic track constraints to maintain React Native’s existing device handling APIs.

0.72.0

Enhanced Participant Type for Dial-in/out

Added specific participantType values for telephony participants: sip-dial-in, sip-dial-out, pstn-dial-in, and pstn-dial-out.

Added Audio-Only Raw Tracks Recording

Added raw-tracks-audio-only streaming config for audio-only recording support.

Bug fixes

  • Fixed track event reliability for muting and custom tracks.
  • Updated internal REST APIs to use native utilities.
  • Added participant info to track-stopped events on leave.

0.71.0

Bug fixes and improvements

  • Added sessionId to dial-in events.

daily-android

View full release notes →

0.30.0

Ignore Network Devices API

Introduced CallClient.GlobalConfig.setIgnoredNetworkDevices() to exclude specific network interfaces (VPNs, virtual adapters) during ICE candidate gathering for improved connection reliability.

Bug fixes

  • Fixed ICE server configuration application via CallClient.setIceConfig().

0.29.0

Automatic Cloud Recording Start

Added support for automatically starting cloud recording on join when start_cloud_recording: true is set in the meeting token.

Bug fixes and improvements

  • Fixed reconnection with expired meeting tokens.
  • Updated dependencies (ffmpeg, libav, libvpx) for security patches.

daily-ios

View full release notes →

0.30.0

Bug fixes

  • Fixed ICE server configuration application via setIceConfig().

0.29.0

Automatic Cloud Recording Start

Added support for automatically starting cloud recording on join when start_cloud_recording: true is set in the meeting token.

Bug fixes

  • Fixed reconnection with expired meeting tokens.

daily-python

View full release notes →

0.17.0

Improved Linux Compatibility

Recompiled against glibc 2.28 for broader Linux distribution support.

0.16.1

Bug fixes

  • Fixed virtual speaker device selection.

0.16.0

Update canReceive Permissions Support

Added support for modifying remote participant’s canReceive permission via update_remote_participants().

Bug fixes

  • Fixed ICE server configuration application.

0.15.0

Automatic Cloud Recording Start

Added support for automatically starting cloud recording on join when start_cloud_recording: true is set in the meeting token.

Bug fixes

  • Fixed reconnection with expired meeting tokens.

Daily Prebuilt

Transcription Language Defaults

Transcription now defaults to the room/domain lang configuration when started via Closed Captions, falling back to English if not configured.

Media Services

Recording and Live Streaming

New Features

  • Scale Mode Overrides: Added videoSettings.split.scaleModeOverrides for individual participant scaling in split layout compositions.
  • Background Color Support: VCS render pipeline now supports custom background colors via backgroundColor parameter.

Bug fixes

  • Fixed audio-only participant filtering in baseline compositions.
  • Fixed instance ID handling for raw tracks recording.

Telephony

Enhanced Caller ID Control

Added callerId support in sipCallTransfer() for PSTN transfers with improved default caller ID selection logic.

API Improvements

  • Domain dial-in configs endpoint now supports filtering by multiple phone numbers.
  • Purchased phone numbers endpoint now includes pagination support.
  • Room creation API provides more specific telephony provisioning error messages.

Bug fixes and improvements

  • Improved SIP INVITE handling to prevent signaling state errors.
  • Enhanced error messages for invalid call transfers.
  • Fixed layout updates for disconnected SIP participants.
  • Added comprehensive transfer guide documentation.

Transcription

Bug fixes

  • Fixed race condition when stopping or updating transcription immediately after starting.
New transcription webhooks, better multi-instance recording support, improved telephony features, platform-wide bug fixes, and strengthened SDK reliability.

Overview

Rounding out 2024 and kicking off 2025 with major improvements across Daily’s platform components: bug fixes (Safari audio processing detection, call quality test error handling), expanded feature set (improved PSTN/SIP support, expanded multi-instance recording, new transcription webhooks), and strengthened infrastructure (SDK and media service reliability).Complete release history for our client SDKs is available in our Github release notes:

daily-js

0.74.0

Updated Krisp CSP Requirements

Added missing blob: source to the CSP guide:

Follow-up fix for Safari Audio Processing Detection

Fixed a logical error in Safari version comparison for audio processing support. We resolved an edge case where Safari versions above 18 were incorrectly flagged as unsupported. This completes the Safari 17.4+ audio processing detection fix from our previous release.This change ensures accurate audio processing support detection across all Safari versions.

Fixed Call Quality Test Error Handling

Fixed error handling in testCallQuality() when rate limits are hit and improved promise rejection handling to avoid uncaught errors. Test failures now properly resolve with a FAILED result instead of throwing.

Added Session ID to Dial-in Events

Added sessionId field to all dial-in events: dialin-connected, dialin-error, dialin-stopped, and dialin-warning.For example:

Version Support Update

  • The oldest supported version of daily-js is now 0.63.0.

react-native-daily-js

0.71.0

This release also includes several core improvements shared with daily-js 0.74.0:
  • Added sessionId to dial-in events
See the daily-js 0.74.0 section for full details on these changes.

daily-android

0.28.0

Added support for Cloudflare TURN/STUN servers

Added support for using Cloudflare TURN/STUN servers for ICE connections. If you’re interested in using this for your Daily domain, please contact help@daily.co

Fixed Android Proguard Build Configuration

Fixed an issue where apps using R8/Proguard would fail to build due to missing Banuba video processor classes:
  • Added proper Proguard configuration for optional Banuba SDK dependencies
  • Ensured R8 optimization doesn’t fail on missing video processor classes
  • Maintained backwards compatibility with existing video processor integrations
This change prevents build failures in release builds when the video processor plugin is not included.

0.27.0

Fixed crash when creating and deleting VideoTextureView/VideoTrackCapturerToSurface without also creating a CallClient.

Fixed an issue where daily-android would crash when cleaning up video views without an active CallClient:
  • Moved native library initialization to shared context to prevent premature loading
  • Added safety checks to prevent cleanup of uninitialized native contexts
  • Improved synchronization of client tracking in shared context
This change prevents crashes when creating and destroying video views without an active call client, improving stability for applications that conditionally initialize video components.

Enhanced Call Reliability during Meeting Moves

Improved call reliability during meeting moves by implementing increased retry attempts for meeting moves to handle longer backend processing times.

daily-ios

0.28.0

Added support for Cloudflare TURN/STUN servers

Added support for using Cloudflare TURN/STUN servers for ICE connections. If you’re interested in using this for your Daily domain, please contact help@daily.co

0.27.0

Enhanced Call Reliability during Meeting Moves

Improved call reliability during meeting moves by implementing increased retry attempts for meeting moves to handle longer backend processing times.

daily-python

0.14.2

Fixed type hints for CallClient.send_app_message()

Fixed type hints for CallClient.send_app_message() to match the expected payload structure.

0.14.1

Enhanced App Message Serialization

Added serialize_none option to CallClient.send_app_message() to control whether None values are serialized to JSON null or ignored. This enables more flexible data handling in application messages.

0.14.0

Added DTMF Support for Dial-out Calls

Added the ability to send DTMF tones in dial-out sessions using CallClient.send_dtmf()docs:
  • Send numeric tones (0-9), symbols (#, *) and letters (A-D) to control interactive voice systems
  • Control automated phone menus and voicemail systems during dial-out calls
  • Specify session ID and tone sequences via simple settings object
This addition enables programmatic interaction with phone systems that require DTMF input during dial-out calls.

Added SIP REFER Support

Added support for transferring SIP calls to external endpoints via CallClient.sip_refer() (docs):
  • Transfer ongoing SIP dial-in calls to external SIP endpoints
  • Control transfers using session ID and destination endpoint
  • Support for standard SIP REFER mechanism
This addition enables seamless call transfers between Daily and external SIP systems.

Added Daily-to-Daily SIP Call Transfer Support

Added support for transferring SIP/PSTN calls between Daily rooms via CallClient.sip_call_transfer() (docs):
  • Transfer SIP dial-in calls between Daily rooms
  • Transfer dial-out calls to other SIP/PSTN endpoints
  • Control transfers using session ID and destination endpoint
This addition enables seamless call transfers within the Daily ecosystem and to external numbers.

Changed field name in Dial Events

Renamed participantId to sessionId in DialoutEvent and DialinEvent objects for consistency

Enhanced Call Reliability during Meeting Moves

Improved call reliability during meeting moves by implementing increased retry attempts for meeting moves to handle longer backend processing times.

Daily Prebuilt

  • Enhanced accessibility across Prebuilt with ARIA attributes, improved keyboard navigation, semantic HTML, updated labels and roles, and better screen reader support to meet WCAG standards.
  • Fixed issue where GIFs with empty titles were not rendered in chat.
  • Fixed a case where flickering in chat input height occurred while typing.

Media Services

Recording and Live Streaming

Support Multiple Recording Types with Multi-Instance Recording

Added support for running different recording types simultaneously using instance IDs:
  • New type parameter in startRecording() (docs) API accepts 'cloud', 'raw-tracks', or 'local'
  • Recording types must be enabled via enable_recording property on room/domain
  • Each recording instance requires a unique UUID via instanceId parameter
You can now run cloud recordings and raw track captures simultaneously, enabling both processed and unprocessed recording workflows from a single call.

Added Audio-Only Support for Raw Tracks Recording

Added support for audio-only recording in raw-tracks recordings:
  • New raw-tracks-audio-only preset captures only audio tracks, reducing storage requirements and simplifying post-processing workflows
  • Preset must be specified at recording start - cannot be changed via updateRecording()
  • Compatible with existing raw-tracks processing tools for audio extraction and analysis
This addition makes raw-tracks recordings more flexible for audio-focused use cases where individual tracks are needed for post-processing like podcasting, voice analysis, and audio archival.

Added Raw Tracks Processing Tools

Released an open-source suite of tools for processing raw-tracks recordings:
  • New raw-tracks-tools CLI provides tools for analyzing, converting and compositing WebM files from raw-tracks recordings
  • Supports track alignment, synchronization, and layout composition using Daily’s VCS engine
  • Complements existing GUI tools like CloudConvert and Handbrake with more precise control over WebM processing
This release makes raw-tracks recordings more accessible for post-processing workflows, especially for high-quality audio/video production.

Added Audio Recording Loss Detection

Added automatic detection of audio quality issues in recordings and streams. This fixes issues where audio quality issues where audio or video tracks were visible during the live call but not in the final recording/stream.

Improved Recording Reliability with Network Optimizations

Enhanced network reliability for all recording types (cloud, raw-tracks, live streaming) and phone integration:
  • Increased UDP buffer sizes to prevent packet loss between servers
  • Added server-to-server retransmission between SFU and media workers
  • Reduces recording freezes and dropped tracks in environments with network congestion

Fixed Missing Tracks in Recordings

Fixed an issue where tracks could be missing from recordings when added during WebSocket reconnections between SFU and recording services. New tracks are now properly subscribed even during connection re-establishment.

Telephony

Renamed Dialout Timeout Configuration Field

Renamed dialout configuration parameter from max_alone_duration_sec to max_idle_timeout_sec to better describe its purpose of controlling how long dialout participants remain in an idle room.

Added Participant Type Support in participants() for Phone Participants

Added distinct participant types for phone participants in participants() to enable better handling of SIP and PSTN users:
  • New participant types: sip-dial-in, sip-dial-out, pstn-dial-in, pstn-dial-out
  • Automatically set for all phone-based participants, including umbrella participants
This helps developers better identify and manage phone participants in their applications.

Fixed Dialout ICE Connection Reliability

Fixed an issue where SIP dialout calls could hang during ICE connection negotiation, improving the reliability of phone system integration.

Added dialout_config to Room Configuration

Added dialout_config (docs) as a room-level configuration option to control dialout behavior:
  • dialout_config.allow_room_start: Allow dialouts to start an empty room
  • dialout_config.max_idle_timeout_sec: Control how long a dialout participant can remain in a room alone
  • dialout_config.dialout_geo: Specify region for dialout sessions

Transcription

Unified Transcription Configuration Across Live and Batch Processing

Aligned transcription configuration options between live transcription and batch processing for consistent API usage:
  • All configuration options from live transcription (language, model, punctuate, etc.) now supported in batch processing
  • Previous undocumented params field maintained for backward compatibility
  • Added new extra field for additional Deepgram parameters in both APIs
Simplifies transcription configuration by providing a consistent interface across real-time and batch processing workflows.

Added Room Name in Transcription API

Enhanced transcription list and info endpoints with room name support:

Webhooks

New transcription webhook events

Added three new webhook events to track the full lifecycle of transcriptions:
  • transcript.started indicates transcription has begun, including metadata like room ID, instance ID and initial status
  • transcript.ready-to-download fires when transcription completes, providing S3 location details for downloading the transcript
  • transcript.error provides detailed error information and context if transcription fails during any stage
Monitor and automate transcription workflows with comprehensive status updates and error handling through webhooks.

Other

Added support for Cloudflare TURN/STUN servers

Added support for using Cloudflare TURN/STUN servers for TURN/STUN connections. If you’re interested in using this for your Daily domain, please contact help@daily.co