FreeMaint
FeaturesPricing
DocsGuides & API referenceBlogPlaybooks & product updatesComparisonFreeMaint vs the alternativesChangelogWhat's new
AffiliatesEarn recurring commissionServicesSetup, migration & training
Contact
ENSign inSign up

Product

FeaturesPricing

Resources

DocsBlogComparisonChangelog

Partnership

AffiliatesServices

Account

ContactSign in
FreeMaint

Free your maintenance

Product

FeaturesPricingComparisonChangelogSign up

Resources

BlogDocumentationResearch

Company

AboutServicesAffiliatesContact

Legal

PrivacyTermsRefund PolicyExport Compliance
Freemaint LLC ยฉ 2026 ยท All rights reserved.GDPR & LGPD CompliantMobile app
Back to Documentation

FreeMaint CMMS

Team Chat

Team Chat

Real-time messaging with threads, search, attachments and entity references

Team Chat Overview

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.

Managing your conversations

  • Clear history โ€” wipes the conversation history from your own view only; other members keep theirs. This cannot be undone.
  • Delete / Hide โ€” removes a conversation from your list; it reappears automatically if a new message arrives.
  • Leave group โ€” removes you from a group conversation. If you are the owner, ownership is handed to another member.
  • Delete for everyone โ€” group owners can permanently delete a whole group and all its messages for every member.
  • Open the three-dots menu on any conversation (in the list or the header) to find these actions.

Tier required

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.

What you get

  • Direct messages 1:1 between any two team members in your company
  • Group chats with up to 50 members
  • Self-DM (Notes to self) for personal reminders
  • Threaded replies to keep long discussions organized (Slack-style, depth-1)
  • Full-text message search across all conversations you belong to
  • File attachments (images, PDFs, any file type up to 10 MB)
  • Live typing indicators showing who's writing
  • Entity references โ€” link to a Work Order, Asset or Part directly in a message
  • Real-time delivery via WebSocket โ€” no refresh needed

How to access it

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.


Direct Messages (DMs)

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.

Creating a direct message

  1. {"title":"Open Chat","description":"Click the Chat entry in the sidebar."}
  2. {"title":"Click 'New DM'","description":"A picker opens listing every active user in your company."}
  3. {"title":"Pick a recipient","description":"Select the person you want to message. The DM opens immediately."}
  4. {"title":"Send your message","description":"Type in the composer and press Enter (Shift+Enter for newline)."}

Notes to self (Self-DM)

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.


Group Chats

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).

Creating a group

  1. {"title":"Click 'New group'","description":"From the Chat page header, opens the group creation dialog."}
  2. {"title":"Name the group","description":"Give it a descriptive name (e.g. 'North Plant maintenance')."}
  3. {"title":"Add members","description":"Pick from the user list. You can add up to 49 other members."}
  4. {"title":"Create","description":"Click Create. The group appears in your list and members get a real-time notification."}

Limits and rules

  • Maximum 50 members including the creator
  • Members must belong to the same company (no cross-tenant groups)
  • Only the creator can edit the title (member management coming soon)
  • Soft-deleting messages turns them into tombstones; the timeline is preserved

Threaded Replies

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.

How to start a thread

  1. {"title":"Hover the parent message","description":"A 'Reply in thread' button appears on the right."}
  2. {"title":"Click it","description":"A side panel opens on the right with the parent and an empty replies list."}
  3. {"title":"Write your reply","description":"Type in the composer at the bottom of the side panel and press Enter."}
  4. {"title":"See the reply nested under its parent","description":"The reply appears indented under the message it answers, right in the main timeline. The parent also shows 'Open thread' โ€” click it for the focused view with the full history."}

Rules

  • Threads are depth-1: you cannot reply to a reply (the server returns 400)
  • You cannot reply to a deleted parent message
  • Replies are scoped to the same conversation as the parent
  • New replies appear live, nested under their parent โ€” and are still there after a refresh

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.


Search Messages

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.

How to search

  1. {"title":"Click the search icon","description":"In the Chat page header, top-right of the conversation list."}
  2. {"title":"Type your query","description":"Minimum 2 characters. Results refresh after a 300ms debounce."}
  3. {"title":"Click a result","description":"The conversation opens and the chat scrolls to the matching message."}

Scope

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.


File Attachments

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.

Three ways to attach

  • Click the paperclip button in the composer to open the file picker
  • Drag-and-drop one or more files onto the composer area (highlight indicates drop zone)
  • Paste a file or screenshot directly into the textarea (Cmd/Ctrl+V)

Limits

  • Maximum file size: 10 MB per file
  • Maximum 10 attachments per message
  • Files count against your tier storage quota (chat/ prefix in MinIO)
  • Any file type accepted; images preview inline, others show as a download link

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.


Typing Indicators

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.

How it works

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.

Privacy

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.


Entity References

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.

Two ways to add a reference

  • From any Work Order page, click the 'Discuss' button in the toolbar โ€” opens Chat with the WO already attached as a reference chip in the composer
  • Manually attach via API by adding `references: [{entityType, entityId}]` to the sendMessage payload

Restricted cards

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.

Supported entity types

  • WorkOrder
  • Asset
  • Part
  • Location
  • Request
  • PurchaseOrder
  • Vendor
  • Customer

Real-time WebSocket

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.

Events you receive

  • chat:new โ€” a new message arrives in a conversation you're subscribed to
  • chat:edited โ€” someone edited a message
  • chat:deleted โ€” someone soft-deleted a message (replaced by a tombstone)
  • chat:typing โ€” someone in the conversation is currently typing

Polling fallback

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.

Room scoping

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.