What's Changed
Highlights
This release brings a major architectural shift: call participation and video tiles now rely on MatrixRTC membership instead of the LiveKit room state. This marks the final step toward enabling to-device media key exchange. To support this change, we introduced a new MembershipManager, ensuring RTC membership is accurately handled across all scenarios.
Additionally this release includes various usability improvements.
Key updates:
- Implement the new MatrixRTCSession MembershipManager
- Base (call participation) video tiles on MatrixRTC membership rather than LiveKit participants (a prerequisite for to-device E2EE key distribution)
- Improve UX by making on-screen tile selection and arrangement more stable
- Add sound effects for call exits and screen share activation
- Introduce a wave/hello reaction 👋
- Ensure new devices don't start unmuted by default
- Remember previous mute states when devices disconnect and reconnect
- Begin handling errors more gracefully, including:
- SFU capacity limits
- Missing MatrixRTC backend in a Matrix site deployment
- Enhancements in widget mode:
- Adapt to theme changes during a call
- Hide the header
- On Failure: leave session and show relevant error
- Introduce a "close" action when the widget is ready to shut down (allowing error messages to be displayed and benefiting other widgets)
- Notify users when their camera is initializing in the Lobby
- Authenticate media requests when loading avatars
Changes
- Upgrade js-sdk to develop with MSC4222 state_after support by @hughns in #2841
- Mute state improvements including muting if skipLobby=true in SPA (Same as #2834) by @toger5 in #2846
- Fix wrong hand raise margins in pip tile. by @toger5 in #2840
- Fix Cache-Control header for docker images by @hughns in #2847
- Bump js-sdk (key after leave fix) by @toger5 in #2850
- Use light background by @toger5 in #2851
- Add sound effect for call joined / left by @Half-Shot in #2794
- Show hostname in developer settings by @hughns in #2857
- Add a lower limit to duplicate tiles. by @Half-Shot in #2854
- add information about MSC4222 state_after by @fkwp in #2864
- Rename
en-GB
language toen
by @hughns in #2866 - Use a consistent background colour for video tiles and avatars by @hughns in #2868
- Make video tiles be based on MatrixRTC member not LiveKit participants by @toger5 in #2701
- Localazy Download by @RiotRobot in #2877
- Use specific Node.js version (22) instead of latest LTS by @hughns in #2879
- Authenticate media requests when loading avatars by @Half-Shot in #2856
- Ensure call sound effects are played over the correct sink by @Half-Shot in #2863
- Configure sentry integration for netlify PR previews by @hughns in #2884
- Update dependency vite to v6 by @renovate in #2853
- Add missing full stops from end of settings descriptions by @hughns in #2883
- Ignore URL params where they are not applicable for the mode (widget vs SPA) by @hughns in #2882
- Check for parentUrl when deciding whether a SPA specific url parameter should be ignored by @hughns in #2881
- Enable @typescript-eslint/consistent-type-imports lint rule by @hughns in #2886
- Simplify settings tabs by @hughns in #2875
- Add some quick-and-dirty debug info for TileStore by @robintown in #2887
- Rename developerSettingsTab to developerMode for consistency by @hughns in #2889
- Add support for playing a sound when the user exits a call. by @Half-Shot in #2860
- Clean up useMuteStates test by @hughns in #2891
- Refactor preferences tab strings for consistency by @hughns in #2888
- Bump matrix-js-sdk by @hughns in #2897
- Determine which tiles are on screen in a more stable manner by @robintown in #2894
- Developer setting to show LiveKit participants that do not have MatrixRTC sessions a.k.a. non-member tiles by @hughns in #2771
- Wait for .well-known/matrix/client to load before determining MatrixRTC foci by @hughns in #2901
- Localazy Download by @RiotRobot in #2898
- Revert "Wait for .well-known/matrix/client to load before determining MatrixRTC foci" by @toger5 in #2902
- Skip some redundant updates to the grid and spotlight by @robintown in #2899
- Support selection of audio output device when using Firefox by @robintown in #2816
- Use finnish notation for observables by @hughns in #2905
- Use afterEach from vitest for consistency by @hughns in #2908
- Use AutoDiscovery.getRawClientConfig() instead of MatrixClient.getClientWellKnown() and wait for result by @hughns in #2906
- Bump matrix-js-sdk for bundle improvements by @hughns in #2911
- Introduce intent URL param and make it change the default lobby behaviour by @hughns in #2828
- Inform user that their camera is starting in Lobby by @hughns in #2869
- Fix loading of matrix-sdk-crypto-wasm when running in local development mode by @hughns in #2915
- Add screen share sound effect. by @Half-Shot in #2917
- Refactor reactions / hand raised to use rxjs and start ordering tiles based on hand raised. by @Half-Shot in #2885
- Update dependency @livekit/components-react to v2.6.10 by @renovate in #2920
- Update LiveKit components by @renovate in #2923
- Add developer mode option to show RTC connection statistics by @hughns in #2904
- Update dependency @vector-im/compound-design-tokens to v3 by @renovate in #2896
- Upgrade to React Router v6 by @sandhose in #2919
- Update dependency i18next to v24 by @renovate in #2822
- Remove unnecessary dependency on @testing-library/react-hooks by @hughns in #2926
- Use documented @sentry/vite-plugin config options by @hughns in #2925
- Update dependency @vector-im/compound-web to v7.6.2 by @renovate in #2932
- Update codecov/codecov-action action to v5 by @renovate in #2933
- Update docker/build-push-action action to v6.11.0 by @renovate in #2936
- Set the document title to the current call name. by @Half-Shot in #2928
- Add wave/hello reaction by @davidegirardi in #2921
- React to theme changes in widget mode by @robintown in #2910
- Update dependency global-jsdom to v26 by @renovate in #2941
- Update dependency jsdom to v26 by @renovate in #2938
- Type fixes for react v19 compatibility by @hughns in #2937
- Update GitHub Actions by @renovate in #2945
- Use correct Sentry entrypoints for react router v7 by @hughns in #2943
- Disambiguate displaynames by @Half-Shot in #2918
- Bump matrix-js-sdk to latest by @hughns in #2946
- Fix displayname calculation around RTL / unhomoglyth. by @Half-Shot in #2953
- Update dependency @sentry/vite-plugin to v3 by @renovate in #2950
- Update vitest monorepo to v3 (major) by @renovate in #2954
- Remember previous mute states when devices disappear and reappear by @robintown in #2957
- Make error screens more visually consistent by @robintown in #2951
- Prevent new devices from automatically starting unmuted in call by @robintown in #2959
- Update dependency vite to v6.0.9 [SECURITY] by @renovate in #2964
- Fix calculation of local membership identifier by @Half-Shot in #2966
- Update dependency @stylistic/eslint-plugin to v3 by @renovate in #2968
- Automatically deploy livekit branch to call.element.dev via workflow dispatch by @hughns in #2974
- Do run build workflow/action in CI when GHA workflows change by @hughns in #2976
- Adjust renovate bot schedule and enable vulnerability updates by @hughns in #2977
- Fix renovate schedule settings by @hughns in #2979
- Fix screenshare displayname displaying as [👻] by @Half-Shot in #2981
- Bump matrix-js-sdk to v36.1.0 by @toger5 in #2967
- Resolve version clash in matrix-widget-api dependency by @toger5 in #2988
- dual license AGPL + Commercial by @ara4n in #2984
- Update dependency vitest to v3.0.5 [SECURITY] by @renovate in #2986
- Update LiveKit components by @renovate in #2962
- Use --frozen-lockfile when install deps in CI by @hughns in #2992
- Cleanup GitHub Actions by @hughns in #2983
- Don't produce compressed assets at build time and instead do it as part of the nginx build by @hughns in #2995
- Explicitly build and publish docker for develop/livekit branch by @hughns in #2996
- Show current SFU and Server Info in developer tab by @hughns in #3000
- Copyright header should say dual license not just AGPL by @hughns in #3013
- Send a 'close' action when the widget is ready to close by @robintown in #3011
- Actually hide the header on error pages by @robintown in #3019
- Clarify what useLatest is for by @robintown in #3020
- Leave session when error occurs and show error screens in widget mode by @robintown in #3021
- Show an error screen when the SFU is at capacity by @robintown in #3022
- Update config.sample.json by @escix in #3001
- Update readme to reflect latest config.json and matrix-js-sdk dependency by @hughns in #3028
- Update dependency livekit-client to v2.9.5 by @renovate in #3029
- Error Handling: gracefully handle missing livekit service url in config by @BillCarsonFr in #3027
- Localazy Download by @RiotRobot in #3030
- Update GitHub Actions by @renovate in #3034
- Fix: i18n not properly configured in vitest by @BillCarsonFr in #3037
- Added OpenGraph and Twitter meta tags for better link previews by @Harshal-Taori-11 in #3006
- Change LK log level to warn by @toger5 in #3049
- Prevent PRs with the X-Blocked label from being merged by @robintown in #3041
- Send a 'join' action when entering the call by @robintown in #3055
- Use the configured brand name in OpenGraph tags by @robintown in #3054
- Respect the returnToLobby flag by @robintown in #3051
- Reduce redundant calculations of display name map by @toger5 in #3062
- Use the New MatrixRTCSession MembershipManager by @toger5 in #3015
- Pin matrix-js-sdk to a specific commit by @hughns in #3082
- Close button instead of go to home when in widget mode by @BillCarsonFr in #3087
- Fix: js-sdk version that uses expected value for isJoined (isJoined will now be false before we left as expected by EC) by @toger5 in #3094
- Downgrade to livekit client v2.9.1 by @hughns in #3106
New Contributors
- @escix made their first contribution in #3001
- @BillCarsonFr made their first contribution in #3027
- @Harshal-Taori-11 made their first contribution in #3006
Full Changelog: v0.7.2...v0.8.0. No changes since v0.8.0-rc.4.