Files
upstream-mattermost/docs/main/administration-guide/configure/experimental-configuration-settings.mdx
upstream-mirror 240db4e2a7
Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
snapshot of https://github.com/mattermost/mattermost.git (master, 2026-09-16; blobs > 131072B omitted)
2026-09-16 00:29:55 +05:00

1213 lines
48 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Experimental configuration settings"
---
import useBaseUrl from '@docusaurus/useBaseUrl';
<PlanAvailability slug="all-commercial" />
Review and manage the following [experimental](/administration-guide/manage/feature-labels#experimental) configuration options in the System Console by selecting the **Product** <img src={useBaseUrl('/img/ui/products_E82F.svg')} alt="Navigate between Channels, collaborative playbooks, and boards using the product menu icon." className="theme-icon" /> menu, selecting **System Console**, and then selecting **Experimental \> Features**:
- [Experimental System Console configuration settings](#experimental-system-console-configuration-settings)
- [Experimental job configuration settings](#experimental-job-configuration-settings)
- [Experimental configuration settings for self-hosted deployments only](#experimental-configuration-settings-for-self-hosted-deployments-only)
<Tip>
System admins managing a self-hosted Mattermost deployment can edit the `config.json` file as described in the following tables. Each configuration value below includes a JSON path to access the value programmatically in the `config.json` file using a JSON-aware tool. For example, the `LinkMetadataTimeoutMilliseconds` value is under `ExperimentalSettings`.
- If using a tool such as [jq](https://stedolan.github.io/jq/), you'd enter: `cat config/config.json | jq '.ExperimentalSettings.LinkMetadataTimeoutMilliseconds'`
- When working with the `config.json` file manually, look for an object such as `ExperimentalSettings`, then within that object, find the key `LinkMetadataTimeoutMilliseconds`.
</Tip>
------------------------------------------------------------------------------------------------------------------------
## Experimental System Console configuration settings
### Change authentication method
**True**: Users can change their sign-in method to any that is enabled on the server, either via their Profile or the APIs.
**False**: Users cannot change their sign-in method, regardless of which authentication options are enabled.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalEnableAuthenticationTransfer": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Link metadata timeout
Adds a configurable timeout for requests made to return link metadata. If the metadata is not returned before this timeout expires, the message will post without requiring metadata. This timeout covers the failure cases of broken URLs and bad content types on slow network connections.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"LinkMetadataTimeoutMilliseconds</code>: 5000`` with numerical input.</td>
</tr>
</tbody>
</table>
### Enable automatic replies
**True**: Users can enable Automatic Replies in **Settings \> Notifications**. Users set a custom message that will be automatically sent in response to Direct Messages.
**False**: Disables the Automatic Direct Message Replies feature and hides it from **Settings**.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalEnableAutomaticReplies": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Enable default channel leave/join system messages
This setting determines whether team leave/join system messages are posted in the default `town-square` channel.
**True**: Enables leave/join system messages in the default `town-square` channel.
**False**: Disables leave/join messages from the default `town-square` channel. These system messages won't be added to the database either.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalEnableDefaultChannelLeaveJoinMessages": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Enable Mobile Watermark
Available on [Enterprise Advanced](https://mattermost.com/pricing/) from Mattermost v11.7 onward.
**True**: Authenticated Mattermost mobile sessions display a watermark overlay showing the user's username, the server domain, the current date (YYYY-MM-DD), and the current time (HH:mm). This experimental capability is intended to support data loss prevention (DLP) workflows by helping identify the user, server, and time associated with mobile screenshots or shared screen captures.
**False**: No watermark overlay is displayed in the Mattermost mobile app.
<Note>
- This is an experimental setting. Behavior, defaults, and visual presentation may change in future releases.
- This setting only applies to the Mattermost mobile app. It does not add a watermark to the Mattermost web app or desktop apps.
- The watermark overlay is a visual aid and does not, by itself, prevent screenshots, screen recordings, file exports, or other forms of data extraction. Use it in combination with other mobile security controls, such as [screenshot and screen recording prevention](/deployment-guide/mobile/mobile-security-features#screenshot-and-screen-recording-prevention), where appropriate.
</Note>
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalSettings.EnableWatermark": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### User's status and profile fetching poll interval
This setting configures the number of milliseconds to wait between fetching user statuses and profiles periodically. Set to `0` to disable.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalSettings.UsersStatusAndProfileFetchingPollIntervalMilliseconds": 3000</code> with numerical input.</td>
</tr>
</tbody>
</table>
<Note>
Decrease this configuration setting value to increase how often Mattermost checks for and retrieves updated user profile datails. Reducing this value can be particularly helpful to reduce the likelyhood of usernames being displayed in channels as **Someone** due to outdated or missing data.
</Note>
### Primary team
The primary team of which users on the server are members. When a primary team is set, the options to join other teams or leave the primary team are disabled.
If the team URL of the primary team is `https://example.mattermost.com/myteam/`, then set the value to `myteam` in `config.json`.
<table style={{width: '95%'}}>
<colgroup>
<col style={{width: '95%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalPrimaryTeam": ""</code> with string input.</td>
</tr>
</tbody>
</table>
### Disable data refetching on browser refocus
This setting disables re-fetching of channel and channel members on browser focus.
**True**: Mattermost won't refetch channels and channel members when the browser regains focus. This may result in improved performance for users with many channels and channel members.
**False**: (Default) Mattermost will refetch channels and channel members when the browser regains focus.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalSettings.DisableRefetchingOnBrowserFocus": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Disable wake up reconnect handler
This setting disables attempts to detect when the computer has woken up and refetch data.
**True**: Mattermost won't attempt to detect when the computer has woken up and refetch data. This might reduce the amount of regular network traffic the app is sending.
**False**: (**Default**) Mattermost attempts to detect when the computer has woken up and refreshes data.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalSettings.DisableWakeUpReconnectHandler": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Delay channel autocomplete
This setting controls whether or not the channel link autocomplete triggers immediately when after a tilde is typed when composing a message. This setting makes the channel autocomplete, such as `~town-square`, less obtrusive for people who use tildes `~` as punctuation.
**True**: The autocomplete appears after the user types a tilde followed by two or more characters. For example, typing `~to` will show the autocomplete, but typing `~` will not.
**False**: **(Default)** The autocomplete appears immediately after the user types a tilde. For example, typing `~` will show the autocomplete.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalSettings.DelayChannelAutocomplete": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### YouTube referrer policy
This setting resolves issues where YouTube video previews display as unavailable.
**True**: The referrer policy for embedded YouTube videos is set to `strict-origin-when-cross-origin`.
**False**: (Default) The referrer policy is set to `no-referrer` which enhances user privacy by not disclosing the source URL, but limits the ability to track user engagement and traffic sources in analytics tools.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalSettings.YoutubeReferrerPolicy": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
------------------------------------------------------------------------------------------------------------------------
## Experimental Bleve configuration settings
<PlanAvailability slug="all-commercial" />
<Important>
**From Mattermost v11, Bleve search has been deprecated.** These configuration settings are only available for Mattermost versions prior to v11.0. For v11.0 and later, [Elasticsearch](/deployment-guide/scale/elasticsearch-setup) or [OpenSearch](/deployment-guide/scale/opensearch-setup) for [enterprise search](/deployment-guide/scale/enterprise-search) capabilities.
</Important>
Access the following configuration settings in the System Console by going to **Experimental \> Bleve**, or by editing the `config.json` file as described in the following tables:
### Enable Bleve indexing
**True**: The indexing of new posts occurs automatically. Search queries will not use bleve search until [Enable Bleve for search queries](/administration-guide/configure/experimental-configuration-settings#enable-bleve-for-search-queries) is enabled.
**False**: The indexing of new posts does not occur automatically.
<table style={{width: '91%'}}>
<colgroup>
<col style={{width: '90%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableIndexing": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Index directory
Directory path to use for storing bleve indexes.
<Tip>
The bleve index directory path isn't required to exist within the `mattermost` directory. When it exists outside of the `mattermost` directory, no additional steps are needed to preserve or reindex these files as part of a Mattermost upgrade. See our [Upgrading Mattermost Server](/administration-guide/upgrade/upgrading-mattermost-server) documentation for details.
</Tip>
<table style={{width: '90%'}}>
<colgroup>
<col style={{width: '90%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"IndexDir": ""</code> with string input.</td>
</tr>
</tbody>
</table>
### Bulk index now
Select **Index Now** to index all users, channels, and posts in the database from oldest to newest. Bleve is available during indexing, but search results may be incomplete until the indexing job is complete.
### Purge indexes
Select **Purge Index** to remove the contents of the Bleve index directory. Search results may be incomplete until a bulk index of the existing database is rebuilt.
### Enable Bleve for search queries
**True**: Search queries will use bleve search.
**False**: Search queries will not use bleve search.
<table style={{width: '92%'}}>
<colgroup>
<col style={{width: '92%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableSearching": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Enable Bleve for autocomplete queries
**True**: Autocomplete queries will use bleve search.
**False**: Autocomplete queries will not use bleve search.
<table style={{width: '95%'}}>
<colgroup>
<col style={{width: '95%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableAutocomplete": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
------------------------------------------------------------------------------------------------------------------------
## Experimental configuration settings for self-hosted deployments only
Access the following self-hosted configuration settings by editing the `config.json` file as described in the following tables. These configuration settings are not accessible through the System Console.
<Tip>
Each configuration value below includes a JSON path to access the value programmatically in the `config.json` file using a JSON-aware tool. For example, the `SiteURL` value is under `ServiceSettings`.
- If using a tool such as [jq](https://stedolan.github.io/jq/), you'd enter: `cat config/config.json | jq '.ServiceSettings.SiteURL'`
- When working with the `config.json` file manually, look for the key `ServiceSettings`, then within that object, find the key `SiteURL`.
</Tip>
### File Location
<PlanAvailability slug="ent-plus" />
This setting isn't available in the System Console and can only be set in `config.json`.
Set the file location of the compliance exports. By default, they are written to the `exports` subdirectory of the configured [Local Storage directory](/administration-guide/configure/environment-configuration-settings#local-storage-directory).
<table style={{width: '77%'}}>
<colgroup>
<col style={{width: '76%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"FileLocation": "export"</code> with string input.</td>
</tr>
</tbody>
</table>
### Push notification buffer
This setting isn't available in the System Console and can only be set in `config.json`.
Used to control the buffer of outstanding Push Notification messages to be sent. If the number of messages exceeds that number, then the request making the Push Notification will be blocked until there's room.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature’s <code>config.json</code> setting is <code>"PushNotificationBuffer": 1000"</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Restrict system admin
This setting isn't available in the System Console and can only be set in `config.json`.
**True**: **(Default for Cloud deployments)** Restricts the system admin from viewing and modifying a subset of server configuration settings from the System Console. Not recommended for use in on-prem installations. This is intended to support Mattermost Private Cloud in giving the system admin role to users but restricting certain actions only for Cloud Admins.
**False**: **(Default for self-host deployments)** No restrictions are applied to the system admin role.
<table style={{width: '97%'}}>
<colgroup>
<col style={{width: '96%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"RestrictSystemAdmin": "false"</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
<Note>
The ability to restrict the system admin from viewing and modifying a subset of server configuration settings is currently in [Beta](/administration-guide/manage/feature-labels#beta).
</Note>
### Enable client-side certification
<PlanAvailability slug="ent-plus" />
<Important>
**Certificate-based authentication has been deprecated from Mattermost v11.0.** This setting must be set to `false` to start the server from v11. Setting this to `true` will prevent the server from starting.
</Important>
**True**: Enables client-side certification for your Mattermost server. See [the documentation](/administration-guide/onboard/certificate-based-authentication) to learn more.
**False**: **(Default)** Client-side certification is disabled.
<table style={{width: '96%'}}>
<colgroup>
<col style={{width: '95%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ClientSideCertEnable": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Client-side certification login method
<PlanAvailability slug="ent-plus" />
<Important>
**Certificate-based authentication has been deprecated from Mattermost v11.0.** This setting is no longer functional from Mattermost v11.0 and should be left at the default value.
</Important>
This configuration setting is used in combination with the `ClientSideCertEnable` configuration setting and has the following possible values:
**Primary**: After the client side certificate is verified, user's email is retrieved from the certificate and is used to log in without a password.
**Secondary**: **(Default)** After the client side certificate is verified, user's email is retrieved from the certificate and matched against the one supplied by the user. If they match, the user logs in with regular email/password credentials.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ClientSideCertCheck": "secondary"</code> with options <code>"primary"</code> and <code>"secondary"</code>.</td>
</tr>
</tbody>
</table>
### Export output directory
This setting isn't available in the System Console and can only be set in `config.json`.
The directory where the exported files are stored. The path is relative to the `FileSettings` directory. By default, exports are stored under `./data/export`.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting under the <code>ExportSettings</code> section is <code>Directory: ./export</code> with string input.</td>
</tr>
</tbody>
</table>
### Export retention days
This setting isn't available in the System Console and can only be set in `config.json`.
The number of days to retain the exported files before deleting them.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting under the <code>ExportSettings</code> section is <code>RetentionDays: 30</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Maximum image resolution
This setting isn't available in the System Console and can only be set in `config.json`.
Maximum image resolution size for message attachments in pixels.
<table style={{width: '88%'}}>
<colgroup>
<col style={{width: '87%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"MaxImageResolution": 33177600</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Maximum image decoder concurrency
This setting isn't available in the System Console and can only be set in `config.json`.
Indicates how many images can be decoded concurrently at once. The default value of `-1` configures Mattermost to automatically use the number of CPUs present.
<Note>
- This configuration setting affects the total memory consumption of the server. The maximum memory of a single image is dictated by `MaxImageResolution * 24 bytes`, where the default maximum image resolution value is 33MB.
- Therefore, a good rule of thumb to follow is that `33MB * MaxImageDecoderConcurrency * 24` should be less than the total memory for the server.
- For example, if you have a 4-core server, you should leave aside at least `33 * 4 * 24 = 3168MB` memory for image processing. Otherwise, adjust the [MaxImageResolution](#maximum-image-resolution) configuration setting to adjust the amount of memory needed for image processing.
</Note>
<table style={{width: '88%'}}>
<colgroup>
<col style={{width: '87%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"MaxImageDecoderConcurrency": "-1"</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Initial font
This setting isn't available in the System Console and can only be set in `config.json`.
Font used in auto-generated profile pics with colored backgrounds.
<table style={{width: '80%'}}>
<colgroup>
<col style={{width: '80%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"InitialFont": "luximbi.ttf"</code> with string input.</td>
</tr>
</tbody>
</table>
### Amazon S3 signature v2
This setting isn't available in the System Console and can only be set in `config.json`.
By default, Mattermost uses Signature V4 to sign API calls to AWS, but under some circumstances, V2 is required. For more information about when to use V2, see [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html).
**True**: Use Signature Version 2 Signing Process.
**False**: Use Signature Version 4 Signing Process.
<table style={{width: '91%'}}>
<colgroup>
<col style={{width: '90%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"AmazonS3SignV2": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Amazon S3 path
This setting isn't available in the System Console and can only be set in `config.json`.
Allows using the same S3 bucket for multiple deployments.
<table style={{width: '91%'}}>
<colgroup>
<col style={{width: '90%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature’s <code>config.json</code> setting is <code>"AmazonS3PathPrefix: ""</code> with string input.</td>
</tr>
</tbody>
</table>
### GitLab scope
This setting isn't available in the System Console and can only be set in `config.json`.
Standard setting for OAuth to determine the scope of information shared with OAuth client. Not currently supported by GitLab OAuth.
<table style={{width: '66%'}}>
<colgroup>
<col style={{width: '65%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"Scope": ""</code> with string input.</td>
</tr>
</tbody>
</table>
### Global relay SMTP server timeout
<PlanAvailability slug="ent-plus" />
This setting isn't available in the System Console and can only be set in `config.json`.
The number of seconds that can elapse before the connection attempt to the SMTP server is abandoned. The default value is 1800 seconds. This setting is currently not available in the System Console and can only be set in `config.json`.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"GlobalRelaySettings.SMTPServerTimeout": "1800"</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Google scope
This setting isn't available in the System Console and can only be set in `config.json`.
Standard setting for OAuth to determine the scope of information shared with OAuth client. Recommended setting is `profile email`.
<table style={{width: '77%'}}>
<colgroup>
<col style={{width: '76%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"Scope": "profile email"</code> with string input.</td>
</tr>
</tbody>
</table>
### Import input directory
This setting isn't available in the System Console and can only be set in `config.json`.
The directory where the imported files are stored. The path is relative to the `FileSettings` directory. By default, imports are stored under `./data/import`.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting under the <code>ImportSettings</code> section is <code>Directory: ./import</code> with string input.</td>
</tr>
</tbody>
</table>
### Import retention days
This setting isn't available in the System Console and can only be set in `config.json`.
The number of days to retain the imported files before deleting them.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting under the <code>ImportSettings</code> section is <code>RetentionDays: 30</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Export from timestamp
<PlanAvailability slug="ent-plus" />
This setting isn't available in the System Console and can only be set in `config.json`.
Set the Unix timestamp (seconds since epoch, UTC) to export data from.
<table style={{width: '79%'}}>
<colgroup>
<col style={{width: '79%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExportFromTimestamp": 0</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Entra ID Scope
This setting isn't available in the System Console and can only be set in `config.json`.
Standard setting for OAuth to determine the scope of information shared with OAuth client. Recommended setting is `User.Read`.
<table style={{width: '73%'}}>
<colgroup>
<col style={{width: '73%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"Scope": "User.Read"</code> with string input.</td>
</tr>
</tbody>
</table>
### Enable plugin uploads
This setting isn't available in the System Console and can only be set in `config.json`.
**True**: Enables plugin uploads by system admins at **Plugins \> Management**. If you do not plan to upload a plugin, set to `false` to control which plugins are installed on your server. See [documentation](https://developers.mattermost.com/integrate/admin-guide/admin-plugins-beta/) to learn more.
**False**: Disables plugin uploads on your Mattermost server.
<table style={{width: '90%'}}>
<colgroup>
<col style={{width: '90%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableUploads": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Allow insecure download URL
This setting isn't available in the System Console and can only be set in `config.json`.
**True**: Enables downloading and installing a plugin from a remote URL.
**False**: Disables downloading and installing a plugin from a remote URL.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"AllowInsecureDownloadUrl": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Enable plugin health check
This setting isn't available in the System Console and can only be set in `config.json`.
**True**: Enables plugin health check to ensure all plugins are periodically monitored, and restarted or deactivated based on their health status. The health check runs every 30 seconds. If the plugin is detected to fail 3 times within an hour, the Mattermost server attempts to restart it. If the restart fails 3 successive times, it's automatically disabled.
**False**: Disables plugin health check on your Mattermost server.
<table style={{width: '92%'}}>
<colgroup>
<col style={{width: '92%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableHealthCheck": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Plugin directory
This setting isn't available in the System Console and can only be set in `config.json`.
The location of the plugin files. If blank, they are stored in the `./plugins` directory. The path that you set must exist and Mattermost must have write permissions in it.
<table style={{width: '95%'}}>
<colgroup>
<col style={{width: '95%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"Directory": "./plugins"</code> with string input.</td>
</tr>
</tbody>
</table>
### Client plugin directory
This setting isn't available in the System Console and can only be set in `config.json`.
The location of client plugin files. If blank, they are stored in the `./client/plugins` directory. The path that you set must exist and Mattermost must have write permissions in it.
<table style={{width: '95%'}}>
<colgroup>
<col style={{width: '95%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ClientDirectory": "./client/plugins"</code> with string input.</td>
</tr>
</tbody>
</table>
### Scoping IDP provider ID
This setting isn't available in the System Console and can only be set in `config.json`.
Allows an authenticated user to skip the initial login page of their federated Azure AD server, and only require a password to log in.
<table style={{width: '78%'}}>
<colgroup>
<col style={{width: '78%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ScopingIDPProviderId": ""</code> with string input.</td>
</tr>
</tbody>
</table>
### Scoping IDP provider name
This setting isn't available in the System Console and can only be set in `config.json`.
Adds the name associated with a user's Scoping Identity Provider ID.
<table style={{width: '73%'}}>
<colgroup>
<col style={{width: '73%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ScopingIDPName": ""</code> with string input.</td>
</tr>
</tbody>
</table>
### Group unread channels
This setting isn't available in the System Console and can only be set in `config.json`.
This setting applies to the new sidebar only. You must disable the [Enable Legacy Sidebar](/administration-guide/configure/deprecated-configuration-settings#enable-legacy-sidebar) configuration setting to see and enable this functionality in the System Console.
**Default Off**: Disables the unread channels sidebar section for all users by default. Users can enable it in **Settings \> Sidebar \> Group unread channels separately**.
**Default On**: Enables the unread channels sidebar section for all users by default. Users can disable it in **Settings \> Sidebar \> Group unread channels separately**.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalGroupUnreadChannels": "default_off"</code> with options <code>"default_off"</code> and <code>"default_on"</code>.</td>
</tr>
</tbody>
</table>
### Enable channel category sorting
From Mattermost v10.10, when this [experimental](/administration-guide/manage/feature-labels#experimental) feature is enabled, users can assign channels to new or existing channel categories when creating or renaming channels.
**This configuration setting applies only to cloud-based deployments.**
**True**: Users can assign channels to new or existing channel categories when creating or renaming channels.
**False**: **(Default)** Disables the ability to automatically assign channels to new or existing channel categories.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalEnableChannelCategorySorting": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Strict CSRF token enforcement
This setting isn't available in the System Console and can only be set in `config.json`.
**True**: Enables CSRF protection tokens for additional hardening compared to the currently used custom header. When the user logs in, an additional cookie is created with the CSRF token contained.
**False**: Disables CSRF protection tokens and enables legacy X-Requested-With header fallback for backward compatibility.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalStrictCSRFEnforcement": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Developer flags
This setting isn't available in the System Console and can only be set in `config.json`.
This configuration setting specifies a list of strings where each string is a flag used to set the content security policy (CSP) for the Mattermost Web App. Each flag must be in the format `flag=true` (e.g. `unsafe-eval=true,unsafe-inline=true`). Not recommended for production environments.
The following values are currently supported:
- `unsafe-eval`: Adds the `unsafe-eval` CSP directive to the root webapp, allowing increased debugging in developer environments.
- `unsafe-inline`: Adds the `unsafe-inline` CSP directive to the root webapp, allowing increased debugging in developer environments.
This configuration setting is disabled by default and requires [developer mode](/administration-guide/configure/environment-configuration-settings#enable-developer-mode) to be enabled.
<table style={{width: '74%'}}>
<colgroup>
<col style={{width: '74%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"DeveloperFlags": ""</code> with string input.</td>
</tr>
</tbody>
</table>
### Enable post search
This setting isn't available in the System Console and can only be set in `config.json`.
If this setting is enabled, users can search for messages in their Mattermost instance.
<table style={{width: '92%'}}>
<colgroup>
<col style={{width: '91%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnablePostSearch": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
<Note>
Disabling this experimental configuration setting in larger deployments may improve server performance in the following areas:
- Reduced Database Load: When post search is enabled, every search query adds additional load to the database. Disabling search reduces these queries, leading to better database performance and lower response times for other operations.
- Lower Memory Usage: Search functionality often requires indexing of posts, which consumes memory. By disabling search, the memory required for maintaining these indexes is freed up for other uses, improving overall system performance.
- Faster Write Operations: When post search is enabled, indexing has to be updated with every new post, edit, or deletion. Disabling search avoids this overhead, allowing for faster write operations.
- Performance Consistency: Without the search feature, the application avoids potential performance bottlenecks and can maintain more consistent performance levels, especially under heavy usage scenarios with a high number of posts.
- Simplified System Maintenance: Managing search indexes can be complex and resource-intensive. Disabling search simplifies this aspect of system maintenance, potentially reducing the risk of performance issues related to search index corruption or degradation.
- However, the ability to search messages in Mattermost is a critical feature for many users, and disabling this feature will result in users seeing an error if they attempt to use the Mattermost Search box. It’s important to balance performance improvements with the needs of your organization and users.
</Note>
### Enable file search
This setting isn't available in the System Console and can only be set in `config.json`.
<Important>
This experimental configuration setting enables users to search documents attached to messages by filename. To enable users to search documents by their content, you must also enable the `ExtractContent` configuration setting. See our [Enable Document Search by Content](/administration-guide/configure/environment-configuration-settings#enable-document-search-by-content) documentation for details. Document content search is available in Mattermost Server from v5.35, with mobile support coming soon.
</Important>
**True**: Supported document types are searchable by their filename.
**False**: File-based searches are disabled.
<table style={{width: '92%'}}>
<colgroup>
<col style={{width: '91%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableFileSearch": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
<Note>
Disabling this experimental configuration setting in larger deployments may improve server performance in the following areas:
- Less Data to Index: Indexing files in addition to messages adds to the amount of data that needs to be processed and stored in the search index.
- Fewer Complex Queries: Searching through files can require more complex queries, which can be more resource-intensive and time-consuming as compared to searching through messages alone.
- Lower IO Operations: Searching files can generate more input/output operations, impacting the overall disk performance, especially if the system handles a large volume of file uploads and searches.
- However, the ability to search for files in Mattermost is a critical feature for many users, and disabling this feature will result in users seeing an error if they attempt to use the Mattermost Search box. It’s important to balance performance improvements with the needs of your organization and users.
</Note>
### Enable user status updates
This setting isn't available in the System Console and can only be set in `config.json`.
Turn status updates off to improve performance. When status updates are off, users appear online only for brief periods when posting a message, and only to members of the channel in which the message is posted.
<table style={{width: '93%'}}>
<colgroup>
<col style={{width: '93%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableUserStatuses": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Websocket secure port
This setting isn't available in the System Console and can only be set in `config.json`. Changes to this setting require a server restart before taking effect.
(Optional) This setting defines the port on which the secured WebSocket is listening using the `wss` protocol. Defaults to `443`. When the client attempts to make a WebSocket connection it first checks to see if the page is loaded with HTTPS. If so, it will use the secure WebSocket connection. If not, it will use the unsecure WebSocket connection. IT IS HIGHLY RECOMMENDED PRODUCTION DEPLOYMENTS ONLY OPERATE UNDER HTTPS AND WSS.
<table style={{width: '81%'}}>
<colgroup>
<col style={{width: '80%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"WebsocketSecurePort": 443</code> with numerical input.</td>
</tr>
</tbody>
</table>
<Note>
This is a client only override that doesn't affect the listening port of the server process which is controlled by the [Web server listen address](/administration-guide/configure/environment-configuration-settings#web-server-listen-address) setting.
</Note>
### Websocket port
This setting isn't available in the System Console and can only be set in `config.json`. Changes to this setting require a server restart before taking effect.
(Optional) This setting defines the port on which the unsecured WebSocket is listening using the `ws` protocol. Defaults to `80`. When the client attempts to make a WebSocket connection it first checks to see if the page is loaded with HTTPS. If so, it will use the secure WebSocket connection. If not, it will use the unsecure WebSocket connection. IT IS HIGHLY RECOMMENDED PRODUCTION DEPLOYMENTS ONLY OPERATE UNDER HTTPS AND WSS.
<table style={{width: '74%'}}>
<colgroup>
<col style={{width: '74%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>WebsocketPort": 80</code> with numerical input.</td>
</tr>
</tbody>
</table>
<Note>
This is a client only override that doesn't affect the listening port of the server process which is controlled by the [Web server listen address](/administration-guide/configure/environment-configuration-settings#web-server-listen-address) setting.
</Note>
### Enable local mode for mmctl
This self-hosted deployment setting isn't available in the System Console and can only be set in `config.json`.
**True**: Enables local mode for mmctl.
**False**: Prevents local mode for mmctl.
<table style={{width: '92%'}}>
<colgroup>
<col style={{width: '91%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableLocalMode": false</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
<Tip>
When trying to use local mode with mmctl, ensure you're using the same user when running the server and mmctl, or clean up the socket file before switching to a new user. If you encounter an error like `socket file "/var/tmp/mattermost_local.socket" doesn't exists, please check the server configuration for local mode`, this can be resolved by setting this configuration setting to `true`.
</Tip>
### Enable local mode socket location
This self-hosted deployment setting isn't available in the System Console and can only be set in `config.json`.
The path for the socket that the server will create for mmctl to connect and communicate through local mode. If the default value for this key is changed, you will need to point mmctl to the new socket path when in local mode, using the `--local-socket-path /new/path/to/socket` flag in addition to the `--local` flag.
If nothing is specified, the default path that both the server and mmctl assumes is `/var/tmp/mattermost_local.socket`.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"LocalModeSocketLocation": "/var/tmp/mattermost_local.socket"</code> with string input.</td>
</tr>
</tbody>
</table>
### Default channels
This setting isn't available in the System Console and can only be set in `config.json`.
Default channels every user is added to automatically after joining a new team. Only applies to Public channels, but affects all teams on the server.
When not set, every user is added to the `town-square` channel by default.
<Note>
Even if `town-square` isn't listed, every user is added to that channels automatically when joining a new team.
</Note>
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"ExperimentalDefaultChannels": []</code> with string array input consisting of channel names, such as <code>["announcement", "developers"]</code>.</td>
</tr>
</tbody>
</table>
------------------------------------------------------------------------------------------------------------------------
## Experimental job configuration settings
With self-hosted deployments, you can configure how Mattermost schedules and completes periodic tasks such as the deletion of old posts with Data Retention enabled or indexing posts with Elasticsearch. These settings control which Mattermost servers are designated as a Scheduler, a server that queues the tasks at the correct times, and as a Worker, a server that completes the given tasks.
When running Mattermost on a single machine, both `RunJobs` and `RunScheduler` should be enabled. Without both of these enabled, Mattermost will not function properly.
When running Mattermost in High Availability mode, `RunJobs` should be enabled on one or more servers while `RunScheduler` should be enabled on all servers under normal circumstances. A High Availability cluster-based deployment will have one Scheduler and one or more Workers. See the below sections for more information.
### Run jobs
This setting isn't available in the System Console and can only be set in `config.json`.
Set whether or not this Mattermost server will handle tasks created by the Scheduler. When running Mattermost on a single machine, this setting should always be enabled.
When running Mattermost in [High Availablity mode](/deployment-guide/server/high-availability-cluster-based-deployment), one or more servers should have this setting enabled. We recommend that your High Availability cluster-based deployment has one or more dedicated Workers with this setting enabled while the remaining Mattermost app servers have it disabled.
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"RunJobs": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Run scheduler
This setting isn't available in the System Console and can only be set in `config.json`.
Set whether or not this Mattermost server will schedule tasks that will be completed by a Worker. When running Mattermost on a single machine, this setting should always be enabled.
When running Mattermost in [High Availablity mode](/deployment-guide/server/high-availability-cluster-based-deployment), this setting should always be enabled. In a High Availability cluster-based deployment, exactly one of the servers will be designated as the Scheduler at a time to ensure that duplicate tasks aren't created. See [High Availability documentation](/deployment-guide/server/high-availability-cluster-based-deployment) for more details.
<Warning>
We strongly recommend that you not change this setting from the default setting of `true` as this prevents the `ClusterLeader` from being able to run the scheduler. As a result, recurring jobs such as LDAP sync, Compliance Export, and data retention will no longer be scheduled. In previous Mattermost Server versions, and this documentation, the instructions stated to run the Job Server with `RunScheduler: false`. The cluster design has evolved and this is no longer the case.
</Warning>
<Tip>
From Mattermost v11.4, debug-level log messages are available to help verify that specific Recurring Tasks (Scheduled Posts, Post Reminders, and DND Status Reset) are executing correctly in a cluster. Non-leader nodes log messages when they skip execution of these Recurring Tasks, confirming that leader election is functioning as expected. These debug messages do not apply to other job types such as Elasticsearch indexing, SAML sync, or LDAP sync. See [Cluster job execution debug messages](/administration-guide/manage/logging#cluster-job-execution-debug-messages) for details.
</Tip>
<table>
<colgroup>
<col style={{width: '100%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"RunScheduler": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>
### Clean up old database jobs
This setting isn't available in the System Console and can only be set in `config.json`.
Defines the threshold in days beyond which older completed database jobs are removed. This setting is disabled by default, and must be set to a value greater than or equal to `0` to be enabled.
<table style={{width: '98%'}}>
<colgroup>
<col style={{width: '97%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"JobSettings.CleanupJobsThresholdDays": -1</code> with numerical input.</td>
</tr>
</tbody>
</table>
### Clean up outdated database entries
This setting only applies to configuration in the database. It isn't available in the System Console and can be set via mmctl or changed in the database.
Defines the threshold in days beyond which outdated configurations are removed from the database.
<table style={{width: '98%'}}>
<colgroup>
<col style={{width: '97%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"JobSettings.CleanupConfigThresholdDays": 30</code> with numerical input.</td>
</tr>
</tbody>
</table>