{"id":362807,"date":"2026-09-28T16:46:39","date_gmt":"2026-09-28T16:46:39","guid":{"rendered":"https:\/\/br.wordpress.org\/plugins\/surfcoinschat-community\/"},"modified":"2026-10-16T22:59:49","modified_gmt":"2026-10-16T22:59:49","slug":"surfcoinschat-community","status":"publish","type":"plugin","link":"https:\/\/kea.wordpress.org\/plugins\/surfcoinschat-community\/","author":23540586,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.7.25","stable_tag":"0.7.25","tested":"7.1.3","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"SurfCoinsChat Community","header_author":"SurfCoins","header_description":"Adds presence, message status, voice messages, WebRTC calls, PWA installation, and opt-in Web Push to Better Messages Community.","assets_banners_color":"3e362b","last_updated":"2026-10-16 22:59:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":460,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.6.43":{"tag":"0.6.43","author":"naturalsurf","date":"2026-09-28 23:18:08","revision":3718014},"0.6.64":{"tag":"0.6.64","author":"naturalsurf","date":"2026-10-04 19:20:38","revision":3727738},"0.6.66":{"tag":"0.6.66","author":"naturalsurf","date":"2026-10-08 01:54:00","revision":3733534},"0.6.67":{"tag":"0.6.67","author":"naturalsurf","date":"2026-10-08 02:28:53","revision":3733544},"0.6.68":{"tag":"0.6.68","author":"naturalsurf","date":"2026-10-09 01:10:26","revision":3735751},"0.6.69":{"tag":"0.6.69","author":"naturalsurf","date":"2026-10-09 01:58:28","revision":3735771},"0.6.70":{"tag":"0.6.70","author":"naturalsurf","date":"2026-10-11 02:19:12","revision":3738842},"0.7.10":{"tag":"0.7.10","author":"naturalsurf","date":"2026-10-12 19:11:34","revision":3742369},"0.7.12":{"tag":"0.7.12","author":"naturalsurf","date":"2026-10-12 20:17:13","revision":3742463},"0.7.16":{"tag":"0.7.16","author":"naturalsurf","date":"2026-10-13 01:01:55","revision":3742700},"0.7.25":{"tag":"0.7.25","author":"naturalsurf","date":"2026-10-16 22:59:49","revision":3751237},"0.7.7":{"tag":"0.7.7","author":"naturalsurf","date":"2026-10-12 14:14:06","revision":3741847}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3717627,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3717627,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717627,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717627,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.6.43","0.6.64","0.6.66","0.6.67","0.6.68","0.6.69","0.6.70","0.7.10","0.7.12","0.7.16","0.7.25","0.7.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3741847,"resolution":"1","location":"assets","locale":"","width":1448,"height":1086},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3741847,"resolution":"2","location":"assets","locale":"","width":1448,"height":1086},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3741847,"resolution":"3","location":"assets","locale":"","width":1448,"height":1086},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3741847,"resolution":"4","location":"assets","locale":"","width":1448,"height":1086},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3741847,"resolution":"5","location":"assets","locale":"","width":1448,"height":1086},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3741847,"resolution":"6","location":"assets","locale":"","width":941,"height":1672}},"screenshots":[]},"plugin_section":[],"plugin_tags":[5707,2512,4906,28310,8025],"plugin_category":[41],"plugin_contributors":[275767],"plugin_business_model":[],"class_list":["post-362807","plugin","type-plugin","status-publish","hentry","plugin_tags-chat","plugin_tags-messaging","plugin_tags-notifications","plugin_tags-presence","plugin_tags-webrtc","plugin_category-communication","plugin_contributors-naturalsurf","plugin_committers-naturalsurf"],"banners":{"banner":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/banner-772x250.png?rev=3717627","banner_2x":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/banner-1544x500.png?rev=3717627","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/icon-128x128.png?rev=3717627","icon_2x":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/icon-256x256.png?rev=3717627","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-1.png?rev=3741847","caption":""},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-2.png?rev=3741847","caption":""},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-3.png?rev=3741847","caption":""},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-4.png?rev=3741847","caption":""},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-5.png?rev=3741847","caption":""},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-6.png?rev=3741847","caption":""}],"raw_content":"<!--section=description-->\n<p>SurfCoinsChat Community is an independent extension for the free\/community edition of Better Messages.<\/p>\n\n<p>It keeps Better Messages responsible for conversations and message storage while adding:<\/p>\n\n<ul>\n<li>Group-conversation management: group name\/image, participants, moderators, invitations, conversation notification mute, mute\/ban controls, system-message preference, and leave-group flow.<\/li>\n<li>Online and last-seen presence, avatar indicators, and typing\/activity states.<\/li>\n<li>One-tap quick replies above the active composer, using the native Better Messages send flow.<\/li>\n<li>Administrator-managed quick replies with add, edit, enable\/disable, drag-to-reorder, preview, and restore-default controls.<\/li>\n<li>Sent, delivered, and read indicators for outgoing messages, with per-participant receipt details in group conversations.<\/li>\n<li>Browser-recorded voice messages stored on the same WordPress site.<\/li>\n<li>One-to-one WebRTC voice and video calls with call history.<\/li>\n<li>Automatic Better Messages full-screen mode on the dedicated <code>\/chat\/<\/code> page.<\/li>\n<li>Per-user chat background images for users with the standard WordPress <code>upload_files<\/code> capability.<\/li>\n<li>Installable PWA manifest and Service Worker support.<\/li>\n<li>Explicit opt-in browser Web Push notifications.<\/li>\n<li>Adaptive\/event-driven synchronization that reduces background REST traffic and duplicate work across multiple browser tabs.<\/li>\n<li>A compact footer transport indicator shows whether the optional SurfCoins WebSocket connection is active, reconnecting, or inactive.<\/li>\n<li>Administrator settings show the optional SurfCoins WebSocket integration state and can simplify selected commercial Better Messages submenu links without modifying Better Messages files.<\/li>\n<li>When SurfCoins WebSocket is not installed, administrators can download the plugin for free from SurfCoins while licensing remains separate for the realtime service.<\/li>\n<\/ul>\n\n<p>Better Messages is required. The dependency slug is <code>bp-better-messages<\/code>.<\/p>\n\n<p>SurfCoinsChat Community is an independent project and is not affiliated with or endorsed by Better Messages or its developer.<\/p>\n\n<h4>PWA and activation behavior<\/h4>\n\n<p>The plugin serves <code>\/surfcoins-manifest.webmanifest<\/code> and <code>\/surfcoins-sw.js<\/code>.<\/p>\n\n<p>On activation, the plugin may create a local WordPress page named \"SurfCoins Offline\" for the offline PWA experience. It also creates its own database tables and local settings used for presence, calls\/signaling, and opt-in push subscriptions.<\/p>\n\n<p>If the former SurfCoins PWA plugin is installed, deactivate it before using these integrated PWA features so both plugins do not attempt to own the same Service Worker and manifest URLs.<\/p>\n\n<h3>External services<\/h3>\n\n<p>SurfCoinsChat Community only contacts external network services in specific features described below.<\/p>\n\n<h4>Google STUN for WebRTC<\/h4>\n\n<p>By default, one-to-one WebRTC calls use the public endpoints <code>stun:stun.l.google.com:19302<\/code> and <code>stun:stun1.l.google.com:19302<\/code>.<\/p>\n\n<p>These STUN requests occur when a user starts or receives a WebRTC call. They help browsers discover network addresses for peer-to-peer connectivity and may disclose network information such as the user's public IP address to Google. SurfCoinsChat Community does not send chat messages or stored voice-message files to Google.<\/p>\n\n<p>Service: https:\/\/www.google.com\/\nPrivacy: https:\/\/policies.google.com\/privacy\nTerms: https:\/\/policies.google.com\/terms<\/p>\n\n<h4>Optional administrator-configured TURN<\/h4>\n\n<p>A site administrator may configure a TURN relay. If a direct peer-to-peer connection cannot be established, call media may be relayed through that configured TURN service.<\/p>\n\n<p>SurfCoinsChat Community does not choose a third-party TURN provider. The site administrator is responsible for the selected TURN service and for documenting its privacy policy and terms to site users.<\/p>\n\n<h4>Browser Web Push endpoints<\/h4>\n\n<p>Web Push is disabled until a signed-in user explicitly enables browser notifications and grants permission.<\/p>\n\n<p>The browser creates a push subscription whose endpoint is operated by the browser or operating-system vendor. SurfCoinsChat Community stores that subscription on the WordPress site and sends encrypted notification payloads directly to the supplied endpoint when a new Better Messages message is sent. No SurfCoins-operated push gateway is used.<\/p>\n\n<p>Depending on the browser\/device, the endpoint can be operated by services such as Google\/Firebase, Mozilla, or Apple.<\/p>\n\n<p>Google\/Firebase:\nService: https:\/\/firebase.google.com\/docs\/cloud-messaging\nPrivacy: https:\/\/policies.google.com\/privacy\nTerms: https:\/\/firebase.google.com\/terms<\/p>\n\n<p>Mozilla:\nService: https:\/\/support.mozilla.org\/kb\/push-notifications-firefox\nPrivacy: https:\/\/www.mozilla.org\/privacy\/firefox\/\nTerms: https:\/\/www.mozilla.org\/about\/legal\/terms\/firefox\/<\/p>\n\n<p>Apple:\nService: https:\/\/developer.apple.com\/documentation\/usernotifications\/sending-web-push-notifications-in-web-apps-and-browsers\nPrivacy: https:\/\/www.apple.com\/legal\/privacy\/<\/p>\n\n<p>Users can disable notifications through the SurfCoinsChat interface or their browser\/device settings.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>SurfCoinsChat Community stores plugin data on the WordPress site, including:<\/p>\n\n<ul>\n<li>Transient presence rows per browser installation\/session, including user ID, a random session identifier, conversation ID, temporary activity, activity expiration, and last-seen time. This lets the same account stay active on more than one device without one device overwriting another.<\/li>\n<li>Temporary WebRTC call\/signaling records.<\/li>\n<li>Opt-in browser push subscriptions.<\/li>\n<li>A per-user chat-background URL when the user selects a custom background.<\/li>\n<li>Voice-message media attachments only when the user explicitly records and sends them.<\/li>\n<\/ul>\n\n<p>The plugin registers with the WordPress personal-data Export and Erase tools for its presence data. Presence and push-subscription records are removed when the corresponding WordPress user is deleted. Plugin-owned tables and plugin settings are removed by <code>uninstall.php<\/code> when the plugin is deleted.<\/p>\n\n<p>Site owners should review these behaviors and adapt their privacy policy to applicable requirements.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Better Messages.<\/li>\n<li>Install and activate SurfCoinsChat Community.<\/li>\n<li>Open the site's Better Messages chat while signed in.<\/li>\n<li>Customize quick replies under SurfCoinsChat &gt; Quick replies, if desired.<\/li>\n<li>Review optional realtime transport and administrator-menu preferences under SurfCoinsChat &gt; Settings.<\/li>\n<li>Configure optional PWA settings under Settings &gt; SurfCoinsChat PWA &amp; Push.<\/li>\n<li>For calls across restrictive networks, optionally configure a TURN server.<\/li>\n<\/ol>\n\n<p>No external account or API key is required for the default STUN configuration.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20better%20messages%3F\"><h3>Does this replace Better Messages?<\/h3><\/dt>\n<dd><p>No. Better Messages remains responsible for conversations, recipients, messages, and its core interface.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20quick%20replies%3F\"><h3>Can I customize the quick replies?<\/h3><\/dt>\n<dd><p>Yes. Administrators can add, edit, enable or disable, reorder, and restore the default quick replies under SurfCoinsChat &gt; Quick replies. Custom replies are stored as a single WordPress option and do not add a database table or polling request.<\/p><\/dd>\n<dt id=\"does%20it%20require%20the%20paid%20better%20messages%20websocket%20edition%3F\"><h3>Does it require the paid Better Messages WebSocket edition?<\/h3><\/dt>\n<dd><p>No. The plugin is designed for the Better Messages Community\/free workflow. SurfCoinsChat uses Better Messages 3.x runtime events when available and an adaptive WordPress REST fallback. When the optional SurfCoins WebSocket transport is connected, presence, typing, message wake-ups, one-to-one delivery\/read receipts, and WebRTC call signaling are event-driven while REST remains a reconciliation fallback.<\/p><\/dd>\n<dt id=\"are%20voice%20messages%20sent%20to%20a%20third%20party%3F\"><h3>Are voice messages sent to a third party?<\/h3><\/dt>\n<dd><p>No. When a user explicitly records and sends a voice message, the audio file is uploaded to the same WordPress site and stored as a WordPress media attachment associated with the conversation.<\/p><\/dd>\n<dt id=\"are%20voice%20or%20video%20calls%20recorded%3F\"><h3>Are voice or video calls recorded?<\/h3><\/dt>\n<dd><p>No. SurfCoinsChat Community stores temporary call\/signaling metadata on the WordPress site but does not record call audio or video.<\/p><\/dd>\n<dt id=\"can%20a%20site%20owner%20use%20turn%3F\"><h3>Can a site owner use TURN?<\/h3><\/dt>\n<dd><p>Yes. Define <code>SURFCOINSCHAT_TURN_URL<\/code>, <code>SURFCOINSCHAT_TURN_USERNAME<\/code>, and <code>SURFCOINSCHAT_TURN_CREDENTIAL<\/code> in <code>wp-config.php<\/code>, or use the <code>surfcoinschat_webrtc_ice_servers<\/code> filter.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.7.25<\/h4>\n\n<ul>\n<li>Compatibility: adds contenteditable caret normalization before Better Messages 3.1 processes @mentions.<\/li>\n<li>Compatibility: adds a caret-aware fallback mention lookup for Chat Rooms while preserving Better Messages native mention markup.<\/li>\n<li>Known issue: @mention autocomplete can still fail in some Better Messages 3.1 Chat Rooms and remains under investigation.<\/li>\n<\/ul>\n\n<h4>0.7.24<\/h4>\n\n<ul>\n<li>Fix: restores native Better Messages 3.1 @mention autocomplete in persistent Chat Rooms by overriding only the native suggestion lookup with the authoritative room recipient list.<\/li>\n<li>Compatibility: keeps Better Messages in control of the mention UI, insertion markup and notifications; no parallel autocomplete is added.<\/li>\n<\/ul>\n\n<h4>0.7.23<\/h4>\n\n<ul>\n<li>Fixes Better Messages 3.1 Chat Room @mention autocomplete by repairing the native <code>mentionsSuggestions<\/code> REST response instead of rendering a separate picker.<\/li>\n<li>Includes valid Chat Room recipients even when Better Messages marks their recipient row as deleted from the thread list, while preserving native permissions, composer UI, mention markup and notifications.<\/li>\n<li>Repairs missing Better Messages user-index records before the native composer hydrates returned suggestion IDs.<\/li>\n<li>Removes the unsuccessful 0.7.22 custom mention picker and preserves the proven 0.7.19 mobile keyboard behavior.<\/li>\n<\/ul>\n\n<h4>0.7.22<\/h4>\n\n<ul>\n<li>Adds a dedicated @mention autocomplete fallback for Better Messages 3.1 large\/legacy Chat Rooms when the native composer recognizes @ but cannot hydrate any suggestion users.<\/li>\n<li>Resolves matching users directly from the current Better Messages recipients plus WordPress user data, without modifying Better Messages files or exposing users outside the conversation.<\/li>\n<li>Inserts Better Messages' own <code>bm-inline-mention<\/code> markup so message formatting and mention notifications remain native.<\/li>\n<li>Removes the ineffective 0.7.20\/0.7.21 REST-response mutation and preserves the proven 0.7.19 mobile keyboard behavior.<\/li>\n<\/ul>\n\n<h4>0.7.21<\/h4>\n\n<ul>\n<li>Fixes Better Messages 3.1 @mention suggestions in Chat Rooms whose valid participant recipient rows are marked deleted only from the participant's thread list.<\/li>\n<li>Uses Better Messages' own Chat Room membership semantics while keeping the native active-recipient rule for regular conversations.<\/li>\n<li>Preserves the 0.7.19 mobile keyboard behavior and all existing Better Messages 3.0.x\/3.1.x, WebSocket and administrator integrations.<\/li>\n<\/ul>\n\n<h4>0.7.20<\/h4>\n\n<ul>\n<li>Restores @mention suggestions in Better Messages 3.1 groups when the Better Messages user index is incomplete.<\/li>\n<li>Keeps Better Messages' native mention endpoint, permissions, insertion and notification behavior; SurfCoinsChat only merges matching thread participants from the authoritative recipients\/WordPress user tables.<\/li>\n<li>Preserves the 0.7.19 mobile keyboard fix, Better Messages 3.0.x\/3.1.x compatibility, WebSocket integration and administrator features.<\/li>\n<\/ul>\n\n<h4>0.7.19<\/h4>\n\n<ul>\n<li>Restores the mobile send-focus guard for Better Messages 3.1+ so the software keyboard remains open after a manual text send.<\/li>\n<li>Does not inject the legacy voice control into Better Messages 3.1+ and does not cancel the native send action.<\/li>\n<li>Keeps Better Messages 3.0.x compatibility and the existing SurfCoins WebSocket\/admin integrations.<\/li>\n<\/ul>\n\n<h4>0.7.17<\/h4>\n\n<ul>\n<li>Adds explicit Better Messages 3.1.0 compatibility while preserving Better Messages 3.0.x support.<\/li>\n<li>Supports both legacy <code>bp-better-messages-*<\/code> and new <code>better-messages-*<\/code> administrator slugs for menu cleanup and the WebSocket licensing CTA.<\/li>\n<li>Treats the new Better Messages 3.1 \u201cSupport\u201d menu as the successor to \u201cContact Us\u201d for the existing optional menu-hiding preference.<\/li>\n<li>Avoids redundant mobile-composer refocusing on Better Messages 3.1+, while retaining the SurfCoinsChat compatibility guard on older Better Messages builds.<\/li>\n<li>Keeps complete internationalization and updates the bundled pt-BR catalog.<\/li>\n<\/ul>\n\n<h4>0.7.16<\/h4>\n\n<ul>\n<li>Shows that the SurfCoins WebSocket plugin is available as a free download when it is not installed.<\/li>\n<li>Adds a direct free-download button plus a separate WebSocket plans button in the administrator notice and settings screen.<\/li>\n<li>Keeps the Better Messages WebSocket licensing CTA directed to the SurfCoins WebSocket plans page.<\/li>\n<li>Keeps complete internationalization with updated pt-BR catalogs.<\/li>\n<\/ul>\n\n<h4>0.7.15<\/h4>\n\n<ul>\n<li>Redirects only Better Messages' WebSocket-specific \u201cGet WebSocket license\u201d pricing link to the SurfCoins WebSocket product page.<\/li>\n<li>Keeps the replacement isolated to Better Messages administrator screens, opens the product page in a new tab, and reapplies it after dynamic UI remounts without modifying Better Messages files.<\/li>\n<\/ul>\n\n<h4>0.7.14<\/h4>\n\n<ul>\n<li>Fixes Better Messages promotional-menu hiding by running after Freemius registers Upgrade\/Pricing, Add-Ons and Contact Us, with a structural fallback for compatible Freemius menu markup.<\/li>\n<li>Forces the complete bundled pt-BR catalog for this plugin after locale resolution, preventing a temporarily stale WordPress.org language pack from leaving new administrator strings in English.<\/li>\n<li>Uses the WordPress plugin registry to detect SurfCoins WebSocket installation\/activation accurately.<\/li>\n<li>Replaces the generic Plugins screen link with a direct activation action when SurfCoins WebSocket is installed but inactive, and sends sites without the plugin directly to the SurfCoins WebSocket product page.<\/li>\n<\/ul>\n\n<h4>0.7.13<\/h4>\n\n<ul>\n<li>Adds an administrator introduction and permanent settings card for the optional SurfCoins WebSocket transport, including a direct product\/plans link.<\/li>\n<li>Detects whether SurfCoins WebSocket is installed, active, licensed and locally configured without adding a remote status request.<\/li>\n<li>Adds administrator-selectable Better Messages menu simplification; Upgrade, Add-Ons and Contact Us are hidden by default, while Mobile App remains visible unless selected.<\/li>\n<li>Changes the gray transport tooltip from \u201cFallback mode (REST)\u201d to the clearer \u201cWebSocket inactive\u201d.<\/li>\n<li>Adds and compiles pt-BR translations for all new administrator and transport-status strings.<\/li>\n<\/ul>\n\n<h4>0.7.12<\/h4>\n\n<ul>\n<li>Fixes the realtime WebSocket status dot not appearing in the Better Messages mobile account footer.<\/li>\n<li>Broadens current-user label detection for mobile layouts without injecting child nodes into React-managed markup.<\/li>\n<li>Keeps the CSS-only stable indicator introduced in 0.7.11, avoiding avatar\/name flicker.<\/li>\n<li>Keeps bundled internationalization and pt-BR labels unchanged.<\/li>\n<\/ul>\n\n<h4>0.7.11<\/h4>\n\n<ul>\n<li>Fixes the mobile\/desktop account row flashing together with the WebSocket indicator.<\/li>\n<li>Stops injecting a status child inside Better Messages React-managed username markup; the indicator is now rendered with a stable CSS pseudo-element.<\/li>\n<li>Removes the reconnect pulse animation so the avatar and account label remain visually stable while connection state changes.<\/li>\n<li>Keeps the green\/amber\/gray transport states and localized pt-BR status tooltip.<\/li>\n<\/ul>\n\n<h4>0.7.10<\/h4>\n\n<ul>\n<li>Loads the bundled translation catalog before SurfCoinsChat localizes runtime JavaScript labels.<\/li>\n<li>Fixes the WebSocket transport status tooltip showing in English on pt-BR installations.<\/li>\n<li>Keeps the WebSocket indicator behavior unchanged.<\/li>\n<\/ul>\n\n<h4>0.7.9<\/h4>\n\n<ul>\n<li>Fixes the WebSocket status indicator on Better Messages 3.x.<\/li>\n<li>Anchors the indicator to SurfCoinsChat's stable current-user element and keeps legacy Better Messages compatibility.<\/li>\n<\/ul>\n\n<h4>0.7.8<\/h4>\n\n<ul>\n<li>Adds a compact realtime transport indicator beside the signed-in user name.<\/li>\n<li>Green indicates an active SurfCoins WebSocket connection, amber indicates reconnecting, and gray indicates REST fallback.<\/li>\n<li>The status follows the SurfCoins WebSocket runtime without adding polling or extra network requests.<\/li>\n<\/ul>\n\n<h4>0.7.7<\/h4>\n\n<ul>\n<li>WordPress.org compatibility cleanup: document the external Better Messages thread-created hook at the exact PHPCS token.<\/li>\n<li>No functional chat behavior changed.<\/li>\n<\/ul>\n\n<h4>0.7.6<\/h4>\n\n<ul>\n<li>WordPress.org review cleanup: documents intentional realtime database access and Better Messages compatibility hooks for Plugin Check.<\/li>\n<li>Shortens the readme short description to the WordPress.org limit.<\/li>\n<li>No functional chat behavior changes.<\/li>\n<\/ul>\n\n<h4>0.7.5<\/h4>\n\n<ul>\n<li>Removes the empty Better Messages subject\/subtitle row in one-to-one conversations after switching from a group, eliminating the blank line between the contact name and presence status.<\/li>\n<li>Preserves genuine non-empty conversation subjects and the group member-count subtitle.<\/li>\n<\/ul>\n\n<h4>0.7.4<\/h4>\n\n<ul>\n<li>Fixed stale group\/member and last-seen header information when switching between conversations in Better Messages 3.x.<\/li>\n<li>The official thread-opened event now remains authoritative during React navigation transitions, preventing the previous thread id from being reused.<\/li>\n<li>Clears SurfCoinsChat-owned header state during thread changes and immediately restores a cached snapshot when available.<\/li>\n<\/ul>\n\n<h4>0.7.3<\/h4>\n\n<ul>\n<li>Fixes formatted group-member spacing, progressive group delivery\/read indicators, and named typing indicators in large Chat Rooms.<\/li>\n<\/ul>\n\n<h4>0.7.2<\/h4>\n\n<ul>\n<li>Adds clickable detailed delivery\/read status for outgoing group messages, including participant names and receipt timestamps.<\/li>\n<\/ul>\n\n<h4>0.7.1<\/h4>\n\n<ul>\n<li>Uses the Better Messages native participant count as the authoritative total for large group headers.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Adds a dedicated group-management panel integrated with Better Messages group conversations.<\/li>\n<li>Adds group name\/image, participants, moderators, invitations, member search, removal, mute\/ban, banned-user recovery, conversation notification mute, system-message preference, and leave-group controls.<\/li>\n<li>Preserves the existing SurfCoins WebSocket presence, typing, receipts, mobile keyboard\/header behavior, native voice\/video messages, and one-to-one calls.<\/li>\n<\/ul>\n\n<h4>0.6.70<\/h4>\n\n<ul>\n<li>Adds native Better Messages 3.x voice recording with waveform, pause\/resume, microphone selection, preview and audio trimming.<\/li>\n<li>Adds native video messages with camera and microphone selection, live recording, preview\/replay and native upload finalization.<\/li>\n<li>Provides built-in voice and video integration without requiring the optional Better Messages Voice and Video Messages add-on.<\/li>\n<li>Uses the Better Messages native attachment upload pipeline for faster voice and video message delivery.<\/li>\n<li>Preserves SurfCoins WebSocket realtime delivery and existing Community chat features.<\/li>\n<\/ul>\n\n<h4>0.6.67<\/h4>\n\n<ul>\n<li>Improves Web Share Target request validation and WordPress coding standards compatibility.<\/li>\n<li>Documents operating-system initiated share requests that cannot provide a WordPress nonce.<\/li>\n<li>Improves shared-file validation without changing the sharing workflow.<\/li>\n<\/ul>\n\n<h4>0.6.66<\/h4>\n\n<ul>\n<li>Adds Android\/PWA Web Share Target support for sharing text, links and images with SurfCoinsChat.<\/li>\n<li>Adds a conversation picker for selecting an existing Better Messages conversation or Chat Room.<\/li>\n<li>Uses Better Messages native attachment handling for shared images.<\/li>\n<li>Supports image previews before choosing a conversation.<\/li>\n<li>Improves single-image and multi-image preview layouts on mobile.<\/li>\n<li>Prevents shared content from being sent without explicit user confirmation.<\/li>\n<li>Improves Better Messages 3.x mobile\/full-screen compatibility.<\/li>\n<li>Adds internationalization strings for the complete sharing workflow.<\/li>\n<\/ul>\n\n<h4>0.6.65<\/h4>\n\n<ul>\n<li>Adds Android\/PWA Web Share Target support for sharing text and links into SurfCoinsChat.<\/li>\n<li>Lets the user choose an existing Better Messages conversation or Chat Room before inserting shared content.<\/li>\n<li>Shared content is placed in the native composer for review and is never sent automatically.<\/li>\n<\/ul>\n\n<h4>0.6.64<\/h4>\n\n<ul>\n<li>Added real-time online-user avatars to Better Messages Chat Room information panels.<\/li>\n<li>Improved Better Messages 3.x active conversation detection and context-panel rendering.<\/li>\n<li>Chat Room online presence now uses SurfCoins WebSocket presence without hardcoded room IDs or domains.<\/li>\n<li>Improved asset cache invalidation for updated SurfCoinsChat releases.<\/li>\n<\/ul>\n\n<h4>0.6.52<\/h4>\n\n<ul>\n<li>Fixes duplicate online dots on the conversation header and conversation-list avatars.<\/li>\n<li>Keeps the real image-anchored overlay only for message-stack avatars where Better Messages uses tall wrappers.<\/li>\n<\/ul>\n\n<h4>0.6.51<\/h4>\n\n<ul>\n<li>Fix: moves the real online dot slightly inward so it overlaps the avatar's lower-right corner instead of appearing below it.<\/li>\n<li>Fix: suppresses the legacy pseudo-element dot whenever the real 0.6.49+ overlay is active, preventing a second\/misaligned marker on Better Messages message avatars.<\/li>\n<\/ul>\n\n<h4>0.6.49<\/h4>\n\n<ul>\n<li>Fix: uses a real green online overlay anchored to the actual avatar image, covering Better Messages 3.0.11 desktop\/mobile wrappers, message avatars and conversation-list avatars.<\/li>\n<li>Fix: reapplies avatar presence after Better Messages React DOM rerenders without waiting for another presence pulse.<\/li>\n<\/ul>\n\n<h4>0.6.48<\/h4>\n\n<ul>\n<li>Shows the SurfCoinsChat online dot consistently on every visible avatar of the online participant, including message-stack avatars rendered on either side by Better Messages.<\/li>\n<li>Preserves the existing header, conversation-list and conversation-information presence markers.<\/li>\n<\/ul>\n\n<h4>0.6.43<\/h4>\n\n<ul>\n<li>Defers Web Push network delivery to an immediate one-shot WordPress cron task so remote Push latency does not block chat sends.<\/li>\n<li>Shows live percentage progress while a recorded voice message uploads.<\/li>\n<li>Preserves synchronous fallback if cron scheduling fails and keeps all Better Messages storage\/moderation behavior intact.<\/li>\n<\/ul>\n\n<h4>0.6.42<\/h4>\n\n<ul>\n<li>Turbo voice-message send path with a lean 32 kbps mono recording target to reduce upload size and mobile transfer time.<\/li>\n<li>Stores validated voice uploads directly as private WordPress attachments without waiting for unused synchronous media-library metadata generation.<\/li>\n<li>Removes the unused synchronous formatted-message rebuild from the voice upload response and lets SurfCoins WebSocket 0.3.2 reconcile the stored message asynchronously.<\/li>\n<li>Avoids a competing presence REST request at the exact start of a voice upload while realtime transport is healthy; the previous fallback remains active when WebSocket is unavailable.<\/li>\n<\/ul>\n\n<h4>0.6.37<\/h4>\n\n<ul>\n<li>Renders SurfCoinsWebSocket typing:start\/typing:stop events immediately in the active conversation and thread list instead of waiting for the REST safety poll.<\/li>\n<li>Keeps a short-lived in-memory WebSocket activity overlay on top of the latest REST presence snapshot so slower reconciliation responses cannot erase a just-received typing state.<\/li>\n<li>Restores the previous online\/last-seen state immediately after typing stops and falls back to a one-shot REST reconciliation only when no baseline snapshot exists yet.<\/li>\n<li>Suppresses redundant REST typing activity writes while the persistent WebSocket transport is connected; REST automatically resumes if the socket disconnects.<\/li>\n<li>Adds no new endpoint, database table, background task, or persistent timer beyond a bounded cleanup timeout for lost typing:stop frames.<\/li>\n<\/ul>\n\n<h4>0.6.36<\/h4>\n\n<ul>\n<li>Restores real-time online presence and typing activity with Better Messages 3.0.10 by keeping SurfCoinsChat's live presence query independent from Better Messages' durable last-activity lookup.<\/li>\n<li>Uses the official Better Messages thread-opened event as an active-thread fallback during React\/fullscreen remounts.<\/li>\n<li>Restores the green online marker on the current conversation header avatar and improves Better Messages 3.x avatar targeting.<\/li>\n<li>Adds a short typing grace window so brief typing bursts are not missed by adaptive polling while keeping the existing low-load synchronization model.<\/li>\n<li>Preserves the durable last-seen fallback from 0.6.35 without adding REST routes, database tables, external services, or background tasks.<\/li>\n<\/ul>\n\n<h4>0.6.35<\/h4>\n\n<ul>\n<li>Adds compatibility tuning for Better Messages 3.0.10 while retaining fallbacks for older Better Messages 3.x releases.<\/li>\n<li>Stops installing SurfCoinsChat's legacy Composer draft-race workaround when Better Messages 3.0.8 or newer is active, because Better Messages now fixes that race natively.<\/li>\n<li>Keeps the proven bounded one-tap quick-reply emoji safeguard because that programmatic Composer path is separate from Better Messages' newly fixed phone-keyboard\/paste emoji handling.<\/li>\n<li>Fixes the one-to-one header status by reusing Better Messages' visible native online-status line instead of inserting a second line that could be clipped by the compact header.<\/li>\n<li>Fixes offline last-seen information by combining SurfCoinsChat's real-time presence timestamp with Better Messages' durable <code>last_activity<\/code> value in batched queries. Real-time \"online now\" still requires a recent SurfCoinsChat session, so general site activity is not misreported as live chat presence.<\/li>\n<li>Adds no new REST endpoint, table, polling loop, external service, or background task.<\/li>\n<\/ul>\n\n<h4>0.6.34<\/h4>\n\n<ul>\n<li>Fixes drag-and-drop reordering in the Quick replies admin screen. jQuery UI Sortable ignores drags that start on button elements by default; the accessible drag handle is now explicitly allowed to start sorting while form controls remain protected.<\/li>\n<li>Improves the visual feedback while a row is being reordered and keeps the saved field indexes synchronized with the new order.<\/li>\n<li>Removes a duplicated Quick replies page heading. No front-end chat, REST, database, Push, PWA, presence, voice, or call behavior changes.<\/li>\n<\/ul>\n\n<h4>0.6.33<\/h4>\n\n<ul>\n<li>Fixes a fatal error on the Quick replies administration page caused by calling a non-existent <code>hidden()<\/code> helper after the reply rows were rendered.<\/li>\n<li>Uses the native HTML <code>hidden<\/code> attribute for the empty-state message, preserving the existing admin JavaScript behavior without adding inline scripts or styles.<\/li>\n<li>No changes to front-end quick-reply sending, REST routes, database tables, Push, PWA, presence, voice, or calls.<\/li>\n<\/ul>\n\n<h4>0.6.32<\/h4>\n\n<ul>\n<li>Adds SurfCoinsChat &gt; Quick replies so administrators can add, edit, enable\/disable, remove, and reorder the one-tap replies.<\/li>\n<li>Adds a live admin preview and Restore defaults action while keeping custom replies in one sanitized WordPress option.<\/li>\n<li>Adds no new REST endpoint, database table, polling cycle, or front-end background task.<\/li>\n<\/ul>\n\n<h4>0.6.31<\/h4>\n\n<ul>\n<li>Keeps the mobile software keyboard closed when a quick reply is tapped by no longer focusing the Better Messages contenteditable Composer during programmatic insertion.<\/li>\n<li>Normalizes emoji presentation selectors when confirming the selected quick reply, fixing the one-tap path for emoji-only suggestions such as \ud83d\udc4d on mobile browsers.<\/li>\n<li>Re-signals the native Better Messages input handler during the short bounded send window when a mobile WebView delays contenteditable bookkeeping.<\/li>\n<li>Keeps the existing horizontally scrollable quick-reply chips and introduces no REST endpoint, polling cycle, database table, or server-side message path.<\/li>\n<\/ul>\n\n<h4>0.6.30<\/h4>\n\n<ul>\n<li>Fixes one-tap quick-reply sending with Better Messages 3.x by honoring its <code>aria-disabled<\/code> \/ <code>data-disabled<\/code> button state instead of relying only on the native <code>disabled<\/code> property.<\/li>\n<li>Binds quick replies to the Composer immediately adjacent to the visible suggestion strip so a covered fullscreen\/background Composer cannot receive the text instead.<\/li>\n<li>Makes quick-reply chips non-shrinking, horizontally scrollable pill buttons even when the active Better Messages fullscreen wrapper is outside <code>.bp-messages-wrap<\/code>.<\/li>\n<li>No REST endpoint, database, polling, Push, PWA, presence, voice, or call behavior changes.<\/li>\n<\/ul>\n\n<h4>0.6.29<\/h4>\n\n<ul>\n<li>Fixes quick replies on layouts that expose the legacy Better Messages <code>.bm-send-message<\/code> control so tapping a suggestion sends it immediately instead of only filling the composer.<\/li>\n<li>Keeps the Better Messages 3.x accented composer action path and waits for React to switch safely from microphone\/idle state before activating it.<\/li>\n<li>Strengthens quick-reply chip styling against theme\/button resets, with visible borders, pill-shaped border radius, spacing, and mobile-friendly touch targets.<\/li>\n<li>Adds no REST endpoint, polling cycle, database table, or server-side message path.<\/li>\n<\/ul>\n\n<p>For releases before 0.6.29, see <code>changelog.txt<\/code>.<\/p>","raw_excerpt":"Adds group management, quick replies, presence, read status, voice messages, WebRTC calls, PWA support, and Web Push to Better Messages Community.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/362807","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=362807"}],"author":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/naturalsurf"}],"wp:attachment":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=362807"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=362807"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=362807"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=362807"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=362807"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=362807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}