docs: resolve raw HTML link and image paths through useBaseUrl (#38958)

* docs: resolve raw HTML link and image paths through useBaseUrl

Docusaurus prepends `baseUrl` to markdown-syntax links (`[text](/path)`) but
never to site-absolute paths written in raw HTML/JSX attributes. Those values
ship verbatim, which is correct only while `baseUrl` is `/`.

Convert the 221 raw `<a href="/...">` anchors across 22 files under docs/main
and the 3 raw `<img src="/img/...">` tags in docs/develop to
`useBaseUrl('/...')`, matching how images in the same table rows already
resolve their paths. Link targets, link text and table structure are unchanged.

Add scripts/check-base-url-attrs.mjs and run it as the first step of
`prebuild` so the build fails fast on any new occurrence.

* docs(site): match CommonMark fence closing in baseUrl attr check

Toggle on any fence-like line could exit a block early; track the
opening marker and only close with the same character of sufficient length.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(site): also flag JSX string-literal href/src in baseUrl check

Quoted attributes alone miss href={"/path"} / src={'/path'}, which
bypass baseUrl the same way. Scan both forms through one validation path.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Eva SarafianouandCursor authored and GitHub committed 2026-10-04 11:01:13 +02:00
1 parent 05a293c603
commit 9e386cb993
25 files changed
+362 -205

No files matched your search

@@ -2,6 +2,7 @@
title: "Example plugins"
sidebar_position: 90
---
import useBaseUrl from '@docusaurus/useBaseUrl';
## Server "Hello, world!"
@@ -23,7 +24,7 @@ To see a stripped down version of the demo plugin with just the build scripts an
The [Zoom plugin for Mattermost](https://github.com/mattermost/mattermost-plugin-zoom) adds UI elements that allow users to easily create and join Zoom meetings:
<img src="/img/extend/zoom-plugin-screenshot.png" width="445" height="295" />
<img src={useBaseUrl('/img/extend/zoom-plugin-screenshot.png')} width="445" height="295" />
Topics demonstrated:
@@ -37,7 +38,7 @@ Topics demonstrated:
The [JIRA plugin for Mattermost](https://github.com/mattermost/mattermost-plugin-jira) creates a webhook that your JIRA server can use to post messages to Mattermost when issues are created:
<img src="/img/extend/jira-plugin-screenshot.png" width="445" height="263" />
<img src={useBaseUrl('/img/extend/jira-plugin-screenshot.png')} width="445" height="263" />
Topics demonstrated:
@@ -59,7 +60,7 @@ Topics demonstrated:
The [Memes plugin for Mattermost](https://github.com/mattermost/mattermost-plugin-memes) creates a slash command that can be used to create dank memes:
<img src="/img/extend/memes-plugin-screenshot.png" width="445" height="325" />
<img src={useBaseUrl('/img/extend/memes-plugin-screenshot.png')} width="445" height="325" />
Topics demonstrated:
@@ -1,6 +1,8 @@
---
title: "Audit log JSON schema"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
<PlanAvailability slug="entry-ent" />
The audit log JSON schema functions as a standardized blueprint or schematic that consistently defines how a single event should appear when being written to the audit log, including: field names, data types, objects, and structure.
@@ -1832,7 +1834,7 @@ This comprehensive list includes all audit events captured by Mattermost across
<tr>
<td>timestamp</td>
<td>int64</td>
<td colspan="2"><dl><dt>Date/time when event or activity has taken place. |</dt><dd><div class="line-block"></div></dd></dl><p>Mattermost currently supports three log formats: plain, JSON, and | <a href="https://go2docs.graylog.org/current/getting_in_log_data/gelf.html">GELF</a>. | | - Plain log format uses <a href="https://www.rfc-editor.org/rfc/rfc3339">RFC3339</a> by default. | See the <a href="/administration-guide/manage/logging#plain-log-format-configuration-options">plain log format configuration</a> documentation for supported options. | - JSON log format uses <a href="https://www.rfc-editor.org/rfc/rfc3339">RFC3339</a> by default. | See the <a href="/administration-guide/manage/logging#json-log-format-configuration-options">JSON log format configuration</a> documentation for supported options. | | - GELF log format uses <a href="https://www.unixtimestamp.com/">unixtime</a>. | See the <a href="/administration-guide/manage/logging#gelf-log-format-configuration-options">GELF log format configuration</a> documentation for supported options. |</p></td>
<td colspan="2"><dl><dt>Date/time when event or activity has taken place. |</dt><dd><div class="line-block"></div></dd></dl><p>Mattermost currently supports three log formats: plain, JSON, and | <a href="https://go2docs.graylog.org/current/getting_in_log_data/gelf.html">GELF</a>. | | - Plain log format uses <a href="https://www.rfc-editor.org/rfc/rfc3339">RFC3339</a> by default. | See the <a href={useBaseUrl('/administration-guide/manage/logging#plain-log-format-configuration-options')}>plain log format configuration</a> documentation for supported options. | - JSON log format uses <a href="https://www.rfc-editor.org/rfc/rfc3339">RFC3339</a> by default. | See the <a href={useBaseUrl('/administration-guide/manage/logging#json-log-format-configuration-options')}>JSON log format configuration</a> documentation for supported options. | | - GELF log format uses <a href="https://www.unixtimestamp.com/">unixtime</a>. | See the <a href={useBaseUrl('/administration-guide/manage/logging#gelf-log-format-configuration-options')}>GELF log format configuration</a> documentation for supported options. |</p></td>
</tr>
<tr>
<td>event_name</td>
@@ -70,7 +70,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td>This setting limits the email address domains that can be used to create a new account or team. | - System Config path: <strong>Authentication &gt; Signup</strong> | You <strong>must</strong> set <a href="/administration-guide/configure/authentication-configuration-settings#require-email-verification">Require Email Verification</a> | - <code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>RestrictCreationToDomains</code> to <code>true</code> for the restriction to function. This setting only affects email login. | - Environment variable: <code>MM_TEAMSETTINGS_RESTRICTCREATIONTODOMAINS</code> |</td>
<td>This setting limits the email address domains that can be used to create a new account or team. | - System Config path: <strong>Authentication &gt; Signup</strong> | You <strong>must</strong> set <a href={useBaseUrl('/administration-guide/configure/authentication-configuration-settings#require-email-verification')}>Require Email Verification</a> | - <code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>RestrictCreationToDomains</code> to <code>true</code> for the restriction to function. This setting only affects email login. | - Environment variable: <code>MM_TEAMSETTINGS_RESTRICTCREATIONTODOMAINS</code> |</td>
</tr>
</tbody>
</table>
@@ -306,7 +306,7 @@ We recommend deploying Mattermost within your own private network, and using VPN
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Users who sign-in with AD/LDAP or an email address have the option to add | - System Config path: <strong>Authentication &gt; MFA</strong> | <a href="/administration-guide/onboard/multi-factor-authentication">multi-factor authentication</a> to their accounts. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableMultifactorAuthentication</code> &gt; <code>false</code></li><li><strong>false</strong>: <strong>(Default)</strong> Disables multi-factor authentication. | - Environment variable: <code>MM_SERVICESETTINGS_ENABLEMULTIFACTORAUTHENTICATION</code> |</li></ul></td>
<td><ul><li><strong>true</strong>: Users who sign-in with AD/LDAP or an email address have the option to add | - System Config path: <strong>Authentication &gt; MFA</strong> | <a href={useBaseUrl('/administration-guide/onboard/multi-factor-authentication')}>multi-factor authentication</a> to their accounts. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableMultifactorAuthentication</code> &gt; <code>false</code></li><li><strong>false</strong>: <strong>(Default)</strong> Disables multi-factor authentication. | - Environment variable: <code>MM_SERVICESETTINGS_ENABLEMULTIFACTORAUTHENTICATION</code> |</li></ul></td>
</tr>
</tbody>
</table>
@@ -319,7 +319,7 @@ We recommend deploying Mattermost within your own private network, and using VPN
</colgroup>
<tbody>
<tr>
<td><dl><dt>- <strong>true</strong>: Requires <a href="/administration-guide/onboard/multi-factor-authentication">multi-factor authentication (MFA)</a> | - System Config path: **Authentication &gt; MFA** | | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnforceMultifactorAuthentication</code> &gt; <code>false</code></dt><dd><p>for users who sign-in with AD/LDAP or an email address. | - Environment variable: <code>MM_SERVICESETTINGS_ENFORCEMULTIFACTORAUTHENTICATION</code> | New users must set up MFA. Logged in users are redirected to the MFA | | setup page until configuration is complete. | |</p></dd></dl><ul><li><strong>false</strong>: <strong>(Default)</strong> MFA is optional. | |</li></ul></td>
<td><dl><dt>- <strong>true</strong>: Requires <a href={useBaseUrl('/administration-guide/onboard/multi-factor-authentication')}>multi-factor authentication (MFA)</a> | - System Config path: **Authentication &gt; MFA** | | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnforceMultifactorAuthentication</code> &gt; <code>false</code></dt><dd><p>for users who sign-in with AD/LDAP or an email address. | - Environment variable: <code>MM_SERVICESETTINGS_ENFORCEMULTIFACTORAUTHENTICATION</code> | New users must set up MFA. Logged in users are redirected to the MFA | | setup page until configuration is complete. | |</p></dd></dl><ul><li><strong>false</strong>: <strong>(Default)</strong> MFA is optional. | |</li></ul></td>
</tr>
</tbody>
</table>
@@ -669,7 +669,7 @@ If this setting is `false`, no additional users are designated as system admins
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting accepts an AD/LDAP filter to apply when searching for external users with Guest Access to Mattermost. Only users selected by the query can access Mattermost as Guests. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>GuestFilter</code> |</div></dd><dt>See <a href="/administration-guide/onboard/guest-accounts">Guest Accounts</a> for more information. | - Environment variable: <code>MM_LDAPSETTINGS_GUESTFILTER</code></dt><dd><div class="line-block">                                                              |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting accepts an AD/LDAP filter to apply when searching for external users with Guest Access to Mattermost. Only users selected by the query can access Mattermost as Guests. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>GuestFilter</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/guest-accounts')}>Guest Accounts</a> for more information. | - Environment variable: <code>MM_LDAPSETTINGS_GUESTFILTER</code></dt><dd><div class="line-block">                                                              |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -759,7 +759,7 @@ The ID attribute value is matched verbatim - Mattermost applies no case normaliz
</colgroup>
<tbody>
<tr>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the first name field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>FirstNameAttribute</code> |</div></dd><dt>When set, users cannot edit their first name. | - Environment variable: <code>MM_LDAPSETTINGS_FIRSTNAMEATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                     |</div></dd></dl><p>When not set, users can edit their first name in their | | <a href="/end-user-guide/preferences/manage-your-profile">profile settings</a>. | | | String input. | |</p></td>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the first name field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>FirstNameAttribute</code> |</div></dd><dt>When set, users cannot edit their first name. | - Environment variable: <code>MM_LDAPSETTINGS_FIRSTNAMEATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                     |</div></dd></dl><p>When not set, users can edit their first name in their | | <a href={useBaseUrl('/end-user-guide/preferences/manage-your-profile')}>profile settings</a>. | | | String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -772,7 +772,7 @@ The ID attribute value is matched verbatim - Mattermost applies no case normaliz
</colgroup>
<tbody>
<tr>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the last name field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>LastNameAttribute</code> |</div></dd><dt>When set, users cannot edit their last name. | - Environment variable: <code>MM_LDAPSETTINGS_LASTNAMEATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                    |</div></dd></dl><p>When not set, users can edit their last name as part of their | | <a href="/end-user-guide/preferences/manage-your-profile">profile settings</a>. | | | | String input. | |</p></td>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the last name field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>LastNameAttribute</code> |</div></dd><dt>When set, users cannot edit their last name. | - Environment variable: <code>MM_LDAPSETTINGS_LASTNAMEATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                    |</div></dd></dl><p>When not set, users can edit their last name as part of their | | <a href={useBaseUrl('/end-user-guide/preferences/manage-your-profile')}>profile settings</a>. | | | | String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -785,7 +785,7 @@ The ID attribute value is matched verbatim - Mattermost applies no case normaliz
</colgroup>
<tbody>
<tr>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the nickname field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>NicknameAttribute</code> |</div></dd><dt>When set, users cannot edit their nickname. | - Environment variable: <code>MM_LDAPSETTINGS_NICKNAMEATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                    |</div></dd></dl><p>When not set, users can edit their nickname as part of their | | <a href="/end-user-guide/preferences/manage-your-profile">profile settings</a>. | | | String input. | |</p></td>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the nickname field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>NicknameAttribute</code> |</div></dd><dt>When set, users cannot edit their nickname. | - Environment variable: <code>MM_LDAPSETTINGS_NICKNAMEATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                    |</div></dd></dl><p>When not set, users can edit their nickname as part of their | | <a href={useBaseUrl('/end-user-guide/preferences/manage-your-profile')}>profile settings</a>. | | | String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -798,7 +798,7 @@ The ID attribute value is matched verbatim - Mattermost applies no case normaliz
</colgroup>
<tbody>
<tr>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the position field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>PositionAttribute</code> |</div></dd><dt>When set, users cannot edit their position. | - Environment variable: <code>MM_LDAPSETTINGS_POSITIONATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                    |</div></dd></dl><p>When not set, users can edit their position as part of their | | <a href="/end-user-guide/preferences/manage-your-profile">profile settings</a>. | | | String input. | |</p></td>
<td><dl><dt>This is the attribute in the AD/LDAP server that populates the position field in Mattermost. | - System Config path: <strong>Authentication &gt; AD/LDAP</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>LdapSettings</code> &gt; <code>PositionAttribute</code> |</div></dd><dt>When set, users cannot edit their position. | - Environment variable: <code>MM_LDAPSETTINGS_POSITIONATTRIBUTE</code> |</dt><dd><div class="line-block">                                                                    |</div></dd></dl><p>When not set, users can edit their position as part of their | | <a href={useBaseUrl('/end-user-guide/preferences/manage-your-profile')}>profile settings</a>. | | | String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -1012,7 +1012,7 @@ In line with Microsoft ADFS guidance, we recommend [configuring intranet forms-b
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Enables sign-in with SAML. See <a href="/administration-guide/onboard/sso-saml">SAML Single Sign-On</a> to learn more. | - System Config path: <strong>Authentication &gt; SAML 2.0</strong></li><li><dl><dt><strong>false</strong>: <strong>(Default)</strong> Disables sign-in with SAML. | - <code>config.json</code> setting: <code>SamlSettings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_SAMLSETTINGS_ENABLE</code> |</div></dd></dl></li></ul></td>
<td><ul><li><strong>true</strong>: Enables sign-in with SAML. See <a href={useBaseUrl('/administration-guide/onboard/sso-saml')}>SAML Single Sign-On</a> to learn more. | - System Config path: <strong>Authentication &gt; SAML 2.0</strong></li><li><dl><dt><strong>false</strong>: <strong>(Default)</strong> Disables sign-in with SAML. | - <code>config.json</code> setting: <code>SamlSettings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_SAMLSETTINGS_ENABLE</code> |</div></dd></dl></li></ul></td>
</tr>
</tbody>
</table>
@@ -1349,7 +1349,7 @@ The ID attribute value is matched verbatim - Mattermost applies no case normaliz
</colgroup>
<tbody>
<tr>
<td><dl><dt>(Optional) This setting determines the SAML Assertion attribute used to apply a Guest role to users in Mattermost. | - System Config path: <strong>Authentication &gt; SAML 2.0</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>SamlSettings</code> &gt; <code>GuestAttribute</code>|</div></dd><dt>See the <a href="/administration-guide/onboard/guest-accounts">Guest Accounts documentation</a> for more information. | - Environment variable: <code>MM_SAMLSETTINGS_GUESTATTRIBUTE</code></dt><dd><div class="line-block">                                                                |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>(Optional) This setting determines the SAML Assertion attribute used to apply a Guest role to users in Mattermost. | - System Config path: <strong>Authentication &gt; SAML 2.0</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>SamlSettings</code> &gt; <code>GuestAttribute</code>|</div></dd><dt>See the <a href={useBaseUrl('/administration-guide/onboard/guest-accounts')}>Guest Accounts documentation</a> for more information. | - Environment variable: <code>MM_SAMLSETTINGS_GUESTATTRIBUTE</code></dt><dd><div class="line-block">                                                                |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -1626,7 +1626,7 @@ GitLab provides the [Application Secret Key](#gitlab-oauth-20-application-secret
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Allows team and account creation using Google OAuth authentication. Input the <strong>Client ID</strong> and <strong>Client Secret</strong> credentials to configure. | - System Config path: <strong>Authentication &gt; OAuth 2.0</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables Google OAuth authentication. | - <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Enable</code> &gt; <code>false</code>|</dt><dd><div class="line-block">- Environment variable: <code>MM_GOOGLESETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href="/administration-guide/onboard/sso-google">Google Single Sign-On</a> implementation instructions. |</p></td>
<td><ul><li><strong>true</strong>: Allows team and account creation using Google OAuth authentication. Input the <strong>Client ID</strong> and <strong>Client Secret</strong> credentials to configure. | - System Config path: <strong>Authentication &gt; OAuth 2.0</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables Google OAuth authentication. | - <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Enable</code> &gt; <code>false</code>|</dt><dd><div class="line-block">- Environment variable: <code>MM_GOOGLESETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href={useBaseUrl('/administration-guide/onboard/sso-google')}>Google Single Sign-On</a> implementation instructions. |</p></td>
</tr>
</tbody>
</table>
@@ -1639,7 +1639,7 @@ GitLab provides the [Application Secret Key](#gitlab-oauth-20-application-secret
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the OAuth Client ID from Google. Generate the ID by going to the <strong>Credentials</strong> section of the Google Cloud Platform APIs &amp; Services menu and selecting <strong>Create Credentials &gt; OAuth client ID</strong>. | - System Config path: <strong>Authentication &gt; OAuth 2.0</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Id</code>|</div></dd><dt>See <a href="/administration-guide/onboard/sso-google">Google Single Sign-On</a> for instructions that can be used to implement Google OAuth or OpenID authentication. | - Environment variable: <code>MM_GOOGLESETTINGS_ID</code></dt><dd><div class="line-block">                                                      |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the OAuth Client ID from Google. Generate the ID by going to the <strong>Credentials</strong> section of the Google Cloud Platform APIs &amp; Services menu and selecting <strong>Create Credentials &gt; OAuth client ID</strong>. | - System Config path: <strong>Authentication &gt; OAuth 2.0</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Id</code>|</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-google')}>Google Single Sign-On</a> for instructions that can be used to implement Google OAuth or OpenID authentication. | - Environment variable: <code>MM_GOOGLESETTINGS_ID</code></dt><dd><div class="line-block">                                                      |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2002,7 +2002,7 @@ See **Step 2** of the [GitLab Single Sign-On](/administration-guide/onboard/sso-
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Allows team and account creation using Google OpenID authentication. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables Google OpenID authentication. | - <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_GOOGLESETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href="/administration-guide/onboard/sso-google">Google Single Sign-On</a> implementation instructions. |</p></td>
<td><ul><li><strong>true</strong>: Allows team and account creation using Google OpenID authentication. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables Google OpenID authentication. | - <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_GOOGLESETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href={useBaseUrl('/administration-guide/onboard/sso-google')}>Google Single Sign-On</a> implementation instructions. |</p></td>
</tr>
</tbody>
</table>
@@ -2015,7 +2015,7 @@ See **Step 2** of the [GitLab Single Sign-On](/administration-guide/onboard/sso-
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting is prepopulated with the Discovery Endpoint for Google OpenID Connect. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>DiscoveryEndpoint</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-google#step-3-configure-mattermost-for-google-apps-sso">Configure Mattermost for Google Apps SSO</a>. | - Environment variable: <code>MM_GOOGLESETTINGS_DISCOVERYENDPOINT</code></dt><dd><div class="line-block">                                                                      |</div></dd></dl><p>String input. Default is <code>https://accounts.google.com/.well-known/openid-configuration</code> | |</p></td>
<td><dl><dt>This setting is prepopulated with the Discovery Endpoint for Google OpenID Connect. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>DiscoveryEndpoint</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-google#step-3-configure-mattermost-for-google-apps-sso')}>Configure Mattermost for Google Apps SSO</a>. | - Environment variable: <code>MM_GOOGLESETTINGS_DISCOVERYENDPOINT</code></dt><dd><div class="line-block">                                                                      |</div></dd></dl><p>String input. Default is <code>https://accounts.google.com/.well-known/openid-configuration</code> | |</p></td>
</tr>
</tbody>
</table>
@@ -2028,7 +2028,7 @@ See **Step 2** of the [GitLab Single Sign-On](/administration-guide/onboard/sso-
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the Client ID generated by Google. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Id</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-google">Google Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_GOOGLESETTINGS_ID</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the Client ID generated by Google. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Id</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-google')}>Google Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_GOOGLESETTINGS_ID</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2041,7 +2041,7 @@ See **Step 2** of the [GitLab Single Sign-On](/administration-guide/onboard/sso-
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the Client Secret generated by Google. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Secret</code>|</div></dd><dt>See <a href="/administration-guide/onboard/sso-google">Google Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_GOOGLESETTINGS_SECRET</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the Client Secret generated by Google. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>GoogleSettings</code> &gt; <code>Secret</code>|</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-google')}>Google Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_GOOGLESETTINGS_SECRET</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2076,7 +2076,7 @@ In line with Microsoft ADFS guidance, we recommend [configuring intranet forms-b
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Allows team and account creation using Entra ID OpenID Connect authentication. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables Entra ID OpenID Connect authentication. | - <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_OFFICE365SETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href="/administration-guide/onboard/sso-entraid">Entra ID Single Sign-On</a> implementation instructions. |</p></td>
<td><ul><li><strong>true</strong>: Allows team and account creation using Entra ID OpenID Connect authentication. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables Entra ID OpenID Connect authentication. | - <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_OFFICE365SETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href={useBaseUrl('/administration-guide/onboard/sso-entraid')}>Entra ID Single Sign-On</a> implementation instructions. |</p></td>
</tr>
</tbody>
</table>
@@ -2089,7 +2089,7 @@ In line with Microsoft ADFS guidance, we recommend [configuring intranet forms-b
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting holds the Directory (tenant) ID set for Mattermost through the Microsoft Azure Portal. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>DirectoryId</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-entraid">Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_DIRECTORYID</code></dt><dd><div class="line-block">                                                                   |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting holds the Directory (tenant) ID set for Mattermost through the Microsoft Azure Portal. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>DirectoryId</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-entraid')}>Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_DIRECTORYID</code></dt><dd><div class="line-block">                                                                   |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2102,7 +2102,7 @@ In line with Microsoft ADFS guidance, we recommend [configuring intranet forms-b
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting is prepopulated with the Discovery Endpoint for Entra ID OpenID Connect. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>DiscoveryEndpoint</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-entraid">Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_DISCOVERYENDPOINT</code></dt><dd><div class="line-block">                                                                                                                   |</div></dd></dl><p>String input. Default is <code>https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration</code> | |</p></td>
<td><dl><dt>This setting is prepopulated with the Discovery Endpoint for Entra ID OpenID Connect. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>DiscoveryEndpoint</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-entraid')}>Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_DISCOVERYENDPOINT</code></dt><dd><div class="line-block">                                                                                                                   |</div></dd></dl><p>String input. Default is <code>https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration</code> | |</p></td>
</tr>
</tbody>
</table>
@@ -2115,7 +2115,7 @@ In line with Microsoft ADFS guidance, we recommend [configuring intranet forms-b
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the <strong>Application (client) ID</strong> generated through the Microsoft Azure Portal. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>Id</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-entraid">Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_ID</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the <strong>Application (client) ID</strong> generated through the Microsoft Azure Portal. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>Id</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-entraid')}>Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_ID</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2128,7 +2128,7 @@ In line with Microsoft ADFS guidance, we recommend [configuring intranet forms-b
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the <strong>Client Secret</strong> generated through the Microsoft Azure Portal. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>Secret</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-entraid">Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_SECRET</code></dt><dd><div class="line-block">                                                               |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the <strong>Client Secret</strong> generated through the Microsoft Azure Portal. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>Office365Settings</code> &gt; <code>Secret</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-entraid')}>Entra ID Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OFFICE365SETTINGS_SECRET</code></dt><dd><div class="line-block">                                                               |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2163,7 +2163,7 @@ To make the `preferred_username` claim available, add it as an optional claim in
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Allows team and account creation using other OpenID Connect service providers. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables OpenID Connect authentication with other service providers. | - <code>config.json</code> setting: <code>OpenIdSettings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_OPENIDSETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href="/administration-guide/onboard/sso-openidconnect">OpenID Connect Single Sign-On</a> implementation instructions. |</p></td>
<td><ul><li><strong>true</strong>: Allows team and account creation using other OpenID Connect service providers. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</li></ul><dl><dt>- <strong>false</strong>: <strong>(Default)</strong> Disables OpenID Connect authentication with other service providers. | - <code>config.json</code> setting: <code>OpenIdSettings</code> &gt; <code>Enable</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_OPENIDSETTINGS_ENABLE</code> |</div></dd></dl><p>See <a href={useBaseUrl('/administration-guide/onboard/sso-openidconnect')}>OpenID Connect Single Sign-On</a> implementation instructions. |</p></td>
</tr>
</tbody>
</table>
@@ -2206,7 +2206,7 @@ To make the `preferred_username` claim available, add it as an optional claim in
</colgroup>
<tbody>
<tr>
<td>This setting stores the Discovery Endpoint URL from the OpenID provider. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> | The URL should be in the format of <code>https://myopenid.provider.com/&#123;my_organization&#125;/ | -</code>config.json<code>setting:</code>OpenIdSettings<code>&gt;</code>DiscoveryEndpoint<code>| .well-known/openid-configuration</code>. | - Environment variable: <code>MM_OPENIDSETTINGS_DISCOVERYENDPOINT</code> | | | See <a href="/administration-guide/onboard/sso-openidconnect">OpenID Connect Single Sign-On</a> | implementation instructions. | | | | String input. | |</td>
<td>This setting stores the Discovery Endpoint URL from the OpenID provider. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> | The URL should be in the format of <code>https://myopenid.provider.com/&#123;my_organization&#125;/ | -</code>config.json<code>setting:</code>OpenIdSettings<code>&gt;</code>DiscoveryEndpoint<code>| .well-known/openid-configuration</code>. | - Environment variable: <code>MM_OPENIDSETTINGS_DISCOVERYENDPOINT</code> | | | See <a href={useBaseUrl('/administration-guide/onboard/sso-openidconnect')}>OpenID Connect Single Sign-On</a> | implementation instructions. | | | | String input. | |</td>
</tr>
</tbody>
</table>
@@ -2225,7 +2225,7 @@ The **Discovery Endpoint** setting can be used to determine the connectivity and
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the Client ID from the OpenID provider. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>OpenIdSettings</code> &gt; <code>Id</code> |</div></dd><dt>See <a href="/administration-guide/onboard/sso-openidconnect">OpenID Connect Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OPENIDSETTINGS_ID</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the Client ID from the OpenID provider. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>OpenIdSettings</code> &gt; <code>Id</code> |</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-openidconnect')}>OpenID Connect Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OPENIDSETTINGS_ID</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -2238,7 +2238,7 @@ The **Discovery Endpoint** setting can be used to determine the connectivity and
</colgroup>
<tbody>
<tr>
<td><dl><dt>This setting stores the Client Secret from the OpenID provider. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>OpenIdSettings</code> &gt; <code>Secret</code>|</div></dd><dt>See <a href="/administration-guide/onboard/sso-openidconnect">OpenID Connect Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OPENIDSETTINGS_SECRET</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
<td><dl><dt>This setting stores the Client Secret from the OpenID provider. | - System Config path: <strong>Authentication &gt; OpenID Connect</strong> |</dt><dd><div class="line-block">- <code>config.json</code> setting: <code>OpenIdSettings</code> &gt; <code>Secret</code>|</div></dd><dt>See <a href={useBaseUrl('/administration-guide/onboard/sso-openidconnect')}>OpenID Connect Single Sign-On</a> implementation instructions. | - Environment variable: <code>MM_OPENIDSETTINGS_SECRET</code></dt><dd><div class="line-block">                                                          |</div></dd></dl><p>String input. | |</p></td>
</tr>
</tbody>
</table>
@@ -905,7 +905,7 @@ MySQL databases must be configured to support searching strings shorter than thr
</colgroup>
<tbody>
<tr>
<td>When <a href="/administration-guide/scale/enterprise-search">enterprise-scale search</a>, | - System Config path: <strong>Environment &gt; Database</strong> database search can be disabled from performing searches. | - <code>config.json</code> setting: <code>SqlSettings</code> &gt; <code>DisableDatabaseSearch</code> &gt; <code>false</code> | | - Environment variable: <code>MM_SQLSETTINGS_DISABLEDATABASESEARCH</code> | - <strong>true</strong>: Disables the use of the database to perform | | searches. If another search engine isn't configured, | | setting this value to <code>true</code> will result in empty search | | results. | | - <strong>false</strong>: <strong>(Default)</strong> Database search isn't disabled. | |</td>
<td>When <a href={useBaseUrl('/administration-guide/scale/enterprise-search')}>enterprise-scale search</a>, | - System Config path: <strong>Environment &gt; Database</strong> database search can be disabled from performing searches. | - <code>config.json</code> setting: <code>SqlSettings</code> &gt; <code>DisableDatabaseSearch</code> &gt; <code>false</code> | | - Environment variable: <code>MM_SQLSETTINGS_DISABLEDATABASESEARCH</code> | - <strong>true</strong>: Disables the use of the database to perform | | searches. If another search engine isn't configured, | | setting this value to <code>true</code> will result in empty search | | results. | | - <strong>false</strong>: <strong>(Default)</strong> Database search isn't disabled. | |</td>
</tr>
</tbody>
</table>
@@ -3819,7 +3819,7 @@ This setting improves an organization's mobile security posture by restricting f
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Prevents file downloads, previews, and sharing for most file types, | - System Config path: <strong>Site Configuration &gt; File sharing and downloads</strong> | even when the | - <code>config.json</code> setting: <code>FileSettings</code> &gt; <code>MobileEnableSecureFilePreview</code> &gt; <code>false</code> | <a href="/administration-guide/configure/site-configuration-settings#allow-file-downloads-on-mobile">Allow file downloads on mobile</a> | - Environment variable: <code>MM_FILESETTINGS_MOBILEENABLESECUREFILEPREVIEW</code> configuration setting is enabled. Allows in-app previews for PDFs, | | videos, and images only. Files are stored temporarily in the app's cache and cannot be exported or shared. | |</li><li><strong>false</strong>: <strong>(Default)</strong> Secure file preview mode is disabled. | |</li></ul></td>
<td><ul><li><strong>true</strong>: Prevents file downloads, previews, and sharing for most file types, | - System Config path: <strong>Site Configuration &gt; File sharing and downloads</strong> | even when the | - <code>config.json</code> setting: <code>FileSettings</code> &gt; <code>MobileEnableSecureFilePreview</code> &gt; <code>false</code> | <a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#allow-file-downloads-on-mobile')}>Allow file downloads on mobile</a> | - Environment variable: <code>MM_FILESETTINGS_MOBILEENABLESECUREFILEPREVIEW</code> configuration setting is enabled. Allows in-app previews for PDFs, | | videos, and images only. Files are stored temporarily in the app's cache and cannot be exported or shared. | |</li><li><strong>false</strong>: <strong>(Default)</strong> Secure file preview mode is disabled. | |</li></ul></td>
</tr>
</tbody>
</table>
@@ -4087,7 +4087,7 @@ Adding a prefix to all Redis cache keys reduces key collisions, simplifies debug
</colgroup>
<tbody>
<tr>
<td><p>Enables the ability to specify an alternate filestore target for Mattermost <a href="/administration-guide/manage/bulk-export-tool">bulk exports</a> and <a href="/administration-guide/comply/compliance-export">compliance exports</a>.</p><ul><li><strong>True</strong>: A new <code>ExportFileBackend()</code> is generated under <code>FileSettings</code> using new configuration values for the following configuration settings:<ul><li><code>ExportDriverName</code></li><li><code>ExportDirectory</code></li><li><code>ExportAmazonS3AccessKeyId</code></li><li><code>ExportAmazonS3SecretAccessKey</code></li><li><code>ExportAmazonS3Bucket</code></li><li><code>ExportAmazonS3PathPrefix</code></li><li><code>ExportAmazonS3Region</code></li><li><code>ExportAmazonS3Endpoint</code></li><li><code>ExportAmazonS3SSL</code></li><li><code>ExportAmazonS3SignV2</code></li><li><code>ExportAmazonS3SSE</code></li><li><code>ExportAmazonS3Trace</code></li><li><code>ExportAmazonS3RequestTimeoutMilliseconds</code></li><li><code>ExportAmazonS3PresignExpiresSeconds</code></li><li><code>ExportAzureStorageAccount</code></li><li><code>ExportAzureAuthMode</code></li><li><code>ExportAzureAccessKey</code></li><li><code>ExportAzureContainer</code></li><li><code>ExportAzurePathPrefix</code></li><li><code>ExportAzureCloud</code></li><li><code>ExportAzureEndpoint</code></li><li><code>ExportAzureSSL</code></li><li><code>ExportAzureRequestTimeoutMilliseconds</code></li><li><code>ExportAzurePresignExpiresSeconds</code></li></ul></li><li><strong>False</strong>: (<strong>Default</strong>) Standard <a href="/administration-guide/configure/environment-configuration-settings#file-storage">file storage</a> is used. Standard file storage will also be used when the configuration setting or value is omitted.</li></ul></td>
<td><p>Enables the ability to specify an alternate filestore target for Mattermost <a href={useBaseUrl('/administration-guide/manage/bulk-export-tool')}>bulk exports</a> and <a href={useBaseUrl('/administration-guide/comply/compliance-export')}>compliance exports</a>.</p><ul><li><strong>True</strong>: A new <code>ExportFileBackend()</code> is generated under <code>FileSettings</code> using new configuration values for the following configuration settings:<ul><li><code>ExportDriverName</code></li><li><code>ExportDirectory</code></li><li><code>ExportAmazonS3AccessKeyId</code></li><li><code>ExportAmazonS3SecretAccessKey</code></li><li><code>ExportAmazonS3Bucket</code></li><li><code>ExportAmazonS3PathPrefix</code></li><li><code>ExportAmazonS3Region</code></li><li><code>ExportAmazonS3Endpoint</code></li><li><code>ExportAmazonS3SSL</code></li><li><code>ExportAmazonS3SignV2</code></li><li><code>ExportAmazonS3SSE</code></li><li><code>ExportAmazonS3Trace</code></li><li><code>ExportAmazonS3RequestTimeoutMilliseconds</code></li><li><code>ExportAmazonS3PresignExpiresSeconds</code></li><li><code>ExportAzureStorageAccount</code></li><li><code>ExportAzureAuthMode</code></li><li><code>ExportAzureAccessKey</code></li><li><code>ExportAzureContainer</code></li><li><code>ExportAzurePathPrefix</code></li><li><code>ExportAzureCloud</code></li><li><code>ExportAzureEndpoint</code></li><li><code>ExportAzureSSL</code></li><li><code>ExportAzureRequestTimeoutMilliseconds</code></li><li><code>ExportAzurePresignExpiresSeconds</code></li></ul></li><li><strong>False</strong>: (<strong>Default</strong>) Standard <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#file-storage')}>file storage</a> is used. Standard file storage will also be used when the configuration setting or value is omitted.</li></ul></td>
<td><ul><li>System Config path: <strong>N/A</strong></li><li><code>config.json</code> setting: <code>FileSettings</code> &gt; <code>DedicatedExportStore</code></li><li>Environment variable: <code>MM_FILESETTINGS_DEDICATEDEXPORTSTORE</code></li></ul></td>
</tr>
</tbody>
@@ -42,7 +42,7 @@ The following optimization areas can alert you to workspace suggestions, warning
<tr>
<td>Mattermost release</td>
<td>Are you on the latest Mattermost release?</td>
<td><p>You're notified when updates are available.</p><p>See the <a href="/administration-guide/upgrade/upgrading-mattermost-server">Upgrade Mattermost</a> product documentation for details on upgrading your workspace.</p></td>
<td><p>You're notified when updates are available.</p><p>See the <a href={useBaseUrl('/administration-guide/upgrade/upgrading-mattermost-server')}>Upgrade Mattermost</a> product documentation for details on upgrading your workspace.</p></td>
</tr>
<tr>
<td>Configuration issues</td>
@@ -51,22 +51,22 @@ The following optimization areas can alert you to workspace suggestions, warning
<li><strong>Session Length</strong>: The default value may not provide an optimal user experience.</li>
<li><strong>File Storage</strong>: Write access to the configured file storage location is required.</li>
</ul></td>
<td><p>See the product documentation to learn more:</p><ul><li><a href="/administration-guide/onboard/ssl-client-certificate">Set up SSL</a></li><li><a href="/administration-guide/configure/environment-configuration-settings#session-lengths">Configure session length</a></li><li><a href="/administration-guide/configure/environment-configuration-settings#file-storage">Configure file storage</a></li></ul></td>
<td><p>See the product documentation to learn more:</p><ul><li><a href={useBaseUrl('/administration-guide/onboard/ssl-client-certificate')}>Set up SSL</a></li><li><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#session-lengths')}>Configure session length</a></li><li><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#file-storage')}>Configure file storage</a></li></ul></td>
</tr>
<tr>
<td>Workspace access</td>
<td>Is the Mattermost workspace accessible to users?</td>
<td>If your web server settings don't pass a live URL test, your workspace may not be accessible to others. See the <a href="/administration-guide/configure/environment-configuration-settings#web-server">Web server configuration settings</a> product documentation to learn more.</td>
<td>If your web server settings don't pass a live URL test, your workspace may not be accessible to others. See the <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#web-server')}>Web server configuration settings</a> product documentation to learn more.</td>
</tr>
<tr>
<td>Search performance</td>
<td>As your user base grows, is search getting slower?</td>
<td>See the <a href="/administration-guide/scale/enterprise-search">Enterprise search</a> product documentation to learn more.</td>
<td>See the <a href={useBaseUrl('/administration-guide/scale/enterprise-search')}>Enterprise search</a> product documentation to learn more.</td>
</tr>
<tr>
<td>Data privacy</td>
<td>Do you need more control and insights into your data?</td>
<td><p>See the product documentation to learn more:</p><ul><li><a href="/administration-guide/comply/data-retention-policy">Data Retention</a></li><li><a href="/administration-guide/comply/compliance-export">Compliance Export</a></li></ul></td>
<td><p>See the product documentation to learn more:</p><ul><li><a href={useBaseUrl('/administration-guide/comply/data-retention-policy')}>Data Retention</a></li><li><a href={useBaseUrl('/administration-guide/comply/compliance-export')}>Compliance Export</a></li></ul></td>
</tr>
<tr>
<td>User authentication</td>
@@ -74,7 +74,7 @@ The following optimization areas can alert you to workspace suggestions, warning
<li><strong>AD/LDAP</strong>: As your user base grows, would you benefit from easier onboarding, automated deactivations, and role assignments?</li>
<li><strong>Guest accounts</strong>: Do you want to control user access to channels and teams with guest accounts?</li>
</ul></td>
<td><p>See the product documentation to learn more:</p><ul><li><a href="/administration-guide/configure/authentication-configuration-settings#adldap">AD/LDAP</a></li><li><a href="/administration-guide/onboard/guest-accounts">Guest accounts</a></li></ul></td>
<td><p>See the product documentation to learn more:</p><ul><li><a href={useBaseUrl('/administration-guide/configure/authentication-configuration-settings#adldap')}>AD/LDAP</a></li><li><a href={useBaseUrl('/administration-guide/onboard/guest-accounts')}>Guest accounts</a></li></ul></td>
</tr>
</tbody>
</table>
@@ -104,7 +104,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td>Text that will be shown below the <strong>Custom brand image</strong> on the login page. | - System Config path: <strong>Site Configuration &gt; Customization</strong> | You can format this text using the same <a href="/end-user-guide/collaborate/format-messages">Markdown formatting</a> | - <code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>CustomBrandText</code> as in Mattermost messages. | - Environment variable: <code>MM_TEAMSETTINGS_CUSTOMBRANDTEXT</code> | | | String input. Maximum 500 characters. <a href="#enable-custom-branding">Enable custom branding</a> | | must be set to <strong>true</strong> to display the text. | |</td>
<td>Text that will be shown below the <strong>Custom brand image</strong> on the login page. | - System Config path: <strong>Site Configuration &gt; Customization</strong> | You can format this text using the same <a href={useBaseUrl('/end-user-guide/collaborate/format-messages')}>Markdown formatting</a> | - <code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>CustomBrandText</code> as in Mattermost messages. | - Environment variable: <code>MM_TEAMSETTINGS_CUSTOMBRANDTEXT</code> | | | String input. Maximum 500 characters. <a href="#enable-custom-branding">Enable custom branding</a> | | must be set to <strong>true</strong> to display the text. | |</td>
</tr>
</tbody>
</table>
@@ -485,7 +485,7 @@ This setting is applicable to self-hosted deployments only.
</colgroup>
<tbody>
<tr>
<td>Specify the minimum version of the Mattermost Desktop App required to connect to this server | - System Config path: <strong>Site Configuration &gt; Customization</strong> | (e.g., <code>5.10.0</code>). Users connecting with a Desktop App version below this minimum are shown | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>MinimumDesktopAppVersion</code> | an update required screen and cannot use the application until they update. | - Environment variable: <code>MM_SERVICESETTINGS_MINIMUMDESKTOPAPPVERSION</code> | | | The update screen includes a download link configured via the | | <a href="/administration-guide/configure/site-configuration-settings#mattermost-apps-download-page-link">Mattermost apps download page link</a> setting. | | | Must be a valid semantic version (e.g., <code>5.0.0</code>). Leave blank to allow all Desktop App | | versions to connect. | | | | String input. Default is empty (no minimum enforced). | |</td>
<td>Specify the minimum version of the Mattermost Desktop App required to connect to this server | - System Config path: <strong>Site Configuration &gt; Customization</strong> | (e.g., <code>5.10.0</code>). Users connecting with a Desktop App version below this minimum are shown | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>MinimumDesktopAppVersion</code> | an update required screen and cannot use the application until they update. | - Environment variable: <code>MM_SERVICESETTINGS_MINIMUMDESKTOPAPPVERSION</code> | | | The update screen includes a download link configured via the | | <a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#mattermost-apps-download-page-link')}>Mattermost apps download page link</a> setting. | | | Must be a valid semantic version (e.g., <code>5.0.0</code>). Leave blank to allow all Desktop App | | versions to connect. | | | | String input. Default is empty (no minimum enforced). | |</td>
</tr>
</tbody>
</table>
@@ -754,7 +754,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td>The <strong>Max users per team</strong> is the maximum total number of users per team, | - System Config path: <strong>Site Configuration &gt; Users and Teams</strong> | including activated and deactivated users. | - <code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>MaxUsersPerTeam</code> &gt; <code>50</code> | | - Environment variable: <code>MM_TEAMSETTINGS_MAXUSERSPERTEAM</code> | In Mattermost, a team of people should be a small organization with a | | specific goal. In the physical world, a team could sit around a single | | table. The default maximum (50) should be enough for most teams, but | | with appropriate <a href="https://docs.mattermost.com/install/ | |software-hardware-requirements.html">hardware</a>, this limit can be increased to | | thousands of users. | | | | <a href="/end-user-guide/collaborate/collaborate-within-channels">Channels</a> | are another way of organizing communications within teams on various topics. | | | | Numerical input. Default is <strong>50</strong> self-hosted deployments, and <strong>10000</strong> | | for Cloud deployments. | |</td>
<td>The <strong>Max users per team</strong> is the maximum total number of users per team, | - System Config path: <strong>Site Configuration &gt; Users and Teams</strong> | including activated and deactivated users. | - <code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>MaxUsersPerTeam</code> &gt; <code>50</code> | | - Environment variable: <code>MM_TEAMSETTINGS_MAXUSERSPERTEAM</code> | In Mattermost, a team of people should be a small organization with a | | specific goal. In the physical world, a team could sit around a single | | table. The default maximum (50) should be enough for most teams, but | | with appropriate <a href="https://docs.mattermost.com/install/ | |software-hardware-requirements.html">hardware</a>, this limit can be increased to | | thousands of users. | | | | <a href={useBaseUrl('/end-user-guide/collaborate/collaborate-within-channels')}>Channels</a> | are another way of organizing communications within teams on various topics. | | | | Numerical input. Default is <strong>50</strong> self-hosted deployments, and <strong>10000</strong> | | for Cloud deployments. | |</td>
</tr>
</tbody>
</table>
@@ -813,7 +813,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td><p>This setting determines how names appear in posts and under the <strong>Direct Messages</strong> list. Users can change this setting in their interface under <strong>Settings &gt; Display &gt; Teammate Name Display</strong>, unless this setting is locked by a system admin via the <strong>Lock teammate name display for all users</strong> configuration setting.</p><ul><li><strong>Show username</strong>: <strong>(Default for self-hosted deployments)</strong> Displays usernames. <code>config.json</code> option: <code>"username"</code>.</li><li><strong>Show nickname if one exists...</strong>: Displays the user's nickname. If the user doesn't have a nickname, their full name is displayed. If the user doesn't have a full name, their username is displayed. <code>config.json</code> option: <code>"nickname_full_name"</code>.</li><li><strong>Show first and last name</strong>: <strong>(Default for Cloud deployments)</strong> Displays user's full name. If the user doesn't have a full name, their username is displayed. Recommended when using <a href="/administration-guide/onboard/sso-saml">SAML</a> or <a href="/administration-guide/onboard/ad-ldap">LDAP</a> if first name and last name attributes are configured. <code>config.json</code> option: <code>"full_name"</code>.</li></ul></td>
<td><p>This setting determines how names appear in posts and under the <strong>Direct Messages</strong> list. Users can change this setting in their interface under <strong>Settings &gt; Display &gt; Teammate Name Display</strong>, unless this setting is locked by a system admin via the <strong>Lock teammate name display for all users</strong> configuration setting.</p><ul><li><strong>Show username</strong>: <strong>(Default for self-hosted deployments)</strong> Displays usernames. <code>config.json</code> option: <code>"username"</code>.</li><li><strong>Show nickname if one exists...</strong>: Displays the user's nickname. If the user doesn't have a nickname, their full name is displayed. If the user doesn't have a full name, their username is displayed. <code>config.json</code> option: <code>"nickname_full_name"</code>.</li><li><strong>Show first and last name</strong>: <strong>(Default for Cloud deployments)</strong> Displays user's full name. If the user doesn't have a full name, their username is displayed. Recommended when using <a href={useBaseUrl('/administration-guide/onboard/sso-saml')}>SAML</a> or <a href={useBaseUrl('/administration-guide/onboard/ad-ldap')}>LDAP</a> if first name and last name attributes are configured. <code>config.json</code> option: <code>"full_name"</code>.</li></ul></td>
<td><ul><li>System Config path: <strong>Site Configuration &gt; Users and Teams</strong></li><li><code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>TeammateNameDisplay</code> &gt; <code>username</code></li><li>Environment variable: <code>MM_TEAMSETTINGS_TEAMMATENAMEDISPLAY</code></li></ul></td>
</tr>
</tbody>
@@ -847,7 +847,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td><p>This setting controls whether users who sign in with email and password can change their own profile fields under <strong>Settings &gt; Profile</strong>. System admins are always exempt and can edit any user's profile through the System Console or the API. Users authenticating through an external provider (AD/LDAP, SAML, or OAuth) aren't affected; their fields remain governed by the provider's attribute settings.</p><ul><li><strong>Don't lock profile fields</strong>: <strong>(Default)</strong> Users can change all of their profile fields. <code>config.json</code> option: <code>"none"</code>.</li><li><strong>Lock name and username</strong>: Users cannot change their first name, last name, or username. <code>config.json</code> option: <code>"name_and_username"</code>.</li><li><strong>Lock entire profile</strong>: Additionally locks the nickname, position, and profile picture. Email stays editable because it's the sign-in credential, protected by password re-entry and verification. <code>config.json</code> option: <code>"all"</code>.</li></ul><p>Empty first and last names can be filled in once by the user, so people who join through a team invite link or open server signup aren't left without a name. Once set, the name is locked.</p><p>When this setting is enabled, anyone with the <strong>Invite Users</strong> permission can pre-set the first name, last name, and username for each email invitation they send. The invited person sees the pre-set username on the account creation page and cannot change it. We recommend restricting the <strong>Invite Users</strong> permission through <a href="/administration-guide/onboard/advanced-permissions">advanced permissions</a> to people trusted to enter this information correctly.</p><p>For a display name convention of "First Last" across the workspace, combine this setting with <strong>Teammate Name Display</strong> set to <strong>Show first and last name</strong> and <strong>Lock Teammate Name Display</strong> set to <strong>true</strong>.</p></td>
<td><p>This setting controls whether users who sign in with email and password can change their own profile fields under <strong>Settings &gt; Profile</strong>. System admins are always exempt and can edit any user's profile through the System Console or the API. Users authenticating through an external provider (AD/LDAP, SAML, or OAuth) aren't affected; their fields remain governed by the provider's attribute settings.</p><ul><li><strong>Don't lock profile fields</strong>: <strong>(Default)</strong> Users can change all of their profile fields. <code>config.json</code> option: <code>"none"</code>.</li><li><strong>Lock name and username</strong>: Users cannot change their first name, last name, or username. <code>config.json</code> option: <code>"name_and_username"</code>.</li><li><strong>Lock entire profile</strong>: Additionally locks the nickname, position, and profile picture. Email stays editable because it's the sign-in credential, protected by password re-entry and verification. <code>config.json</code> option: <code>"all"</code>.</li></ul><p>Empty first and last names can be filled in once by the user, so people who join through a team invite link or open server signup aren't left without a name. Once set, the name is locked.</p><p>When this setting is enabled, anyone with the <strong>Invite Users</strong> permission can pre-set the first name, last name, and username for each email invitation they send. The invited person sees the pre-set username on the account creation page and cannot change it. We recommend restricting the <strong>Invite Users</strong> permission through <a href={useBaseUrl('/administration-guide/onboard/advanced-permissions')}>advanced permissions</a> to people trusted to enter this information correctly.</p><p>For a display name convention of "First Last" across the workspace, combine this setting with <strong>Teammate Name Display</strong> set to <strong>Show first and last name</strong> and <strong>Lock Teammate Name Display</strong> set to <strong>true</strong>.</p></td>
<td><ul><li>System Config path: <strong>Site Configuration &gt; Users and Teams</strong></li><li><code>config.json</code> setting: <code>TeamSettings</code> &gt; <code>LockProfileFieldsForEmailUsers</code> &gt; <code>none</code></li><li>Environment variable: <code>MM_TEAMSETTINGS_LOCKPROFILEFIELDSFOREMAILUSERS</code></li></ul></td>
</tr>
</tbody>
@@ -1488,7 +1488,7 @@ Customers upgrading from a legacy Mattermost release prior to v7.0 must review t
</colgroup>
<tbody>
<tr>
<td><dl><dt>- <strong>Always On</strong>: <strong>(Default)</strong> Enables <a href="/end-user-guide/collaborate/organize-conversations">threaded discussions</a> | - System Config path: **Site Configuration &gt; Posts** | | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>CollapsedThreads</code></dt><dd><p>on the server and for all users. This is the recommended configuration for optimal user experience | - Environment variable: <code>MM_SERVICESETTINGS_COLLAPSEDTHREADS</code> | and to ensure consistency in how users read and respond to threaded conversations. | | <code>config.json</code> setting: <code>"always_on"</code> | |</p></dd></dl><ul><li><strong>Default On</strong>: Enables threaded discussions on the server and for all users. | |</li><li><strong>Default Off</strong>: Enables threaded discussions on the server but <strong>not</strong> for users. | |</li><li><strong>Disabled</strong>: Users cannot enable threaded discussions. <code>config.json</code> setting: <code>"disabled"</code> | |</li></ul></td>
<td><dl><dt>- <strong>Always On</strong>: <strong>(Default)</strong> Enables <a href={useBaseUrl('/end-user-guide/collaborate/organize-conversations')}>threaded discussions</a> | - System Config path: **Site Configuration &gt; Posts** | | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>CollapsedThreads</code></dt><dd><p>on the server and for all users. This is the recommended configuration for optimal user experience | - Environment variable: <code>MM_SERVICESETTINGS_COLLAPSEDTHREADS</code> | and to ensure consistency in how users read and respond to threaded conversations. | | <code>config.json</code> setting: <code>"always_on"</code> | |</p></dd></dl><ul><li><strong>Default On</strong>: Enables threaded discussions on the server and for all users. | |</li><li><strong>Default Off</strong>: Enables threaded discussions on the server but <strong>not</strong> for users. | |</li><li><strong>Disabled</strong>: Users cannot enable threaded discussions. <code>config.json</code> setting: <code>"disabled"</code> | |</li></ul></td>
</tr>
</tbody>
</table>
@@ -1705,7 +1705,7 @@ Disabling this configuration setting in larger deployments may improve server pe
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: <strong>(Default)</strong> <a href="/end-user-guide/collaborate/share-links">Share links to Mattermost messages</a> | - System Config path: <strong>Site Configuration &gt; Posts</strong> will generate a preview for any users that have access to the original message. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnablePermalinkPreviews</code> &gt; <code>true</code> |</li><li><strong>false</strong>: Share links do not generate a preview. | - Environment variable: <code>MM_SERVICESETTINGS_ENABLEPERMALINKPREVIEWS</code> |</li></ul></td>
<td><ul><li><strong>true</strong>: <strong>(Default)</strong> <a href={useBaseUrl('/end-user-guide/collaborate/share-links')}>Share links to Mattermost messages</a> | - System Config path: <strong>Site Configuration &gt; Posts</strong> will generate a preview for any users that have access to the original message. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnablePermalinkPreviews</code> &gt; <code>true</code> |</li><li><strong>false</strong>: Share links do not generate a preview. | - Environment variable: <code>MM_SERVICESETTINGS_ENABLEPERMALINKPREVIEWS</code> |</li></ul></td>
</tr>
</tbody>
</table>
@@ -1752,7 +1752,7 @@ Enabling SVGs is not recommended in environments where not all users are trusted
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Enables rendering of <a href="/end-user-guide/collaborate/format-messages#math-formulas">LaTeX in code blocks</a>. | - System Config path: <strong>Site Configuration &gt; Posts</strong></li><li><dl><dt><strong>false</strong>: <strong>(Default)</strong> Disables rendering in blocks. Instead, LaTeX code is highlighted. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableLatex</code> &gt; <code>false</code>|</dt><dd><div class="line-block">- Environment variable: <code>MM_SERVICESETTINGS_ENABLELATEX</code> |</div></dd></dl></li></ul></td>
<td><ul><li><strong>true</strong>: Enables rendering of <a href={useBaseUrl('/end-user-guide/collaborate/format-messages#math-formulas')}>LaTeX in code blocks</a>. | - System Config path: <strong>Site Configuration &gt; Posts</strong></li><li><dl><dt><strong>false</strong>: <strong>(Default)</strong> Disables rendering in blocks. Instead, LaTeX code is highlighted. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableLatex</code> &gt; <code>false</code>|</dt><dd><div class="line-block">- Environment variable: <code>MM_SERVICESETTINGS_ENABLELATEX</code> |</div></dd></dl></li></ul></td>
</tr>
</tbody>
</table>
@@ -1771,7 +1771,7 @@ Enabling LaTeX rendering is not recommended in environments where not all users
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Enables rendering of | - System Config path: <strong>Site Configuration &gt; Posts</strong> | <a href="/end-user-guide/collaborate/format-messages#math-formulas">LaTeX in message text</a>. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableInlineLatex</code> &gt; <code>false</code></li><li><strong>false</strong>: <strong>(Default)</strong> Disables inline rendering of LaTeX. Instead, LaTeX in message text is highlighted. | - Environment variable: <code>MM_SERVICESETTINGS_ENABLEINLINELATEX</code> | LaTeX can also be rendered in a code block, if that feature is enabled. See <strong>Enable LaTeX code block rendering</strong>. | |</li></ul></td>
<td><ul><li><strong>true</strong>: Enables rendering of | - System Config path: <strong>Site Configuration &gt; Posts</strong> | <a href={useBaseUrl('/end-user-guide/collaborate/format-messages#math-formulas')}>LaTeX in message text</a>. | - <code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableInlineLatex</code> &gt; <code>false</code></li><li><strong>false</strong>: <strong>(Default)</strong> Disables inline rendering of LaTeX. Instead, LaTeX in message text is highlighted. | - Environment variable: <code>MM_SERVICESETTINGS_ENABLEINLINELATEX</code> | LaTeX can also be rendered in a code block, if that feature is enabled. See <strong>Enable LaTeX code block rendering</strong>. | |</li></ul></td>
</tr>
</tbody>
</table>
@@ -2137,7 +2137,7 @@ This setting improves an organization's mobile security posture by restricting f
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Prevents file downloads, previews, and sharing for most file types, | - System Config path: <strong>Site Configuration &gt; File sharing and downloads</strong> | even when the | - <code>config.json</code> setting: <code>FileSettings</code> &gt; <code>MobileEnableSecureFilePreview</code> &gt; <code>false</code> | <a href="/administration-guide/configure/site-configuration-settings#allow-file-downloads-on-mobile">Allow file downloads on mobile</a> | - Environment variable: <code>MM_FILESETTINGS_MOBILEENABLESECUREFILEPREVIEW</code> configuration setting is enabled. Allows in-app previews for PDFs, | | videos, and images only. Files are stored temporarily in the app's cache and cannot be exported or shared. | |</li><li><strong>false</strong>: <strong>(Default)</strong> Secure file preview mode is disabled. | |</li></ul></td>
<td><ul><li><strong>true</strong>: Prevents file downloads, previews, and sharing for most file types, | - System Config path: <strong>Site Configuration &gt; File sharing and downloads</strong> | even when the | - <code>config.json</code> setting: <code>FileSettings</code> &gt; <code>MobileEnableSecureFilePreview</code> &gt; <code>false</code> | <a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#allow-file-downloads-on-mobile')}>Allow file downloads on mobile</a> | - Environment variable: <code>MM_FILESETTINGS_MOBILEENABLESECUREFILEPREVIEW</code> configuration setting is enabled. Allows in-app previews for PDFs, | | videos, and images only. Files are stored temporarily in the app's cache and cannot be exported or shared. | |</li><li><strong>false</strong>: <strong>(Default)</strong> Secure file preview mode is disabled. | |</li></ul></td>
</tr>
</tbody>
</table>
@@ -2179,7 +2179,7 @@ With self-hosted deployments, you can access the following configuration setting
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: Allows users to create <a href="/end-user-guide/collaborate/share-files-in-messages">public links</a> to files attached to Mattermost messages. | - System Config path: <strong>Site Configuration &gt; Public Links</strong></li><li><dl><dt><strong>false</strong>: <strong>(Default)</strong> Prevents users from creating public links to files and disables all previously created links. | - <code>config.json</code> setting: <code>FileSettings</code> &gt; <code>EnablePublicLink</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_FILESETTINGS_ENABLEPUBLICLINK</code> |</div></dd></dl></li></ul></td>
<td><ul><li><strong>true</strong>: Allows users to create <a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages')}>public links</a> to files attached to Mattermost messages. | - System Config path: <strong>Site Configuration &gt; Public Links</strong></li><li><dl><dt><strong>false</strong>: <strong>(Default)</strong> Prevents users from creating public links to files and disables all previously created links. | - <code>config.json</code> setting: <code>FileSettings</code> &gt; <code>EnablePublicLink</code> &gt; <code>false</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_FILESETTINGS_ENABLEPUBLICLINK</code> |</div></dd></dl></li></ul></td>
</tr>
</tbody>
</table>
@@ -2219,7 +2219,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: <strong>(Default)</strong> System admins will receive <a href="/administration-guide/manage/in-product-notices">in-product notices</a> about server upgrades and administration features. | - System Config path: <strong>Site Configuration &gt; Notices</strong> - | - <code>config.json</code> setting: <code>AnnouncementSettings</code> &gt; <code>AdminNoticesEnabled</code> &gt; <code>true</code> |</li><li><strong>false</strong>: System admins will not receive specific notices. Admins will still receive notices for all users (see <strong>Enable end user notices</strong>) | - Environment variable: <code>MM_ANNOUNCEMENTSETTINGS_ADMINNOTICESENABLED</code> |</li></ul></td>
<td><ul><li><strong>true</strong>: <strong>(Default)</strong> System admins will receive <a href={useBaseUrl('/administration-guide/manage/in-product-notices')}>in-product notices</a> about server upgrades and administration features. | - System Config path: <strong>Site Configuration &gt; Notices</strong> - | - <code>config.json</code> setting: <code>AnnouncementSettings</code> &gt; <code>AdminNoticesEnabled</code> &gt; <code>true</code> |</li><li><strong>false</strong>: System admins will not receive specific notices. Admins will still receive notices for all users (see <strong>Enable end user notices</strong>) | - Environment variable: <code>MM_ANNOUNCEMENTSETTINGS_ADMINNOTICESENABLED</code> |</li></ul></td>
</tr>
</tbody>
</table>
@@ -2232,7 +2232,7 @@ Access the following configuration settings in the System Console by going to **
</colgroup>
<tbody>
<tr>
<td><ul><li><strong>true</strong>: <strong>(Default)</strong> All users receive <a href="/administration-guide/manage/in-product-notices">in-product notices</a> about client upgrades and end user features. | - System Config path: <strong>Site Configuration &gt; Notices</strong></li><li><dl><dt><strong>false</strong>: Users will not receive in-product notices. | - <code>config.json</code> setting: <code>AnnouncementSettings</code> &gt; <code>UserNoticesEnabled</code> &gt; <code>true</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_ANNOUNCEMENTSETTINGS_USERNOTICESENABLED</code> |</div></dd></dl></li></ul></td>
<td><ul><li><strong>true</strong>: <strong>(Default)</strong> All users receive <a href={useBaseUrl('/administration-guide/manage/in-product-notices')}>in-product notices</a> about client upgrades and end user features. | - System Config path: <strong>Site Configuration &gt; Notices</strong></li><li><dl><dt><strong>false</strong>: Users will not receive in-product notices. | - <code>config.json</code> setting: <code>AnnouncementSettings</code> &gt; <code>UserNoticesEnabled</code> &gt; <code>true</code> |</dt><dd><div class="line-block">- Environment variable: <code>MM_ANNOUNCEMENTSETTINGS_USERNOTICESENABLED</code> |</div></dd></dl></li></ul></td>
</tr>
</tbody>
</table>
@@ -325,7 +325,7 @@ View user profile details using the System Console. Gather information including
<td></td>
</tr>
<tr>
<td colspan="3">See the <a href="/administration-guide/onboard/ad-ldap-groups-synchronization">AD/LDAP groups</a> documentation for details. |</td>
<td colspan="3">See the <a href={useBaseUrl('/administration-guide/onboard/ad-ldap-groups-synchronization')}>AD/LDAP groups</a> documentation for details. |</td>
</tr>
</tbody>
</table>
@@ -653,7 +653,7 @@ Channels can be deleted with all content, including posts in the database, using
<td></td>
</tr>
<tr>
<td colspan="3">See <a href="/administration-guide/onboard/advanced-permissions">advanced permissions</a> documentation for details</td>
<td colspan="3">See <a href={useBaseUrl('/administration-guide/onboard/advanced-permissions')}>advanced permissions</a> documentation for details</td>
</tr>
</tbody>
</table>
@@ -681,7 +681,7 @@ Channels can be deleted with all content, including posts in the database, using
<td></td>
</tr>
<tr>
<td colspan="3">See the <a href="/administration-guide/onboard/delegated-granular-administration">delegated granular administration</a> documentation for details |</td>
<td colspan="3">See the <a href={useBaseUrl('/administration-guide/onboard/delegated-granular-administration')}>delegated granular administration</a> documentation for details |</td>
</tr>
</tbody>
</table>
@@ -1,6 +1,8 @@
---
title: "Migrate between self-hosted and Cloud"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
This document outlines the process for migrating an existing Mattermost instance [from self-hosted to Cloud](#migrate-from-self-hosted-to-cloud), and [from Cloud to self-hosted](#migrate-from-cloud-to-self-hosted).
<Note>
@@ -199,14 +201,14 @@ Finally, it's time to take our export from the source server and use it as an im
<td></td>
</tr>
<tr>
<td colspan="3"><a href="/administration-guide/configure/site-configuration-settings#max-users-per-team">Maximum Users Per Team | Increase this value to a number that **exceeds** the maximum number of users, per team, in the import file. |</a> |</td>
<td colspan="3"><a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#max-users-per-team')}>Maximum Users Per Team | Increase this value to a number that **exceeds** the maximum number of users, per team, in the import file. |</a> |</td>
</tr>
<tr>
<td colspan="3"><a href="/administration-guide/configure/environment-configuration-settings#maximum-file-size">Maximum File Size | Temporarily increase this value to be **larger** than the size of the import file. |</a> | Following a successful import, we strongly recommend reverting this value to a reasonable limit for daily expected usage. |</td>
<td colspan="3"><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#maximum-file-size')}>Maximum File Size | Temporarily increase this value to be **larger** than the size of the import file. |</a> | Following a successful import, we strongly recommend reverting this value to a reasonable limit for daily expected usage. |</td>
</tr>
<tr>
<td colspan="3"><dl>
<dt><a href="/administration-guide/configure/environment-configuration-settings#write-timeout">Write Timeout | Temporarily adjust this value based on import file speed and network path to enable the file to upload without timeouts. |</a> | Start with a value of <strong>3600</strong> and adjust if needed. |</dt>
<dt><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#write-timeout')}>Write Timeout | Temporarily adjust this value based on import file speed and network path to enable the file to upload without timeouts. |</a> | Start with a value of <strong>3600</strong> and adjust if needed. |</dt>
<dd>
<div class="line-block">Following a successful import, we strongly recommend reverting this setting to its initial or previous value. |</div>
</dd>
@@ -214,14 +216,14 @@ Finally, it's time to take our export from the source server and use it as an im
</tr>
<tr>
<td colspan="3"><dl>
<dt><a href="/administration-guide/configure/environment-configuration-settings#read-timeout">Read Timeout | Temporarily adjust this value based on import file speed and network path to enable the file to upload without timeouts. |</a> | Start with a value of <strong>3600</strong> and adjust if needed. |</dt>
<dt><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#read-timeout')}>Read Timeout | Temporarily adjust this value based on import file speed and network path to enable the file to upload without timeouts. |</a> | Start with a value of <strong>3600</strong> and adjust if needed. |</dt>
<dd>
<div class="line-block">Following a successful import, we strongly recommend reverting this setting to its initial or previous value. |</div>
</dd>
</dl></td>
</tr>
<tr>
<td colspan="3"><a href="/administration-guide/configure/environment-configuration-settings#amazon-s3-request-timeout">Amazon S3 Request Timeout | If using cloud-based file storage, adjust this value to ensure your storage requests don't time out too soon. |</a> |</td>
<td colspan="3"><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#amazon-s3-request-timeout')}>Amazon S3 Request Timeout | If using cloud-based file storage, adjust this value to ensure your storage requests don't time out too soon. |</a> |</td>
</tr>
</tbody>
</table>
@@ -1,6 +1,8 @@
---
title: "Product limits"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
<PlanAvailability slug="all-commercial" />
This page describes some of the product limits that apply to Mattermost, including hard and recommended limits.
@@ -15,132 +17,132 @@ This page describes some of the product limits that apply to Mattermost, includi
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/collaborate/create-channels">Group messages</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/create-channels')}>Group messages</a></td>
<td>8 participants</td>
<td>If 8 isn't enough, create a private channel</td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/make-calls">Call participants</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/make-calls')}>Call participants</a></td>
<td>Unlimited</td>
<td>50</td>
</tr>
<tr>
<td><a href="/administration-guide/configure/custom-branding-tools#custom-brand-text">Custom brand text</a></td>
<td><a href={useBaseUrl('/administration-guide/configure/custom-branding-tools#custom-brand-text')}>Custom brand text</a></td>
<td>500</td>
<td></td>
</tr>
<tr>
<td><a href="/administration-guide/configure/custom-branding-tools#site-description">Custom site description</a></td>
<td><a href={useBaseUrl('/administration-guide/configure/custom-branding-tools#site-description')}>Custom site description</a></td>
<td>1024</td>
<td></td>
</tr>
<tr>
<td><a href="/administration-guide/manage/logging#advanced-logging">Advanced log output</a></td>
<td><a href={useBaseUrl('/administration-guide/manage/logging#advanced-logging')}>Advanced log output</a></td>
<td>500 MB file size, 1000 audit records</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/set-your-status-availability#set-a-custom-status">Custom status</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/set-your-status-availability#set-a-custom-status')}>Custom status</a></td>
<td>100 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/channel-header-purpose#channel-name">Channel name</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/channel-header-purpose#channel-name')}>Channel name</a></td>
<td>64 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/channel-header-purpose#channel-purpose">Channel purpose</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/channel-header-purpose#channel-purpose')}>Channel purpose</a></td>
<td>250 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/channel-header-purpose#channel-header">Channel header</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/channel-header-purpose#channel-header')}>Channel header</a></td>
<td>1024 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/manage-channel-bookmarks">Bookmarked links &amp; files</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/manage-channel-bookmarks')}>Bookmarked links &amp; files</a></td>
<td>50</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/message-priority#request-acknowledgements">Message acknowledgement</a> response time</td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/message-priority#request-acknowledgements')}>Message acknowledgement</a> response time</td>
<td>5 minutes</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/organize-using-custom-user-groups">Custom user group</a> notifications</td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-using-custom-user-groups')}>Custom user group</a> notifications</td>
<td>256 users per group</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/react-with-emojis-gifs#quick-emoji-reactions">Emoji reactions</a> per message</td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/react-with-emojis-gifs#quick-emoji-reactions')}>Emoji reactions</a> per message</td>
<td>50</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/react-with-emojis-gifs#upload-custom-emojis">Custom emoji uploads</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/react-with-emojis-gifs#upload-custom-emojis')}>Custom emoji uploads</a></td>
<td>6000</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/team-settings#team-description">Team description</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/team-settings#team-description')}>Team description</a></td>
<td>50 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/administration-guide/configure/environment-configuration-settings#session-length-for-sso">SSO user session duration</a></td>
<td><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#session-length-for-sso')}>SSO user session duration</a></td>
<td>30 days</td>
<td></td>
</tr>
<tr>
<td><a href="/administration-guide/configure/environment-configuration-settings#session-length-for-mobile">Mobile user session duration</a></td>
<td><a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#session-length-for-mobile')}>Mobile user session duration</a></td>
<td>30 days</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages">Attachments per message</a> (files or images)</td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages')}>Attachments per message</a> (files or images)</td>
<td>10</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes">Attachment file size</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes')}>Attachment file size</a></td>
<td>100 MB</td>
<td>Configurable</td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes">Attachment image file size</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes')}>Attachment image file size</a></td>
<td>253 MB</td>
<td>Configurable</td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes">Attachment dimensions</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes')}>Attachment dimensions</a></td>
<td>7680 pixels x 4320 pixels</td>
<td>Configurable</td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes">Attachment image resolution size</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages#attachment-limits-and-sizes')}>Attachment image resolution size</a></td>
<td>33 MP (mega pixels) or 8K resolution</td>
<td>Configurable</td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-profile">User nickname</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-profile')}>User nickname</a></td>
<td>64 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/send-messages">Message length</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/send-messages')}>Message length</a></td>
<td>16,383 characters</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/organize-using-teams#create-a-team">Teams per deployment</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-using-teams#create-a-team')}>Teams per deployment</a></td>
<td>10,000</td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/invite-people">Users per team</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/invite-people')}>Users per team</a></td>
<td>No enforced limit</td>
<td>Dependent on infrastructure</td>
</tr>
@@ -1,6 +1,8 @@
---
title: "Important upgrade notes"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
import Inc0_common_esr_support_rst from '../../product-overview/common-esr-support-rst.mdx';
<PlanAvailability slug="all-commercial" />
@@ -483,7 +485,7 @@ DROP INDEX CONCURRENTLY IF EXISTS idx_propertyfields_protected;</code></pre></td
<td>The <code>role_updated</code> WebSocket events are scoped to the affected team/channel instead of broadcasting globally, improving performance and reducing unnecessary network traffic. No manual action is required from administrators as the migration runs automatically during the upgrade. No downtime is expected, and no special planning is needed for the upgrade as the migration can run during normal operations. All installations are affected by this change, but the impact is minimal since the <code>roles</code> table is small with well under 10k rows even on large installations. The upgrade includes automatic database migrations to add a <code>schemeid</code> column to the <code>roles</code> table for efficient role-scheme lookups. The migrations use PostgreSQL's non-blocking techniques: first adding the column with a brief ACCESS EXCLUSIVE lock (catalog-only operation), then backfilling existing data with a ROW EXCLUSIVE lock, and finally creating an index concurrently with a SHARE UPDATE EXCLUSIVE lock that doesn't block other operations. The <code>roles</code> table size is bounded and unaffected by posts, reactions, or other high-volume data. The migrations are fully backwards-compatible.</td>
</tr>
<tr>
<td>v11.7 includes Agents plugin v2. Please see <a href="/agents/docs/upgrading_to_2.0">this guide</a> on how to upgrade the Mattermost Agents plugin from a v1.x release to v2.0.0. It covers the supported version path, the migrations that run automatically on first start of v2.0.0, the breaking changes and default-behavior flips that admins should know about before the upgrade window, and the verification steps to confirm the upgrade succeeded.</td>
<td>v11.7 includes Agents plugin v2. Please see <a href={useBaseUrl('/agents/docs/upgrading_to_2.0')}>this guide</a> on how to upgrade the Mattermost Agents plugin from a v1.x release to v2.0.0. It covers the supported version path, the migrations that run automatically on first start of v2.0.0, the breaking changes and default-behavior flips that admins should know about before the upgrade window, and the verification steps to confirm the upgrade succeeded.</td>
</tr>
<tr>
<td><p>v11.7.6 migration removes orphaned rows from the <code>threadmemberships</code> table — specifically, rows where the associated user is no longer a member of the channel that the thread belongs to. The cleanup is performed via a filtered <code>DELETE</code> using a three-way join across <code>threadmemberships</code>, <code>threads</code>, and <code>channelmembers</code>. No schema objects (tables, columns, or indexes) are added or removed; only data rows are affected. Note for large instances: this migration issues a single unbatched delete that scans the entirety of <code>threadmemberships</code> with a join against <code>threads</code> and <code>channelmembers</code>. On databases with tens of millions of rows or significant historical channel-membership churn, this query may run for an extended period, block autovacuum on <code>threadmemberships</code>, increase WAL pressure, and contribute to replication lag. Administrators of large deployments should test execution time on a representative dataset before upgrading and consider scheduling the upgrade during a low-traffic window. The down migration contains no rollback SQL because the deleted rows cannot be recovered; this migration is irreversible. The migrations are fully backwards-compatible and no database downtime is expected for this upgrade. The SQL queries included are:</p><pre><code>-- Drop ThreadMembership rows whose user is no longer a member of the thread's channel.
@@ -683,7 +685,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
</tr>
<tr>
<td rowspan="2">v10.6</td>
<td colspan="3">Support for PostgreSQL v11 and v12 have been removed. The new minimum PostgreSQL version is v13+. | See the | <a href="/deployment-guide/software-hardware-requirements#minimum-postgresql-database-support-policy">minimum supported PostgreSQL version policy</a> documentation | for details. |</td>
<td colspan="3">Support for PostgreSQL v11 and v12 have been removed. The new minimum PostgreSQL version is v13+. | See the | <a href={useBaseUrl('/deployment-guide/software-hardware-requirements#minimum-postgresql-database-support-policy')}>minimum supported PostgreSQL version policy</a> documentation | for details. |</td>
</tr>
<tr>
<td><p>System Console statistics now perform faster on PostgreSQL. The <code>MaxUsersForStatistics</code> configuration setting now only disables the <strong>User counts with posts</strong> chart, while all other stats remain unaffected. The other stats remain unaffected because that configuration value is no longer needed to disable the other queries since they are always fast now. Post and file counts update daily, so they may not always reflect real-time data. Advanced stats, such as line charts and plugin data, are now hidden until clicked, reducing load time. No performance improvements apply to MySQL since it's scheduled for full deprecation in v11. We recommend migrating to PostgreSQL for better performance and long-term support. Migration times: On a system with 12M posts, and 1M fileinfo entries, the migration takes 15s, but could take several minutes depending on the server's table sizes and database specs. This migration is non-locking. Note that there is no migration for MySQL deployments because this optimization is only applicable for PostgreSQL. Below are the SQL queries included in the schema changes:</p><div class="sourceCode" id="cb21"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">MATERIALIZED</span> <span class="kw">VIEW</span> <span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> posts_by_team_day <span class="kw">as</span></span><span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">to_timestamp</span>(p.createat<span class="op">/</span><span class="dv">1000</span>):<span class="ch">:date</span> <span class="kw">as</span> <span class="dt">day</span>, <span class="fu">COUNT</span>(<span class="op">&#42;</span>) <span class="kw">as</span> num, teamid</span><span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> posts p <span class="kw">JOIN</span> channels c <span class="kw">on</span> p.channelid<span class="op">=</span>c.<span class="kw">id</span></span><span id="cb21-4"><a href="#cb21-4" aria-hidden="true" tabindex="-1"></a><span class="kw">GROUP</span> <span class="kw">BY</span> <span class="dt">day</span>, c.teamid;</span><span id="cb21-5"><a href="#cb21-5" aria-hidden="true" tabindex="-1"></a></span><span id="cb21-6"><a href="#cb21-6" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">MATERIALIZED</span> <span class="kw">VIEW</span> <span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> bot_posts_by_team_day <span class="kw">as</span></span><span id="cb21-7"><a href="#cb21-7" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">to_timestamp</span>(p.createat<span class="op">/</span><span class="dv">1000</span>):<span class="ch">:date</span> <span class="kw">as</span> <span class="dt">day</span>, <span class="fu">COUNT</span>(<span class="op">&#42;</span>) <span class="kw">as</span> num, teamid</span><span id="cb21-8"><a href="#cb21-8" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> posts p</span><span id="cb21-9"><a href="#cb21-9" aria-hidden="true" tabindex="-1"></a><span class="kw">JOIN</span> Bots b <span class="kw">ON</span> p.UserId <span class="op">=</span> b.Userid</span><span id="cb21-10"><a href="#cb21-10" aria-hidden="true" tabindex="-1"></a><span class="kw">JOIN</span> channels c <span class="kw">on</span> p.channelid<span class="op">=</span>c.<span class="kw">id</span></span><span id="cb21-11"><a href="#cb21-11" aria-hidden="true" tabindex="-1"></a><span class="kw">GROUP</span> <span class="kw">BY</span> <span class="dt">day</span>, c.teamid;</span><span id="cb21-12"><a href="#cb21-12" aria-hidden="true" tabindex="-1"></a></span><span id="cb21-13"><a href="#cb21-13" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">MATERIALIZED</span> <span class="kw">VIEW</span> <span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> file_stats <span class="kw">as</span></span><span id="cb21-14"><a href="#cb21-14" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">COUNT</span>(<span class="op">&#42;</span>) <span class="kw">as</span> num, <span class="fu">COALESCE</span>(<span class="fu">SUM</span>(<span class="kw">Size</span>), <span class="dv">0</span>) <span class="kw">as</span> <span class="kw">usage</span></span><span id="cb21-15"><a href="#cb21-15" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> fileinfo</span><span id="cb21-16"><a href="#cb21-16" aria-hidden="true" tabindex="-1"></a><span class="kw">WHERE</span> DeleteAt <span class="op">=</span> <span class="dv">0</span>;</span></code></pre></div></td>
@@ -702,7 +704,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>Mattermost has stopped official Mattermost server builds for the Microsoft Windows operating system. Administrators should migrate existing Mattermost server installations to use the official Linux builds. See more details in <a href="https://forum.mattermost.com/t/deprecation-notice-server-builds-for-microsoft-windows/21498">this forum post</a>.</td>
</tr>
<tr>
<td colspan="3">v10.5 introduces updates to the Compliance Export functionality, which will modify how exported data is structured, stored and processed. These changes | primarily affect System Administrators and the main changes are outlined below. See more details in | the <a href="/administration-guide/comply/compliance-export">Compliance Export documentation</a>. | | Output files and directories have changed - Previously we were exporting a single zip containing all the batch directories. Now we will export a single | directory, and under that directory each batch will be its own zip. | | Compliance exports performance improvements - Compliance exports should now be at least 50% faster, and possibly more. | | Logic improvements - We’ve made improvements and fixed bugs that we found. | | Changes specific to each Export Type - The export output formats have been changed. Some fields’ semantic meaning has been clarified, and there are a number of | new fields. Our goal was to maintain backwards compatibility while fixing the logic bugs. | | See the <a href="/administration-guide/comply/compliance-export">compliance export</a> product documentation for details. |</td>
<td colspan="3">v10.5 introduces updates to the Compliance Export functionality, which will modify how exported data is structured, stored and processed. These changes | primarily affect System Administrators and the main changes are outlined below. See more details in | the <a href={useBaseUrl('/administration-guide/comply/compliance-export')}>Compliance Export documentation</a>. | | Output files and directories have changed - Previously we were exporting a single zip containing all the batch directories. Now we will export a single | directory, and under that directory each batch will be its own zip. | | Compliance exports performance improvements - Compliance exports should now be at least 50% faster, and possibly more. | | Logic improvements - We’ve made improvements and fixed bugs that we found. | | Changes specific to each Export Type - The export output formats have been changed. Some fields’ semantic meaning has been clarified, and there are a number of | new fields. Our goal was to maintain backwards compatibility while fixing the logic bugs. | | See the <a href={useBaseUrl('/administration-guide/comply/compliance-export')}>compliance export</a> product documentation for details. |</td>
</tr>
<tr>
<td><p>As part of the Property System Architecture feature, Mattermost v10.5 is going to run a set of migrations to add new tables to the schema. This migration only creates new tables and indexes, so there is no impact on preexisting data.</p><p>New tables <code>PropertyGroups</code>, <code>PropertyFields</code> and <code>PropertyValues</code> are going to be created.</p><p>In the case of PostgreSQL, a new enum type <code>property_field_type</code> is going to be created, to be used in the <code>Type</code> column of the <code>PropertyFields</code> table.</p><p>The <code>PropertyFields</code> and <code>PropertyValues</code> tables have a unique constraint that will generate an index in MySQL, and in the case of PostgreSQL, they directly use a <code>UNIQUE INDEX</code> to enforce this constraint.</p><p>A new index <code>idx_propertyvalues_targetid_groupid</code> will be created for the <code>PropertyValues</code> table.</p><p>The migration is only creating new tables with no data. The migration is backwards-compatible, and a previous version of Mattermost can run with the new schema changes. No table locks or existing operations on the table are impacted by this upgrade. Zero downtime is possible when upgrading to this release.</p><p>Below are the SQL queries included in the schema changes:</p><p><strong>MySQL</strong>:</p><div class="sourceCode" id="cb22"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">TABLE</span> <span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> PropertyGroups (</span><span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">ID</span> <span class="dt">varchar</span>(<span class="dv">26</span>) <span class="kw">PRIMARY</span> <span class="kw">KEY</span>,</span><span id="cb22-3"><a href="#cb22-3" aria-hidden="true" tabindex="-1"></a> Name <span class="dt">varchar</span>(<span class="dv">64</span>) <span class="kw">NOT</span> <span class="kw">NULL</span>,</span><span id="cb22-4"><a href="#cb22-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">UNIQUE</span>(Name)</span><span id="cb22-5"><a href="#cb22-5" aria-hidden="true" tabindex="-1"></a>);</span><span id="cb22-6"><a href="#cb22-6" aria-hidden="true" tabindex="-1"></a></span><span id="cb22-7"><a href="#cb22-7" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">TABLE</span> <span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> PropertyFields (</span><span id="cb22-8"><a href="#cb22-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">ID</span> <span class="dt">varchar</span>(<span class="dv">26</span>) <span class="kw">PRIMARY</span> <span class="kw">KEY</span>,</span><span id="cb22-9"><a href="#cb22-9" aria-hidden="true" tabindex="-1"></a> GroupID <span class="dt">varchar</span>(<span class="dv">26</span>) <span class="kw">NOT</span> <span class="kw">NULL</span>,</span><span id="cb22-10"><a href="#cb22-10" aria-hidden="true" tabindex="-1"></a> Name <span class="dt">varchar</span>(<span class="dv">255</span>) <span class="kw">NOT</span> <span class="kw">NULL</span>,</span><span id="cb22-11"><a href="#cb22-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">Type</span> enum(<span class="st">&#39;text&#39;</span>, <span class="st">&#39;select&#39;</span>, <span class="st">&#39;multiselect&#39;</span>, <span class="st">&#39;date&#39;</span>, <span class="st">&#39;user&#39;</span>, <span class="st">&#39;multiuser&#39;</span>),</span><span id="cb22-12"><a href="#cb22-12" aria-hidden="true" tabindex="-1"></a> Attrs json,</span><span id="cb22-13"><a href="#cb22-13" aria-hidden="true" tabindex="-1"></a> TargetID <span class="dt">varchar</span>(<span class="dv">255</span>),</span><span id="cb22-14"><a href="#cb22-14" aria-hidden="true" tabindex="-1"></a> TargetType <span class="dt">varchar</span>(<span class="dv">255</span>),</span><span id="cb22-15"><a href="#cb22-15" aria-hidden="true" tabindex="-1"></a> CreateAt bigint(<span class="dv">20</span>),</span><span id="cb22-16"><a href="#cb22-16" aria-hidden="true" tabindex="-1"></a> UpdateAt bigint(<span class="dv">20</span>),</span><span id="cb22-17"><a href="#cb22-17" aria-hidden="true" tabindex="-1"></a> DeleteAt bigint(<span class="dv">20</span>),</span><span id="cb22-18"><a href="#cb22-18" aria-hidden="true" tabindex="-1"></a> <span class="kw">UNIQUE</span>(GroupID, TargetID, Name, DeleteAt)</span><span id="cb22-19"><a href="#cb22-19" aria-hidden="true" tabindex="-1"></a>);</span><span id="cb22-20"><a href="#cb22-20" aria-hidden="true" tabindex="-1"></a></span><span id="cb22-21"><a href="#cb22-21" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">TABLE</span> <span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> PropertyValues (</span><span id="cb22Line truncated
@@ -765,7 +767,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
</tr>
<tr>
<td>v9.11</td>
<td colspan="3">Added support for Elasticsearch v8. Also added Beta support for OpenSearch v1.x and v2.x. A new config setting <code>ElasticsearchSettings.Backend</code> has been | added to differentiate between Elasticsearch and OpenSearch. The default value is <code>elasticsearch</code> which breaks support for AWS Elasticsearch v7.10.x | since the official v8 client only works from Elasticsearch v7.11+ versions. | | .. note:: | | - For AWS customers on OpenSearch, you must modify Mattermost configuration from <code>elasticsearch</code> to <code>opensearch</code> and disable compatibility mode. | See the <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/version-migration.html">OpenSearch documentation</a> for details on upgrading. | - After upgrading the Mattermost server, use <a href="/administration-guide/manage/mmctl-command-line-tool#mmctl-config-set">mmctl</a> or edit the config manually, | then restart the Mattermost server. | - If you are using OpenSearch, you <strong>must</strong> set the backend to <code>opensearch</code>. Otherwise Mattermost will not work. | | If you are using Elasticsearch v8, be sure to set <code>action.destructive_requires_name</code> to <code>false</code> in <code>elasticsearch.yml</code> to allow for wildcard operations to | work. |</td>
<td colspan="3">Added support for Elasticsearch v8. Also added Beta support for OpenSearch v1.x and v2.x. A new config setting <code>ElasticsearchSettings.Backend</code> has been | added to differentiate between Elasticsearch and OpenSearch. The default value is <code>elasticsearch</code> which breaks support for AWS Elasticsearch v7.10.x | since the official v8 client only works from Elasticsearch v7.11+ versions. | | .. note:: | | - For AWS customers on OpenSearch, you must modify Mattermost configuration from <code>elasticsearch</code> to <code>opensearch</code> and disable compatibility mode. | See the <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/version-migration.html">OpenSearch documentation</a> for details on upgrading. | - After upgrading the Mattermost server, use <a href={useBaseUrl('/administration-guide/manage/mmctl-command-line-tool#mmctl-config-set')}>mmctl</a> or edit the config manually, | then restart the Mattermost server. | - If you are using OpenSearch, you <strong>must</strong> set the backend to <code>opensearch</code>. Otherwise Mattermost will not work. | | If you are using Elasticsearch v8, be sure to set <code>action.destructive_requires_name</code> to <code>false</code> in <code>elasticsearch.yml</code> to allow for wildcard operations to | work. |</td>
</tr>
<tr>
<td>v9.10</td>
@@ -792,7 +794,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>We have stopped supporting MySQL v5.7 since it's at the end of life. We urge customers to upgrade their MySQL instance at their earliest convenience.</td>
</tr>
<tr>
<td colspan="3">Added safety limit error message in compiled Team Edition and Enterprise Edition deployments when enterprise scale and access control automation features are | unavailable and count of users who are registered and not deactivated exceeds 10,000. | <a href="/administration-guide/manage/admin/error-codes">ERROR_SAFETY_LIMITS_EXCEEDED</a>. |</td>
<td colspan="3">Added safety limit error message in compiled Team Edition and Enterprise Edition deployments when enterprise scale and access control automation features are | unavailable and count of users who are registered and not deactivated exceeds 10,000. | <a href={useBaseUrl('/administration-guide/manage/admin/error-codes')}>ERROR_SAFETY_LIMITS_EXCEEDED</a>. |</td>
</tr>
<tr>
<td>v9.4</td>
@@ -868,7 +870,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>Removed deprecated <code>model.CommandArgs.Session</code>.</td>
</tr>
<tr>
<td colspan="3">For servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the <code>ServiceSettings.AllowCorsFrom</code> | <a href="/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from">configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
<td colspan="3">For servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the <code>ServiceSettings.AllowCorsFrom</code> | <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from')}>configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
</tr>
<tr>
<td>In v8.0 release, the following repositories are merged into one: <code>mattermost-server</code>, <code>mattermost-webapp</code> and <code>mmctl</code>. Developers should read the updated <a href="https://docs.mattermost.com/developers/contribute/developer-setup/">Developer Guide</a> for details.</td>
@@ -893,7 +895,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>In v7.10.1, fixed an issue where a user would still see threads in the threads view of channels they have left. Migration execution time in MySQL: Query OK, 2766769 rows affected (4 min 47.57 sec). Migration execution time in PostgreSQL: 58.11 sec, DELETE 2766690.</td>
</tr>
<tr>
<td colspan="3">In v7.10.3, for servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the | <code>ServiceSettings.AllowCorsFrom</code> | <a href="/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from">configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
<td colspan="3">In v7.10.3, for servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the | <code>ServiceSettings.AllowCorsFrom</code> | <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from')}>configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
</tr>
<tr>
<td rowspan="4">v7.9</td>
@@ -906,11 +908,11 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td><p>In v7.9.4, backported a fix related Oauth 2. Query times depend on if you have rows to delete or not.</p><p>With no rows to delete:</p><ul><li>MySQL v5.7.12: 9ms</li><li>PostgreSQL v10: 21ms</li></ul><p>4 rows:</p><ul><li>MySQL v5.7.12: 17.2ms</li><li>PostgreSQL v10: 9.9ms</li></ul><p>Those times are based off the following table sizes:</p><ul><li>Preferences: 2 million records</li><li><code>oauthaccessdata</code> and sessions: 10 records</li></ul><p>You can assess the number of impacted rows by running the following:</p><p><strong>PostgreSQL</strong>:</p><div class="sourceCode" id="cb26"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">count</span>(o.<span class="op">&#42;</span>)</span><span id="cb26-2"><a href="#cb26-2" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> oauthaccessdata o</span><span id="cb26-3"><a href="#cb26-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">WHERE</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> (</span><span id="cb26-4"><a href="#cb26-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">SELECT</span> p.<span class="op">&#42;</span></span><span id="cb26-5"><a href="#cb26-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">FROM</span> preferences p</span><span id="cb26-6"><a href="#cb26-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">WHERE</span> o.clientid <span class="op">=</span> p.name</span><span id="cb26-7"><a href="#cb26-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> o.userid <span class="op">=</span> p.</span><span id="cb26-8"><a href="#cb26-8" aria-hidden="true" tabindex="-1"></a> userid</span><span id="cb26-9"><a href="#cb26-9" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> p.<span class="kw">category</span> <span class="op">=</span></span><span id="cb26-10"><a href="#cb26-10" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;oauth_app&#39;</span></span><span id="cb26-11"><a href="#cb26-11" aria-hidden="true" tabindex="-1"></a> );</span></code></pre></div><p><strong>MySQL</strong>:</p><div class="sourceCode" id="cb27"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">COUNT</span>(o.`Token`)</span><span id="cb27-2"><a href="#cb27-2" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> OAuthAccessData o</span><span id="cb27-3"><a href="#cb27-3" aria-hidden="true" tabindex="-1"></a><span class="kw">LEFT</span> <span class="kw">JOIN</span> Preferences p <span class="kw">ON</span> o.</span><span id="cb27-4"><a href="#cb27-4" aria-hidden="true" tabindex="-1"></a> clientid <span class="op">=</span> p.name</span><span id="cb27-5"><a href="#cb27-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> o.userid <span class="op">=</span> p.userid</span><span id="cb27-6"><a href="#cb27-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> p.<span class="kw">category</span> <span class="op">=</span> <span class="st">&#39;oauth_app&#39;</span></span><span id="cb27-7"><a href="#cb27-7" aria-hidden="true" tabindex="-1"></a><span class="kw">INNER</span> <span class="kw">JOIN</span> Sessions s <span class="kw">ON</span> o.token <span class="op">=</span> s</span><span id="cb27-8"><a href="#cb27-8" aria-hidden="true" tabindex="-1"></a> .token</span><span id="cb27-9"><a href="#cb27-9" aria-hidden="true" tabindex="-1"></a><span class="kw">WHERE</span> p.name <span class="kw">IS</span> <span class="kw">NULL</span>;</span></code></pre></div><p>Locks on the <code>oauthaccessdata</code> and sessions table will only be acquired if there are rows to delete.</p></td>
</tr>
<tr>
<td colspan="3">In v7.9.5, for servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the | <code>ServiceSettings.AllowCorsFrom</code> | <a href="/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from">configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
<td colspan="3">In v7.9.5, for servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the | <code>ServiceSettings.AllowCorsFrom</code> | <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from')}>configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
</tr>
<tr>
<td rowspan="5">v7.8</td>
<td colspan="3"><a href="/administration-guide/configure/site-configuration-settings#message-priority">Message Priority &amp; Acknowledgement</a> is now enabled by default | for all instances. You may disable this feature in the System Console by going to <strong>Posts &gt; Message Priority</strong> or via the config <code>PostPriority</code> setting. |</td>
<td colspan="3"><a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#message-priority')}>Message Priority &amp; Acknowledgement</a> is now enabled by default | for all instances. You may disable this feature in the System Console by going to <strong>Posts &gt; Message Priority</strong> or via the config <code>PostPriority</code> setting. |</td>
</tr>
<tr>
<td>In v7.8.5, fixed an issue where a user would still see threads in the threads view of channels they have left. Migration execution time in MySQL: Query OK, 2766769 rows affected (4 min 47.57 sec). Migration execution time in PostgreSQL: 58.11 sec, DELETE 2766690.</td>
@@ -919,7 +921,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td><p>In v7.8.5, backported a fix related Oauth 2. Query times depend on if you have rows to delete or not.</p><p>With no rows to delete:</p><ul><li>MySQL v5.7.12: 9ms</li><li>PostgreSQL v10: 21ms</li></ul><p>4 rows:</p><ul><li>MySQL v5.7.12: 17.2ms</li><li>PostgreSQL v10: 9.9ms</li></ul><p>Those times are based off the following table sizes:</p><ul><li>Preferences: 2 million records</li><li><code>oauthaccessdata</code> and sessions: 10 records</li></ul><p>You can assess the number of impacted rows by running the following:</p><p><strong>PostgreSQL</strong>:</p><div class="sourceCode" id="cb28"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">count</span>(o.<span class="op">&#42;</span>)</span><span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">FROM</span> oauthaccessdata o</span><span id="cb28-3"><a href="#cb28-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">WHERE</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span> (</span><span id="cb28-4"><a href="#cb28-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">SELECT</span> p.<span class="op">&#42;</span></span><span id="cb28-5"><a href="#cb28-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">FROM</span> preferences p</span><span id="cb28-6"><a href="#cb28-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">WHERE</span> o.clientid <span class="op">=</span> p.name</span><span id="cb28-7"><a href="#cb28-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> o.userid <span class="op">=</span> p.</span><span id="cb28-8"><a href="#cb28-8" aria-hidden="true" tabindex="-1"></a> userid</span><span id="cb28-9"><a href="#cb28-9" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> p.<span class="kw">category</span> <span class="op">=</span></span><span id="cb28-10"><a href="#cb28-10" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;oauth_app&#39;</span></span><span id="cb28-11"><a href="#cb28-11" aria-hidden="true" tabindex="-1"></a> );</span></code></pre></div><p><strong>MySQL</strong>:</p><div class="sourceCode" id="cb29"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a><span class="kw">SELECT</span> <span class="fu">COUNT</span>(o.`Token`)</span><span id="cb29-2"><a href="#cb29-2" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> OAuthAccessData o</span><span id="cb29-3"><a href="#cb29-3" aria-hidden="true" tabindex="-1"></a><span class="kw">LEFT</span> <span class="kw">JOIN</span> Preferences p <span class="kw">ON</span> o.</span><span id="cb29-4"><a href="#cb29-4" aria-hidden="true" tabindex="-1"></a> clientid <span class="op">=</span> p.name</span><span id="cb29-5"><a href="#cb29-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> o.userid <span class="op">=</span> p.userid</span><span id="cb29-6"><a href="#cb29-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">AND</span> p.<span class="kw">category</span> <span class="op">=</span> <span class="st">&#39;oauth_app&#39;</span></span><span id="cb29-7"><a href="#cb29-7" aria-hidden="true" tabindex="-1"></a><span class="kw">INNER</span> <span class="kw">JOIN</span> Sessions s <span class="kw">ON</span> o.token <span class="op">=</span> s</span><span id="cb29-8"><a href="#cb29-8" aria-hidden="true" tabindex="-1"></a> .token</span><span id="cb29-9"><a href="#cb29-9" aria-hidden="true" tabindex="-1"></a><span class="kw">WHERE</span> p.name <span class="kw">IS</span> <span class="kw">NULL</span>;</span></code></pre></div><p>Locks on the <code>oauthaccessdata</code> and sessions table will only be acquired if there are rows to delete.</p></td>
</tr>
<tr>
<td colspan="3">In v7.8.7, for servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the | <code>ServiceSettings.AllowCorsFrom</code> | <a href="/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from">configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
<td colspan="3">In v7.8.7, for servers wanting to allow websockets to connect from origins other than the origin of the site URL, please set the | <code>ServiceSettings.AllowCorsFrom</code> | <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-cross-origin-requests-from')}>configuration setting</a>. Also ensure that | the <code>siteURL</code> is set correctly. |</td>
</tr>
<tr>
<td><p>In v7.8.11, improved performance on data retention <code>DeleteOrphanedRows</code> queries.</p><p>New migration for a new table:</p><p><strong>MySQL</strong>:</p><div class="sourceCode" id="cb30"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">TABLE</span></span><span id="cb30-2"><a href="#cb30-2" aria-hidden="true" tabindex="-1"></a></span><span id="cb30-3"><a href="#cb30-3" aria-hidden="true" tabindex="-1"></a><span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span></span><span id="cb30-4"><a href="#cb30-4" aria-hidden="true" tabindex="-1"></a> RetentionIdsForDeletion(<span class="kw">Id</span></span><span id="cb30-5"><a href="#cb30-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">VARCHAR</span>(<span class="dv">26</span>) <span class="kw">NOT</span> <span class="kw">NULL</span>,</span><span id="cb30-6"><a href="#cb30-6" aria-hidden="true" tabindex="-1"></a> TableName <span class="dt">VARCHAR</span>(<span class="dv">64</span>),</span><span id="cb30-7"><a href="#cb30-7" aria-hidden="true" tabindex="-1"></a> Ids json, <span class="kw">PRIMARY</span> <span class="kw">KEY</span> (<span class="kw">Id</span></span><span id="cb30-8"><a href="#cb30-8" aria-hidden="true" tabindex="-1"></a> ), <span class="kw">KEY</span></span><span id="cb30-9"><a href="#cb30-9" aria-hidden="true" tabindex="-1"></a> idx_retentionidsfordeletion_tablename</span><span id="cb30-10"><a href="#cb30-10" aria-hidden="true" tabindex="-1"></a> (TableName)) ENGINE <span class="op">=</span></span><span id="cb30-11"><a href="#cb30-11" aria-hidden="true" tabindex="-1"></a> InnoDB <span class="kw">DEFAULT</span> CHARSET <span class="op">=</span></span><span id="cb30-12"><a href="#cb30-12" aria-hidden="true" tabindex="-1"></a> utf8mb4;</span><span id="cb30-13"><a href="#cb30-13" aria-hidden="true" tabindex="-1"></a> ``</span></code></pre></div><p><strong>PostgreSQL</strong>:</p><div class="sourceCode" id="cb31"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a><span class="kw">CREATE</span> <span class="kw">TABLE</span></span><span id="cb31-2"><a href="#cb31-2" aria-hidden="true" tabindex="-1"></a></span><span id="cb31-3"><a href="#cb31-3" aria-hidden="true" tabindex="-1"></a><span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span></span><span id="cb31-4"><a href="#cb31-4" aria-hidden="true" tabindex="-1"></a> retentionidsfordeletion(<span class="kw">id</span></span><span id="cb31-5"><a href="#cb31-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">VARCHAR</span>(<span class="dv">26</span>) <span class="kw">PRIMARY</span> <span class="kw">KEY</span>,</span><span id="cb31-6"><a href="#cb31-6" aria-hidden="true" tabindex="-1"></a> tablename <span class="dt">VARCHAR</span>(<span class="dv">64</span>),</span><span id="cb31-7"><a href="#cb31-7" aria-hidden="true" tabindex="-1"></a> ids <span class="dt">VARCHAR</span>(<span class="dv">26</span>) []);</span><span id="cb31-8"><a href="#cb31-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">CREATE</span> <span class="kw">INDEX</span></span><span id="cb31-9"><a href="#cb31-9" aria-hidden="true" tabindex="-1"></a></span><span id="cb31-10"><a href="#cb31-10" aria-hidden="true" tabindex="-1"></a><span class="cf">IF</span> <span class="kw">NOT</span> <span class="kw">EXISTS</span></span><span id="cb31-11"><a href="#cb31-11" aria-hidden="true" tabindex="-1"></a> idx_retentionidsfordeletion_tablename</span><span id="cb31-12"><a href="#cb31-12" aria-hidden="true" tabindex="-1"></a> <span class="kw">ON</span> retentionidsfordeletion(</span><span id="cb31-13"><a href="#cb31-13" aria-hidden="true" tabindex="-1"></a> tablename);</span><span id="cb31-14"><a href="#cb31-14" aria-hidden="true" tabindex="-1"></a> ``</span></code></pre></div><p>Hard deleting a user or a channel will now also clean up associated reactions.</p><p>Removed feature flag <code>DataRetentionConcurrencyEnabled</code>. Data retention now runs without concurrency in order to avoid any performance degradation.</p><p>Added a new configuration setting <code>DataRetentionSettings.RetentionIdsBatchSize</code>, which allows admins to configure how many batches of IDs will be fetched at a time when deleting orphaned reactions. The default value is 100.</p></td>
@@ -935,7 +937,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>Starting with the Calls version shipping with v7.7, there's now a minimum version requirement when using the external RTCD service. This means that if Calls is configured to use the external service, customers need to upgrade RTCD first to at least version 0.8.0 or the plugin will fail to start.</td>
</tr>
<tr>
<td colspan="3">In v7.7.2, <a href="/administration-guide/configure/site-configuration-settings#message-priority">Message Priority &amp; Acknowledgement</a> is now enabled by | default for all instances. You may disable this feature in the System Console by going to <strong>Posts &gt; Message Priority</strong> or via the config <code>PostPriority</code> | setting. |</td>
<td colspan="3">In v7.7.2, <a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#message-priority')}>Message Priority &amp; Acknowledgement</a> is now enabled by | default for all instances. You may disable this feature in the System Console by going to <strong>Posts &gt; Message Priority</strong> or via the config <code>PostPriority</code> | setting. |</td>
</tr>
<tr>
<td rowspan="2">v7.5</td>
@@ -970,34 +972,34 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>When a new configuration setting via <strong>System Console &gt; Experimental &gt; Features &gt; Enable App Bar</strong> is enabled, all channel header icons registered by plugins will be moved to the new Apps Bar, even if they do not explicitly use the new registry function to render a component there. The setting for Apps Bar defaults to <code>false</code> for self-hosted deployments.</td>
</tr>
<tr>
<td colspan="3">The value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain conditions. | Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href="/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header">here</a>. |</td>
<td colspan="3">The value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain conditions. | Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header')}>here</a>. |</td>
</tr>
<tr>
<td colspan="3"><a href="/end-user-guide/collaborate/organize-conversations">Collapsed Reply Threads</a> is now generally available and enabled by default for new | Mattermost servers. For servers upgrading to v7.0 and later, please reference | <a href="https://support.mattermost.com/hc/en-us/articles/6880701948564-Administrator-s-guide-to-enabling-Collapsed-Reply-Threads">this article</a> for more information | and guidance on enabling the feature. |</td>
<td colspan="3"><a href={useBaseUrl('/end-user-guide/collaborate/organize-conversations')}>Collapsed Reply Threads</a> is now generally available and enabled by default for new | Mattermost servers. For servers upgrading to v7.0 and later, please reference | <a href="https://support.mattermost.com/hc/en-us/articles/6880701948564-Administrator-s-guide-to-enabling-Collapsed-Reply-Threads">this article</a> for more information | and guidance on enabling the feature. |</td>
</tr>
<tr>
<td rowspan="2">v6.7</td>
<td><p>New schema changes were introduced in the form of a new index. The following summarizes the test results measuring how long it took for the database queries to run with these schema changes:</p><p>MySQL 7M Posts - ~17s (Instance: db.r5.xlarge)</p><p>MySQL 9M Posts - 2min 12s (Instance: db.r5.large)</p><p>Postgres 7M Posts - ~9s (Instance: db.r5.xlarge)</p><p>For customers wanting a zero downtime upgrade, they are encouraged to apply this index prior to doing the upgrade. This is fully backwards compatible and will not acquire any table lock or affect any existing operations on the table when run manually. Else, the queries will run during the upgrade process and will lock the table in non-MySQL environments. Run the following to apply this index:</p><p>For MySQL: <code>CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;</code></p><p>For Postgres: <code>CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_posts_create_at_id on posts(createat, id);</code></p></td>
</tr>
<tr>
<td colspan="3">In v6.7.1, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href="/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header">here</a>. |</td>
<td colspan="3">In v6.7.1, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header')}>here</a>. |</td>
</tr>
<tr>
<td rowspan="3">v6.6</td>
<td>The Apps Framework protocol for binding/form submissions has changed, by separating the single <code>call</code> into separate <code>submit</code>, <code>form</code>, <code>refresh</code> and <code>lookup</code> calls. If any users have created their own Apps, they have to be updated to the new system.</td>
</tr>
<tr>
<td colspan="3">Channel admins can now configure <a href="/end-user-guide/collaborate/create-channels">certain actions</a> to be executed automatically based on trigger | conditions without writing any code. Users running an older Playbooks release need to upgrade their Playbooks instance to at least v1.26 to take advantage of | the channel actions functionality. |</td>
<td colspan="3">Channel admins can now configure <a href={useBaseUrl('/end-user-guide/collaborate/create-channels')}>certain actions</a> to be executed automatically based on trigger | conditions without writing any code. Users running an older Playbooks release need to upgrade their Playbooks instance to at least v1.26 to take advantage of | the channel actions functionality. |</td>
</tr>
<tr>
<td colspan="3">In v6.6.2, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href="/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header">here</a>. |</td>
<td colspan="3">In v6.6.2, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header')}>here</a>. |</td>
</tr>
<tr>
<td rowspan="2">v6.5</td>
<td colspan="3">The <code>mattermost version</code> CLI command does not interact with the database anymore. Therefore the database version is not going to be | printed. Also, the database migrations are not going to be applied with the version sub command. | <a href="/administration-guide/manage/command-line-tools#mattermost-db-migrate">A new db migrate sub command</a> is added to enable administrators | to trigger migrations. |</td>
<td colspan="3">The <code>mattermost version</code> CLI command does not interact with the database anymore. Therefore the database version is not going to be | printed. Also, the database migrations are not going to be applied with the version sub command. | <a href={useBaseUrl('/administration-guide/manage/command-line-tools#mattermost-db-migrate')}>A new db migrate sub command</a> is added to enable administrators | to trigger migrations. |</td>
</tr>
<tr>
<td colspan="3">In v6.5.2, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href="/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header">here</a>. |</td>
<td colspan="3">In v6.5.2, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header')}>here</a>. |</td>
</tr>
<tr>
<td rowspan="2">v6.4</td>
@@ -1011,11 +1013,11 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>In v6.3.3, the default for <code>ThreadAutoFollow</code> has been changed to <code>false</code>. This does not affect existing configurations where this value is already set to <code>true</code>.</td>
</tr>
<tr>
<td colspan="3">In v6.3.9, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href="/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header">here</a>. |</td>
<td colspan="3">In v6.3.9, the value of <code>ServiceSettings.TrustedProxyIPHeader</code> defaults to empty from now on. A previous bug prevented this from happening in certain | conditions. Customers are requested to check for these values in their config and set them to nil if necessary. See more details | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#trusted-proxy-ip-header')}>here</a>. |</td>
</tr>
<tr>
<td rowspan="3">v6.2</td>
<td colspan="3">Channel results in the channel autocomplete will include private channels. Customers using <a href="/administration-guide/configure/bleve-search">Bleve</a> or | <a href="/administration-guide/scale/elasticsearch-setup">Elasticsearch</a> for autocomplete will have to reindex their data to get the new results. Since this can | take a long time, we suggest disabling autocomplete and running indexing in the background. When this is complete, re-enable autocomplete. | | .. note:: | Only channel members see private channel names in autocomplete results. |</td>
<td colspan="3">Channel results in the channel autocomplete will include private channels. Customers using <a href={useBaseUrl('/administration-guide/configure/bleve-search')}>Bleve</a> or | <a href={useBaseUrl('/administration-guide/scale/elasticsearch-setup')}>Elasticsearch</a> for autocomplete will have to reindex their data to get the new results. Since this can | take a long time, we suggest disabling autocomplete and running indexing in the background. When this is complete, re-enable autocomplete. | | .. note:: | Only channel members see private channel names in autocomplete results. |</td>
</tr>
<tr>
<td>In v6.2.3, the default for <code>ThreadAutoFollow</code> has been changed to <code>false</code>. This does not affect existing configurations where this value is already set to <code>true</code>.</td>
@@ -1047,16 +1049,16 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td><p>While trying to upgrade to a Mattermost version &gt;= 6.0.x, you might encounter the following error: <code>Failed to alter column type. It is likely you have invalid JSON values in the column. Please fix the values manually and run the migration again.</code></p><p>This means that the particular column has some invalid JSON values which need to be fixed manually. A common fix that is known to work is to wipe out all <code>\u0000</code> characters.</p><p>Please follow these steps:</p><ol type="1"><li>Check the affected values by: <code>SELECT COUNT(*) FROM &lt;table&gt; WHERE &lt;column&gt; LIKE '%\u0000%';</code></li><li>If you get a count more than 0, check those values manually, and confirm they are okay to be removed.</li><li>Remove them by <code>UPDATE &lt;table&gt; SET &lt;column&gt; = regexp_replace(&lt;column&gt;, '\\u0000', '', 'g') where &lt;column&gt; like '%\u0000%';</code></li></ol><p>Then try to start Mattermost again.</p></td>
</tr>
<tr>
<td colspan="3">Please see <a href="/product-overview/unsupported-legacy-releases">unsupported legacy releases</a> documentation for a list of deprecations in this release. |</td>
<td colspan="3">Please see <a href={useBaseUrl('/product-overview/unsupported-legacy-releases')}>unsupported legacy releases</a> documentation for a list of deprecations in this release. |</td>
</tr>
<tr>
<td>Focalboard plugin has been renamed to Mattermost Boards, and v0.9.1 (released with Mattermost v6.0) is now enabled by default.</td>
</tr>
<tr>
<td colspan="3">The advanced logging configuration schema changed. This is a breaking change relative to 5.x. See updated | <a href="/administration-guide/manage/logging">documentation</a>. |</td>
<td colspan="3">The advanced logging configuration schema changed. This is a breaking change relative to 5.x. See updated | <a href={useBaseUrl('/administration-guide/manage/logging')}>documentation</a>. |</td>
</tr>
<tr>
<td colspan="3">The existing theme names and colors, including "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" have been updated to the new "Denim", | "Quartz", "Indigo", and "Onyx" theme names and colors, respectively. Anyone using the existing themes will see slightly modified theme colors after their | server or workspace is upgraded. The theme variables for the existing "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" themes will still be | accessible in <a href="/end-user-guide/preferences/customize-your-theme">our documentation</a>. A custom theme can be created with these theme variables if desired. | Custom themes are unaffected by this change. |</td>
<td colspan="3">The existing theme names and colors, including "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" have been updated to the new "Denim", | "Quartz", "Indigo", and "Onyx" theme names and colors, respectively. Anyone using the existing themes will see slightly modified theme colors after their | server or workspace is upgraded. The theme variables for the existing "Mattermost", "Organization", "Mattermost Dark", and "Windows Dark" themes will still be | accessible in <a href={useBaseUrl('/end-user-guide/preferences/customize-your-theme')}>our documentation</a>. A custom theme can be created with these theme variables if desired. | Custom themes are unaffected by this change. |</td>
</tr>
<tr>
<td><p>Some breaking changes to plugins are included:</p><ul><li>Support for left-hand side-specific bot icons was dropped.</li><li>Removed a deprecated "Backend" field from the plugin manifest.</li><li>Converted the "Executables" field in the plugin manifest to a map.</li></ul></td>
@@ -1079,7 +1081,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>The <code>platform</code> binary and “--platform” flag have been removed. If you are using the “--platform” flag or are using the <code>platform</code> binary directly to run the Mattermost server application via a systemd file or custom script, you will be required to use only the mattermost binary.</td>
</tr>
<tr>
<td colspan="3"><a href="https://mattermost.com/blog/collapsed-reply-threads-beta/">Collapsed Reply Threads</a> are available as Beta in Mattermost Server | v5.37 and later. It’s expected that you may experience bugs as we stabilize the feature. In particular, please be aware of | <a href="/end-user-guide/collaborate/organize-conversations#known-issues">the known issues documented here</a>. |</td>
<td colspan="3"><a href="https://mattermost.com/blog/collapsed-reply-threads-beta/">Collapsed Reply Threads</a> are available as Beta in Mattermost Server | v5.37 and later. It’s expected that you may experience bugs as we stabilize the feature. In particular, please be aware of | <a href={useBaseUrl('/end-user-guide/collaborate/organize-conversations#known-issues')}>the known issues documented here</a>. |</td>
</tr>
<tr>
<td>v5.37 adds support for emoji standard v13.0. If you have added a custom emoji in the past that uses one of the new system names, then it is going to get overwritten by the system emoji. The workaround is to change the custom emoji name.</td>
@@ -1105,7 +1107,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>The existing password generation logic used during the bulk user import process was comparatively weak. Hence it's advised for admins to immediately reset the passwords for all the users who were generated during the bulk import process and whose password has not been changed even once.</td>
</tr>
<tr>
<td colspan="3">v5.35.0 introduces a new feature to search for files. Search results for files shared in the past may be incomplete until a | <a href="/administration-guide/manage/mmctl-command-line-tool#mmctl-extract">content extraction command</a> is executed to extract | and index the content of files already in the database. Instances running Elasticsearch or Bleve search backends will also need to execute a Bulk Indexing after | the content extraction is complete. Please see more details in <a href="https://mattermost.com/blog/file-search/">this blog post</a>. |</td>
<td colspan="3">v5.35.0 introduces a new feature to search for files. Search results for files shared in the past may be incomplete until a | <a href={useBaseUrl('/administration-guide/manage/mmctl-command-line-tool#mmctl-extract')}>content extraction command</a> is executed to extract | and index the content of files already in the database. Instances running Elasticsearch or Bleve search backends will also need to execute a Bulk Indexing after | the content extraction is complete. Please see more details in <a href="https://mattermost.com/blog/file-search/">this blog post</a>. |</td>
</tr>
<tr>
<td>v5.34.1</td>
@@ -1137,7 +1139,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
</tr>
<tr>
<td rowspan="2">v5.29.0</td>
<td colspan="3">A new configuration setting <code>ThreadAutoFollow</code> has been added to support Collapsed Reply Threads releasing in beta in Q1 2021. | This setting is enabled by default and may affect server performance. It is recommended to review our <a href="/deployment-guide/software-hardware-requirements#hardware-requirements">documentation on hardware requirements |</a> to ensure your servers are appropriately scaled for the size of your user base. |</td>
<td colspan="3">A new configuration setting <code>ThreadAutoFollow</code> has been added to support Collapsed Reply Threads releasing in beta in Q1 2021. | This setting is enabled by default and may affect server performance. It is recommended to review our <a href={useBaseUrl('/deployment-guide/software-hardware-requirements#hardware-requirements')}>documentation on hardware requirements |</a> to ensure your servers are appropriately scaled for the size of your user base. |</td>
</tr>
<tr>
<td>Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.</td>
@@ -1147,7 +1149,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td><p>Now when the service crashes, it will generate a coredump instead of just dumping the stack trace to the console. This allows us to preserve the full information of the crash to help with debugging it.</p><p>For more information about coredumps, please see: <a href="https://man7.org/linux/man-pages/man5/core.5.html">https://man7.org/linux/man-pages/man5/core.5.html</a>.</p></td>
</tr>
<tr>
<td colspan="3">In-product notices have been introduced to keep system admins and end users informed of the latest product enhancements available in new server and desktop | versions. <a href="/administration-guide/manage/in-product-notices">Learn more about in-product notices</a> and how to disable them in our documentation. |</td>
<td colspan="3">In-product notices have been introduced to keep system admins and end users informed of the latest product enhancements available in new server and desktop | versions. <a href={useBaseUrl('/administration-guide/manage/in-product-notices')}>Learn more about in-product notices</a> and how to disable them in our documentation. |</td>
</tr>
<tr>
<td>Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.</td>
@@ -1171,7 +1173,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
</tr>
<tr>
<td rowspan="2">v5.25.0</td>
<td colspan="3">Some incorrect instructions regarding SAML setup with Active Directory ADFS for setting the “Relying Party Trust Identifier” were corrected. Although the | settings will continue to work, it is encouraged that you | <a href="/administration-guide/onboard/sso-saml-adfs-msws2016#add-a-relying-party-trust">modify those settings</a>. |</td>
<td colspan="3">Some incorrect instructions regarding SAML setup with Active Directory ADFS for setting the “Relying Party Trust Identifier” were corrected. Although the | settings will continue to work, it is encouraged that you | <a href={useBaseUrl('/administration-guide/onboard/sso-saml-adfs-msws2016#add-a-relying-party-trust')}>modify those settings</a>. |</td>
</tr>
<tr>
<td>Disabled the xmlsec1-based SAML library in favor of the re-enabled and improved SAML library.</td>
@@ -1244,14 +1246,14 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>The <a href="https://github.com/mattermost/desktop/blob/master/CHANGELOG.md">Mattermost Desktop v4.3.0</a> release includes a change to how desktop notifications are sent sent from non-secure URLs <code>http://</code>. Organizations using non-secure Mattermost Servers <code>http://</code> will need to update to Mattermost Server versions 5.16.0+, 5.15.1, 5.14.4 or 5.9.5 (ESR) to continue receiving desktop notifications when using Mattermost Desktop v4.3.0 or later.</td>
</tr>
<tr>
<td colspan="3">When enabling <a href="/administration-guide/onboard/guest-accounts">Guest Accounts</a>, all users who have the ability to invite users will be able to | invite guests by default. System admins will need to remove this permission on each role via <strong>System Console &gt; Permissions Schemes</strong>. In Mattermost Server | version 5.17, the system admin will be the only role to automatically get the invite guest permission, however the fix will not be applicable in 5.16 due to | database migration processes. |</td>
<td colspan="3">When enabling <a href={useBaseUrl('/administration-guide/onboard/guest-accounts')}>Guest Accounts</a>, all users who have the ability to invite users will be able to | invite guests by default. System admins will need to remove this permission on each role via <strong>System Console &gt; Permissions Schemes</strong>. In Mattermost Server | version 5.17, the system admin will be the only role to automatically get the invite guest permission, however the fix will not be applicable in 5.16 due to | database migration processes. |</td>
</tr>
<tr>
<td rowspan="2">v5.14.0</td>
<td>Webhooks are now only displayed if the user is the creator of the webhook or a system administrator.</td>
</tr>
<tr>
<td colspan="3">With the update from Google+ to Google People, system admins need to ensure the <code>GoogleSettings.Scope</code> config.json setting is set to <code>profile email</code> and | <code>UserAPIEndpoint</code> setting should be set to <code>https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata</code> per | <a href="/administration-guide/onboard/sso-google">updated documentation</a>. |</td>
<td colspan="3">With the update from Google+ to Google People, system admins need to ensure the <code>GoogleSettings.Scope</code> config.json setting is set to <code>profile email</code> and | <code>UserAPIEndpoint</code> setting should be set to <code>https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata</code> per | <a href={useBaseUrl('/administration-guide/onboard/sso-google')}>updated documentation</a>. |</td>
</tr>
<tr>
<td rowspan="4">v5.12.0</td>
@@ -1272,18 +1274,18 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
</tr>
<tr>
<td>v5.10.0</td>
<td colspan="3"><code>SupportedTimezonesPath</code> setting in config.json and changes to timezones in the UI based on the <code>timezones.json</code> file was removed. This was made to support | <a href="/administration-guide/configure/configuration-in-your-database">storing configurations in the database</a>. |</td>
<td colspan="3"><code>SupportedTimezonesPath</code> setting in config.json and changes to timezones in the UI based on the <code>timezones.json</code> file was removed. This was made to support | <a href={useBaseUrl('/administration-guide/configure/configuration-in-your-database')}>storing configurations in the database</a>. |</td>
</tr>
<tr>
<td rowspan="2">v5.9.0</td>
<td colspan="3">If <code>DisableLegacyMfa</code> setting in <code>config.json</code> is set to <code>true</code> and | <a href="/administration-guide/onboard/multi-factor-authentication">multi-factor authentication</a> is enabled, ensure your users have upgraded to mobile app | version 1.17 or later. Otherwise, users who have MFA enabled may not be able to log in successfully. | | If the setting is not defined in the <code>config.json</code> file, the <code>DisableLegacyMfa</code> setting is set to <code>false</code> by default to ensure no breaking changes. | | We recommend setting <code>DisableLegacyMfa</code> to <code>true</code> for additional security hardening. |</td>
<td colspan="3">If <code>DisableLegacyMfa</code> setting in <code>config.json</code> is set to <code>true</code> and | <a href={useBaseUrl('/administration-guide/onboard/multi-factor-authentication')}>multi-factor authentication</a> is enabled, ensure your users have upgraded to mobile app | version 1.17 or later. Otherwise, users who have MFA enabled may not be able to log in successfully. | | If the setting is not defined in the <code>config.json</code> file, the <code>DisableLegacyMfa</code> setting is set to <code>false</code> by default to ensure no breaking changes. | | We recommend setting <code>DisableLegacyMfa</code> to <code>true</code> for additional security hardening. |</td>
</tr>
<tr>
<td colspan="3">The public IP of the Mattermost application server is considered a reserved IP for additional security hardening in the context of untrusted external requests | such as Open Graph metadata, webhooks, or slash commands. | <a href="/administration-guide/configure/environment-configuration-settings#allow-untrusted-internal-connections">See documentation</a> for additional information. |</td>
<td colspan="3">The public IP of the Mattermost application server is considered a reserved IP for additional security hardening in the context of untrusted external requests | such as Open Graph metadata, webhooks, or slash commands. | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#allow-untrusted-internal-connections')}>See documentation</a> for additional information. |</td>
</tr>
<tr>
<td>v5.8.0</td>
<td colspan="3">The local image proxy has been added, and images displayed within the client are now affected by the <code>AllowUntrustedInternalConnections</code> setting. | <a href="/deployment-guide/server/image-proxy#local-image-proxy">See documentation</a> for more details if you have trouble loading images. |</td>
<td colspan="3">The local image proxy has been added, and images displayed within the client are now affected by the <code>AllowUntrustedInternalConnections</code> setting. | <a href={useBaseUrl('/deployment-guide/server/image-proxy#local-image-proxy')}>See documentation</a> for more details if you have trouble loading images. |</td>
</tr>
<tr>
<td rowspan="2">v5.6.0</td>
@@ -1337,7 +1339,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td><p>This release includes support for post messages longer than the default of 4000 characters, but may require a manual database migration. This migration is entirely optional, and need only be done if you want to enable post messages up to 16383 characters. For many installations, no migration will be required, or the old limit remains sufficient.</p><p>To check your current post limit after upgrading to 5.0.0, look for a log message on startup:</p><p><code>[2018/03/27 09:08:00 EDT] [INFO] Post.Message supports at most 16383 characters (65535 bytes)</code></p><p>As of 5.0.0, the maximum post message size is 16383 (multi-byte) characters. If your logs show a number less than this limit and you want to enable longer post messages, you will need to manually migrate your database as described below. This migration can be slow for larger <code>Posts</code> tables, so it's best to schedule this upgrade during off-peak hours.</p><p>To migrate a MySQL database, connect to your database and run the following:</p><p><code>ALTER TABLE Posts MODIFY COLUMN Message TEXT;</code></p><p>To migrate a PostgreSQL database, connect to your database and run the following:</p><p><code>ALTER TABLE Posts ALTER COLUMN Message TYPE VARCHAR(65535);</code></p><p>Restart your Mattermost instances.</p></td>
</tr>
<tr>
<td colspan="3">Deployments on Enterprise E20 will need to enable <code>RunJobs</code> in the <code>config.json</code> and allow the permissions migration to complete before using <a href="/administration-guide/onboard/advanced-permissions">Team | Override Schemes</a>. |</td>
<td colspan="3">Deployments on Enterprise E20 will need to enable <code>RunJobs</code> in the <code>config.json</code> and allow the permissions migration to complete before using <a href={useBaseUrl('/administration-guide/onboard/advanced-permissions')}>Team | Override Schemes</a>. |</td>
</tr>
<tr>
<td rowspan="5">v4.10.0</td>
@@ -1366,11 +1368,11 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>The behavior of the <code>config.json</code> setting <code>PostEditTimeLimit</code> has been updated to accommodate the migration to a roles based permission system. When post editing is permitted, set <code>"PostEditTimeLimit": -1</code> to allow editing anytime, or set <code>"PostEditTimeLimit"</code> to a positive integer to restrict editing time in seconds. If post editing is disabled, this setting does not apply.</td>
</tr>
<tr>
<td colspan="3"><dl><dt>If using Let's Encrypt without a proxy server, the server will fail to start with an error message unless the <a href="/administration-guide/configure/environment-configuration-settings#forward-port-80-to-443">Forward80To443 |</a> <code>config.json</code> setting is set to <code>true</code>.</dt><dd><div class="line-block"></div></dd></dl><p>If forwarding port 80 to 443, the server will fail to start with an error message unless the <a href="/administration-guide/configure/environment-configuration-settings#web-server-listen-address">ListenAddress |</a> <code>config.json</code> setting is set to listen on port 443. |</p></td>
<td colspan="3"><dl><dt>If using Let's Encrypt without a proxy server, the server will fail to start with an error message unless the <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#forward-port-80-to-443')}>Forward80To443 |</a> <code>config.json</code> setting is set to <code>true</code>.</dt><dd><div class="line-block"></div></dd></dl><p>If forwarding port 80 to 443, the server will fail to start with an error message unless the <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#web-server-listen-address')}>ListenAddress |</a> <code>config.json</code> setting is set to listen on port 443. |</p></td>
</tr>
<tr>
<td>v4.6.2</td>
<td colspan="3">If using Let's Encrypt without a proxy server, forward port 80 through a firewall, with the <a href="/administration-guide/configure/environment-configuration-settings#forward-port-80-to-443">Forward80To443 |</a> <code>config.json</code> setting set to <code>true</code> to complete the Let's Encrypt certification. |</td>
<td colspan="3">If using Let's Encrypt without a proxy server, forward port 80 through a firewall, with the <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#forward-port-80-to-443')}>Forward80To443 |</a> <code>config.json</code> setting set to <code>true</code> to complete the Let's Encrypt certification. |</td>
</tr>
<tr>
<td rowspan="2">v4.4.0</td>
@@ -1384,7 +1386,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td>Mattermost now handles multiple content types for integrations, including plaintext content type. If your integration suddenly prints the JSON payload data instead of rendering the generated message, make sure your integration is returning the <code>application/json</code> content-type to retain previous behavior.</td>
</tr>
<tr>
<td colspan="3">By default, user-supplied URLs such as those used for Open Graph metadata, webhooks, or slash commands will no longer be allowed to connect to reserved IP | addresses including loopback or link-local addresses used for internal networks. | | This change may cause private integrations to break in testing environments, which may point to a URL such as <a href="http://127.0.0.1:1021/my-command">http://127.0.0.1:1021/my-command</a>. | | If you point private integrations to such URLs, you may whitelist such domains, IP addresses, or CIDR notations via the | <a href="/administration-guide/configure/environment-configuration-settings#allow-untrusted-internal-connections">Allowed Untrusted Internal Connections</a> | configuration setting in your local environment. Although not recommended, you may also whitelist the addresses in your production environments. See | <a href="/administration-guide/configure/environment-configuration-settings#allow-untrusted-internal-connections">documentation to learn more</a>. | | Push notification, OAuth 2.0 and WebRTC server URLs are trusted and not affected by this setting. |</td>
<td colspan="3">By default, user-supplied URLs such as those used for Open Graph metadata, webhooks, or slash commands will no longer be allowed to connect to reserved IP | addresses including loopback or link-local addresses used for internal networks. | | This change may cause private integrations to break in testing environments, which may point to a URL such as <a href="http://127.0.0.1:1021/my-command">http://127.0.0.1:1021/my-command</a>. | | If you point private integrations to such URLs, you may whitelist such domains, IP addresses, or CIDR notations via the | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#allow-untrusted-internal-connections')}>Allowed Untrusted Internal Connections</a> | configuration setting in your local environment. Although not recommended, you may also whitelist the addresses in your production environments. See | <a href={useBaseUrl('/administration-guide/configure/environment-configuration-settings#allow-untrusted-internal-connections')}>documentation to learn more</a>. | | Push notification, OAuth 2.0 and WebRTC server URLs are trusted and not affected by this setting. |</td>
</tr>
<tr>
<td>Uploaded file attachments are now grouped by day and stored in <code>/data/&lt;date-of-upload-as-YYYYMMDD&gt;/teams/...</code> of your file storage system.</td>
@@ -1408,7 +1410,7 @@ DELETE FROM threadmemberships WHERE (postid, userid) IN (
<td><p>You need to verify settings in the System Console due to a security-related change.</p><ol type="1"><li>Go to the the GENERAL section of the System Console</li><li>Click <strong>Logging</strong></li><li>Make sure that the <strong>File Log Directory</strong> field is either empty or has a directory path only. It must not have a filename as part of the path.</li></ol></td>
</tr>
<tr>
<td colspan="3">Backwards compatibility with the old CLI tool was removed. If you have any scripts that rely on the old CLI, they must be revised to use the | <a href="/administration-guide/manage/command-line-tools">new CLI</a>. |</td>
<td colspan="3">Backwards compatibility with the old CLI tool was removed. If you have any scripts that rely on the old CLI, they must be revised to use the | <a href={useBaseUrl('/administration-guide/manage/command-line-tools')}>new CLI</a>. |</td>
</tr>
<tr>
<td rowspan="2">v3.6.0</td>
@@ -1,6 +1,8 @@
---
title: "RTCD Setup and Configuration"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
<PlanAvailability slug="ent-plus" />
This guide provides detailed instructions for setting up, configuring, and validating a Mattermost Calls deployment using the dedicated RTCD service.
@@ -94,7 +96,7 @@ The following network connectivity is required:
<td>UDP (outgoing)</td>
<td>Mattermost Instance(s) (Calls plugin) or <code>rtcd</code> service</td>
<td>Configured STUN servers</td>
<td>(Optional) To allow for either Calls plugin or <code>rtcd</code> service to discover their instance public IP. Only needed if configuring STUN/TURN servers. This requirement does not apply when manually setting an IP or hostname through the <a href="/administration-guide/configure/plugins-configuration-settings#ice-host-override">ICE Host Override</a> config option.</td>
<td>(Optional) To allow for either Calls plugin or <code>rtcd</code> service to discover their instance public IP. Only needed if configuring STUN/TURN servers. This requirement does not apply when manually setting an IP or hostname through the <a href={useBaseUrl('/administration-guide/configure/plugins-configuration-settings#ice-host-override')}>ICE Host Override</a> config option.</td>
</tr>
</tbody>
</table>
@@ -1,6 +1,8 @@
---
title: "Software and hardware requirements"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
This guide outlines minimum software and hardware requirements for deploying Mattermost. Requirements may vary based on utilization and observing performance of pilot projects is recommended prior to scale out.
## Deployment overview
@@ -205,27 +207,27 @@ When a PostgreSQL version reaches its end of life (EOL), Mattermost will require
</thead>
<tbody>
<tr>
<td><a href="/product-overview/unsupported-legacy-releases#release-v9-11-extended-support-release">v9.11 ESR</a></td>
<td><a href={useBaseUrl('/product-overview/unsupported-legacy-releases#release-v9-11-extended-support-release')}>v9.11 ESR</a></td>
<td>2024-8-16</td>
<td>11.x</td>
</tr>
<tr>
<td><a href="/product-overview/mattermost-v10-changelog#release-v10-5-extended-support-release">v10.5 ESR</a></td>
<td><a href={useBaseUrl('/product-overview/mattermost-v10-changelog#release-v10-5-extended-support-release')}>v10.5 ESR</a></td>
<td>2025-2-14</td>
<td>11.x</td>
</tr>
<tr>
<td><a href="/product-overview/mattermost-v10-changelog#release-v10-6-feature-release">v10.6</a></td>
<td><a href={useBaseUrl('/product-overview/mattermost-v10-changelog#release-v10-6-feature-release')}>v10.6</a></td>
<td>2025-3-14</td>
<td>13.x</td>
</tr>
<tr>
<td><a href="/product-overview/mattermost-v10-changelog#release-v10-11-extended-support-release">v10.11 ESR</a></td>
<td><a href={useBaseUrl('/product-overview/mattermost-v10-changelog#release-v10-11-extended-support-release')}>v10.11 ESR</a></td>
<td>2025-8-15</td>
<td>13.x</td>
</tr>
<tr>
<td><a href="/product-overview/mattermost-v11-changelog#release-v11-7-extended-support-release">v11.7 ESR</a></td>
<td><a href={useBaseUrl('/product-overview/mattermost-v11-changelog#release-v11-7-extended-support-release')}>v11.7 ESR</a></td>
<td>2026-5-15</td>
<td>14.x (EOL 2026-11-12)</td>
</tr>
@@ -26,49 +26,49 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/collaborate/organize-conversations">Threaded discussions</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-conversations')}>Threaded discussions</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/format-messages#use-markdown">Format messages with Markdown</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/format-messages#use-markdown')}>Format messages with Markdown</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td>Partial Support</td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/react-with-emojis-gifs">Emojis</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/react-with-emojis-gifs')}>Emojis</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/react-with-emojis-gifs#quick-emoji-reactions">Emoji reactions</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/react-with-emojis-gifs#quick-emoji-reactions')}>Emoji reactions</a></td>
<td></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages">File sharing</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages')}>File sharing</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/mention-people">@mentions</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/mention-people')}>@mentions</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/search-for-messages#hashtags">Search hashtags</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/search-for-messages#hashtags')}>Search hashtags</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/search-for-messages#search-modifiers">Search modifiers</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/search-for-messages#search-modifiers')}>Search modifiers</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -80,31 +80,31 @@ The following tables highlight the end user features of Mattermost and their sup
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/save-pin-messages">Pin and save messages</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/save-pin-messages')}>Pin and save messages</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/share-files-in-messages#preview-file-attachments">Preview image links</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/share-files-in-messages#preview-file-attachments')}>Preview image links</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/configure/site-configuration-settings#enable-website-link-previews">Preview websites</a></td>
<td><a href={useBaseUrl('/administration-guide/configure/site-configuration-settings#enable-website-link-previews')}>Preview websites</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-notifications">Notifications</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-notifications')}>Notifications</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/manage-channel-bookmarks">Bookmark channels</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/manage-channel-bookmarks')}>Bookmark channels</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -131,55 +131,55 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/collaborate/create-channels">Create a new channel</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/create-channels')}>Create a new channel</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/join-leave-channels#join-a-channel">Join a channel</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/join-leave-channels#join-a-channel')}>Join a channel</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/join-leave-channels#leave-a-channel">Leave a channel</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/join-leave-channels#leave-a-channel')}>Leave a channel</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/favorite-channels">Favorite a channel</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/favorite-channels')}>Favorite a channel</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-channel-specific-notifications#mute-channels">Mute a channel</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-channel-specific-notifications#mute-channels')}>Mute a channel</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/manage-channel-members">Manage members</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/manage-channel-members')}>Manage members</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/manage-channel-members#add-members-to-a-channel">Add members</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/manage-channel-members#add-members-to-a-channel')}>Add members</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/rename-channels">Rename channels</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/rename-channels')}>Rename channels</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/configure/user-management-configuration-settings#deactivate-users">Deactivate members</a></td>
<td><a href={useBaseUrl('/administration-guide/configure/user-management-configuration-settings#deactivate-users')}>Deactivate members</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td></td>
@@ -206,61 +206,61 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-notifications">Multi-team support for notifications</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-notifications')}>Multi-team support for notifications</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/organize-using-teams">Team switching</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-using-teams')}>Team switching</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/customize-your-theme">Team-based theming</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/customize-your-theme')}>Team-based theming</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/team-settings">Team settings</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/team-settings')}>Team settings</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/organize-using-teams#join-a-team">Join existing team</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-using-teams#join-a-team')}>Join existing team</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/organize-using-teams#create-a-team">Create a new team</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-using-teams#create-a-team')}>Create a new team</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/invite-people">Share an invite link</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/invite-people')}>Share an invite link</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/invite-people">Invite people</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/invite-people')}>Invite people</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/manage/team-channel-members#teams">Manage team members</a></td>
<td><a href={useBaseUrl('/administration-guide/manage/team-channel-members#teams')}>Manage team members</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/organize-using-teams#leave-a-team">Leave team</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/organize-using-teams#leave-a-team')}>Leave team</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -287,7 +287,7 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/workflow-automation/work-with-playbooks">Collaborative playbooks</a></td>
<td><a href={useBaseUrl('/end-user-guide/workflow-automation/work-with-playbooks')}>Collaborative playbooks</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td></td>
@@ -314,31 +314,31 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/collaborate/make-calls#join-a-call">Join call</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/make-calls#join-a-call')}>Join call</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/make-calls#share-your-screen">Share screen</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/make-calls#share-your-screen')}>Share screen</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/make-calls#chat-in-a-call">Chat in thread</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/make-calls#chat-in-a-call')}>Chat in thread</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/make-calls#react-using-emojis">React with emoji</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/make-calls#react-using-emojis')}>React with emoji</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/collaborate/make-calls#record-a-call">Record a call</a></td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/make-calls#record-a-call')}>Record a call</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -365,13 +365,13 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/workflow-automation/interact-with-playbooks#slash-commands">Slash commands</a></td>
<td><a href={useBaseUrl('/end-user-guide/workflow-automation/interact-with-playbooks#slash-commands')}>Slash commands</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td>Partial Support</td>
</tr>
<tr>
<td><a href="/integrations-guide/popular-integrations">Server-side plugins</a></td>
<td><a href={useBaseUrl('/integrations-guide/popular-integrations')}>Server-side plugins</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -458,37 +458,37 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/access/access-your-workspace#email-address-or-username">Email password login</a></td>
<td><a href={useBaseUrl('/end-user-guide/access/access-your-workspace#email-address-or-username')}>Email password login</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/onboard/ad-ldap">AD/LDAP</a></td>
<td><a href={useBaseUrl('/administration-guide/onboard/ad-ldap')}>AD/LDAP</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/onboard/sso-saml">SAML SSO</a></td>
<td><a href={useBaseUrl('/administration-guide/onboard/sso-saml')}>SAML SSO</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/onboard/sso-gitlab">GitLab SSO</a></td>
<td><a href={useBaseUrl('/administration-guide/onboard/sso-gitlab')}>GitLab SSO</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/onboard/sso-entraid">Entra ID SSO</a></td>
<td><a href={useBaseUrl('/administration-guide/onboard/sso-entraid')}>Entra ID SSO</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/administration-guide/onboard/sso-google">Google SSO</a></td>
<td><a href={useBaseUrl('/administration-guide/onboard/sso-google')}>Google SSO</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -515,25 +515,25 @@ The following tables highlight the end user features of Mattermost and their sup
</thead>
<tbody>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-display-options#language">Localization for 30 languages</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-display-options#language')}>Localization for 30 languages</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/customize-your-theme">Custom user interface themes</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/customize-your-theme')}>Custom user interface themes</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-profile">User profile settings</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-profile')}>User profile settings</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
</tr>
<tr>
<td><a href="/end-user-guide/preferences/manage-your-channel-specific-notifications">Channel notification settings</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-channel-specific-notifications')}>Channel notification settings</a></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
<td><img src={useBaseUrl('/img/ui/checkmark.svg')} alt="Supported" className="theme-icon" /></td>
@@ -53,10 +53,10 @@ The message formatting toolbar offers the following formatting options:
</td>
</tr>
<tr>
<td colspan="2"><a href="/end-user-guide/collaborate/react-with-emojis-gifs">Add emojis or GIFs</a> <img src={useBaseUrl('/img/ui/emoticon-outline_F01F2.svg')} alt="Emoji" className="theme-icon" /></td>
<td colspan="2"><a href={useBaseUrl('/end-user-guide/collaborate/react-with-emojis-gifs')}>Add emojis or GIFs</a> <img src={useBaseUrl('/img/ui/emoticon-outline_F01F2.svg')} alt="Emoji" className="theme-icon" /></td>
</tr>
<tr>
<td colspan="2"><a href="/end-user-guide/collaborate/message-priority">Set message priority</a> <img src={useBaseUrl('/img/ui/alert-circle-outline_F05D6.svg')} alt="Message priority" className="theme-icon" /></td>
<td colspan="2"><a href={useBaseUrl('/end-user-guide/collaborate/message-priority')}>Set message priority</a> <img src={useBaseUrl('/img/ui/alert-circle-outline_F05D6.svg')} alt="Message priority" className="theme-icon" /></td>
</tr>
</tbody>
</table>
@@ -55,25 +55,25 @@ The table below lists the types of notifications you can expect to see and hear
<tr>
<td><p>Icon badge (dot)</p><p><img src={useBaseUrl('/images/dot-badge.png')} width="50" alt="A dot on the badge means you have unread activity in at least one channel you&#39;re a member of." /></p></td>
<td>You have unread activity in at least 1 channel you're a member of</td>
<td><a href="/end-user-guide/preferences/manage-your-web-notifications">Web</a>, <a href="/end-user-guide/preferences/manage-your-desktop-notifications">Desktop</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-web-notifications')}>Web</a>, <a href={useBaseUrl('/end-user-guide/preferences/manage-your-desktop-notifications')}>Desktop</a></td>
</tr>
<tr>
<td><p>Icon badge (number)</p><p><img src={useBaseUrl('/images/numbered-badge.png')} width="50" alt="A numbered badge means you have at least 1 unread message, @mention, or one of your keywords has triggered a notification." /></p></td>
<td rowspan="3">You have at least 1 unread message with an @mention, or a match to a keyword you're watching</td>
<td><a href="/end-user-guide/preferences/manage-your-web-notifications">Web</a> &amp; <a href="/end-user-guide/preferences/manage-your-desktop-notifications">Desktop</a> &amp; <a href="/end-user-guide/preferences/manage-your-mobile-notifications">Mobile</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-web-notifications')}>Web</a> &amp; <a href={useBaseUrl('/end-user-guide/preferences/manage-your-desktop-notifications')}>Desktop</a> &amp; <a href={useBaseUrl('/end-user-guide/preferences/manage-your-mobile-notifications')}>Mobile</a></td>
</tr>
<tr>
<td>Banner alert popups</td>
<td><a href="/end-user-guide/preferences/manage-your-web-notifications">Web</a> &amp; <a href="/end-user-guide/preferences/manage-your-desktop-notifications">Desktop</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-web-notifications')}>Web</a> &amp; <a href={useBaseUrl('/end-user-guide/preferences/manage-your-desktop-notifications')}>Desktop</a></td>
</tr>
<tr>
<td>Push notifications</td>
<td><a href="/end-user-guide/preferences/manage-your-mobile-notifications">Mobile</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-mobile-notifications')}>Mobile</a></td>
</tr>
<tr>
<td>Alert sounds</td>
<td>You have at least 1 unread message with an @mention, a match to a keyword you're watching, or replies to a thread you're following</td>
<td><a href="/end-user-guide/preferences/manage-your-web-notifications">Web</a>, <a href="/end-user-guide/preferences/manage-your-desktop-notifications">Desktop</a>, &amp; <a href="/end-user-guide/preferences/manage-your-mobile-notifications">Mobile</a></td>
<td><a href={useBaseUrl('/end-user-guide/preferences/manage-your-web-notifications')}>Web</a>, <a href={useBaseUrl('/end-user-guide/preferences/manage-your-desktop-notifications')}>Desktop</a>, &amp; <a href={useBaseUrl('/end-user-guide/preferences/manage-your-mobile-notifications')}>Mobile</a></td>
</tr>
</tbody>
</table>
@@ -1,6 +1,8 @@
---
title: "Manage your Mattermost profile"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
<PlanAvailability slug="all-commercial" />
Select your profile picture and select **Profile** to manage the details of your Mattermost profile, including your name, username, nickname, email, and profile picture.
@@ -31,7 +33,7 @@ Your system admin may also manage profile fields for accounts that sign in with
</tr>
<tr>
<td>Nickname</td>
<td>(Optional) Nicknames appear in the direct messages member list and team management modal. Your nickname can be up to 64 characters long.<br/><br/>You won't be notified when someone types your nickname unless you add your nickname to the list of <strong>Keywords that Trigger Notifications</strong> as a <a href="/end-user-guide/preferences/manage-your-mentions-keywords-notifications#customize-notification-keywords">notification preference</a>.<br/><br/>From Mattermost v10.8, nicknames display in <a href="/end-user-guide/collaborate/organize-conversations">threaded discussions</a> when available.</td>
<td>(Optional) Nicknames appear in the direct messages member list and team management modal. Your nickname can be up to 64 characters long.<br/><br/>You won't be notified when someone types your nickname unless you add your nickname to the list of <strong>Keywords that Trigger Notifications</strong> as a <a href={useBaseUrl('/end-user-guide/preferences/manage-your-mentions-keywords-notifications#customize-notification-keywords')}>notification preference</a>.<br/><br/>From Mattermost v10.8, nicknames display in <a href={useBaseUrl('/end-user-guide/collaborate/organize-conversations')}>threaded discussions</a> when available.</td>
</tr>
<tr>
<td>Position</td>
@@ -25,11 +25,11 @@ Select your profile picture, select **Profile**, and then select **Security** to
</tr>
<tr>
<td>Multi-factor authentication (MFA)</td>
<td><p>If your system admin has enabled <a href="/administration-guide/configure/authentication-configuration-settings#enable-multi-factor-authentication">multi-factor authentication</a> (MFA), you can require a passcode in addition to your password to log-in to your Mattermost account.</p><p>You'll need to download a MFA passcode generation app, such as Google Authenticator or a similar app, and then set-up MFA in your Mattermost account.</p><p><strong>Download a passcode generation app</strong></p><ul><li>Download Google Authenticator for an Apple device from <a href="https://apps.apple.com/us/app/google-authenticator/id388497605">iTunes</a></li><li>Download Google Authenticator for an Android device from <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Google Play</a></li></ul><p><strong>Enable MFA in Mattermost</strong></p><ol><li>Open Mattermost in a web browser or the desktop app.</li><li>In Mattermost, from your profile picture, select <strong>Profile &gt; Security</strong>.</li><li>Under <strong>Multi-factor Authentication</strong>, select <strong>Edit</strong>.<p><img src={useBaseUrl('/images/multi-factor-authentication.png')} alt="Enable multi-factor authentication through your Mattermost user profile." /></p></li><li>Select <strong>Add MFA to Account</strong>.<p><img src={useBaseUrl('/images/add-mfa-to-account.png')} alt="Add multi-factor authentication to your Mattermost user profile." /></p></li><li>Scan the QR code or enter the <strong>Secret</strong> provided by Mattermost into the authenticator app.</li><li>In Mattermost, enter the <strong>MFA Code</strong> generated by the authenticator app.</li><li>Select <strong>Save</strong>.</li></ol></td>
<td><p>If your system admin has enabled <a href={useBaseUrl('/administration-guide/configure/authentication-configuration-settings#enable-multi-factor-authentication')}>multi-factor authentication</a> (MFA), you can require a passcode in addition to your password to log-in to your Mattermost account.</p><p>You'll need to download a MFA passcode generation app, such as Google Authenticator or a similar app, and then set-up MFA in your Mattermost account.</p><p><strong>Download a passcode generation app</strong></p><ul><li>Download Google Authenticator for an Apple device from <a href="https://apps.apple.com/us/app/google-authenticator/id388497605">iTunes</a></li><li>Download Google Authenticator for an Android device from <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Google Play</a></li></ul><p><strong>Enable MFA in Mattermost</strong></p><ol><li>Open Mattermost in a web browser or the desktop app.</li><li>In Mattermost, from your profile picture, select <strong>Profile &gt; Security</strong>.</li><li>Under <strong>Multi-factor Authentication</strong>, select <strong>Edit</strong>.<p><img src={useBaseUrl('/images/multi-factor-authentication.png')} alt="Enable multi-factor authentication through your Mattermost user profile." /></p></li><li>Select <strong>Add MFA to Account</strong>.<p><img src={useBaseUrl('/images/add-mfa-to-account.png')} alt="Add multi-factor authentication to your Mattermost user profile." /></p></li><li>Scan the QR code or enter the <strong>Secret</strong> provided by Mattermost into the authenticator app.</li><li>In Mattermost, enter the <strong>MFA Code</strong> generated by the authenticator app.</li><li>Select <strong>Save</strong>.</li></ol></td>
</tr>
<tr>
<td>Sign-in method</td>
<td><p>This option allows you to switch your login method between using email/username and password and <a href="/end-user-guide/access/access-your-workspace#single-sign-on-sso">single sign-on credentials</a>.</p><p>You can configure this setting using Mattermost in a web browser or using the desktop app.</p><Note><p>While you can choose to log in with either set of credentials, you can only enable one login method at a time. For example, if AD/LDAP single sign-on is enabled, you can select <strong>Switch to using AD/LDAP</strong>, and enter your AD/LDAP credentials to switch login over to AD/LDAP. You'll need to enter the password for your email account to verify your existing credentials. Following the change, you'll receive an email to confirm the action.</p></Note></td>
<td><p>This option allows you to switch your login method between using email/username and password and <a href={useBaseUrl('/end-user-guide/access/access-your-workspace#single-sign-on-sso')}>single sign-on credentials</a>.</p><p>You can configure this setting using Mattermost in a web browser or using the desktop app.</p><Note><p>While you can choose to log in with either set of credentials, you can only enable one login method at a time. For example, if AD/LDAP single sign-on is enabled, you can select <strong>Switch to using AD/LDAP</strong>, and enter your AD/LDAP credentials to switch login over to AD/LDAP. You'll need to enter the password for your email account to verify your existing credentials. Following the change, you'll receive an email to confirm the action.</p></Note></td>
</tr>
<tr>
<td>View access history</td>
@@ -98,7 +98,7 @@ The JSON payload can contain the following parameters:
<tr>
<td><code>text</code></td>
<td>Yes (if <code>props.mm_blocks</code> is not set)</td>
<td><a href="/end-user-guide/collaborate/format-messages">Markdown-formatted</a> message. Use <code>@&lt;username&gt;</code>, <code>@channel</code>, and <code>@here</code> for notifications.</td>
<td><a href={useBaseUrl('/end-user-guide/collaborate/format-messages')}>Markdown-formatted</a> message. Use <code>@&lt;username&gt;</code>, <code>@channel</code>, and <code>@here</code> for notifications.</td>
</tr>
<tr>
<td><code>channel</code></td>
@@ -108,17 +108,17 @@ The JSON payload can contain the following parameters:
<tr>
<td><code>username</code></td>
<td>No</td>
<td>Overrides the default username. The <a href="/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-usernames">Enable integrations to override usernames</a> setting must be enabled.</td>
<td>Overrides the default username. The <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-usernames')}>Enable integrations to override usernames</a> setting must be enabled.</td>
</tr>
<tr>
<td><code>icon_url</code></td>
<td>No</td>
<td>Overrides the default profile picture URL. The <a href="/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-profile-picture-icons">Enable integrations to override profile picture icons</a> setting must be enabled.</td>
<td>Overrides the default profile picture URL. The <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-profile-picture-icons')}>Enable integrations to override profile picture icons</a> setting must be enabled.</td>
</tr>
<tr>
<td><code>icon_emoji</code></td>
<td>No</td>
<td>Overrides the <code>icon_url</code> with an emoji. Use the emoji name (e.g., <code>:tada:</code>). The <a href="/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-profile-picture-icons">Enable integrations to override profile picture icons</a> setting must be enabled.</td>
<td>Overrides the <code>icon_url</code> with an emoji. Use the emoji name (e.g., <code>:tada:</code>). The <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-profile-picture-icons')}>Enable integrations to override profile picture icons</a> setting must be enabled.</td>
</tr>
<tr>
<td><code>type</code></td>
@@ -22,7 +22,7 @@ Mattermost provides a variety of methods to integrate with your favorite tools,
</thead>
<tbody>
<tr>
<td><a href="/integrations-guide/faq#no-code">No-code</a></td>
<td><a href={useBaseUrl('/integrations-guide/faq#no-code')}>No-code</a></td>
<td><ul>
<li><a href="#pre-built-plugins">Pre-built plugins</a></li>
<li><a href="#built-in-slash-commands">Built-in slash commands</a></li>
@@ -37,7 +37,7 @@ Mattermost provides a variety of methods to integrate with your favorite tools,
</ul></td>
</tr>
<tr>
<td><a href="/integrations-guide/faq#low-code">Low-code</a></td>
<td><a href={useBaseUrl('/integrations-guide/faq#low-code')}>Low-code</a></td>
<td><ul>
<li><a href="#webhooks">Webhooks</a></li>
<li><a href="#custom-slash-commands">Custom slash commands</a></li>
@@ -48,7 +48,7 @@ Mattermost provides a variety of methods to integrate with your favorite tools,
</ul></td>
</tr>
<tr>
<td><a href="/integrations-guide/faq#pro-code">Pro-code</a></td>
<td><a href={useBaseUrl('/integrations-guide/faq#pro-code')}>Pro-code</a></td>
<td><ul>
<li><a href="#restful-api">REST API</a></li>
<li><a href="#custom-built-plugins">Custom plugins</a></li>
@@ -168,7 +168,7 @@ The JSON response can contain the following parameters:
<tbody>
<tr>
<td><code>text</code></td>
<td>(Required unless <code>attachments</code> or <code>props.mm_blocks</code> is set) <a href="/end-user-guide/collaborate/format-messages">Markdown-formatted</a> message.</td>
<td>(Required unless <code>attachments</code> or <code>props.mm_blocks</code> is set) <a href={useBaseUrl('/end-user-guide/collaborate/format-messages')}>Markdown-formatted</a> message.</td>
</tr>
<tr>
<td><code>response_type</code></td>
@@ -176,11 +176,11 @@ The JSON response can contain the following parameters:
</tr>
<tr>
<td><code>username</code></td>
<td>Overrides the default username. Requires <a href="/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-usernames">Enable integrations to override usernames</a> to be enabled.</td>
<td>Overrides the default username. Requires <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-usernames')}>Enable integrations to override usernames</a> to be enabled.</td>
</tr>
<tr>
<td><code>icon_url</code></td>
<td>Overrides the default profile picture. Requires <a href="/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-profile-picture-icons">Enable integrations to override profile picture icons</a> to be enabled.</td>
<td>Overrides the default profile picture. Requires <a href={useBaseUrl('/administration-guide/configure/integrations-configuration-settings#enable-integrations-to-override-profile-picture-icons')}>Enable integrations to override profile picture icons</a> to be enabled.</td>
</tr>
<tr>
<td><code>attachments</code></td>
+3 -1
View File
@@ -1,6 +1,8 @@
---
title: "Business & Licensing"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
## What are Mattermost's policies around licensing, terms of use, and privacy?
The following outlines the licensing, terms of use and privacy policies across Mattermost software and services. See the [source available license](/product-overview/faq-mattermost-source-available-license) documentation to learn what the Mattermost source available license offers.
@@ -25,7 +27,7 @@ The following outlines the licensing, terms of use and privacy policies across M
<tbody>
<tr>
<td>Mattermost Team Edition (Open Source)</td>
<td>Open Source <strong>MIT License</strong>.<br/>Open Source Add-ons available under <a href="/product-overview/subscription">Apache v2 and other licenses</a>.</td>
<td>Open Source <strong>MIT License</strong>.<br/>Open Source Add-ons available under <a href={useBaseUrl('/product-overview/subscription')}>Apache v2 and other licenses</a>.</td>
<td><a href="https://mattermost.com/trademark-standards-of-use/">Mattermost Trademark Policy</a><br/><a href="https://mattermost.com/terms-of-use/">Mattermost Terms of Use</a></td>
<td rowspan="3"><a href="https://mattermost.com/privacy-policy/">Mattermost Server Privacy Policy</a> with <a href="https://mattermost.com/data-processing-addendum/">GDPR Data Processing Addendum</a>.</td>
</tr>
+1 -1
View File
@@ -370,7 +370,7 @@ See a [complete list of features](https://mattermost.com/pricing) on the Matterm
<Note>
Mattermost Enterprise Advanced requires a Mattermost Server running v10.9 or later and a <a href="/deployment-guide/server/prepare-database">PostgreSQL database</a>. Enterprise plugins must be updated to support the new license (most of which are pre-packaged from v10.9).
Mattermost Enterprise Advanced requires a Mattermost Server running v10.9 or later and a <a href={useBaseUrl('/deployment-guide/server/prepare-database')}>PostgreSQL database</a>. Enterprise plugins must be updated to support the new license (most of which are pre-packaged from v10.9).
</Note>
+4 -2
View File
@@ -1,6 +1,8 @@
---
title: "Subscription Overview"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
Mattermost offers the following types of paid subscriptions:
- [Self-hosted subscriptions](/product-overview/self-hosted-subscriptions) for secure enterprise collaboration with full control over your data.
@@ -117,7 +119,7 @@ The affected features include, but are not limited to, the following:
<td><p>Groups in the database are retained but cannot be used. Memberships are frozen in state for group synced teams/channels.</p>
<p>Mentions for AD/LDAP groups are not shown in the autocomplete menu.</p>
<p>Group mentions are no longer highlighted in text and do not trigger new notifications.</p></td>
<td>Use <a href="/administration-guide/manage/mmctl-command-line-tool#mmctl-group">mmctl</a> to modify group sync settings for the team/channel.</td>
<td>Use <a href={useBaseUrl('/administration-guide/manage/mmctl-command-line-tool#mmctl-group')}>mmctl</a> to modify group sync settings for the team/channel.</td>
</tr>
<tr>
<td>High availability</td>
@@ -157,7 +159,7 @@ The affected features include, but are not limited to, the following:
<tr>
<td>Permissions</td>
<td>Permissions are retained in the database in a frozen state and cannot be modified in the System Console.</td>
<td>Use <a href="/administration-guide/manage/mmctl-command-line-tool#mmctl-permissions">mmctl</a> to reset permissions to default.</td>
<td>Use <a href={useBaseUrl('/administration-guide/manage/mmctl-command-line-tool#mmctl-permissions')}>mmctl</a> to reset permissions to default.</td>
</tr>
<tr>
<td>Guest accounts</td>
+2 -1
View File
@@ -16,8 +16,9 @@
"build:plugin-jsdocs": "node scripts/gen-plugin-jsdocs.mjs",
"build:plugin-manifest-docs": "mkdir -p data && go run -C scripts/gen-plugin-manifest-docs . > data/plugin-manifest-docs.json.tmp && mv data/plugin-manifest-docs.json.tmp data/plugin-manifest-docs.json",
"build:plugin-docs": "npm run build:plugin-godocs && npm run build:plugin-jsdocs && npm run build:plugin-manifest-docs",
"check:base-url-attrs": "node scripts/check-base-url-attrs.mjs",
"prestart": "npm run stage:agents-docs && npm run build:sidebars && ( [ -f openapi/mattermost-openapi-v4.yaml ] || npm run build:openapi:spec ) && npm run build:openapi:docs && npm run build:plugin-docs",
"prebuild": "npm run stage:agents-docs && npm run build:sidebars && npm run build:openapi && npm run build:plugin-docs",
"prebuild": "npm run check:base-url-attrs && npm run stage:agents-docs && npm run build:sidebars && npm run build:openapi && npm run build:plugin-docs",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
+137
View File
@@ -0,0 +1,137 @@
#!/usr/bin/env node
// Fail the build when MDX content hard-codes a site-absolute URL in a raw
// HTML/JSX attribute (`href="/..."`, `href={"/..."}`, `src=...`).
//
// Docusaurus prepends `baseUrl` to markdown-syntax links (`[text](/path)`) but
// never to attributes written as raw markup, so those values ship verbatim.
// That is correct only while `baseUrl` is `/` (docs.mattermost.com), which
// makes the bug invisible there. Under the offline bundle (`BASE_URL=/documentation/`)
// the same values resolve against the server root instead: links silently
// navigate the reader out of the docs into the Mattermost webapp rather than
// 404ing, so reviewers cannot be relied on to spot a regression.
//
// The fix is always `useBaseUrl()`, which matches how images in this content
// already resolve their paths and keeps full-page-load navigation.
//
// Generated/vendored trees are skipped: a failure there is not actionable from
// a docs PR in this repo.
import {readdirSync, readFileSync} from 'node:fs';
import {dirname, join, relative, resolve} from 'node:path';
import {fileURLToPath} from 'node:url';
const HERE = dirname(fileURLToPath(import.meta.url));
const DOCS_ROOT = resolve(HERE, '..', '..');
// Content roots registered as Docusaurus plugin-content-docs `path` values.
const CONTENT_ROOTS = ['main', 'develop', 'api'];
// Written by scripts/stage-agents-docs.mjs and `docusaurus gen-api-docs`.
const SKIP_DIRS = new Set([
join(DOCS_ROOT, 'main', 'agents', 'docs'),
join(DOCS_ROOT, 'api', 'reference'),
]);
const CONTENT_EXT = /\.mdx?$/;
const ATTR_QUOTED = /\b(href|src)="(\/[^"]*)"/g;
const ATTR_JSX = /\b(href|src)=\{(["'])(\/.*?)\2\}/g;
// CommonMark: close only with same char, ≥ open length, trailing whitespace only.
const OPEN_FENCE = /^(\s*)(`{3,}|~{3,})/;
const INLINE_CODE = /`[^`]*`/g;
function closingFence(line, char, length) {
const match = line.match(/^(\s*)([`~]+)\s*$/);
if (!match) {
return false;
}
const marker = match[2];
return marker[0] === char && marker.length >= length;
}
function* walk(dir) {
for (const entry of readdirSync(dir, {withFileTypes: true})) {
const full = join(dir, entry.name);
if (entry.isDirectory()) {
if (entry.name === 'node_modules' || SKIP_DIRS.has(full)) {
continue;
}
yield* walk(full);
} else if (entry.isFile() && CONTENT_EXT.test(entry.name)) {
yield full;
}
}
}
const violations = [];
let scanned = 0;
for (const root of CONTENT_ROOTS) {
for (const file of walk(join(DOCS_ROOT, root))) {
scanned++;
let fence = null;
readFileSync(file, 'utf8')
.split('\n')
.forEach((rawLine, index) => {
if (fence) {
if (closingFence(rawLine, fence.char, fence.length)) {
fence = null;
}
return;
}
const open = rawLine.match(OPEN_FENCE);
if (open) {
const marker = open[2];
fence = {char: marker[0], length: marker.length};
return;
}
// Prose may legitimately show the bad form as an example.
const line = rawLine.replace(INLINE_CODE, '');
const matches = [
...line.matchAll(ATTR_QUOTED),
...line.matchAll(ATTR_JSX),
];
for (const match of matches) {
const attr = match[1];
const url = match[match.length - 1];
// `//host/path` is protocol-relative, i.e. not site-local.
if (url.startsWith('//')) {
continue;
}
violations.push({
file: relative(DOCS_ROOT, file),
line: index + 1,
attr,
url,
});
}
});
}
}
if (violations.length > 0) {
console.error(
`[check-base-url-attrs] ${violations.length} site-absolute URL attribute(s) ` +
`in raw markup across ${scanned} content files.\n\n` +
'Docusaurus does not apply baseUrl to raw HTML/JSX attributes, so these break ' +
'the offline /documentation/ build (silently, by navigating out of the docs).\n' +
'Wrap each value in useBaseUrl():\n',
);
for (const {file, line, attr, url} of violations) {
console.error(` ${file}:${line}`);
console.error(` found: ${attr}="${url}"`);
console.error(` expected: ${attr}={useBaseUrl('${url}')}`);
}
console.error(
"\nAdd `import useBaseUrl from '@docusaurus/useBaseUrl';` directly below the " +
'frontmatter in any file that does not already import it.',
);
process.exit(1);
}
console.log(`[check-base-url-attrs] ok: ${scanned} content files, 0 violations`);