Subscribe
28 Nov, 2025

[0.2.2.1] - 2025-11-28

Added

  • Network Quality Indicator:Added a visual connection strength indicator (Signal Icon) to the top-left corner of every video tile.Real-time Feedback: The icon changes color (Green/Yellow/Red) and tooltip based on the real-time uplink/downlink quality reported by Agora RTC.Robust Handling: Implemented checks to handle undefined remote stats, ensuring the UI degrades gracefully if a user is not sending streams.
  • Added a visual connection strength indicator (Signal Icon) to the top-left corner of every video tile.
  • Real-time Feedback: The icon changes color (Green/Yellow/Red) and tooltip based on the real-time uplink/downlink quality reported by Agora RTC.
  • Robust Handling: Implemented checks to handle undefined remote stats, ensuring the UI degrades gracefully if a user is not sending streams.

Fixed

  • Network UI Selector: Updated the network indicator update logic to use ID-based selectors (#player-wrapper-{safeId}) instead of attribute selectors ([data-uid]) for reliable DOM targeting across all user types.
  • Network Quality Stuck State: Fixed a critical issue where the indicator remained stuck on "Checking connection..." for remote users who were muted or not publishing video.Logic Change: Switched iteration source from Agora's stats.remoteUsers (which is empty for idle users) to rtcClient.remoteUsers (client list source of truth).Fallback: Implemented default "Good" status for users with no active stream stats to prevent UI confusion.
  • Logic Change: Switched iteration source from Agora's stats.remoteUsers (which is empty for idle users) to rtcClient.remoteUsers (client list source of truth).
  • Fallback: Implemented default "Good" status for users with no active stream stats to prevent UI confusion.
28 Nov, 2025

[0.2.2.2] - 2025-11-28

Added

  • UI Tooltips (UX Enhancement):Added CSS-based tooltips to all meeting control buttons (Mute, Camera, Share, Leave) and the Device Settings dock.Smart Positioning: Tooltips automatically adjust alignment (Center/Left) to prevent being cut off by the screen edge (e.g., Gear icon at the bottom-left).Dynamic Status: Tooltips text updates dynamically based on state (e.g., "Mute" vs "Unmute", "Spotlight" vs "Un-Spotlight").Localization: All tooltip texts are fully translatable via translations.json and wpj_t().
  • Added CSS-based tooltips to all meeting control buttons (Mute, Camera, Share, Leave) and the Device Settings dock.
  • Smart Positioning: Tooltips automatically adjust alignment (Center/Left) to prevent being cut off by the screen edge (e.g., Gear icon at the bottom-left).
  • Dynamic Status: Tooltips text updates dynamically based on state (e.g., "Mute" vs "Unmute", "Spotlight" vs "Un-Spotlight").
  • Localization: All tooltip texts are fully translatable via translations.json and wpj_t().

Fixed

  • Settings Gear Tooltip: Fixed a CSS issue where the tooltip for the Device Settings gear was clipped by the left screen edge.
27 Nov, 2025

[0.2.1.0] - 2025-11-27

Changed

  • Stretched Grid Layout:CSS: Removed forced 50% height on sub-grids in stretched mode. Grids now naturally stack based on content height.
  • CSS: Removed forced 50% height on sub-grids in stretched mode. Grids now naturally stack based on content height.

Fixed

  • Critical Tile Visibility (Data-First Architecture):Changed the tile creation logic from "Video-First" to "Data-First".Tiles are now created immediately upon receiving RTM attributes (USER_ATTRIBUTES_UPDATE).Benefit: Users without cameras (Audio-Only) or those with delayed video tracks now appear instantly as avatars.
  • Changed the tile creation logic from "Video-First" to "Data-First".
  • Tiles are now created immediately upon receiving RTM attributes (USER_ATTRIBUTES_UPDATE).
  • Benefit: Users without cameras (Audio-Only) or those with delayed video tracks now appear instantly as avatars.
  • Background Throttling (Heartbeat System):Implemented attributeSyncInterval (10s) to periodically broadcast user presence.Benefit: Fixes issues where users in background tabs (minimized browsers) would "disappear" or fail to sync status.
  • Implemented attributeSyncInterval (10s) to periodically broadcast user presence.
  • Benefit: Fixes issues where users in background tabs (minimized browsers) would "disappear" or fail to sync status.
  • Grid Stability (Anti-Flashing):Added Data Diffing logic to the RTM listener. The grid only re-sorts if role or joinTime changes, eliminating UI flicker during Heartbeat updates.
  • Added Data Diffing logic to the RTM listener. The grid only re-sorts if role or joinTime changes, eliminating UI flicker during Heartbeat updates.
  • Screen Share Border Radius (The Clipper Fix):Implemented a JS-based Clipper Wrapper (<div class="clipper">) for screen sharing.Benefit: Solves the persistent "Overflow Hidden" bug on Chrome/Edge where the video player ignored border-radius.
  • Implemented a JS-based Clipper Wrapper (<div class="clipper">) for screen sharing.
  • Benefit: Solves the persistent "Overflow Hidden" bug on Chrome/Edge where the video player ignored border-radius.
  • Page Refresh Logic:Updated leaveMeeting() with a shouldRedirect parameter.Browser refresh (beforeunload) now gracefully cleans up resources without kicking the user back to the lobby.
  • Updated leaveMeeting() with a shouldRedirect parameter.
  • Browser refresh (beforeunload) now gracefully cleans up resources without kicking the user back to the lobby.
26 Nov, 2025

[0.2.0.9] - 2025-11-26

Added

  • Advanced Device Management:Speaker Selection: Added support for selecting Audio Output devices (Speakers) in both Lobby and Meeting Room (Chrome/Edge only).Device Sync: Microphone, Camera, and Speaker selections from the Lobby are seamlessly synced to the Meeting Room.Smart Device Dock:Implemented a "Pop-up" style menu for device selection.Auto-Hide: The device dock gear icon automatically hides if there are no alternative devices to switch to, keeping the UI clean.Hot-Plugging: The dock automatically reappears if a new device is plugged in during the meeting.Device Deduplication: Implemented logic to filter out duplicate/virtual devices (e.g., "Default" vs "Communications") on Windows to show only unique hardware.
  • Speaker Selection: Added support for selecting Audio Output devices (Speakers) in both Lobby and Meeting Room (Chrome/Edge only).
  • Device Sync: Microphone, Camera, and Speaker selections from the Lobby are seamlessly synced to the Meeting Room.
  • Smart Device Dock:Implemented a "Pop-up" style menu for device selection.Auto-Hide: The device dock gear icon automatically hides if there are no alternative devices to switch to, keeping the UI clean.Hot-Plugging: The dock automatically reappears if a new device is plugged in during the meeting.
  • Implemented a "Pop-up" style menu for device selection.
  • Auto-Hide: The device dock gear icon automatically hides if there are no alternative devices to switch to, keeping the UI clean.
  • Hot-Plugging: The dock automatically reappears if a new device is plugged in during the meeting.
  • Device Deduplication: Implemented logic to filter out duplicate/virtual devices (e.g., "Default" vs "Communications") on Windows to show only unique hardware.

Changed

  • Session Persistence (Refresh Support):Changed transient security logic from "Burn on Entry" to "Sliding Expiration" (1-hour extension on access).Users can now refresh the meeting room without being kicked out, while maintaining security against unauthorized access.
  • Changed transient security logic from "Burn on Entry" to "Sliding Expiration" (1-hour extension on access).
  • Users can now refresh the meeting room without being kicked out, while maintaining security against unauthorized access.
  • Screen Share Logic:Camera Unlock: Removed the restriction that disabled the camera toggle during screen sharing. Users can now freely toggle their camera on/off while presenting (Dual-Client architecture).
  • Camera Unlock: Removed the restriction that disabled the camera toggle during screen sharing. Users can now freely toggle their camera on/off while presenting (Dual-Client architecture).

Fixed

  • Device Dock Race Condition: Fixed a bug where the device dock wouldn't hide correctly on load due to execution order issues.
25 Nov, 2025

[0.2.0.8] - 2025-11-25

Added

  • Waiting Room & Approval System:Implemented a manual approval flow for non-presenter users when auto_approve is disabled.Lobby: Users send "Knock" requests via RTM and wait for a host response. Implemented a "Heartbeat" mechanism (every 3s) to ensure new presenters see pending requests immediately.Presenter UI: Presenters receive "Join Requests" as Toast notifications with Approve/Reject buttons.Co-Host Sync: Approval/Rejection actions are synchronized; if one presenter handles a request, the toast automatically clears for all other presenters.
  • Implemented a manual approval flow for non-presenter users when auto_approve is disabled.
  • Lobby: Users send "Knock" requests via RTM and wait for a host response. Implemented a "Heartbeat" mechanism (every 3s) to ensure new presenters see pending requests immediately.
  • Presenter UI: Presenters receive "Join Requests" as Toast notifications with Approve/Reject buttons.
  • Co-Host Sync: Approval/Rejection actions are synchronized; if one presenter handles a request, the toast automatically clears for all other presenters.
  • Presenter Bypass: Users with the presenter role (e.g., Administrator) now bypass the waiting room and join directly, regardless of settings.

Changed

  • Improved Grid Scrolling (Desktop UX):Implemented Independent Scrolling for Presenter and User grids on desktop layouts.Benefit: Users can scroll through the participant list without losing sight of the presenters (or vice versa).Styling: Added custom thin scrollbars (-webkit-scrollbar) to minimize visual clutter in the split view.
  • Implemented Independent Scrolling for Presenter and User grids on desktop layouts.
  • Benefit: Users can scroll through the participant list without losing sight of the presenters (or vice versa).
  • Styling: Added custom thin scrollbars (-webkit-scrollbar) to minimize visual clutter in the split view.
  • Mobile Scroll Logic:Preserved unified vertical scrolling for mobile layouts (< 767px) to ensure a seamless touch experience without nested scroll traps.
  • Preserved unified vertical scrolling for mobile layouts (< 767px) to ensure a seamless touch experience without nested scroll traps.
  • Desktop Grid Layout (Independent Scrolling):Implemented independent scrolling for Presenter and User grids on desktop.Benefit: Allows users to scroll through large participant lists without losing visibility of the presenters.Styling: Applied custom thin scrollbars (-webkit-scrollbar) for a cleaner UI.
  • Implemented independent scrolling for Presenter and User grids on desktop.
  • Benefit: Allows users to scroll through large participant lists without losing visibility of the presenters.
  • Styling: Applied custom thin scrollbars (-webkit-scrollbar) for a cleaner UI.
  • Mobile/Tablet Layout Refinements:Natural Stacking: Removed the forced 50% height split in mobile view. Sub-grids now stack naturally based on their content height.Stretched Mode Optimization: Adjusted the mobile layout when Screen Share/Stretch is active:Stage Area: Fixed to 30% height to maintain visibility.Grid Area: Takes the remaining 70% height for scrollable participant tiles.Full Width: Forced .wpj_call-grid to 100% width on mobile to prevent flexbox shrinking issues.
  • Natural Stacking: Removed the forced 50% height split in mobile view. Sub-grids now stack naturally based on their content height.
  • Stretched Mode Optimization: Adjusted the mobile layout when Screen Share/Stretch is active:Stage Area: Fixed to 30% height to maintain visibility.Grid Area: Takes the remaining 70% height for scrollable participant tiles.
  • Stage Area: Fixed to 30% height to maintain visibility.
  • Grid Area: Takes the remaining 70% height for scrollable participant tiles.
  • Full Width: Forced .wpj_call-grid to 100% width on mobile to prevent flexbox shrinking issues.

Fixed

  • User List Ghosting: Fixed a bug where waiting users (guest_xxx) appeared in the meeting room User List before being approved.
  • Duplicate Tiles: Added strict checks to prevent duplicate video tiles for the same UID in the DOM.
  • View Transition Crash: Added error handling for View Transition API to prevent UI freezes during layout updates.
20 Nov, 2025

[0.2.0.7] - 2025-11-20

Added

  • Stretch Video (Expand Mode):Added a "Stretch" button to user video tiles.Functionality: Moves the selected user's video to the main stage (previously reserved only for screen sharing) for a larger view.Smart Interaction:Screen Share Priority: If a screen share starts (local or remote), any stretched video is automatically unstretched and returned to the grid to prioritize the presentation.Single Focus: Stretching a second user automatically unstretches the current one.Toggle: Clicking the stretch button again returns the user to their original position in the grid.
  • Added a "Stretch" button to user video tiles.
  • Functionality: Moves the selected user's video to the main stage (previously reserved only for screen sharing) for a larger view.
  • Smart Interaction:Screen Share Priority: If a screen share starts (local or remote), any stretched video is automatically unstretched and returned to the grid to prioritize the presentation.Single Focus: Stretching a second user automatically unstretches the current one.Toggle: Clicking the stretch button again returns the user to their original position in the grid.
  • Screen Share Priority: If a screen share starts (local or remote), any stretched video is automatically unstretched and returned to the grid to prioritize the presentation.
  • Single Focus: Stretching a second user automatically unstretches the current one.
  • Toggle: Clicking the stretch button again returns the user to their original position in the grid.
  • Pin Video (Pinned Strip):Added a Pinned Strip area at the bottom of the screen (above the toolbar).Added a "Pin" button to user tiles.Functionality: Moves the user's video to the bottom strip, keeping them visible regardless of grid pagination or layout changes.Pin-to-Stretch Logic: If a pinned user is stretched, they move to the main stage. When unstretched, they return to the main grid (resetting the pin state), preventing UI conflicts.
  • Added a Pinned Strip area at the bottom of the screen (above the toolbar).
  • Added a "Pin" button to user tiles.
  • Functionality: Moves the user's video to the bottom strip, keeping them visible regardless of grid pagination or layout changes.
  • Pin-to-Stretch Logic: If a pinned user is stretched, they move to the main stage. When unstretched, they return to the main grid (resetting the pin state), preventing UI conflicts.
  • Local User Controls (Self-View):Self-Pin & Self-Stretch: Added support for local users to Pin or Stretch their own video tile.Implementation: The local player tile now shares the same ID structure and button logic as remote users, allowing seamless interaction with layout features.
  • Self-Pin & Self-Stretch: Added support for local users to Pin or Stretch their own video tile.
  • Implementation: The local player tile now shares the same ID structure and button logic as remote users, allowing seamless interaction with layout features.
  • Real-time Chat System:Integrated a text chat interface within the Sidebar (#wpj_sidebar--messages).Functionality: Allows participants to send and receive messages instantly via Agora RTM.Smart Notifications: Automatically injects a notification badge (red dot with count) into the Message toolbar button when the sidebar is hidden or when viewing the People tab.
  • Integrated a text chat interface within the Sidebar (#wpj_sidebar--messages).
  • Functionality: Allows participants to send and receive messages instantly via Agora RTM.
  • Smart Notifications: Automatically injects a notification badge (red dot with count) into the Message toolbar button when the sidebar is hidden or when viewing the People tab.
  • Device Settings Dock:Replaced the static device settings panel with a collapsible Settings Dock (floating gear icon) at the bottom-left.Improved UI/UX for managing Microphone and Camera selections during the meeting.
  • Replaced the static device settings panel with a collapsible Settings Dock (floating gear icon) at the bottom-left.
  • Improved UI/UX for managing Microphone and Camera selections during the meeting.

Changed

  • Optimistic UI Initialization (Instant Join):Re-architected the join flow to execute startMeetingTimer() and initial Grid Sorting immediately after local DOM creation.Benefit: Eliminates the ~3-second perceived delay ("frozen state") while waiting for RTC/RTM connection and hardware acquisition. The room UI now feels instant and responsive.
  • Re-architected the join flow to execute startMeetingTimer() and initial Grid Sorting immediately after local DOM creation.
  • Benefit: Eliminates the ~3-second perceived delay ("frozen state") while waiting for RTC/RTM connection and hardware acquisition. The room UI now feels instant and responsive.
  • Smooth Layout Transitions:Implemented the View Transitions API (with fallback) for grid sorting operations.Added CSS keyframe animations for tile entry (Pop-in effect).Benefit: Eliminates visual "glitches" or jumping tiles when users join/leave or when re-sorting the grid. Tiles now smoothly slide to their new positions.
  • Implemented the View Transitions API (with fallback) for grid sorting operations.
  • Added CSS keyframe animations for tile entry (Pop-in effect).
  • Benefit: Eliminates visual "glitches" or jumping tiles when users join/leave or when re-sorting the grid. Tiles now smoothly slide to their new positions.
  • UI Refinements:Updated "Pin" icon to a solid, 45-degree angled design for better visibility.Updated "Gear" icon to a solid filled style for the new Device Dock.Improved button visibility and hover states in the video tiles.
  • Updated "Pin" icon to a solid, 45-degree angled design for better visibility.
  • Updated "Gear" icon to a solid filled style for the new Device Dock.
  • Improved button visibility and hover states in the video tiles.
19 Nov, 2025

[0.2.0.6] - 2025-11-19

Added

  • Moderator Controls (Mute/Kick): Presenters can now remote-control participants via the User List sidebar:Remote Mute: Allows the host to mute a participant's microphone (sends an RTM signal to the target client).Kick User: Allows the host to remove a participant from the meeting instantly.Mute Toggle Logic: The mute command now intelligently toggles the state (Mute if open, Unmute if closed) rather than just forcing mute.
  • Remote Mute: Allows the host to mute a participant's microphone (sends an RTM signal to the target client).
  • Kick User: Allows the host to remove a participant from the meeting instantly.
  • Mute Toggle Logic: The mute command now intelligently toggles the state (Mute if open, Unmute if closed) rather than just forcing mute.
  • Active Discovery Protocol (Name Sync):Implemented a new RTM command CMD_WHO_ARE_YOU.Logic: Upon joining (or re-joining), the client now broadcasts a discovery request. All existing participants immediately reply with their user attributes (unamerole).Benefit: Guarantees that the User List and Video Grid display correct names instantly instead of UIDs, even if the standard REMOTE_JOIN event is delayed or missed.
  • Implemented a new RTM command CMD_WHO_ARE_YOU.
  • Logic: Upon joining (or re-joining), the client now broadcasts a discovery request. All existing participants immediately reply with their user attributes (unamerole).
  • Benefit: Guarantees that the User List and Video Grid display correct names instantly instead of UIDs, even if the standard REMOTE_JOIN event is delayed or missed.
  • Robust Audio-Only Support: Users without a camera (or with permission denied) can now successfully join meetings in "Audio-Only" mode.Lobby: Displays a friendly "Microphone ready (Audio only)" status instead of an error.Meeting Room: Automatically shows the user's avatar and disables the camera toggle button.
  • Lobby: Displays a friendly "Microphone ready (Audio only)" status instead of an error.
  • Meeting Room: Automatically shows the user's avatar and disables the camera toggle button.
  • Configurable Video Resolutions: Added Admin Settings to select default resolutions for Camera and Screen Share (Standard 480p, Medium 720p, High 1080p).
  • Audio Enhancements: Explicitly enabled Agora's built-in Noise Suppression (ANS), Echo Cancellation (AEC), and Automatic Gain Control (AGC).

Changed

  • Major Performance Optimization (Instant Join): Re-architected the joinMeeting flow for maximum responsiveness (Instant Mirror, Non-blocking RTM).
  • Smoother Grid Layout: Replaced setTimeout with requestAnimationFrame in grid sorting logic.

Fixed

  • User Re-join Race Condition: Fixed a critical bug where a re-joining presenter (or user) would see other participants as UIDs instead of names until they interacted. The new Active Discovery logic ensures immediate synchronization of user profiles.
  • Sidebar Interaction: Solved a critical bug where e.stopPropagation() prevented Admin buttons (Mute/Kick) from being clickable. Implemented smart event delegation to allow button clicks while keeping the sidebar open.
  • Real-time Mute Sync: Fixed the mute icon state in the User List. It now correctly reflects the remote user's actual microphone status in real-time.
18 Nov, 2025

[0.2.0.5] - 2025-11-18

Added

  • Speaking Indicator: Added a visual indicator (green border) to video tiles when a participant is speaking. Configured with a stable 200ms polling interval for a balance of responsiveness and accuracy.
  • Screen Share Icon: Added a persistent status icon to the bottom-left of video tiles that becomes visible/green when a user is sharing their screen.
  • Token Renewal Safety Net: Implemented a proactive RTM token renewal mechanism that triggers alongside RTC token renewal to prevent "Server banned" errors (RTM logic is now synchronized with RTC).
  • Meeting Timer: Added a real-time meeting duration timer (HH:MM:SS) to the header.
  • Console Error Suppression: Added an interceptor to suppress harmless RTM socket errors when _WPJ_DEBUG_ is false.
  • PHP REST Endpoint: Added /wpj/v1/rtm-token for on-demand RTM token generation.

Changed

  • Performance Optimization (Concurrent Join): Refactored joinMeeting to execute RTC connection, RTM initialization, and Media Track creation in parallel (using Promise.all) to optimize the joining process.
  • Code Cleanup: Removed unused utility functions (e.g., convertMetadataArrayToObject) and fixed duplicate event listeners in initializeRtm.
14 Nov, 2025

[0.2.0.4] - 2025-11-14

Changed

  • Major Screen Share Overhaul: Re-architected screen sharing to use a Dual RTC Client model. The user now joins the channel with a second, dedicated client (e.g., [uid]_screen) to publish the screen track.
  • RTM Logic: RTM messages (SHARE_STARTSHARE_STOP) now include the screenUid to allow viewers to map the correct track to the correct user.
  • Remote Track Handling: handleUserPublished now checks for the _screen UID suffix to correctly route screen share streams to the main container, solving all previous race conditions.

Added

  • PHP REST Endpoint: Added a new REST API route (/wpj/v1/rtc-token) to generate RTC tokens on-demand for the new screen sharing client.

Fixed

  • Critical Error (CAN_NOT_PUBLISH_MULTIPLE_VIDEO_TRACKS): This error is now fully resolved. The main client's camera track is no longer unpublished, allowing viewers to see both the user's camera and their screen share simultaneously.
  • User List: The user list (renderUserList) is now filtered to exclude screen share clients (e.g., uid_screen) from appearing as participants.
07 Nov, 2025

[0.2.0.3] - 2025-11-07

Changed

  • Major Security Overhaul: Replaced all insecure input type="hidden" fields and URL parameters with a secure, one-time-use WordPress Transient system. All data (Room ID, User Name, Mic/Cam IDs, Auto-Approve) is now passed securely via the server.
  • Improved Redirect Logic: The "Leave Meeting" button now correctly redirects users back to the specific Lobby URL they came from (which is passed securely via the Transient), instead of defaulting to the site's homepage.

Added

  • BuddyBoss Addon Integration: The main plugin is now "addon-aware" and checks for defined('WPJ_BUDDYBOSS_ADDON_ACTIVE').
  • Automatic Group ID: The plugin now automatically uses the BuddyBoss Group ID (via bp_get_current_group_id()) as the room_id when the [wpj_lobby] shortcode is used within a group tab.

Fixed

  • Critical Addon Fix: Fixed the WPJ_BUDDYBOSS_ADDON_ACTIVE constant not being defined on the front-end. Moved its definition from the admin_init hook to the plugins_loaded hook in the addon file.
  • Critical Fallback Loader Fix: Fixed incorrect file paths in the shortcode.php fallback loader. plugins_url() calls for wpj-lobby.js and wpj-front-style.css now correctly use ../public/ to find the assets folder.
  • Fixed: Major RTM (User List) Overhaul: Reworked the entire user list logic. Replaced the failing RTM Storage (setUserMetadata) system with a new method using RTM Channel Messages (publish) to broadcast user names (uname) and roles. This resolves the -12019 and -10019 errors.
  • Fixed: User List Race Condition: Solved the critical bug where late-joiners (User 2) could not see users already in the room (User 1). The app now uses getOnlineUsers (with correct 'MESSAGE' type) and existing users re-publish their attributes when a new user joins (REMOTE_JOIN).
  • Fixed: RTM Message Payload: Corrected the bug where user data was received as undefined. The app now correctly parses event.message instead of the non-existent event.message.text.
  • PHP Fatal Error Fix: Resolved a TypeError in jd-wpjointly.php where wpj_t() was called with a string as the second argument instead of the required array.
  • PHP Security Fix: Resolved the "Session data NOT FOUND" race condition by migrating from unreliable PHP Sessions to the robust WordPress Transient API.