Chat & communities
Conversations, groups and tribes, with members, roles and join approvals. The foundation every Symorva community is built on.
Chat is the foundation module. It provides direct and group conversations, community structure, roles and approvals, and the media every conversation carries. It is always enabled and runs entirely inside the operator's deployment, on the messaging-service component.
The messaging capabilities below run today in the reference deployment. The end-to-end encryption profile, tribes and channels, and the moderator and guest roles are part of the module design and are in developer preview.
Capabilities
| Capability | Status | Notes |
|---|---|---|
| Direct and group messaging | Available | Text, images, video, voice, files, albums, replies, forwarding, reactions, polls |
| Groups up to 10,000 members | Available | Large-group mode above 500 members (see below) |
Roles: owner, admin, member | Available | Owner and admins manage members, settings and policy |
Roles: moderator, guest | Preview | Accepted by the schema today |
| Join approvals, invite links, QR invitations | Available | Controlled per group and by joinApproval |
| Official sticker packs | Available | Published and ordered from the admin console, downloaded at runtime |
| Server-side policy before delivery | Available | Mutes, bans and send policy enforced before a message is delivered |
| Long-message splitting | Available | Text over 4,096 UTF-16 code units is sent as several messages |
| Tribes and channels | Preview | Community sub-spaces above groups |
| End-to-end encryption | Preview | Default true in the manifest; see Encryption |
Configuration
{
"modules": {
"chat": {
"e2ee": true,
"tribes": true,
"roles": ["owner", "admin", "moderator", "member"],
"joinApproval": true,
"maxGroupSize": 2000
}
}
}Prop
Type
Roles
| Role | Intended permissions |
|---|---|
owner | Full control of the community or group, including transferring ownership and changing roles |
admin | Manage members, approvals, settings and content policy; cannot remove the owner |
moderator | Act on reports, mute members and approve join requests; no settings access |
member | Participate in the conversations they belong to |
guest | Read and post in explicitly shared conversations only; not listed in the member directory |
The validator does not require owner to be present in roles; include it unless ownership is managed outside the app.
Groups and large groups
maxGroupSize accepts up to 10,000, the same ceiling the reference deployment enforces — clients cannot sync a group above it. Groups above 500 members run in large-group mode in the reference deployment: group read receipts, typing indicators and per-join notices are turned off, and offline push is sent only for mentions. A group leaves large-group mode when it falls to 10% below the threshold, so a group hovering around the line does not switch modes with every join and leave. The threshold is an operator setting (default 500, range 2 to 10,000).
Encryption
With e2ee: true, message content is encrypted on the sender's device and decrypted only on authorised recipient devices. The messaging service stores and routes ciphertext; attachment keys travel inside the encrypted message, so object storage holds ciphertext as well.
This profile is in developer preview. The reference deployment's messaging runs without end-to-end encryption and applies server-side content policy before delivery. With encryption on, server-side filters cannot inspect message bodies; moderation relies on member reports — which carry the reported content from the reporter's device — and on metadata-level controls.
Encryption does not cover metadata (sender, recipients, conversation, timestamps, sizes, group membership), operator system messages, meetings, AI inference or partner apps. See Data ownership & boundaries.
Events
Preview webhook events. Payloads carry identifiers and metadata only — never message content.
| Event | Fired when | Key fields |
|---|---|---|
chat.member.joined | A member joins the community or a group | memberId, groupId |
chat.member.left | A member leaves or is removed | memberId, groupId, reason |
chat.join_request.created | A join request needs approval | requestId, memberId, groupId |
chat.join_request.resolved | A request is approved or rejected | requestId, decision, resolvedBy |
chat.role.changed | A member's role changes | memberId, groupId, from, to |
chat.group.created | A group is created | groupId, ownerId, memberCount |
chat.message.created | A message is accepted for delivery | messageId, conversationId, senderId, type, sentAt |
chat.report.created | A member reports content | reportId, reporterId, targetType |
Privacy scope
Message content is encrypted on the sender's device and decrypted only on authorised recipient devices.
That is the module's protection statement, as returned in the deployment plan. Until the encryption profile reaches general availability, operators who deploy with e2ee: false should tell members that message content is readable by the community server.
Shared services and metering
Chat uses no shared services and has no metered units. All messaging traffic stays inside the operator's deployment.
Limits
| Field | Bound |
|---|---|
maxGroupSize | 2 to 10,000 |
roles | At least one of owner, admin, moderator, member, guest |
| Single text message | 4,096 UTF-16 code units; longer input is split into several messages |