{"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-09-28T23:18:08","modified_gmt":"2026-09-28T23:18:08","slug":"surfcoinschat-community","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/surfcoinschat-community\/","author":23540586,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.6.43","stable_tag":"0.6.43","tested":"7.1.2","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-09-28 23:18:08","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":58,"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}},"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"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3718007,"resolution":"1","location":"assets","locale":"","width":1448,"height":1086},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3718007,"resolution":"2","location":"assets","locale":"","width":941,"height":1672},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3718007,"resolution":"3","location":"assets","locale":"","width":941,"height":1672},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3718007,"resolution":"4","location":"assets","locale":"","width":941,"height":1672}},"screenshots":{"1":"Desktop chat interface with real-time presence, image sharing, read status and message composer.","2":"Mobile chat interface with presence, audio messaging, image sharing, read status and message composer.","3":"Mobile chat with voice\/video call history and audio messages.","4":"Mobile chat with quoted replies, read status and online presence."}},"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=3718007","caption":"Desktop chat interface with real-time presence, image sharing, read status and message composer."},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-2.png?rev=3718007","caption":"Mobile chat interface with presence, audio messaging, image sharing, read status and message composer."},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-3.png?rev=3718007","caption":"Mobile chat with voice\/video call history and audio messages."},{"src":"https:\/\/ps.w.org\/surfcoinschat-community\/assets\/screenshot-4.png?rev=3718007","caption":"Mobile chat with quoted replies, read status and online presence."}],"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>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.<\/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<\/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>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.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 quick replies, presence, read status, voice messages, WebRTC calls, PWA support, and opt-in Web Push to Better Messages Community.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/362807","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=362807"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/naturalsurf"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=362807"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=362807"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=362807"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=362807"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=362807"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=362807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}