Real-time messaging with threads, search, attachments and entity references
Real-time messaging built into FreeMaint for maintenance teams
Team Chat lets your maintenance team communicate in real time inside FreeMaint โ no more switching to Slack or WhatsApp to discuss a work order. Available on the Business tier.
Team Chat is available from the Business tier ($99/mo). Core and Starter companies see an upgrade banner when accessing the chat page.
When you first open Chat, the conversation list is empty. Click 'New DM' or 'New group' to start one.
Chat has its own entry in the left sidebar (speech-bubble icon). Click Chat to open the messaging page โ the conversation list is on the left and the active conversation on the right.
Start a 1:1 conversation with anyone in your company
Direct messages are private 1:1 conversations between you and another team member. They are find-or-create โ clicking 'New DM' with a user already in a DM with you reopens the existing conversation instead of creating a duplicate.
Pick yourself in the recipient list to create a 'Notes to self' conversation โ a private space for reminders, snippets and quick references. Self-DMs behave exactly like normal DMs except no one else can read them.
DMs are idempotent: opening the same DM twice returns the same conversation, never a duplicate.
Multi-person conversations with up to 50 members
Group chats let multiple team members discuss together. Cap is 50 members including the creator (49 + you).
Keep focused discussions out of the main timeline
When a message generates a long discussion, reply in a thread instead of stretching the main conversation. Replies stay attached to their parent message and appear nested underneath it, so nothing you are notified about is ever missing from the timeline. Threads are depth-1 (Slack-style) โ you can't reply to a reply.
Use threads for any discussion that lasts more than 3-4 messages โ keeps the main timeline scannable. On a narrow window the focused view opens as a side sheet.
Find any message across all conversations you belong to
Search lets you find messages by content across every conversation you're a member of. Results are case-insensitive, support unicode (accents, non-Latin scripts), and exclude soft-deleted messages.
Search runs across every conversation you're a member of. You can also pass a conversationId to scope the search to a single conversation (useful for very long histories).
Search is case-insensitive and unicode-aware โ you can search 'cafรฉ', 'rรฉsumรฉ' or 'ไผ่ญฐ' just like English words.
Share photos, PDFs and files in conversations
Attach any file up to 10 MB to a message. Images render as inline previews; other files appear as clickable download links with the original filename and size.
On macOS, use Cmd+Shift+Ctrl+4 to copy a screenshot region, then paste it directly into the chat composer โ fastest way to share what you're seeing.
See who's writing in real time
While someone is typing in a conversation you're viewing, their name appears below the message list with three bouncing dots โ like in WhatsApp or Telegram.
The frontend emits a 'typing' WebSocket event throttled to once every 2 seconds while you write. Other clients in the conversation receive the event and show the indicator. After 5 seconds without a new event, the indicator disappears automatically.
Typing indicators are pure WebSocket relay โ no data is stored. The indicator only shows to other members of the conversation; you never see your own indicator.
Link Work Orders, Assets, Parts directly in messages
Entity references turn FreeMaint Chat into a CMMS-aware messenger. Mention a Work Order, Asset, Part or any of 8 supported entity types and the message renders an inline card with status, title and a clickable link.
If a recipient does not have permission to see the referenced entity (cross-company, deleted, or scope-restricted), the card renders as 'Restricted' with only the type and ID โ no leaking title or status.
Messages appear instantly without refresh
FreeMaint Chat uses a Socket.IO WebSocket connection to deliver messages, edits, deletes and typing events instantly. No page refresh needed.
If your WebSocket connection drops (network blip, lock screen), the frontend keeps a 30-second polling resync as a safety net. Once the WebSocket reconnects, polling becomes silent again.
Each conversation is its own Socket.IO room (chat:companyId:conversationId). When you open a conversation, the client subscribes; when you switch, it unsubscribes. Membership is verified server-side at subscribe time โ non-members can't eavesdrop.
FreeMaint CMMS
ยฉ 2026 Freemaint LLC. All rights reserved.