{"id":308225,"date":"2026-05-23T09:48:30","date_gmt":"2026-05-23T09:48:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lobbychat\/"},"modified":"2026-06-26T19:09:44","modified_gmt":"2026-06-26T19:09:44","slug":"lobbychat","status":"publish","type":"plugin","link":"https:\/\/bre.wordpress.org\/plugins\/lobbychat\/","author":220166,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.2","stable_tag":"1.2.2","tested":"7.0","requires":"5.8","requires_php":"7.2","requires_plugins":null,"header_name":"LobbyChat","header_author":"Asad Khalil","header_description":"A live, casual shoutbox for your community. Real-time messages, emoji reactions, link previews, moderator tools, and an optional AI chat companion. No third-party dependencies.","assets_banners_color":"","last_updated":"2026-06-26 19:09:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/JauntyMYT\/lobbychat","header_author_uri":"https:\/\/profiles.wordpress.org\/jauntymellifluous\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":216,"num_ratings":0,"support_threads":2,"support_threads_resolved":2,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.6":{"tag":"1.0.6","author":"jauntymellifluous","date":"2026-05-23 10:57:07"},"1.0.7":{"tag":"1.0.7","author":"jauntymellifluous","date":"2026-05-23 11:22:43"},"1.0.8":{"tag":"1.0.8","author":"jauntymellifluous","date":"2026-06-07 18:02:19"},"1.2.1":{"tag":"1.2.1","author":"jauntymellifluous","date":"2026-06-26 18:49:28"},"1.2.2":{"tag":"1.2.2","author":"jauntymellifluous","date":"2026-06-26 19:09:44"}},"upgrade_notice":{"1.2.2":"<p>Minor compliance and code-quality fixes. Recommended for anyone using Turnstile.<\/p>","1.2.1":"<p>Fixes emoji picker insertion on sites that use Twemoji emoji images.<\/p>","1.2.0":"<p>Adds optional Cloudflare Turnstile bot protection, fixes the emoji picker, and smooths out moderator controls.<\/p>","1.1.0":"<p>New emoji picker and moderator &quot;clear chat&quot; button, plus a fix so message auto-delete works reliably on low-traffic sites.<\/p>","1.0.8":"<p>Two bug fixes: apostrophes\/special characters now display correctly; clickable usernames no longer 404 on sites without author archives. Recommended upgrade.<\/p>","1.0.7":"<p>Confirmed compatible with WordPress 7.0.<\/p>","1.0.6":"<p>Minor: Plugin URI updated to GitHub source repository.<\/p>","1.0.5":"<p>WordPress.org compliance \u2014 proper script enqueue + longer constant prefix.<\/p>","1.0.4":"<p>WordPress.org compliance pass \u2014 opt-in branding + documented external services.<\/p>","1.0.3":"<p>Fixes link sharing \u2014 now reliably renders link previews for any URL with a graceful fallback. Recommended upgrade.<\/p>","1.0.2":"<p>Plugin Check compliance pass. Recommended upgrade.<\/p>","1.0.1":"<p>Fixes the send button not working in certain themes. Recommended upgrade.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3545021,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3545021,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.6","1.0.7","1.0.8","1.2.1","1.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3545021,"resolution":"1","location":"assets","locale":"","width":546,"height":524},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3545021,"resolution":"2","location":"assets","locale":"","width":1037,"height":893},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3545021,"resolution":"3","location":"assets","locale":"","width":992,"height":911},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3545041,"resolution":"4","location":"assets","locale":"","width":677,"height":585}},"screenshots":{"1":"Live chat feed with reactions and link previews.","2":"Online member breakdown showing members, guests, and bots.","3":"Settings page with rate-limit controls and moderation options.","4":"AI bot configuration with built-in setup guide."}},"plugin_section":[],"plugin_tags":[5707,107,2316,2379,7487],"plugin_category":[41,44],"plugin_contributors":[264116],"plugin_business_model":[],"class_list":["post-308225","plugin","type-plugin","status-publish","hentry","plugin_tags-chat","plugin_tags-comments","plugin_tags-community","plugin_tags-live-chat","plugin_tags-shoutbox","plugin_category-communication","plugin_category-discussion-and-community","plugin_contributors-jauntymellifluous","plugin_committers-jauntymellifluous"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/lobbychat\/assets\/icon-128x128.png?rev=3545021","icon_2x":"https:\/\/ps.w.org\/lobbychat\/assets\/icon-256x256.png?rev=3545021","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/lobbychat\/assets\/screenshot-1.png?rev=3545021","caption":"Live chat feed with reactions and link previews."},{"src":"https:\/\/ps.w.org\/lobbychat\/assets\/screenshot-2.png?rev=3545021","caption":"Online member breakdown showing members, guests, and bots."},{"src":"https:\/\/ps.w.org\/lobbychat\/assets\/screenshot-3.png?rev=3545021","caption":"Settings page with rate-limit controls and moderation options."},{"src":"https:\/\/ps.w.org\/lobbychat\/assets\/screenshot-4.png?rev=3545041","caption":"AI bot configuration with built-in setup guide."}],"raw_content":"<!--section=description-->\n<p><strong>LobbyChat<\/strong> is a lightweight live-chat shoutbox you can drop into any WordPress page or sidebar with a single shortcode. Built for communities \u2014 fan sites, forums, fandoms, classrooms, internal teams \u2014 where you want a casual, always-on group chat without bolting on Slack or Discord.<\/p>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li><strong>Live chat feed<\/strong> with auto-refresh (configurable polling interval \u2014 no WebSocket server required)<\/li>\n<li><strong>Guest posting<\/strong> \u2014 visitors can chat with just a display name, no signup wall<\/li>\n<li><strong>Emoji reactions<\/strong> on every message \u2014 \ud83d\udc4d \u2764\ufe0f \ud83d\ude02 \ud83d\udd25 \ud83c\udf89<\/li>\n<li><strong>Link previews<\/strong> for YouTube and any URL with Open Graph tags<\/li>\n<li><strong>@mention highlighting<\/strong> \u2014 <code>@username<\/code> gets visually picked out<\/li>\n<li><strong>Pinned messages<\/strong> \u2014 moderators can pin one important message above the feed<\/li>\n<li><strong>Online presence<\/strong> \u2014 live count of members, guests, and search-engine bots in the room<\/li>\n<li><strong>Moderator role<\/strong> \u2014 add a \"LobbyChat Moderator\" role to any user for pin\/delete powers<\/li>\n<li><strong>Reporting + auto-hide<\/strong> \u2014 5 reports on a message and it's hidden automatically<\/li>\n<li><strong>Word blocklist<\/strong> for basic profanity filtering<\/li>\n<li><strong>Rate limiting<\/strong> built in \u2014 separate cooldowns for guests vs members<\/li>\n<li><strong>Fullscreen mode<\/strong> + collapse toggle<\/li>\n<li><strong>Sound notification<\/strong> for new messages (toggleable per-visitor)<\/li>\n<li><strong>Mobile responsive<\/strong><\/li>\n<\/ul>\n\n<h4>Optional: AI Chat Companion<\/h4>\n\n<p>LobbyChat ships with an optional AI bot you can drop into your chat. The bot uses <strong>your own API keys<\/strong> \u2014 you bring your own Google Gemini key (the free tier works) or OpenAI key. The plugin does <strong>not<\/strong> route requests through any third-party server.<\/p>\n\n<ul>\n<li><strong>Bring-your-own-key<\/strong> \u2014 Gemini (free tier) or OpenAI (paid)<\/li>\n<li><strong>Configurable persona<\/strong> \u2014 name, system prompt, custom personality<\/li>\n<li><strong>Smart triggers<\/strong> \u2014 replies to @mentions always; questions usually; random messages occasionally (all configurable)<\/li>\n<li><strong>Hard rate limits<\/strong> \u2014 daily and hourly caps protect against runaway API costs<\/li>\n<li><strong>Active-hours window<\/strong> \u2014 bot only chats during the hours you specify<\/li>\n<li><strong>One-click test<\/strong> in the admin to verify the bot can post<\/li>\n<\/ul>\n\n<h4>Privacy &amp; data<\/h4>\n\n<p>LobbyChat <strong>does not call any third-party server by default<\/strong>. The only network calls are:<\/p>\n\n<ul>\n<li>Fetching link previews when a user shares a URL (request goes from your server to that URL)<\/li>\n<li>Calling Google Gemini or OpenAI <strong>only if you explicitly enable the AI bot and provide an API key<\/strong><\/li>\n<\/ul>\n\n<p>No telemetry, no analytics, no \"phone home.\" All data lives in your own <code>wp_lobbychat*<\/code> tables.<\/p>\n\n<h4>Try it live<\/h4>\n\n<p>See LobbyChat running in production at <a href=\"https:\/\/bejaunty.com\/plugins\/lobbychat\">bejaunty.com\/plugins\/lobbychat<\/a>.<\/p>\n\n<h4>Roadmap<\/h4>\n\n<p>LobbyChat is the free, standalone version. Premium add-ons with gaming-community features \u2014 looking-for-group buttons, platform tags, profile-card integration, and richer moderation tools \u2014 are in development. Updates and announcements at <a href=\"https:\/\/bejaunty.com\">bejaunty.com<\/a>.<\/p>\n\n<h4>Support development<\/h4>\n\n<p>LobbyChat is free and developed in spare time. If it helps your community, you can support development at <a href=\"https:\/\/wise.com\/pay\/me\/asadk372\">wise.com\/pay\/me\/asadk372<\/a>. Every bit is appreciated. \u2665<\/p>\n\n<h4>Usage<\/h4>\n\n<p>After activating, drop this shortcode into any page, post, or text widget:<\/p>\n\n<pre><code>[lobbychat]\n<\/code><\/pre>\n\n<p>Then visit <strong>Settings \u2192 LobbyChat<\/strong> to configure rate limits, blocklist, and other options. For the AI bot, see <strong>Settings \u2192 LobbyChat AI Bot<\/strong>.<\/p>\n\n<h4>Developer hooks<\/h4>\n\n<p>LobbyChat exposes several filters and actions for theme\/plugin developers:<\/p>\n\n<ul>\n<li><code>lobbychat_after_send<\/code> \u2014 action, fires after a message is saved. <code>do_action('lobbychat_after_send', $user_id, $message_id, $row)<\/code> \u2014 the third arg is the database row object.<\/li>\n<li><code>lobbychat_profile_url<\/code> \u2014 filter, override the URL linked from a username (default: WP author archive)<\/li>\n<li><code>lobbychat_allowed_reactions<\/code> \u2014 filter, override the array of allowed reaction emoji<\/li>\n<li><code>lobbychat_report_threshold<\/code> \u2014 filter, change the auto-hide report threshold (default: 5)<\/li>\n<li><code>lobbychat_emoji_set<\/code> \u2014 filter, customize the array of emoji shown in the picker<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external service by default. Two optional features may, <strong>only when explicitly enabled by the site administrator<\/strong>, contact third-party services:<\/p>\n\n<h4>1. Link previews<\/h4>\n\n<p>When the link-sharing feature is enabled (Settings \u2192 LobbyChat \u2192 \"Allow link sharing\", which is on by default), and a logged-in user shares a URL in chat, the plugin's server fetches that URL once to extract Open Graph \/ Twitter \/ <code>&lt;title&gt;<\/code> metadata for a preview card.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> The HTTP request from your server to the URL the user pasted. The request user-agent identifies as <code>LobbyChatBot\/1.0<\/code> and includes a link back to your site.<\/li>\n<li><strong>When:<\/strong> Only at the moment a user posts a message containing a URL.<\/li>\n<li><strong>What is received and stored:<\/strong> Title, description, and image URL extracted from the page's metadata. Stored in the chat message row in your database.<\/li>\n<li><strong>Special handling for YouTube URLs:<\/strong> YouTube URLs are first sent to YouTube's public oEmbed endpoint (<code>https:\/\/www.youtube.com\/oembed<\/code>) to retrieve title and author info. YouTube's <a href=\"https:\/\/www.youtube.com\/static?template=terms\">Terms of Service<\/a> and <a href=\"https:\/\/policies.google.com\/privacy\">Privacy Policy<\/a> apply.<\/li>\n<\/ul>\n\n<p>This feature can be fully disabled by un-checking \"Allow link sharing\" in plugin settings.<\/p>\n\n<h4>2. Optional AI chat companion<\/h4>\n\n<p>When the AI bot is explicitly enabled by the administrator (Settings \u2192 LobbyChat AI Bot \u2192 \"Enable bot\", which is <strong>off by default<\/strong>) and the administrator has provided their own API key for one or both of the providers below, chat messages are sent to that provider for the bot to generate replies.<\/p>\n\n<p><strong>Google Gemini API<\/strong> (<code>https:\/\/generativelanguage.googleapis.com\/<\/code>)\n* <strong>What it is:<\/strong> Google's generative AI service, used here to produce conversational chat replies.\n* <strong>What is sent:<\/strong> Up to 6 most recent chat messages (sender display name + message text), the bot's system prompt, and the administrator's Gemini API key.\n* <strong>When:<\/strong> Only when the administrator has enabled the bot AND a chat message satisfies the bot's reply-trigger rules (mention, question, or random chance \u2014 all configurable).\n* <strong>Terms and privacy:<\/strong> <a href=\"https:\/\/developers.google.com\/terms\">Google APIs Terms of Service<\/a>, <a href=\"https:\/\/ai.google.dev\/gemini-api\/terms\">Gemini API Additional Terms<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a>.<\/p>\n\n<p><strong>OpenAI API<\/strong> (<code>https:\/\/api.openai.com\/<\/code>)\n* <strong>What it is:<\/strong> OpenAI's chat completions API, used here as a fallback when Gemini fails or as the primary if only an OpenAI key is configured.\n* <strong>What is sent:<\/strong> Same as Gemini above (recent messages + system prompt + administrator's OpenAI API key).\n* <strong>When:<\/strong> Same conditions as Gemini above.\n* <strong>Terms and privacy:<\/strong> <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">OpenAI Terms of Use<\/a>, <a href=\"https:\/\/openai.com\/policies\/api-data-usage-policies\">OpenAI API Data Usage Policies<\/a>, <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">OpenAI Privacy Policy<\/a>.<\/p>\n\n<p>The AI bot is disabled by default and will not contact any external service unless the administrator explicitly enables it and provides an API key.<\/p>\n\n<h4>3. Optional Cloudflare Turnstile spam protection<\/h4>\n\n<p>When Turnstile is explicitly enabled by the administrator (Settings \u2192 LobbyChat \u2192 Spam protection, <strong>off by default<\/strong>) and a site key and secret key are provided, the plugin uses Cloudflare's Turnstile service to verify that the person posting is not a bot.<\/p>\n\n<p><strong>Cloudflare Turnstile<\/strong> (<code>https:\/\/challenges.cloudflare.com\/<\/code>)\n* <strong>What it is:<\/strong> Cloudflare's privacy-focused CAPTCHA alternative, used here to block automated spam before a message is posted.\n* <strong>What is sent:<\/strong> When a user submits a message, the Turnstile token generated in their browser plus the user's IP address are sent from your server to Cloudflare's <code>siteverify<\/code> endpoint, along with your secret key, to confirm the token is valid. The browser-side widget also loads Cloudflare's <code>api.js<\/code> script from <code>challenges.cloudflare.com<\/code>.\n* <strong>When:<\/strong> Only when Turnstile is enabled and a user attempts to post a message (optionally limited to guests only).\n* <strong>Terms and privacy:<\/strong> <a href=\"https:\/\/www.cloudflare.com\/website-terms\/\">Cloudflare Website Terms of Use<\/a>, <a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">Cloudflare Privacy Policy<\/a>.<\/p>\n\n<p>Turnstile is disabled by default and will not contact any external service unless the administrator explicitly enables it and provides their own keys.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>lobbychat<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, <strong>or<\/strong> install the zip via Plugins \u2192 Add New \u2192 Upload.<\/li>\n<li>Activate the plugin through the Plugins menu.<\/li>\n<li>Place the shortcode <code>[lobbychat]<\/code> on the page or in the widget area where you want the chat to appear.<\/li>\n<li>(Optional) Visit <strong>Settings \u2192 LobbyChat<\/strong> to tweak rate limits and moderation settings.<\/li>\n<li>(Optional) Visit <strong>Settings \u2192 LobbyChat AI Bot<\/strong> if you want to add an AI chat companion.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20require%20a%20websocket%20server%2C%20pusher%2C%20or%20any%20external%20service%3F\"><h3>Does this require a WebSocket server, Pusher, or any external service?<\/h3><\/dt>\n<dd><p>No. LobbyChat uses simple HTTP polling at a configurable interval (default 30 seconds). It runs entirely on your own WordPress install with no external dependencies.<\/p><\/dd>\n<dt id=\"can%20guests%20post%20without%20registering%3F\"><h3>Can guests post without registering?<\/h3><\/dt>\n<dd><p>Yes \u2014 guest posting is on by default. They just enter a display name. You can require login in Settings if you prefer.<\/p><\/dd>\n<dt id=\"how%20do%20i%20make%20someone%20a%20moderator%3F\"><h3>How do I make someone a moderator?<\/h3><\/dt>\n<dd><p>Edit the user in <strong>Users \u2192 All Users<\/strong>, change their role (or add the role) to <strong>LobbyChat Moderator<\/strong>. Administrators are automatically moderators.<\/p><\/dd>\n<dt id=\"how%20does%20the%20ai%20bot%20work%3F%20does%20it%20cost%20me%20anything%3F\"><h3>How does the AI bot work? Does it cost me anything?<\/h3><\/dt>\n<dd><p>The bot is <strong>off by default<\/strong>. To turn it on, you provide your own Gemini API key (Google offers a free tier \u2014 see <a href=\"https:\/\/aistudio.google.com\/apikey\">aistudio.google.com\/apikey<\/a>) and\/or OpenAI key. The bot calls those APIs directly from your server using your key. We never see your messages or your key.<\/p><\/dd>\n<dt id=\"will%20old%20messages%20be%20deleted%20automatically%3F\"><h3>Will old messages be deleted automatically?<\/h3><\/dt>\n<dd><p>Yes if you want. Set <strong>Auto-delete old messages<\/strong> in Settings to a number of days (default 30, set to 0 to keep forever). Pinned messages are never auto-deleted.<\/p><\/dd>\n<dt id=\"is%20the%20chat%20history%20searchable%3F\"><h3>Is the chat history searchable?<\/h3><\/dt>\n<dd><p>Not in the current version. Messages are stored in a standard MySQL table (<code>wp_lobbychat<\/code>) so any standard WP backup or export tool will include them.<\/p><\/dd>\n<dt id=\"can%20i%20style%20it%20to%20match%20my%20theme%3F\"><h3>Can I style it to match my theme?<\/h3><\/dt>\n<dd><p>Yes \u2014 every color is set via CSS custom properties (<code>--lobbychat-accent<\/code>, <code>--lobbychat-bg<\/code>, etc.) on the wrapper. Override them in your theme's stylesheet.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20mobile%3F\"><h3>Does it work on mobile?<\/h3><\/dt>\n<dd><p>Yes, the layout is fully responsive and supports fullscreen mode.<\/p><\/dd>\n<dt id=\"where%20do%20clickable%20usernames%20link%20to%3F%20can%20i%20point%20them%20at%20a%20custom%20profile%20page%3F\"><h3>Where do clickable usernames link to? Can I point them at a custom profile page?<\/h3><\/dt>\n<dd><p>By default usernames link to the WordPress author archive \u2014 but only if that user has published a post (otherwise the link is omitted to avoid 404s).<\/p>\n\n<p>To send clicks to a different URL (e.g. a BuddyPress profile, a custom <code>\/profile\/{username}<\/code> page from your community plugin, or anywhere else), use the <code>lobbychat_profile_url<\/code> filter in your theme's <code>functions.php<\/code>:<\/p>\n\n<pre><code>add_filter( 'lobbychat_profile_url', function( $url, $user_id ) {\n    $user = get_userdata( $user_id );\n    return $user ? home_url( '\/profile\/' . $user-&gt;user_login ) : $url;\n}, 10, 2 );\n<\/code><\/pre><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Compliance: Cloudflare Turnstile's API script is now printed directly instead of enqueued, to satisfy WordPress.org's rule against enqueueing remote scripts. No functional change \u2014 Turnstile works exactly as before.<\/li>\n<li>Housekeeping: cleaned up a couple of Plugin Check warnings (script versioning and a cross-method nonce annotation).<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fixed: Clicking an emoji in the picker did nothing on sites where WordPress replaces emoji with images (Twemoji). The real emoji character is now stored on each button and inserted reliably regardless of how the glyph is displayed.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: Optional Cloudflare Turnstile integration for bot protection. Enable it under Settings \u2192 LobbyChat \u2192 Spam protection, paste your free site\/secret keys, and choose whether to require it for everyone or guests only. Posting is blocked until the check passes.<\/li>\n<li>Improved: Emoji picker is more reliable \u2014 fixed an issue where clicking the \ud83d\ude0a button or an emoji did nothing on some setups.<\/li>\n<li>Improved: The moderator \"clear chat\" action no longer uses a browser confirm() popup. Instead the \ud83e\uddf9 button arms on first click (turns red, shows \u2713) and clears on a second click within 3 seconds.<\/li>\n<li>Improved: Hover actions (Delete \/ Pin \/ Report) now float in the top-right corner of a message instead of pushing the message taller, so row heights no longer jump on hover.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: Emoji picker \u2014 users can insert emoji into their messages via a \ud83d\ude0a button next to the message box. The emoji set is filterable with <code>lobbychat_emoji_set<\/code>.<\/li>\n<li>New: Moderators can instantly clear all chat messages with a \ud83e\uddf9 button in the chat header \u2014 useful for sites that run multiple separate sessions (pinned messages are kept). <\/li>\n<li>Fixed: Auto-delete (message retention) now also runs opportunistically when the chat is loaded, throttled to once per hour. Previously, on very low-traffic sites \u2014 for example a chat only enabled during a weekly event \u2014 WordPress cron might never fire and old messages would linger past their retention window. Thanks to @david-innes for the report.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Fixed: Apostrophes and other special characters were rendered as HTML entities (<code>I&amp;#039;m going<\/code> instead of <code>I'm going<\/code>) in chat messages and display names. Server no longer double-encodes payload fields that the JS client already escapes at render time. Thanks to @david-innes for the report.<\/li>\n<li>Fixed: Clickable usernames could 404 on sites where users hadn't published any posts or where author archives are disabled. Default username link is now only added when the user has a usable author archive \u2014 otherwise the name is shown as plain text. Use the <code>lobbychat_profile_url<\/code> filter to point at custom profile URLs (see FAQ).<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Updated: \"Tested up to\" bumped to WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Updated: Plugin URI now points to the GitHub source repository (<code>github.com\/JauntyMYT\/lobbychat<\/code>) for a more stable canonical URL.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Compliance: Moved inline admin JavaScript to a properly enqueued file (<code>assets\/js\/admin.js<\/code>) loaded only on the bot settings page via <code>admin_enqueue_scripts<\/code>, per WordPress.org coding standards.<\/li>\n<li>Compliance: Renamed all plugin-defined constants from the 3-character <code>LBC_*<\/code> prefix to <code>LOBBYCHAT_*<\/code> to meet the 4+ character prefix requirement.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Compliance: \"Powered by LobbyChat\" frontend attribution is now opt-in (off by default) per WordPress.org guidelines on plugin attribution.<\/li>\n<li>Compliance: Added detailed \"External services\" section to readme documenting all third-party API calls (Gemini, OpenAI, YouTube oEmbed, link preview fetches) with terms-of-service and privacy-policy links.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: Link sharing now works for any URL \u2014 previously only worked when the linked page had perfectly-formatted Open Graph tags. Now handles Twitter cards, plain <code>&lt;title&gt;<\/code> tags, and falls back to a bare link card if no metadata is available.<\/li>\n<li>Improved: Open Graph parser now handles meta tags with <code>content<\/code> before <code>property<\/code>, mixed quote styles, and follows redirects.<\/li>\n<li>Improved: Bumped link-fetch timeout from 5s to 8s for slower-responding sites.<\/li>\n<li>Updated: Plugin URI and demo link now point to bejaunty.com.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Plugin Check compliance: addressed all errors and warnings from the official WordPress Plugin Check tool.<\/li>\n<li>Replaced <code>parse_url()<\/code> with <code>wp_parse_url()<\/code>, <code>mt_rand()<\/code> with <code>wp_rand()<\/code>, <code>date()<\/code> with <code>gmdate()<\/code>.<\/li>\n<li>Added <code>wp_unslash()<\/code> to all <code>$_POST<\/code> and <code>$_SERVER<\/code> reads before sanitization.<\/li>\n<li>Refactored <code>get_messages()<\/code> to avoid dynamic SQL fragments \u2014 now uses two clean prepared queries.<\/li>\n<li>Added documented phpcs suppressions for legitimate direct-DB access (custom plugin tables) and bot logging.<\/li>\n<li>Removed redundant <code>load_plugin_textdomain()<\/code> (WP.org auto-loads translations since WP 4.6).<\/li>\n<li>Removed <code>Domain Path<\/code> header (no <code>\/languages\/<\/code> folder needed for WP.org-hosted plugins).<\/li>\n<li>Bumped <code>Tested up to: 6.9<\/code> to match current WordPress release.<\/li>\n<li>Renamed template-scope variables to use full <code>lobbychat_<\/code> prefix.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed: Send button not working in some themes \u2014 moved script localization earlier so the LobbyChat global is always defined when the JS loads.<\/li>\n<li>Fixed: Click handler now uses event delegation, so it survives DOM changes from page builders and caching plugins.<\/li>\n<li>Fixed: Uninstall now correctly drops the messages table (was using the wrong table name).<\/li>\n<li>Fixed: Removed unused <code>tag<\/code> column from the messages table schema (auto-migrates from 1.0.0).<\/li>\n<li>Added: \"Show 'Powered by' link\" toggle in Settings (on by default \u2014 admins can turn it off).<\/li>\n<li>Added: Donate link on the Plugins page, in plugin header, and on the settings page footer.<\/li>\n<li>Added: Console diagnostic when the LobbyChat global is missing (helps debug script-loading conflicts).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Live chat feed with HTTP polling.<\/li>\n<li>Guest and member posting with separate rate limits.<\/li>\n<li>Emoji reactions, link previews (YouTube + Open Graph), pinned messages.<\/li>\n<li>Reporting with auto-hide threshold.<\/li>\n<li>Word blocklist + 60-second self-delete window.<\/li>\n<li>Custom <strong>LobbyChat Moderator<\/strong> role.<\/li>\n<li>Online presence with bot detection.<\/li>\n<li>Optional AI chat companion (Gemini + OpenAI fallback).<\/li>\n<li>Fullscreen mode, collapse toggle, sound notifications.<\/li>\n<\/ul>","raw_excerpt":"A live, casual shoutbox for your community. Real-time messages, emoji reactions, link previews, moderator tools, optional AI bot.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/308225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=308225"}],"author":[{"embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jauntymellifluous"}],"wp:attachment":[{"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=308225"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=308225"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=308225"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=308225"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=308225"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bre.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=308225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}