github workadventure/workadventure v1.34.0

5 hours ago

WorkAdventure 1.34: Quality of life improvements, new translations and improved analytics

We keep improving WorkAdventure to make it more enjoyable and easier to use. In this release, we have tried to
listen to your feedback and improve the quality of life. Whether you are organizing large meetings, using WorkAdventure
day to day or are managing a world, we hope you will find something useful in this release.

New features

Raise your hand

You can now raise your hand in a meeting, in a bubble or in an audience zone.
This is particularly useful in large meetings where you want to ask a question without interrupting the speaker,
or when you are in a listening to a presentation in an audience zone and want to ask a question to the speaker.

image

The raised hand will be visible to everyone. Administrators can lower the hand of a participant if needed.

In podiums and audience zones, users raising their hand can be granted the ability to speak by the speaker.
This allows the speaker to control who can speak and when, while still allowing participants to ask questions
without interrupting the speaker. Don't forget that anyone walking into a speaker area becomes a speaker, so if you want to
control who can speak, make sure to lock the podium and only allow speakers to enter (using a "restricted rights area"
on the speaker zone).

View pull requests
  • feat(meeting): raise hand with ordering by @ydiarra in #6292
  • Raise hand: typed space state, generic space queries and JSON Patch by @ydiarra in #6598
  • fix(raise-hand): list a hand raised in several spaces once by @ydiarra in #6647
  • fix(raise-hand): raise the hand in one space, with a picker like the lock by @ydiarra in #6650
  • fix(raise-hand): one raised-hands panel section per space (re-land #6651) by @ydiarra in #6656
  • docs(raise-hand): document raising your hand by @ydiarra in #6654

Kick and ban from inside the game

You can now kick and ban a user right from inside the WorkAdventure. Previously banning a user required to connect
to the admin dashboard, find the user in the user list and ban them from there. That was a lot of clicks for an
action that is often needed in the middle of a meeting. Now, you can ban a user right from inside the game.

In addition, you can now kick a user. Kicking a user is a temporary action that will disconnect the user from the world.
The user can then reconnect to the world. Useful to temporarily remove a user from a meeting or a conversation if they
forgot to log out and left a WorkAdventure tab open in the background.

image

Banning requires an admin API (as any action that requires storing a state). Kicking is available even without an admin
API, provided you have a logged user with the "admin" tag.

View pull requests
  • feat(moderation): kick and ban a user from inside the game by @ydiarra in #6591
  • feat(moderation): remove the ban warning message sent from the admin by @moufmouf in #6618
  • feat(moderation): take the IP of a banned user from the back by @ydiarra in #6626
  • feat(moderation): choose between a ban by account and a ban by IP by @ydiarra in #6619
  • fix(i18n): ban confirmation no longer says the ban is permanent by @ydiarra in #6655

New translations

We are happy to announce that WorkAdventure is now available in Vietnamese and Thai!

View pull requests

Gong, jukebox and other objects making sound

You can now place a gong or a jukebox in the middle of your map and let anyone hear it.

Do you have happy employees who want to ring the gong when they finish a big project? Or do you want to play
chimes to signal the start of a session? We have you covered!

In the past, the map editor would allow you to place a attach a sound to an entity (i.e. an object), but only
the user that triggered the sound would hear it. Starting with 1.34, you can now configure a sound to be heard by
everyone on the map. Optionally, you can choose a radius around the object where the sound will be heard.

image

Thanks a lot to @Pix3lqu4ntum and his team for implementing this feature!

View pull requests
  • feat(map-editor): let a play sound property be heard by everyone on the map by @Pix3lqu4ntum in #6599
  • fix(map-editor): accept a null audible radius by @moufmouf in #6658

Improvements

Improved loading

Previously, WorkAdventure had to be in the foreground to load. If a tab was opened but kept in the background, it would
not load until it was brought to the foreground. As a result, any user pinning a tab in their browser would need to
click the WorkAdventure tab to load it, which was not ideal. The behaviour was inherited from the Phaser game engine
we use, and it was not trivial to change. We are happy to announce that we have found a way to make WorkAdventure load
even when it is in the background. You can now pin WorkAdventure in your browser and it will load when you reopen
your browser!

View pull requests
  • feat(front): let a window that starts in the background load its world by @ydiarra in #6495

Chat links open as co-websites

When clicking on a link in the chat, it will now open as a co-website instead of opening in a new tab (if possible).
This allows users to view the linked content together with their colleagues in the same WorkAdventure session.

View pull requests
  • feat(chat): open chat links as co-websites instead of new tabs by @ydiarra in #6364

Improved codec selection

"WorkAdventure uses too much CPU when screen sharing"

"Screen sharing is blurry!"

Those are the 2 sides of the same coin. Either you spend a lot of CPU to get the best possible video quality, or you
spend less CPU and get a lower video quality. There is not one solution that fits all users, but v1.34 will do
its best to provide the most optimal solution for each user, by dynamically adapting the codec and topology
based on the user's device, CPU usage and network conditions.

  • In P2P bubbles, viewers that do not display the video will no longer receive a P2P video stream. This will save
    bandwidth and CPU usage for both the sender and the viewer.
  • Mobile phones will now only use codecs for which they have hardware acceleration. This will reduce CPU usage and
    improve battery life.
  • When a sender's CPU is overloaded, WorkAdventure will now automatically switch to a cheaper codec for that sender.
  • When a sender's CPU is overloaded and the sender is in a bubble with several P2P viewers, WorkAdventure will now
    automatically move the sender to a LiveKit meeting room. This will reduce CPU usage for the sender.
View pull requests
  • Stop P2P video encoding for viewers that do not display it; keep FPS variability free of deliberate changes by @moufmouf in #6506
  • Choose video codecs by quality setting and device, budget bitrate per codec by @moufmouf in #6523
  • Leave a codec for a cheaper one when the encoder is CPU-limited by @moufmouf in #6534
  • Move a bubble to LiveKit when a member's encoders cannot keep up with several P2P peers by @moufmouf in #6535

Improved analytics

The Admin API now has a new endpoint to ingest "generic" analytics events (in addition to PostHog that was already used).
The endpoint will receive events when someone join or leaves a room, a meeting, a space... Most events sent to PostHog
are now sent to the Admin API as well. Furthermore, the Admin API gets exact timing for events that have a duration
(like time spent on the map or in a meeting room, etc.)

The SaaS version of WorkAdventure will soon be able to use this new endpoint to provide detailed analytics to map owners.

View pull requests
  • feat(analytics): add generic analytics pipeline by @ydiarra in #6185
  • Report encoder health (qualityLimitationReason, encoderImplementation) in video quality analytics by @moufmouf in #6505
  • fix(analytics): end an interval at the last proven activity, not at the socket close by @ydiarra in #6551
  • fix(analytics): stop counting the megaphone space as a meeting, and measure broadcasts properly by @ydiarra in #6549
  • feat(analytics): say which meeting a microphone or speaking period happened in by @ydiarra in #6559
  • feat(analytics): let the back own the meeting it already runs by @ydiarra in #6553
  • feat(analytics): meeting actions, and the Teams / Google Meet areas by @ydiarra in #6554
  • fix(analytics): report a meeting under the space name the clients use by @ydiarra in #6595
  • feat(recording): tell the admin when an egress ends by @ydiarra in #6501
  • feat(analytics): publish the analytics event catalog as JSON Schema by @moufmouf in #6597
  • feat(analytics): report the seconds each media transport carried a meeting by @ydiarra in #6610

Improved virtual backgrounds

Virtual backgrounds are now powered by MediaPipe Tasks Vision, which provides better segmentation and performance
than the previous solution. The segmentation is now done in a web worker, which improves the responsiveness of
the interface. The segmentation mask is also smoothed over time to reduce flickering.

View pull requests
  • Make MediaPipe Tasks Vision the only virtual background engine, drop video backgrounds by @moufmouf in #6561
  • Serve the Tasks Vision wasm and model as content-hashed vite assets by @moufmouf in #6562
  • Run background effects in a worker fed by insertable streams by @moufmouf in #6563
  • Segment every 2nd frame and adapt the interval to segmentation time by @moufmouf in #6564
  • Smooth the segmentation mask over time, share the composite between blur and replace by @moufmouf in #6565
  • Use the landscape selfie segmenter on landscape cameras by @moufmouf in #6566
  • Gate background effects on device capability by @moufmouf in #6567
  • Report how the virtual background pipeline performs by @moufmouf in #6568
  • Smoke-test the virtual background on Chromium by @moufmouf in #6569

Improved privacy settings

WorkAdventure helps you protect your privacy while allowing you to be quickly reachable at the same time.
For this, we make a difference between users that have the WorkAdventure tab focused, and users that have the
WorkAdventure tab in the background. When WorkAdventure is in the background, the user is considered "away".

In "away" mode, the user can decide if they want to share their camera and microphone or not. So everyone
can choose what they are confortable with. In the past, the default settings were to share the microphone and
not share the camera. Starting with 1.34, the default settings are now configurable by setting
environment variables (if you are self-hosting WorkAdventure) or by configuring your world (in the SaaS version
of WorkAdventure). The new default settings are unchanged: share the microphone and not share the camera.
But now, you can now change these settings to your liking. In the end, the end user can always override the
default settings.

Thanks a lot to @0xr2po for this first contribution!

  • feat(play): add DEFAULT_CAMERA_PRIVACY_SETTINGS and DEFAULT_MICROPHONE_PRIVACY_SETTINGS by @0xr2po in #6544

Faster unmute

We noticed that unmuting a user could take a few seconds, especially when the user is using Bluetooth headphones (like
AirPods). Additionally, the quality of the audio could be degraded after unmuting. V1.34 fixes both issues.

View pull requests
  • fix(webrtc): keep the P2P audio sender while muted instead of renegotiating by @ydiarra in #6606
  • fix(media): make unmuting instant during a conversation by @ydiarra in #6603

Other improvements

View pull requests
  • Hide PiP button on mobile phones by @moufmouf in #6526
  • map-storage: advertise a direct upload URL to bypass proxy body-size limits by @moufmouf in #6557
  • Add contributor avatars to the README by @Arata1202 in #6542
  • docs: update contributors by @github-actions[bot] in #6577

Code improvements

View pull requests
  • refactor(play): simplify BreakpointsUtils and drop its dead helpers by @moufmouf in #6497
  • refactor(play): drop the inert isMobile branch in GlobalCommunicationModal by @moufmouf in #6498
  • docs: document WA.player.isLogged by @moufmouf in #6504
  • chore: remove the deprecated /register/ login path by @moufmouf in #6508
  • Upgrading to Playwright 1.63.0 by @moufmouf in #6517
  • ci(uploader): run the S3 tests against RustFS instead of MinIO by @moufmouf in #6539
  • ci(e2e): balance Playwright shards by duration instead of test count by @moufmouf in #6543
  • helm: per-ingress annotations for the map-storage ingress by @moufmouf in #6571
  • docs: explain how to verify WA.player.userRoomToken by @moufmouf in #6579
  • feat(map-editor): enable broadcast areas for everyone by @moufmouf in #6621
  • chore(chat): upgrade matrix-js-sdk 41.8.0 → 42.4.0 by @ydiarra in #6593

Bug fixes

Many bug fixes have been made in this release. One notable was a regression introduced in v1.31 that caused speakers
in large meetings to not be automatically moved at the top of the participants list, forcing each participant to
scroll through the list to find the active speaker. This is fixed in 1.34.

View pull requests
  • fix(tests): drop the dead duplicate field in AreaLivekit by @ydiarra in #6417
  • fix(spaces): stop duplicate unregister from tearing down a departed user by @moufmouf in #6500
  • fix(back): stop sending WEBRTC to the user who tips a bubble into LiveKit by @ydiarra in #6502
  • fix(menu): stop the open submenu from closing itself by @moufmouf in #6511
  • fix(calendar): format dates with the browser locale by @ydiarra in #6510
  • test(e2e): wait for the lock broadcast before pathfinding moves in the lockable area tests by @ydiarra in #6496
  • fix(chat): never announce a proximity bubble with an empty user list by @moufmouf in #6516
  • fix(map-editor): stop the Jitsi advanced options from crashing on render by @ydiarra in #6514
  • fix(screenshare): stop erroring on our own outgoing screen-share peers by @ydiarra in #6509
  • feat(map-editor): make an area hold a single meeting, extension modules included by @ydiarra in #6515
  • fix(chat): stop "send message" from opening a group room as a DM by @ydiarra in #6522
  • fix(i18n): drop the stray $ shown before the calendar and todo list labels by @ydiarra in #6525
  • fix(chat): clear the user providers filter when closing the search bar by @ydiarra in #6524
  • fix(chat): allowlist inline mime types for Matrix attachments by @ydiarra in #6503
  • test(e2e): fix the two biggest sources of flaky CI on master by @moufmouf in #6536
  • test(e2e): replace the lock-area unlock sleep with a retry by @moufmouf in #6537
  • fix(pusher): let the admin socket receive a large listen message by @ydiarra in #6532
  • fix(chat): key the user list rooms by playUri instead of room name by @ydiarra in #6548
  • fix(chat): look users up by profile instead of the user directory by @moufmouf in #6540
  • fix(webrtc): make the P2P reconnection actually reconnect by @ydiarra in #6570
  • fix(pusher): honour CSP frame-ancestors when checking whether a website is embeddable by @ydiarra in #6572
  • fix(webrtc): keep P2P video frames even-sized, Firefox 154's VP9 encoder stalls otherwise by @moufmouf in #6581
  • fix(chat): offer the reconnect prompt when the browser holds no Matrix session by @ydiarra in #6574
  • fix(video): reorder the camera list (active speaker, screen shares, cameras first) by @ydiarra in #6605
  • fix(pusher): only admins can send the kickOffUser private space event by @ydiarra in #6612
  • fix(pusher): only forward the space user fields a client may change by @moufmouf in #6624
  • fix(e2e): skip Klaxoon tests when the secret is missing (Dependabot PRs) by @moufmouf in #6643
  • fix(e2e): await variable writes before navigating in variables storage test by @moufmouf in #6644
  • fix(chat): show the sender's name, not their Matrix ID, on older messages by @ydiarra in #6609
  • fix(front): walk to the #moveTo position of a shared link by @ydiarra in #6649
  • fix(back): form a bubble when a user leaves a silent status next to someone by @moufmouf in #6646
  • fix(front): drop the default max of 50 on number inputs by @moufmouf in #6657

New Contributors

Full Changelog: v1.33.11...v1.34.0

Don't miss a new workadventure release

NewReleases is sending notifications on new releases.