Skip to main content
Archived changelog entries from 2021. For the latest updates, see the changelog.
The latest updates to the Daily real-time audio and video API include background blur for Daily Prebuilt and more.Example video call with background image blurred. Text reads background blur over the image

daily-js 0.21.0

  • Beta ✨ Blur participant backgrounds on Daily video calls via a new inputSettings DailyIframe property or updateInputSettings() method.
  • Beta ✨ Determine whether a browser supports background blur by checking the supportsVideoProcessing property returned by supportedBrowser().
  • 🎥 All recording-started events 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", the recording-started event will also include startedBy with the participant ID of the person who started the recording. "cloud-beta" recordings will also include the same layout property as live streaming events.
  • ☁️ The "cloud-beta" recording type now emits recording-started and recording-stopped events.
  • 🇷🇺 Added Russian language support. Set the DailyIframe lang property to "ru", or pass "ru" to setDailyLang() to specify Russian as the language of choice.

Daily Prebuilt

  • Beta ✨ Toggle background blur participant controls in Daily Prebuilt. The new enable_video_processing_ui property, avaliable at the room or domain level, displays a UI that allows participants to blur or unblur their backgrounds. This property defaults to true (showing the controls) if not explicitly set to false.
  • 📜 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

  • 🌫 Enable or disable enable_video_processing_ui for your domain or room to toggle beta background blur controls in Daily Prebuilt.
  • 🇷🇺 Set "ru" as the language for a room.
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-changed event that fires when a local participant hides or shows their own video element (when the setShowLocalVideo() 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 additional variant key 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 the is_owner flag 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_participants property to the data returned from the /meetings REST 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.Video call with one participant large and and other smaller participants float to top leftSelf-view, if enabled, now floats to the top of a Daily Prebuilt call with setShowParticipantsBar(false).

daily-js 0.17.0

  • 🗣 Shipped activeSpeakerMode iframe 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 layoutConfig customizes 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 video and screenVideo. A higher simulcast layer corresponds to higher quality. The new affordances are:
Note: Simulcast layer settings only apply when a call is in SFU mode.

react-native-daily-js 0.14.0

Daily Prebuilt

  • 🙈 You can now toggle whether or not you see your own video during a call.
  • 🧩 The new layoutConfig iframe 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 to false with 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.Daily Prebuilt video call mobile displayExplore new custom colors in Daily Prebuilt.

Daily Prebuilt

  • 🎨 You can now customize colors in Daily Prebuilt! Pass your own hex codes as a theme property to join() or createFrame(), or use the new setTheme() 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_exit property.
  • 🤫 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.
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.Daily Prebuilt video call mobile displayOur 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!
Additionally:
  • 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_offand start_audio_off and then immediately called setLocalAudio(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 byDeviceInUse as a possible participants().local.tracks.video.blocked property. Now, when Daily can’t access a camera on Windows because another app is using it, participants().local.tracks.video.blocked.byDeviceInUse will be set to true, 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-webrtc fork 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-webrtc is specified as a peer dependency of react-native-daily-js, you’ll need to update your project to depend on the appropriate version. You should get a warning at npm install time 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.

Other bug fixes and improvements

  • We switched the default signaling_impl for all Daily domains to "ws" (WebSocket signaling) to increase connection speed and network reliability across calls.
Four video screens on a Daily Prebuilt video callIntroducing the new Daily PrebuiltWe’ve shipped two new products since we last wrote! Find the full details about Daily Prebuilt and Live Streaming over on the blog. Or, keep reading here for other updates! As always, if you have feedback, we’d love to hear it.P.s. Join us on Clubhouse! We’ll be hosting recurring conversations about the creator economy. It’d be great if you could make it.

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: lang and langSetting. lang is the language currently in effect. langSetting is the value the user explicitly specified (e.g. via setDailyLang()) that resulted in that language ultimately being set. For example, if you call setDailyLang('en'), both your lang and your langSetting will be 'en'. If you call setDailyLang('user'), where 'user' is a special language setting that instructs Daily to use the user’s browser’s language preference, then langSetting will be 'user' and lang will 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
Example text chat in a React app featuring Winona and KeanuUse the Daily sendAppMessage() method to build a React chat component in our new tutorial.

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 error field to the 'camera-error' and 'error' event payloads, in addition to the existing errorMsg field. This new error field includes a type (which you can think of as an error code but a string constant) and an optional localizedMsg, which can provide you with a localized UI-friendly message describing the error. See index.d.ts’s DailyCameraErrorType and DailyFatalErrorType for 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 invoking setDailyLang() or as a lang property when invoking join(), preAuth(), startCamera(), or factory methods like createFrame(). '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().supported now returns false for Edge 18.

New blog posts and podcasts

Audio-only demo app Party Line features icons representing speakers and listenersTest out an audio-only platform or build your own with our Party Line demo and source code.In addition to all changes below, since we last wrote we shipped a multi-platform audio-only demo we’re calling Party Line. Read on, then Party on!

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 via updateParticipant(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 when byRemoteRequest: true is set, byUser: true will 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, byRemoteRequest disappears along with byUser.
The current default value is 9, which is also the maximum number that may be specified.

🎥  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:

🔇  More insight into why a participant’s audio or video might be off (see daily-js 0.11.0 above).

Bugfixes and other improvements

New blog posts and podcasts

Photo of Wesley Faulkner and title of video AMAWatch our first-ever video AMA with Wesley.Read on for details about our first release under a new versioning scheme (we got tired of all those 9’s).

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:

🐛  Bugfixes

New blog posts and podcasts

Daily Developer page screenshot with cards for embedding video chat, building from scratch on mobile or desktop, and the APIWe launched a new docs landing page! Have a look when you get a chance, and read on for more updates.

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 the updateParticipants() method. For example, here’s how you’d subscribe to all participants’ media tracks: callObject.updateParticipants({'*': {setSubscribedTracks: true}});.
  • 🚪  The room() method now returns comprehensive config properties, including both explicitly-set and default values. To only see explicitly-set properties, pass in a new {includeRoomConfigDefaults: false} argument. room() now also returns domainConfig properties describing the room’s domain.
  • 🎥  recording-started and recording-stopped events now fire for all participants—not just the recorder—when someone starts recording the meeting. Additionally, DailyParticipant objects (the ones returned by participants()) have a new record field 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, not updateParticipant() multiple times.

Other bug fixes

  • 🐛  Fixed edge case that ignored max_participants property.
  • ⏰  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

A sample webinar app showing local video and participants being hidden

daily-js 0.9.997

  • 🛤  The participant list returned by participants() (and all events that return a list of participants), now includes a tracks property which gives you a more granular representation of the state of each track. See participants() docs for more. (Also available in react-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 the user_name property in the participants object 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 new DailyIframe for a new meeting.
  • 🛤  TypeScript declaration fixes for track-started and track-stopped events.
  • 🎨  TypeScript declaration fixes wherever CSS properties are expected.