The latest updates to the Daily real-time audio and video API include background blur for Daily Prebuilt and more.

daily-js 0.21.0
- ✨ Beta ✨ Blur participant backgrounds on Daily video calls via a new
inputSettingsDailyIframe property orupdateInputSettings()method. - ✨ Beta ✨ Determine whether a browser supports background blur by checking the
supportsVideoProcessingproperty returned bysupportedBrowser(). - 🎥 All
recording-startedevents now include the type of recording started ("local","cloud","rtp-tracks","output-byte-stream", or"cloud-beta"). When the type is"cloud-beta"or"rtp-tracks", therecording-startedevent will also includestartedBywith the participant ID of the person who started the recording."cloud-beta"recordings will also include the samelayoutproperty as live streaming events. - ☁️ The
"cloud-beta"recording type now emitsrecording-startedandrecording-stoppedevents. - 🇷🇺 Added Russian language support. Set the DailyIframe
langproperty to"ru", or pass"ru"tosetDailyLang()to specify Russian as the language of choice.
Daily Prebuilt
- ✨ Beta ✨ Toggle background blur participant controls in Daily Prebuilt. The new
enable_video_processing_uiproperty, avaliable at the room or domain level, displays a UI that allows participants to blur or unblur their backgrounds. This property defaults totrue(showing the controls) if not explicitly set tofalse. - 📜 Chat history is now visible to all participants during a call, even if they join after the call (and witty side banter) started.
- 🎥 Added support for
"cloud-beta"recording. - 🙅♀️ Improved Safari 15 blocked device handling.
- 🤳 Updated the tray buttons and Leave button locations on mobile.
- 🔘 Improved usability of the Share and Record stop buttons.
- 🐛 Other bug fixes and improvements.
Daily Dashboard
Introducing beta Deepgram transcription, a show-local-video-changed event, getNetworkTopology() method, and more in the latest updates to the Daily real-time audio and video API.
daily-js 0.19.0
- ✨ Beta ✨ Introduced Deepgram transcription support. Have a look at
startTranscription()to get started. - 🙈 Added
show-local-video-changedevent that fires when a local participant hides or shows their own video element (when thesetShowLocalVideo()method is called). - 🚢 Shipped
getNetworkTopology()instance method that indicates whether the call is happening over an"sfu"or"peer"connection type. - 📱 Launched mobile-friendly
"portrait"layout option for live streaming, where up to two participants will be shown. An additionalvariantkey may be specified. Valid values are"vertical"for a vertical grid layout (the default), and"inset"for having one participant’s video take up the entire screen, and the other inset in a smaller rectangle. Participants’ videos are scaled and cropped to fit the entire available space. Participants with theis_ownerflag are shown lower in the grid (vertical variant), or full screen (inset variant).
Daily Prebuilt
- 🛠 Implemented new
getNetworkTopology()method. - 💻 Improved device management in settings for cases when browser access hasn’t been granted.
- 🛑 Disabled the Record button when a cloud recording has stopped and is in the process of being uploaded.
- 🐛 Other bug fixes and technical debt improvements.
Daily dashboard
- 📆 Sped up Past Sessions data retrieval by restricting results to the previous 21 days.
- 🎥 Updated Recordings table to only display finished recordings.
- 📝 Added a note to the Create Room page: any participant will be able to start a recording if recording is set at the room level.
Coming soon in daily-js 0.20.0
- We’re adding a
max_participantsproperty to the data returned from the/meetingsREST API endpoint, so please make sure your client code is ready!
Control how you receive video and audio tracks on a call, customize the number of participant videos displayed, and more updates to the Daily real-time audio and video WebRTC API.
Self-view, if enabled, now floats to the top of a Daily Prebuilt call with

setShowParticipantsBar(false).daily-js 0.17.0
- 🗣 Shipped
activeSpeakerModeiframe property to control whether Daily Prebuilt displays the person currently speaking ({ activeSpeakerMode: true }; this is the default) or a grid of call participants ({ activeSpeakerMode: false }).
- 🧩 New iframe property
layoutConfigcustomizes how the grid of video tiles behaves when the browser is resized (if the call is in grid mode, of course).
- 🎭 Added ‘staged’ media track subscription state that corresponds to setting up the connections for a track, but not transmitting data across that connection. This lets you “stage” tracks that you know you’ll need soon, for later rapid transition into the fully “subscribed” state, without using any extra bandwidth. Reminder: Track subscriptions are only supported when your call is in SFU mode.
- 🎁 Launched several affordances to give you control over how you want to receive the video tracks that you’re subscribed to. These are referred to as receive settings. The first—and so far only—configurable receive settings are the desired maximum simulcast layers for
videoandscreenVideo. A higher simulcast layer corresponds to higher quality. The new affordances are:getReceiveSettings()andupdateReceiveSettings()instance methodsreceiveSettingsDailyIframe propertyreceive-settings-updatedevent
react-native-daily-js 0.14.0
- 🎁 Same receive settings updates as daily-js 0.17.0 (see above)
- 🎥 You can now live stream with react-native-daily-js. To get started, check out our docs on live streaming instance methods.
Daily Prebuilt
- 🙈 You can now toggle whether or not you see your own video during a call.
- 🧩 The new
layoutConfigiframe property lets you customize the number of participant videos displayed when a call is in grid mode (see daily-js update above). - 🎶 Use
setPlayNewParticipantSound()to turn off the default sound when a new participant joins a call (setPlayNewParticipantSound(false)). - ☁ Updated
setShowParticipantsBar()when set tofalsewith self-view still visible to float the self-view to the upper left corner of the call. - 🐛 Fixed a bug that occasionally prevented color themes from being applied.
- 📛 Added a badge that notifies call participants when a call is being live streamed.
The latest improvements, including color theming, to Daily Prebuilt, a ready-to-use video chat app built on WebRTC that developers can plug into their websites and apps.
Explore new custom colors in Daily Prebuilt.

Daily Prebuilt
- 🎨 You can now customize colors in Daily Prebuilt! Pass your own hex codes as a
themeproperty tojoin()orcreateFrame(), or use the newsetTheme()method. See the full guide. - 🌗 Daily Prebuilt’s default light and dark color themes have been updated (and can now be overridden with the color theming feature).
- 💨 In speaker view, when scrolling the participant bar, remote video feeds will be displayed faster.
- 📞 Added support for the recent-call parameter, when using the
redirect_on_meeting_exitproperty. - 🤫 Meeting owners will now see an option to mute all participants.
- 🎙 Updated the microphone level indicator to reflect when a participant changes their audio device.
- 🐛 Fixed a bug so that the lobby’s name entry screen no longer flashes when a name is cached or provided via a token.
New blog posts and other articles
The latest improvements to Daily Prebuilt, a ready-to-use video chat app built on WebRTC that developers can plug into their websites and apps.
Our revamped mobile PrebuiltThe engineering team has been working diligently to improve your Daily Prebuilt experience, especially on mobile.

Daily Prebuilt
Completely redesigned mobile client, including:- A home page that highlights the active speaker and screen shares.
- Additional pages that can be swiped through to reveal up to 3 remote video feeds.
- A new controller bar at the bottom of the UI which shows page position, participant count, and the name of * the screen sharer.
- Mobile UI now runs exclusively on touch enabled tablets and phones.
- Lots of performance improvements!
- Improved audio playback when a Bluetooth device is disconnected.
- Drastically improved active speaker switching performance on mobile.
- Updated participant bar to prioritize participants with cameras on.
- Participant bar scroll position is now preserved after open/close.
- Fixed issue where the wrong active speaker might be displayed on join, thanks to a bug fix shipped with
daily-js 0.15.0 - Added new icons for Firefox.
- Updated German translations.
Core call experience
- Fixed issue where a participants’ audio failed to send at join time if the room/token had
start_video_offandstart_audio_offand then immediately calledsetLocalAudio(true)setLocalVideo(true). - Fixed an issue with Daily Prebuilt that could cause multiple meeting moves at the start of a call when the lobby is enabled.
- Reduced superfluous error logs generated as fallout from a stale websocket.
- Fixed issue causing
stopLiveStreaming()to fail. - Self-signed meeting tokens with
is_ownerset to true can now start recordings.
daily-js 0.14.0
- Added
byDeviceInUseas a possibleparticipants().local.tracks.video.blockedproperty. Now, when Daily can’t access a camera on Windows because another app is using it,participants().local.tracks.video.blocked.byDeviceInUsewill be set totrue, and a'participant-updated'event will fire. This sets you up to handle the use case (say, by showing a prompt asking your user to close other apps that might be using the camera).
react-native-daily-js 0.11.0
- Fixed
setNativeInCallAudioMode(). - Synced Daily’s
react-native-webrtcfork with the upstream version 1.89.2, which contains a more modern M89 build of libwebrtc (we were previously relying on M75). With this update, you can make release builds on iOS that leverage bitcode (see README for details). Some things to keep in mind:- Since
@daily-co/react-native-webrtcis specified as a peer dependency ofreact-native-daily-js, you’ll need to update your project to depend on the appropriate version. You should get a warning atnpm installtime about the version you need—heed it. - iOS 10 and below are no longer supported starting with this version.
- Use of the Chrome debugger is no longer supported due to a change (Android, iOS) in the upstream
react-native-webrtc. We recommend instead using the Safari debugger for debugging JavaScript on iOS.
- Since
Other bug fixes and improvements
- We switched the default
signaling_implfor all Daily domains to"ws"(WebSocket signaling) to increase connection speed and network reliability across calls.

daily-js 0.13.0
- 🗺 Added
'lang-updated'event that fires when setDailyLang() is called and changes the call language. The payload includes two values:langandlangSetting.langis the language currently in effect.langSettingis the value the user explicitly specified (e.g. viasetDailyLang()) that resulted in that language ultimately being set. For example, if you callsetDailyLang('en'), both yourlangand yourlangSettingwill be'en'. If you callsetDailyLang('user'), where'user'is a special language setting that instructs Daily to use the user’s browser’s language preference, thenlangSettingwill be'user'andlangwill be the language chosen based on the browser setting:'en','fr','pt', or any other Daily-supported language. - 🎫 Shipped
getMeetingSession()method that returns the current meeting session id. A meeting session is a set of one or more people in a room together during a specific time window. - ✨ Released
'meeting-session-updated'event that fires when the meeting session changes. One meeting session ends and another begins, for example, when you’ve been sitting alone in a room for 10 minutes. - 🇳🇴 Added Norwegian language support in Daily Prebuilt (language code
"no").
react-native-daily-js 0.10.0
- ⬆️ See above!
Bugfixes
- 🐛 Squashed! If you invoked two or more async methods (like
getInputDevices(),room(),requestAccess(), etc.) within the same millisecond, some of those methods might never have resolved. - 🚨 When a call-ending error happens while using Daily Prebuilt, the call iframe will no longer be cleared. Instead, a relevant user-friendly error message (which might be an oxymoron) will be displayed.
- ✅ Improved a11y on Daily Prebuilt close button
- 🚀 Other Daily Prebuilt performance improvements

daily-js 0.12.0
- 🛤 Built support for custom tracks outside of the standard Daily built-in
cam-audio,cam-video,screen-audio,screen-video. Contact us for beta docs. - 📈 Enhanced network stats detection
- ❗️ Created error message to specify if a participant has been
ejected-from-meeting - 🛑 Added an optional
errorfield to the'camera-error'and'error'event payloads, in addition to the existingerrorMsgfield. This newerrorfield includes a type (which you can think of as an error code but a string constant) and an optionallocalizedMsg, which can provide you with a localized UI-friendly message describing the error. See index.d.ts’sDailyCameraErrorTypeandDailyFatalErrorTypefor supported error types so far. - ❌ Improved preauth for expired or invalid meeting tokens and rooms
- 🗺 Shipped
getDailyLang(), which returns a Promise that resolves to{ lang: <language>, langSetting: <specified language> }, telling you both the language actually in effect and the language you’ve specified. For example, if you’ve specified'user'as your language,getDailyLang()might return{ lang: 'en', langSetting: 'user'}. - 🌎 Added
'user'as a possible value when invokingsetDailyLang()or as alangproperty when invokingjoin(),preAuth(),startCamera(), or factory methods likecreateFrame().'user'instructs Daily to use the user’s preferred language as specified by the browser.
react-native-daily-js 0.9.0
- ❗️ See the
ejected-from-meeting, preauth, and'error'event payload updates above.
Bugfixes and other improvements
- 🐛 Updated error handling for revoked camera and mic permissions mid-call
- 👋 So long, Edge 18, it’s been a wild ride.
supportedBrowser().supportednow returnsfalsefor Edge 18.
New blog posts and podcasts

daily-js 0.11.0
🔇 More insight into why a participant’s audio or video might be off.
If a meeting owner explicitly mutes a participant viaupdateParticipant(id, { setAudio: false }) or updateParticipant(id, { setVideo: false }), or mutes multiple participants via updateParticipants(), then participants()[id].tracks.audio.off and participants()[id].tracks.video.off may now include byRemoteRequest: true.Note that whenThe current default value is 9, which is also the maximum number that may be specified.byRemoteRequest: trueis set,byUser: truewill also be set. You don’t have to change any existing code and can continue treating meeting-owner-triggered mutes as regular mutes. When a user unmutes themselves,byRemoteRequestdisappears along withbyUser.
🎥 Specify max_cam_streams used in a live stream.
When using the default layout in startLiveStreaming(), you can now limit the number of camera streams included in the live stream to the specified number.react-native-daily-js 0.8.0
🔏 (BETA) Room access control methods and events
If you’re using WebSocket signaling (signaling_impl = 'ws' in your room config), then you can try out a new set of room access control APIs geared towards implementing a “lobby”. Users can request “full” access to a meeting and wait for a meeting owner to let them in.These new methods and events let you:- Determine the local participant’s access level, even before attempting to join a meeting:
preAuth(),accessState(),'access-state-updated' - Request elevated access to a meeting:
requestAccess() - Manage pending access requests (if you’re a meeting owner):
waitingParticipants(),updateWaitingParticipant(),updateWaitingParticipants(),'waiting-participant-added','waiting-participant-updated','waiting-participant-removed'
🔇 More insight into why a participant’s audio or video might be off (see daily-js 0.11.0 above).
Bugfixes and other improvements
- 📹 The
'recording-started'event payload now includeslocalandrecordingId.
New blog posts and podcasts

daily-js 0.10.0
🔏 (BETA) Room access control methods and events
If you’re using the Daily call object along with WebSocket signaling (signaling_impl = 'ws' in your room config), then you can try out a new set of room access control APIs geared towards implementing a “lobby”. Users can request “full” access to a meeting and wait for a meeting owner to let them in.These new methods and events let you:- Determine the local participant’s access level, even before attempting to join a meeting:
preAuth(),accessState(),'access-state-updated' - Request elevated access to a meeting:
requestAccess() - Manage pending access requests (if you’re a meeting owner):
waitingParticipants(),updateWaitingParticipant(),updateWaitingParticipants(),'waiting-participant-added','waiting-participant-updated','waiting-participant-removed'
🐛 Bugfixes
setInputDevicesAsync()andgetInputDevices()can now more reliably be used any time before invokingjoin().- The ‘fullscreen’ and ‘exited-fullscreen’ events now have the expected payloads:
{ action: 'fullscreen' }and{ action: 'exited-fullscreen' }, respectively.
New blog posts and podcasts

daily-js 0.9.999 and react-native-daily-js 0.7.1
- 🔌 All new Daily domains now default to web socket signaling. Using web sockets makes muting, unmuting, and changing track subscriptions faster.
- 👩👩👧👧 You can now update all participants on a call at once when you pass
*to theupdateParticipants()method. For example, here’s how you’d subscribe to all participants’ media tracks:callObject.updateParticipants({'*': {setSubscribedTracks: true}});. - 🚪 The
room()method now returns comprehensiveconfigproperties, including both explicitly-set and default values. To only see explicitly-set properties, pass in a new{includeRoomConfigDefaults: false}argument.room()now also returnsdomainConfigproperties describing the room’s domain. - 🎥
recording-startedandrecording-stoppedevents now fire for all participants—not just the recorder—when someone starts recording the meeting. Additionally,DailyParticipantobjects (the ones returned byparticipants()) have a newrecordfield that indicates whether the participant is recording.
Performance improvements
- 📺 Improved our RTMP pipeline performance, and reduced CPU usage during the background generation process. Added support for RTMPS.
- 🛤 Better track subscription performance, especially when updating multiple tracks.❗️important reminder: if you need to update multiple participants, call the
updateParticipants()method once, notupdateParticipant()multiple times.
Other bug fixes
- 🐛 Fixed edge case that ignored
max_participantsproperty. - ⏰ Adjusted client-side timestamps sent in via logging and telemetry to align with server time.
- 🖌 UI dashboard updates: centered chevron, added scroll away domain menu and tooltips on hover, new status codes on webhooks in API logs.
New blog posts and podcasts
January 26, 2021

daily-js 0.9.997
- 🛤 The participant list returned by
participants()(and all events that return a list of participants), now includes atracksproperty which gives you a more granular representation of the state of each track. Seeparticipants()docs for more. (Also available inreact-native-daily-js). - 👩 In the prebuilt UI you can now control whether your local video is displayed in the corner, with a setter (
setShowLocalVideo()), a getter (showLocalVideo()), and a property to pass into factory methods or at meeting join time (showLocalVideo). - 👩👩👧👧 Additionally, in the prebuilt UI you can now control whether the participants bar (the row of videos during a screenshare) is displayed, with a setter (
setShowParticipantsBar()), a getter (showParticipantsBar()), and a property to pass into factory methods or at meeting join time (showParticipantsBar). - 📛 Added
setUserName()for programmatically setting the user name that other participants see either visually in the prebuilt UI or through theuser_nameproperty in theparticipantsobject corresponding to you. - The new
setInputDevicesAsync()method returns a Promise.
Live streaming
- 📺 Our RTMP streaming backend is now more stable and compatible with more services.
- 🎞 The keyframe interval while live streaming has been dropped from 3 seconds to 2 seconds, in line with ingest stream recommendations on major streaming services.
Bugfixes and other improvements
- 🐛 Fixed a bug where when leaving an iframe-based meeting by clicking the leave button in the iframe, stale participants from that meeting would “linger” in
participants(), necessitating the creation of a newDailyIframefor a new meeting. - 🛤 TypeScript declaration fixes for
track-startedandtrack-stoppedevents. - 🎨 TypeScript declaration fixes wherever CSS properties are expected.