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 messagenotification 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)
| Setting | Default | Meaning |
|---|---|---|
| Floating messenger on every page | on | Off = only the /messages pages remain |
| Allow new conversations | on | Off = existing threads can be answered, no new ones can be started |
| Messages per member per day | 100 | 0 = no limit |
| Seconds between two messages | 3 | Flood protection |
| Longest message (characters) | 4000 | |
| Messages loaded at once | 20 | Also 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:
| Route | Purpose |
|---|---|
/messages/panel | conversation list, or ?mode=count for badges only |
/messages/open?to={user id} | open or start the conversation with a member |
/messages/{id}/feed | newest messages, or ?after={id} / ?before={id} for live and older |
/messages/{id}/send, /messages/send | store 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.