- Force end-to-end encryption on private rooms setting encrypts every new private room and locks the toggle in create-channel and create-team dialogs
- Users can hide their presence and status message from specific people chosen from the user menu or My Account > Profile
- Rooms managed by Attribute Based Access Control can show classification banners defined as JSON under Administration > Workspace > General > Attribute Based Access Control
- SAML gains an Import IdP metadata action that parses a metadata URL and prefills connection fields
- SAML sign-in through the system browser on mobile and desktop
- Draft message indicator marks rooms and threads holding unsent text in the sidebar, side panel, and Threads list
- Drafts survive room switches and reloads
- Threads panel loads replies a page at a time as you scroll
- Screen sharing for voice calls is generally available
- Users can join internal calls without a working microphone and enable it later from the call widget
- Native Model Context Protocol server ships in alpha with minimal or extended tool sets
- REST endpoints now cover two-factor, audit, custom OAuth, thread-read, message-send, and push-test flows
- `chat.syncMessages` accepts an optional `fromTs` parameter that bounds the sync window
- App action buttons accept role `name` as well as `_id` and support room-scoped roles including owner, moderator, leader, and custom room roles
- Password reset requests from the Forgot password form are now rate limited
- Imports from a public file URL are checked against the SSRF protection allowlist
- Default Apps-Engine runtime changes from Deno to Node.js unless APPS_ENGINE_RUNTIME_BACKEND is set to deno
- Channel, group, session, license, and role endpoints validate request bodies against a schema and return consistent error payloads
- Sidebar now scrolls when the room list is taller than the window so rooms below the fold can be reached
- The `conditions` entry of the `selector` parameter on Omnichannel autocomplete lookups is deprecated and logs a warning
From Rocket.Chat
Release 8.8.0
Release Date: September 3, 2026 Support Window: Supported until March 31, 2027
Summary
Security and Compliance
Security improvements, authentication changes, data protection, and vulnerability fixes.
A new Force end-to-end encryption on private rooms setting under Administration > Workspace > End-to-end encryption encrypts every new private room and locks the toggle on in the create-channel and create-team dialogs. Public rooms are unaffected and federated rooms are exempt. Users can now hide their presence and status message from specific people, chosen from the user menu or My Account > Profile. Anyone on that list sees them as offline, and hidden status is excluded from lookups and search. Rooms managed by Attribute Based Access Control can show classification banners, defined as JSON under Administration > Workspace > General > Attribute Based Access Control. SAML gains an Import IdP metadata action under Administration > Workspace > SAML that parses a metadata URL and prefills the connection fields, plus sign-in through the system browser on mobile and desktop. LDAP and SAML still work in 8.8.0 without a Premium plan, but from 9.0.0 they require a license with the ldap-enterprise or saml-enterprise module. Password reset requests from the Forgot password form are now rate limited, and imports from a public file URL are checked against the SSRF protection allowlist. Fixes cover POST /v1/logout leaving sessions active in My Account > Device Management, room access checks erroring for callers without a resolved identity, and unescaped visitor names in the Omnichannel queue preview. An undisclosed security hotfix for thread message retrieval and real-time notification subscriptions applies on upgrade.
Messaging and Collaboration
Features and fixes related to messaging, channels, discussions, and communication workflows.
The draft message indicator is now on for everyone, so rooms and threads holding unsent text are marked in the sidebar, side panel, and Threads list. Drafts survive room switches and reloads, and Drafts in sidebar is gone from My Account > Feature Preview. The Threads panel now loads replies a page at a time as you scroll, so long threads open quickly. Screen sharing for voice calls is generally available. Users can join internal calls without a working microphone, enable it later from the call widget, and see share, hold, and transfer controls only when the call supports them. Diverted SIP calls are recorded as transfers, and caller names from the SIP integration are preserved. Federated conversations between servers work again, including first contact, older history, thumbnails, paging, and invitations. Other fixes: read receipts on thread replies, discussion reply counts that ignore hidden system messages, restored reading position when you return to a room, Jump to message across rooms, deep links (?msg=), suggestion popups that stayed open, line breaks lost in very long messages, real names in reaction lists, idle users flipping back to Online, room search for anonymous visitors, editing Omnichannel tags, business hours set to 00:00 to 23:59 closing early, and excessive history loading in contextual bars. The conditions entry of the selector parameter on Omnichannel autocomplete lookups is deprecated and now logs a warning.
Platform and Extensibility
Developer platform, APIs, integrations, and application framework improvements.
A native Model Context Protocol (MCP) server ships in alpha. Admins turn the endpoint on in the AI Center administration area and choose the minimal or extended tool set. Both controls are off by default, and access requires a license with the AI add-on plus the new access-mcp permission. REST endpoints now cover the two-factor, audit, custom OAuth, thread-read, message-send, and push-test flows that were realtime-only. The audit endpoints need a license with auditing, and setting up an authenticator app under My Account > Security now asks for an existing second factor. Integrations calling the replaced realtime methods keep working until 9.0.0 but log a deprecation warning. chat.syncMessages accepts an optional fromTs parameter, sent with lastUpdate, that bounds the sync window. Channel, group, session, license, and role endpoints now validate request bodies against a schema and return a consistent error payload. Callers that relied on loose validation may see new failures. The default Apps-Engine runtime changes from Deno to Node.js unless APPS_ENGINE_RUNTIME_BACKEND is set to deno. App action buttons now accept role name as well as _id and support room-scoped roles, including owner, moderator, leader, and custom room roles.
Data, Storage, and Infrastructure
Database, performance, storage, and system-level improvements.
The remaining first-generation sidebar and side panel components were replaced with their current versions, keeping the same look and behavior. The sidebar now scrolls when the room list is taller than the window, so rooms below the fold can be reached again.
Admin, Configuration, and Workspace Management
Administrative controls, configuration settings, and workspace management improvements.
Expected, client-safe errors are no longer reported to the channel set in Administration > Workspace > Logs > Log Exceptions to Channel when Log Level is Debug, so only genuine exceptions appear there. Dismissing a banner stored on your own user record, such as the new-version notice, no longer fails with a banner-not-found error. Missing German translations were added.
For further details, check out the release notes.
Details
Engine versions
- Node:
22.22.3 - Deno:
2.3.1 - MongoDB:
8.0 - Apps-Engine:
1.66.0
Minor Changes
-
(#41307) Adds classification banners to ABAC-managed rooms: admins can describe US-Government-style classification markings (levels, special access programs, releasability, colors) in a new JSON setting, and matching rooms display a colored classification banner above the room header for all members.
-
(#41765) Accepts a role name in the
when.hasOneRoleandwhen.hasAllRolesfilters of an app action button -
(#41474) Changes the default apps-engine runtime backend from
denotonode. The previous behavior can be restored by setting the environment variableAPPS_ENGINE_RUNTIME_BACKEND='deno' -
(#41788) Adds support for SAML authentication in the mobile and desktop apps via the system browser.
-
(#41642) Deprecates LDAP and SAML authentication on workspaces without a Premium plan. Both keep working as they are today, but the admin settings now warn that version 9.0.0 will require a license including the
ldap-enterpriseorsaml-enterprisemodule, and a warning is logged when an unlicensed workspace authenticates a user through either of them. -
(#41095) Adds a workspace setting Force end-to-end encryption on private rooms (
E2E_Force_Encryption_For_Private_Rooms) under Admin → Settings → End-to-End Encryption. When enabled, every newly created private room is encrypted by default and users can no longer opt out: the encryption toggle in the create-room modal is locked on for private rooms, and the server rejects any attempt to create a private room withencrypted: false(e.g. viagroups.create) with the errorerror-encrypted-private-rooms-enforced. Public rooms are unaffected. Federated rooms are exempt since federation does not support E2EE. Creating a discussion under an unencrypted private parent room is rejected with a dedicated error instructing the user to make the parent public or enable encryption on it, and the create-discussion dialog now surfaces creation errors as toasts. -
(#41355) Replaces the "Drafts in sidebar" feature preview with an always-on draft indicator. Thread-composer drafts are also persisted per thread and indicated in the thread list
-
(#41082) Adds an AI add-on-gated native Model Context Protocol endpoint and its administration controls in AI Center
-
(#41747) Adds status visibility, letting users hide their presence and status message from specific people they choose. Blocked people see that user as offline, indistinguishable from genuinely offline, and the block can be lifted at any time — changes apply live, without a reload.
-
(#40736) Added three new REST endpoints under
/v1/audit.*(EE-only, requires theauditinglicense) covering the audit flows that previously only existed as DDP methods:GET /v1/audit.auditions?startDate=&endDate=→{ auditions: IAuditLog[] }(replacesauditGetAuditions,can-audit-log)POST /v1/audit.messagesbody{ rid?, startDate, endDate, users, msg, type, visitor?, agent? }→{ messages: IMessage[] }(replacesauditGetMessages,can-audit)POST /v1/audit.omnichannelMessagesbody{ startDate, endDate, users, msg, type, visitor?, agent? }→{ messages: IMessage[] }(replacesauditGetOmnichannelMessages,can-audit)
Each endpoint is rate-limited at 10 requests / 60s (matching the DDP
DDPRateLimiterrules) and writes the sameAuditLogentry the DDP methods produced. Dates are serialized as ISO strings on the wire. The DDP methods remain registered with deprecation logs pointing at the new routes until 9.0.0. -
(#41593) Added
POST /v1/chat.readThreadbody{ tmid }, which marks a single thread as read for the caller — clearing the thread from the subscription's unread list and running thebeforeReadMessages/afterReadMessagescallbacks. It replaces thereadThreadsDDP method, which stays registered with a deprecation log pointing at the new route until 9.0.0.POST /v1/subscriptions.readdoes not cover this: it takes{ rid, readThreads? }and operates on the whole room, with no way to address one thread. -
(#40737) Adds two new REST endpoints completing the Custom OAuth admin surface:
POST /v1/settings.removeCustomOAuthbody{ name }→ removes allAccounts_OAuth_Custom-<Name>-*setting documents (replaces the deprecatedremoveOAuthServiceDDP method).POST /v1/settings.refreshOAuthServices(no body) → re-reads ServiceConfiguration entries from settings (replaces the deprecatedrefreshOAuthServiceDDP method).
Both endpoints reuse the
add-oauth-servicepermission andtwoFactorRequiredgates that the DDP methods already enforced.addOAuthServicewas already covered by the existingPOST /v1/settings.addCustomOAuth— its DDP method now also logs a deprecation. The three legacy DDP methods remain registered until 9.0.0. -
(#40734) Adds five new REST endpoints covering the TOTP 2FA flows that previously only existed as DDP methods:
POST /v1/users.enableTotp→{ secret, url }(replaces2fa:enable)POST /v1/users.disableTotpbody{ code }→{ disabled }(replaces2fa:disable)POST /v1/users.validateTotpbody{ code }→{ codes }(replaces2fa:validateTempToken; also rotates non-PAT login tokens server-side)POST /v1/users.regenerateTotpCodesbody{ code }→{ codes }(replaces2fa:regenerateCodes)GET /v1/users.totpCodesRemaining→{ remaining }(replaces2fa:checkCodesRemaining)
users.enableTotpandusers.validateTotprequire two-factor verification (twoFactorRequired) so enrolling a new TOTP device confirms the account owner's identity first — closing a 2FA-enrollment bypass where a hijacked session could register an attacker-controlled TOTP without verifying the existing 2FA. All five endpoints are rate-limited.The legacy DDP methods stay registered with deprecation logs pointing at the new routes until 9.0.0 removes them.
-
(#41715) Adds an optional
fromTsquery parameter tochat.syncMessages, so it can be used as a replacement for the deprecatedloadMissedMessagesDDP method. It bounds the sync window and must be used together withlastUpdate; sending it with cursor pagination is rejected instead of being ignored. -
(#41954) Promotes Voice Call Screen Sharing to stable by removing the
betaalert from its setting and enabling the "In-Room" call interface for every call regardless of screen-share availability.
Patch Changes
-
(#41777) Fixed app action buttons never matching a role scoped to
Subscriptions—owner,moderator,leader, or a custom one. The room was not being passed as the scope of the role check, so a button filtered by one of those roles stayed hidden even for a user who held it in the room. -
Bump @rocket.chat/meteor version.
-
Bump @rocket.chat/meteor version.
-
Bump @rocket.chat/meteor version.
-
(#41784) Fixed business hours closing for one minute a day when configured as
00:00-23:59. Work hours are set at minute granularity, but the finish time was treated as exclusive, so consecutive daily windows never met and the service dropped to closed for the whole23:59minute — agents could not become available and the Livechat widget rendered the offline form. A work hour now stays open until the end of its finish minute. -
(#41664) Fixes the composer popups (mentions, slash commands and emojis) staying open after programmatic changes to the composer text, such as canceling the edition of a message that contains a mention.
-
(#41795) Fixes client-safe errors being reported as exceptions to the channel configured in
Log Exceptions to ChannelwhenLog_Levelis set to2. -
(#40734) Migrates the
TwoFactorTOTPaccount settings page from the five2fa:*DDP methods to the new TOTP REST endpoints. DDP methods stay registered for external SDK/mobile clients with deprecation logs pointing at the new routes until 9.0.0. -
(#40736) Migrated the audit panel (
AuditLogTable,useAuditMutation) from the threeauditGet*DDP methods to the new/v1/audit.*REST endpoints. DDP methods stay registered with deprecation logs pointing at the new routes until 9.0.0. -
(#40737) Migrates the Admin → OAuth services group page from
useMethod(DDP) touseEndpoint(REST):addOAuthService→ existingPOST /v1/settings.addCustomOAuthremoveOAuthService→ newPOST /v1/settings.removeCustomOAuthrefreshOAuthService→ newPOST /v1/settings.refreshOAuthServices
DDP methods stay registered with deprecation logs pointing at the new routes until 9.0.0.
-
(#41593) Migrated the last two thread-read call sites (
ThreadChat,useThreadMessagesQuery) from thereadThreadsDDP method toPOST /v1/chat.readThread, and pointed the admin "send a test push to my user" setting atPOST /v1/push.testinstead of thepush_testDDP method. Both DDP methods stay registered with deprecation logs pointing at the new routes until 9.0.0.POST /v1/push.testnow also returns themessagetranslation key and itsparams, matching what the DDP method returned, so the admin setting still reports how many devices the test reached. -
(#41653) Bumps patch-level dependency updates:
react,react-domandreact-isto 19.2.8,wsto 8.21.3,nodemailerto 9.0.5,mailparserto 3.9.15,google-libphonenumberto 3.2.46,twitter-api-v2to 1.29.1,ip-range-checkto 0.2.1,esbuildto 0.28.2,@octokit/coreto 7.0.7 and@octokit/plugin-throttlingto 11.0.5, plus build and test tooling (@swc/core,ts-jest,rollup,html-webpack-plugin,@vitejs/plugin-react,@testing-library/user-event, and the@types/*packages). No behavior changes are expected. -
(#41876) Fixes room search (
spotlight) failing for anonymous visitors when "Allow Anonymous Read" is enabled -
(#41481) Adds an Import IdP metadata option to SAML settings that fetches the Identity Provider metadata from a URL and prefills the matching setting fields — certificate, entry point and IDP SLO redirect URL, plus identifier format on Enterprise — for the admin to review before saving.
-
(#41699) Adds per-client rate limiting to the unauthenticated sendForgotPasswordEmail method, matching the REST users.forgotPassword endpoint
-
(#41454) Fixes the message list silently loading the entire room history — and downloading its attachments — in the background when a full-width contextual bar (such as the thread view on small screens) hides it
-
(#41805) Fixes the issue where the message list kept jumping to the latest messages instead of restoring the previous position when switching channels.
-
(#41707) Fixes thread replies keeping the "sent" single checkmark after everyone had read the thread, only switching to the "viewed" double checkmark once a new message was sent in that thread.
-
(#41744) Fixes
canAccessRoomthrowing when the user's_idis undefined -
(#41814) Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates)
-
(#41749) Replace http with serverFetch in downloadPublicImportFile to add SSRF protection
-
(#41499) Fixes a reload loop when opening a link to an older message (
?msg=): the room would flash the linked message and then keep loading until it hit the server rate limit (429) instead of settling. The room now opens positioned on the linked message, and when the linked message cannot be loaded the room settles on the most recent messages instead of retrying. -
(#41711) Fixes "Jump to message" not navigating to the message's room when the message belongs to a room other than the currently opened one (e.g. global search results).
-
(#41717) Fixes federation endpoints rejecting valid requests, which broke:
- room history backfill
- image thumbnails
- room message pagination
- accepting an invite from another homeserver
-
(#41573) Marks the user session as logged out in the Sessions collection when logging out via
POST /v1/logout. Previously the session cleanup relied on an indirect chain throughwatch.users→Accounts.onLogoutthat could be broken by a race condition, leaving orphaned sessions visible in Device Manager. -
(#41595) Fixes special characters not being escaped in the visitor name shown in the Omnichannel queue side panel's message preview
-
(#41683) Fixed the sidebar not scrolling when its content is taller than the viewport — the inner wrapper was pinned to the scroll container's height instead of using it as a minimum, so overflowing content was clipped
-
(#41755) Fixes
POST /v1/banners.dismissfailing withBanner not foundfor banners stored in the user's record (such as the version update ones), which were never marked as read. The endpoint now marks them as read as the deprecatedbanner/dismissmethod did, and only fails when the banner does not exist in the banners collection nor in the user's record. -
(#41673) Fixes the messages count displayed on a discussion taking into account system messages which are hidden inside of it, making the count higher than the number of messages actually visible after opening the discussion. The count now excludes every system message type hidden either globally or on the discussion itself. A hint was also added to the
Hide system messagesoption of the room edit panel clarifying that the hidden messages are not included in the count. -
(#41484) Fixes an issue where deleted thread messages display as empty in thread context
-
(#41504) Fixed saving a livechat tag failing with "Invalid response" — the model mutated its return value with
_updatedAt, which the endpoint response schema rejects -
(#41702) Fixes discussion parent message count and last-message timestamp out of sync with the discussion
-
(#41763) Drops
@rocket.chat/string-helpersin favor of@rocket.chat/tools -
(#41574) Fixes reaction list modal showing blank entries (mobile) or usernames (web) instead of real names when
UI_Use_Real_Nameis enabled. The broadcast pipeline now enriches reactions with display names via batch query. -
(#41585) Fixes users being set back to online after a websocket reconnection (connection drop, network change, server restart) even though they had gone idle and never interacted with the UI again. The client now tracks the last UI interaction across connection drops and restates the away status as soon as the reconnected session is authenticated, instead of assuming the new session is online and restarting the idle countdown from scratch.
-
(#41631) Fixes text rendering without line breaks when its length is higher than the value of the
MESSAGE_MAX_PARSE_LENGTHenvironment variable -
- @rocket.chat/apps-engine@1.66.0
- @rocket.chat/apps@0.9.0
- @rocket.chat/i18n@4.0.0
- @rocket.chat/pdf-worker@0.3.36
- @rocket.chat/rest-typings@8.8.0
- @rocket.chat/model-typings@2.5.0
- @rocket.chat/core-typings@8.8.0
- @rocket.chat/ui-client@34.0.0
- @rocket.chat/models@2.5.0
- @rocket.chat/media-calls@0.6.0
- @rocket.chat/media-signaling@1.2.0
- @rocket.chat/ui-voip@24.0.0
- @rocket.chat/core-services@0.16.0
- @rocket.chat/federation-matrix@0.2.1
- @rocket.chat/message-types@0.1.2
- @rocket.chat/tools@0.4.0
- @rocket.chat/omnichannel-services@0.3.57
- @rocket.chat/abac@0.3.2
- @rocket.chat/ui-composer@5.0.0
- @rocket.chat/omni-core@0.1.4
- @rocket.chat/web-ui-registration@34.0.0
- @rocket.chat/network-broker@0.2.39
- @rocket.chat/omni-core-ee@0.0.25
- @rocket.chat/presence@0.3.2
- @rocket.chat/cron@0.1.60
- @rocket.chat/ddp-client@1.1.2
- @rocket.chat/fuselage-ui-kit@34.0.0
- @rocket.chat/gazzodown@34.0.0
- @rocket.chat/instance-status@0.1.60
- @rocket.chat/server-fetch@0.2.4
- @rocket.chat/ui-avatar@30.0.0
- @rocket.chat/ui-contexts@34.0.0
- @rocket.chat/ui-video-conf@34.0.0