Private one-to-one conversations between members, in a Messenger-style window that follows you across the site.

What it does

  • Floating messenger: a round launcher in the bottom corner opens a small panel with your conversations and the active chat. It stays put while you move between pages, remembers the open conversation, and sends and receives messages without a reload.
  • Live updates: when [TabRe Socket](../tabre_socket/) is running, a new message appears in the open conversation immediately and raises a toast elsewhere; counts still come from the server, so the badges never guess. Without the socket the client catches up on a short poll, when the tab becomes visible and when the page loads.
  • Inbox at /messages: a two-pane view — conversations on the left, the chat on the right — with the last message, the time and a solid unread pill. On a phone it shows one pane at a time.
  • Conversation at /messages/{id}: day separators, grouped bubbles, older messages on demand, and a composer that sends with Enter (Shift+Enter for a new line). Markdown is rendered safely.
  • New conversation at /messages/new (type a name) or from the Message button on a profile, which opens the dock straight onto that member.
  • Notifications: the other member gets a sent you a message notification and the account menu keeps an unread conversation count.
  • Only the two participants can read or write a thread; anyone else gets a 404.

The dock hides itself on /messages, /chatroom, the admin panel, login and setup pages, because those pages either already show the conversation or have no room for it.

Settings (Admin → Plugins → TabRe Messages)

SettingDefaultMeaning
Floating messenger on every pageonOff = only the /messages pages remain
Allow new conversationsonOff = existing threads can be answered, no new ones can be started
Messages per member per day1000 = no limit
Seconds between two messages3Flood protection
Longest message (characters)4000
Messages loaded at once20Also the size of one "older messages" batch

Data and endpoints

Two tables, dropped on uninstall: plugin_tabre_messages_thread, plugin_tabre_messages_msg.
The read mark is the last message id each side has seen, so an unread count costs one query per page.

JSON endpoints used by the dock, all POST-checked for state changes and limited to participants:

RoutePurpose
/messages/panelconversation list, or ?mode=count for badges only
/messages/open?to={user id}open or start the conversation with a member
/messages/{id}/feednewest messages, or ?after={id} / ?before={id} for live and older
/messages/{id}/send, /messages/sendstore a message, answer with the escaped bubble HTML

Without JavaScript

Every entry point is a normal link: the launcher goes to /messages, rows are links, chat pages paginate, and the page composer is a real form with a CSRF field. The dock only adds convenience on top.