Chat is IXL CORE’s built-in staff messaging. It gives the people in an entity a place to talk — a shared #general channel everyone lands in, purpose-built channels you create, and direct messages one-to-one — without leaving the platform or reaching for a separate tool. It is deliberately focused: this is internal staff communication, not a customer-facing inbox. Messages carry text, @mentions and file or image attachments, and everything is scoped so a person only ever sees and messages colleagues within their own entity.
This guide is a reference for what the module does and how the pieces fit together. It describes IXL CORE version 1.0.
Overview
At a glance, Chat covers these connected areas:
- Channels — named, entity-bound rooms for a team or topic, plus an automatic #general every entity gets.
- Direct messages — one-to-one conversations between two colleagues who share an entity.
- Messages — text posts (up to 8,000 characters) with @mentions and attachments, which you can edit or delete.
- Attachments — files and images uploaded to a conversation and downloaded by its members.
- Directory — the eligible staff in your current entity, from which you start channels and DMs.
- Delivery — real-time push where a provider is configured, with a polling fallback so messages always arrive.
Every conversation is bound to your organisation and entity, and access is governed by the chat.participate permission (see Access & permissions).
Channels
A channel is a named room within a single entity. Each entity automatically has a default #general channel — it is created on first access and every eligible member of the entity is joined to it, so nobody has to be invited to the room everyone shares.
Beyond #general you can create your own channels, giving each a name and an optional topic. When you create one you pick who joins from the entity’s eligible staff; you are always added yourself. Members are restricted to that entity — you cannot add someone who does not belong to it. Channels are ordered by their most recent activity, and each shows an unread count based on when you last read it.
Typical steps
- Open Chat — you arrive in your entity’s #general.
- Create a channel, give it a name and topic, and pick colleagues from the directory.
- Post messages; the channel rises to the top of your list as people reply.
Direct messages
A direct message is a private one-to-one conversation. You start one by choosing a colleague from the directory; the conversation can only be opened with someone who shares an entity with you. Direct messages are created once and reused — messaging the same person again reopens the existing thread rather than making a new one. Unlike channels, direct messages are not tied to a single entity view: once created, membership alone governs access.
Messages
A message carries text, attachments, or both — an empty message with neither is rejected. Text is limited to 8,000 characters. Within a channel, @mentions are resolved against that channel’s members only (never the wider directory), and each mentioned person receives an in-app notification, so a mention can never notify or reveal someone who is not in the conversation.
You can edit or delete your own messages — only your own. An edited message is marked as edited; a deleted message is soft-deleted, keeping its place in the thread but clearing its text so it renders as removed. Sending is idempotent: a retry or double-click of the same compose returns the message already posted rather than a duplicate.
Attachments
You can attach files and images to a conversation. A file is uploaded to the channel first and then bound to a message when you send it, so a message may carry text, attachments or both. Uploads go through the platform’s shared, governed document storage and use the same allowlist as the rest of IXL CORE — active-markup types that could carry scripts (such as SVG, HTML and JavaScript) are deliberately excluded. Downloading an attachment is membership-gated: only members of the owning conversation can retrieve it, and an attachment can never be carried from one channel onto a message in another.
Delivery
New messages, edits and deletes are broadcast to a conversation’s members for real-time delivery. Where a real-time provider is configured for the platform, updates push instantly; where none is, the client falls back to polling — it periodically asks for anything posted or changed since it last checked (using forward and updated-since cursors), so messages always arrive even without a live connection. A read marker records where you last caught up, driving each conversation’s unread count.
Access & permissions {#access-and-permissions}
Access to staff chat is governed by a single capability, chat.participate. It can be granted at organisation scope — which gives leadership reach across every entity — or at an entity scope, which keeps an ordinary staff member strictly within their own entity. Your entity set is derived from your role assignments in the organisation: a user with only organisation-level (leadership) assignments reaches every entity, while everyone else is confined to the entities they are assigned to.
Every endpoint is membership-gated: you can only read, post to, edit or download within a conversation you belong to. The rules fail closed — a platform operator with no in-entity role assignment resolves to an empty set and sees no chat at all. This is intentional: staff chat is private to staff, and operators are kept out by design.
How Chat connects
Chat sits on the same shared platform foundation as the rest of IXL CORE:
- Access control enforces
chat.participateand the entity scoping that decides who can see whom. - The document store holds every attachment on the platform’s governed storage, under one upload allowlist.
- Notifications deliver the in-app alerts raised by @mentions.
- Real-time delivery rides the platform’s broadcast provider when one is configured, with polling as the always-on fallback.
The result is a focused, private place for your people to talk — scoped correctly by default, and connected to the storage, notifications and access rules the rest of the platform already uses.
