Mattermost

mattermost.com
Mattermost

Self-hostable Slack alternative with native desktop, mobile and web apps, and many integrations. There's no end-to-end encryption, so the server can read all messages, and telemetry is on by default. The open source edition caps at 250 users.

Open Source

Mattermost Privacy Policy

Privacy Policy Summary

  • You are prohibited from sending chain letters, junk mail, spam or any unsolicited messages
  • Harming minors in any ways is prohibited
  • You are forced into binding arbitration in case of disputes
  • You are prohibited from posting content which promotes violence or politically or religiously extremist values
  • This service does not guarantee that it or the products obtained through it meet your expectations or requirements
  • The service is provided 'as is' and to be used at your sole risk
  • Invalidity of any portion of the Terms of Service does not entail invalidity of its remainder
  • If you are the target of a copyright claim, your content may be removed
  • Failure to enforce any provision of the Terms of Service does not constitute a waiver of such provision
  • The service provider makes no warranty regarding uninterrupted, timely, secure or error-free service
  • Specific content can be deleted without reason and may be removed without prior notice
  • You maintain ownership of your content
  • A complaint mechanism is provided for the handling of personal data
  • Extra data may be collected about you through promotions
  • This service is only available to users over 13 years old
  • Defend, indemnify, hold harmless; survives termination
  • Instructions are provided on how to submit a copyright claim
  • There is a date of the last update of the agreements
  • Information is provided about what kind of personal information is collected
  • Information is provided about how your personal data is used
  • You agree to indemnify and hold the service harmless in case of a claim related to your use of the service
  • You must report to the service any unauthorized use of your account or any breach of security
  • The service claims to be GDPR compliant for European users
  • Third parties used by the service are bound by confidentiality obligations
  • Your personal data may be used for marketing purposes
  • Your content can be deleted if you violate the terms
  • You agree not to use the service for illegal purposes
  • Information is provided about how your personal data is collected
  • First-party cookies are used
  • The service assumes no liability for any damages the user incurs
  • Information is gathered about you through third parties
  • This service gives your personal data to third parties involved in its operation
  • Your account can be deleted or permanently suspended without prior notice and without a reason
  • You agree not to submit libelous, harassing or threatening content
  • This service tracks which web page referred you to it
  • Third-party cookies are used for statistics
  • Location data may be collected, used and/or shared
  • Your profile is combined across various products
  • Your IP address is collected, which can be used to view your approximate location
  • Your data may be processed and stored anywhere in the world
  • Your personal data is used to employ targeted third-party advertising
  • Third-party cookies are employed, but with opt out instructions
  • Your personal information is used for many different purposes
  • Your personal data is aggregated into statistics
  • Your personal data is used for automated decision-making, profiling or AI training
  • Your biometric data is collected
  • The data retention period is kept to the minimum necessary for fulfilling its purposes
  • Your personal data may be sold unless you opt out
  • Tracking pixels are used in service-to-user communication
  • You can request access, correction and/or deletion of your data
  • This service shares your personal data with third parties that are not essential to its operation
  • The service claims to be CCPA compliant for California users
  • You can opt out of promotional communications
  • This service will continue using anonymized user-generated content after erasure of personal information
  • You can opt out of targeted advertising
  • Many different types of personal data are collected
  • You can retrieve an archive of your data
  • This service informs you that its Privacy Policy does not apply to third-party services
  • The court of law governing the terms is in a jurisdiction that is friendlier to user privacy protection (California, U.S.A.)
  • The court of law governing the terms is in the State of California, U.S.A.
  • Your personal data may be disclosed to comply with government requests without notice to you
  • Your personal data may be sold or otherwise transferred as part of a bankruptcy proceeding or other type of financial transaction

Score

E

Documents

About the Data

This data is kindly provided by tosdr.org. Read full report at: #2994

Mattermost Source Code

Author

mattermost

Description

Mattermost is an open source platform for secure collaboration across the entire software development lifecycle..

#collaboration#golang#hacktoberfest#mattermost#monorepo#react#react-native

Homepage

https://mattermost.com

Repository

  • LicenseOther
  • Created15 Jun 15
  • Primary languageTypeScript
  • Size1,277,581 KB
  • Stars38,978
  • Forks8,966
  • Watchers38,978

Language Usage

Language Usage

Project Health

  • Last commit5 days ago
  • Open issues1,013
  • Latest releasev11.11.0-rc2

Top Contributors

Recent Commits

  • Eva Sarafianou(03 Sept 26)

    [Docs Revamp Feedback] Match landing page titles to the TOC, and keep the sidebar on persona pages (#38301) * [Docs Revamp Feedback] Match landing page titles to the TOC, and keep the sidebar on persona pages Landing pages and their sidebar entries had drifted apart, so opening a category from the TOC showed a page with a different name and a different list of children. Access control, System Console settings, and Manage now use the same titles and the same ordering as the sidebar. Persona pages under for/ rendered with no left sidebar because they are deliberately absent from the sidebar tree. displayed_sidebar attaches the Documentation sidebar for navigation without adding a TOC entry. Co-authored-by: Cursor <[email protected]> * [Docs Revamp Feedback] Order the SRE Start here cards along the deployment path Start here now follows the sequence an SRE actually works through: size the deployment, prepare the environment, then install. Backup and DR moves down to Common tasks, replacing the Active/Passive on AWS card. Co-authored-by: Cursor <[email protected]> --------- Co-authored-by: Cursor <[email protected]>

  • Christopher Poile(03 Sept 26)

    [MM-70529] Fix OpenSearch plugin discovery on AWS (#38280) * rely on template for definitive analysis-icu detection,fail with err * improve comments * MM-70529: update search watcher log documentation * MM-70529: simplify ICU error guidance

  • cursor[bot](03 Sept 26)

    Fix flaky TestSendMailPlainText (#38309) The test used a shared Inbucket mailbox ([email protected]). Under CI fullyparallel, other packages (e.g. invite emails) deliver to the same address, so RetryInbucket can return that message as resultsMailbox[0] and the HTML/text assertions fail. Scope each subtest to a unique mailbox, matching TestSendMailWithEmbeddedFilesUsingConfig. Tests-only change. Verified with `go test -run '^TestSendMailPlainText$' -race -count=100` locally. Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: mattermost-code <[email protected]>

  • Eva Sarafianou(03 Sept 26)

    docs: fix incorrect GPO policy name for desktop auto-updater (#38310) Rename EnableAutoUpdates to EnableAutoUpdater to match the actual Group Policy exposed by the desktop app. Ports mattermost/docs#9164. Co-authored-by: Cursor <[email protected]>

  • Eva Sarafianou(03 Sept 26)

    fix(docs): apply Algolia searchParameters on the full search page (#38308) The optionalFilters added in #38202 only took effect in the Cmd+K modal. DocSearch honours themeConfig.algolia.searchParameters, but the theme's SearchPage component never reads it, so /search built its query helper from a hardcoded parameter set and returned differently ordered results than the modal for the same query. Upstream exposes no config option for this (3.10.2 has the same gap) and Algolia Rules aren't available on our plan, so eject SearchPage and forward searchParameters to the search helper. Values stay in docusaurus.config.ts so the two surfaces can't drift apart again. Co-authored-by: Cursor <[email protected]>

  • Edgar Bellot Micó(03 Sept 26)

    MM-69994: Fix user endpoint request handling (#37699) See MM-69994 for more details.

  • Jesse Hallam(03 Sept 26)

    chore: extract install-<tool> Makefile targets (#38284) Pull each `go install` of a build tool into its own `install-<tool>` target so the installs are declared once and reused as prerequisites, and add `install-ci-tools` plus a `go-cache` target that pre-warms the Go module and build caches. Also collapse the duplicate `vet-api` target declarations into one.

  • Edgar Bellot Micó(03 Sept 26)

    MM-70215: Adjust status response serialization (#37916)

  • Eva Sarafianou(03 Sept 26)

    [Docs Revamp Feedback] Restructure the Deployment Guide, and fix sidebar placement, labels, and ordering (#38217) * docs: hide cloud-supported-integrations snippet from the Overview sidebar This file is a snippet include (an :orphan: :nosearch: fragment in Sphinx), imported by Cloud Dedicated and Cloud Shared. It was listed in the Cloud group of the Overview sidebar, so it also rendered as a standalone page with a raw filename heading and a bare list of links. Move it into OVERVIEW_HIDDEN alongside the common-esr-support partials. Co-authored-by: Cursor <[email protected]> * docs: move Corporate Directory Integration into the Administration Guide The page was listed in Overview > Subscription Overview > Cloud purely because its file sat in product-overview/. Sphinx navigated it only from administration-guide/manage/admin/user-provisioning.rst's toctree and from no Overview toctree at all. Move the file to administration-guide/onboard/ and make it the landing page of Onboard > SSO & Identity, which had none and whose nine pages it surveys. Update the two inbound links, retarget the /about/ and /overview/auth redirects, and add a redirect from the pre-move URL. Also fix the PDF book spines, which still listed it under Product Overview. Separately, drop common-converting-oauth-to-openidconnect from the same group: it is an :orphan: :nosearch: snippet include, and with no title frontmatter it rendered in the sidebar as "Common Converting Oauth To Openidconnect". Co-authored-by: Cursor <[email protected]> * docs: nest Source Available License under Business & Licensing On the old site faq-mattermost-source-available-license lived in faq-license.rst's own toctree, so it rendered as a child of Business & Licensing. The migration flattened that level and made the two siblings under Frequently Asked Questions. Restore the nesting with an inline sub-group, matching the Cloud sub-group pattern already used in OVERVIEW_GROUPS. Co-authored-by: Cursor <[email protected]> * docs: shorten the General and Enterprise FAQ sidebar labels Sphinx's FAQ toctree used short nav labels ("General", "Enterprise") while the pages kept longer titles. The migration used titles for both, so the sidebar carried "General Mattermost" and "Enterprise Edition". Restore the short labels via sidebar_label, leaving the page titles as they are. Co-authored-by: Cursor <[email protected]> * docs: restore the remaining short FAQ sidebar labels Same migration gap as the General and Enterprise labels: Sphinx's toctrees listed these as "Federal Procurement" and "Source Available License" while the pages carried longer titles. Set sidebar_label on both; page titles are unchanged. Co-authored-by: Cursor <[email protected]> * docs: order the Use Case Guide sidebar to match its landing page The section has no manual grouping override, so buildCategory sorted it by filename. devops-collaboration.mdx is titled "Real-Time DevSecOps Collaboration", so it sorted first while the landing page lists it sixth. Set sidebar_position on all eight pages. Positions are needed on every page rather than just the odd one out, because the sort key is [position || 9999, filename] — a page with a position always sorts ahead of one without. Co-authored-by: Cursor <[email protected]> * docs: narrow the Corporate Directory Integration redirect changes Drop the PDF spine edits; the PDF pipeline is being handled separately. Remove the /product-overview/corporate-directory-integration redirect. That path only ever existed on the revamp preview, which never served customers, so there is no inbound traffic to preserve. Point the legacy /onboard/common-converting-oauth-to-openidconnect redirect at convert-oauth20-service-providers-to-openidconnect, the page that includes the snippet, rather than at the snippet fragment itself. Co-authored-by: Cursor <[email protected]> * docs: drop legacy redirects that resolved to snippet fragments Sphinx generated a redirect for every source file, including the :nosearch: include fragments that only exist to be pulled into a real page. Those fragments should never have had public URLs, so preserving inbound paths to them preserves a mistake: the reader lands on a bare list with no title and no way back into the navigation. Remove the four such redirects, covering the cloud-supported-integrations, common-esr-support (plus -upgrade and -rst) and common-converting-oauth-to-openidconnect fragments. Co-authored-by: Cursor <[email protected]> * docs: reorganise the Deployment Guide information architecture Restructure the guide around the order a reader actually works in — evaluate, pick a scenario, plan, prepare, install, secure, scale, back up, operate, troubleshoot — so the sidebar teaches the deployment process rather than mirroring the directory layout it was generated from. - Consolidate air-gapped content into air-gapped-operations/. The scenario page had grown into a second, drifting copy of the registry-mirroring procedure; it is now a short architectural framing that links to the runbook. The Local Documentation steps move with it, rewritten for the current Node build rather than the retired Sphinx toolchain. - Flatten reference-architecture/ (28 files). The nav category was dissolved earlier but its URL segment and hidden index page were left behind. - Move the PostgreSQL and FIPS migration pages to the Administration Guide, restoring the placement Sphinx uses and giving fips-migration a sidebar home for the first time. - List desktop and mobile troubleshooting only under the central troubleshooting hub, with prominent links from each platform landing page, so prev/next pagination is not split across two locations. - Normalise labels to sentence case via title rather than sidebar_label, so sidebar entries and page headings stop disagreeing. - Rewrite the guide index, which was a verbatim Sphinx port linking to an orphaned page and omitting 7 of 13 sidebar groups. DEPLOYMENT_HIDDEN is now empty and all 87 pages are reachable from the sidebar. Redirects are added for the eight reference-architecture URLs that the live Sphinx site still serves; they had no entry in active-redirects.json because their paths were previously identity-mapped, so flattening would have 404'd them on cutover. The deployment-guide and administration-guide PDF book manifests are resynced — the latter was already carrying 20 dangling entries from the earlier scale migration. Co-authored-by: Cursor <[email protected]> * docs: restore Title Case labels in the Deployment Guide Revert the sentence-case conversion of 22 titles and sidebar labels, and update the six link texts that referenced them, so the Deployment Guide keeps Title Case for page titles and sidebar entries. Rewordings from the same pass are unaffected: the parenthetical nav prefixes, the three-way architecture rename, the digit grouping in the scale-to-* labels, and the "Partner and marketplace deployment options" rename all stand. Note that docs/styles/Mattermost/Headings.yml asks for sentence case in headings. It only scopes to Markdown headings, not frontmatter, so it does not flag these — but the two conventions now disagree for any page whose H1 comes from its frontmatter title. Co-authored-by: Cursor <[email protected]> * docs: rename the server group to Deploy the Server and Title Case sidebar labels "Install the server" understated what the group covers and clashed with its own pages: all nine are titled "Deploy Mattermost ...", and they use "install" for a narrower step within them, alongside database setup, configuration, and startup. Also Title Case the eleven Deployment Guide generator labels. These live in the sidebar generator rather than frontmatter, so the earlier Title Case revert never reached them, leaving categories like "Desktop app deployment" opening a page titled "Desktop App Deployment". Every other section's generator labels were already Title Case. The two-tier grammar is deliberate and preserved: imperative verbs for the sequential spine (Plan, Prepare, Deploy the Server, Secure Your Deployment, Scale, Back Up and Recover, Troubleshoot Deployments) and nouns for the per-product sections (Calls, Desktop App, Mobile App Deployment). Co-authored-by: Cursor <[email protected]> * docs: restore the Deployment Solution Programs title Revert the Phase 6 rename. "Partner and marketplace deployment options" promised marketplace content the page does not have — it covers the partner recognition programme and its Community, Registered, and Certified tiers. The clearer one-line description on the Plan landing page is kept, since that is where the ambiguity the rename was chasing is best resolved. Co-authored-by: Cursor <[email protected]> * docs: restore Deployment Architecture at Scale, unlist a partial, move SAML encryption Three unrelated fixes to the Deployment Guide reorganisation: - Restore the "Deployment Architecture at Scale" title on scale/server-architecture. It no longer collides with anything, since the page formerly called "Deployment Architecture" is now "Size your deployment". - Stop listing common-configure-mattermost-for-enterprise-search in the sidebar. It is an MDX partial imported by both elasticsearch-setup and opensearch-setup, so its content already renders inside them; the Phase 4 grouping added it a third time as a context-free standalone entry. It keeps its file and URL because admin-onboarding-tasks deep-links to its limitations anchor. Handled with a new DEPLOYMENT_SNIPPETS set rather than DEPLOYMENT_HIDDEN, so the latter stays empty and keeps its meaning as a reachability signal. - Move the SAML encryption method list off the deployment-side encryption-options page into the SAML settings reference, beside the Encrypt setting it describes. Nine Administration Guide links already pointed into it, which is what it is for; encryption-options keeps a cross-link. Co-authored-by: Cursor <[email protected]> * docs: fix copy errors in the deployment and security guides - Hyphenate "full-text message search" in the enterprise search description. - Drop a stray "the" before the desktop release-history link. - Remove a doubled closing parenthesis after the out-of-band link in the CMMC compliance guide. - Correct "availabilty" and "availaiblity" in the application architecture page. - Comma-separate every displayed user count across the scale pages. Applied to all nine rather than only the four reported, since formatting a subset would have left them inconsistent with their siblings in the same list. URLs and filenames keep their unpunctuated form. Co-authored-by: Cursor <[email protected]> * docs: restore a collapsed note list and fix a high availability link The RST-to-MDX conversion joined three note items onto one line in the authentication settings, so they rendered as a paragraph. The command resilience bullet also pointed both of its links at the scaling guide. Co-authored-by: Cursor <[email protected]> * docs: rename and reorder the Security Guide, and remove four pages Rename "Security & Compliance" to "Security Guide". It was the only top-level entry not following the "* Guide" pattern, and "Security Guide" is what Sphinx calls the section. Add a sidebar ordering override. The section had none, so it rendered alphabetically and led with the regulatory pages ahead of the hardening guidance most readers arrive for. It now runs Secure Mattermost, Zero Trust, Mobile Security, then CMMC/FINRA/HIPAA grouped under Compliance Frameworks. Remove the three pages under compliance-frameworks/. They have no Sphinx counterpart and are not publishable as written: - Internal planning artifacts leaked into the prose. Three bullets read "preserved at parent level pending Phase 2 re-organization", two pages cite "Audit Log Reference (Phase 2)" as a source, and the index carries a note addressed to authors rather than readers. - The DISA STIG control mapping is wrong. Four SRG identifiers are each mapped to two different requirements (SRG-APP-000033, -000148, -000164 and -000516), and SRG-APP-000068 is labelled account lockout when it is the DoD consent banner requirement. These are identifiers an accreditor would copy into an authorization package. - Both pages assert authorization posture and roadmap commitments (status="roadmap", "Not on roadmap") that belong on the Trust Portal, not in docs. Remove dependency-vulnerability-analysis as unmaintained. It is a point-in-time snapshot scoped to "our latest release" that still promises an upgrade in v11.4. Repoint the persona landing pages that linked to the removed content. That also clears four duplicate card targets on the developer page and returns its grids to the 3/6/3 shape the other persona pages use. Add redirects for the removed URLs and drop the deleted page from the PDF spine. active-redirects.json is maintained by hand now, since the input its generator reads never came across in the monorepo move, so correct its metadata and the config comment claiming it is regenerated. Co-authored-by: Cursor <[email protected]> * docs: reorganise the Integrations Guide information architecture Lead with Plugins, then the catalogue. Plugins explains the delivery mechanism that the catalogue and every vendor page depend on, but it sat last in the guide while Popular Pre-Built Integrations sat first, so the two ends of one idea were as far apart as the section allows. Nest the vendor pages under the catalogue they belong to, split Microsoft and third-party to match the tables already on that page. The sidebar and the page were carving up the same nine pages on different lines: Zoom was third-party on the page but grouped with Microsoft in the sidebar, and M365 was Microsoft on the page but "Chat & Meeting Interop" in the sidebar. Within each group they are now alphabetical, which is the only order a reader scanning for a vendor name can predict. Flatten No-Code Automation and RESTful API to root entries. The former was a category holding a single page of the same name, and the latter sat under "Built-in Integrations" alongside Plugins — a label that fits neither, since custom plugins are the pro-code path and an API is not an integration. Removing that catch-all takes the section from four levels deep to three. Shorten the vendor sidebar labels. Seven of nine read "Connect X to Mattermost", so the vendor name was buried mid-string and wrapped in the sidebar. Sphinx overrode these to bare vendor names in its toctree and the override was lost in the migration; sidebar_label restores it without touching any H1. Also correct "Built-In" to "Built-in" to match the page's own headings. Add a "Mattermost-built plugins" section covering Channel Export, Legal Hold, Metrics, and User Survey. These are first-party plugins that add capabilities rather than connecting to an external system, so they do not belong in a catalogue of connectors, and the page had no third category for them. Sphinx listed them in the integrations toctree; a Docusaurus doc resolves to one sidebar position, so linking them from the page keeps them discoverable without giving them a second home. No page moves, so no redirects change. Co-authored-by: Cursor <[email protected]> * docs: suppress MDX snippet includes with unlisted frontmatter Snippet includes were hidden from the sidebar in three different ways: two generator-side lists (OVERVIEW_HIDDEN, DEPLOYMENT_SNIPPETS), a HIDDEN-set entry, or not at all. The five Administration Guide partials were not hidden at all, so content already rendered inside Environment configuration settings and the SAML provider pages was also listed as separate sidebar pages. Converge on `unlisted: true`, which Docusaurus already honours by dropping a page from the sidebar, search, and sitemap while keeping its URL — needed because 10 pages deep-link the push notification anchors. The generator now reads it too, so the generated sidebar matches what production renders. Co-authored-by: Cursor <[email protected]> * docs: restructure the Administration Guide sidebar around admin tasks The section read as six categories named after the repository's folders, with placement following where a file happened to live: monitoring pages split between "Manage" and "Scale", access control split between "Manage" and "Onboard", System Console settings split across three groups, and Comply and Upgrade in filename order. Reorganize into Configure, Onboard users, Manage, Monitor and troubleshoot, Comply, Upgrade. Monitoring gets its own category — 15 pages is too much to hide inside Manage, and "Scale" told a reader nothing about what was in it. Groups that predicted nothing ("Optional capabilities", "Content & product governance") are dissolved, and the two hub pages a reader now lands on when opening Configure and Onboard users move into those sections so their URLs match the nav. No page is deleted and only the two hub pages change URL; both redirect. Co-authored-by: Cursor <[email protected]> * docs: align Administration Guide labels and hub pages with the sidebar Sidebar labels mixed title case and sentence case, and several repeated their parent group ("Configure SAML with Okta" under SAML, "Google Single Sign-On" under Single sign-on). Sentence-case the titles that were simply mis-cased, and add sidebar_label where the nav needs a shorter form than the page title. The five hub pages a reader now lands on when opening a category or group listed a different set of pages than the sidebar under them — configuration settings omitted search and listed Bleve as a System Console category, monitoring and performance listed surveys and product limits, and comply was missing custom terms of service. Rewrite each to match, and cross-link the two migration hubs so it's clear which one covers moving off Slack and which one covers moving off MySQL. Co-authored-by: Cursor <[email protected]> * docs: redirect the 21 scale pages that moved to the deployment guide Capacity planning, high availability, enterprise search, and Redis moved from /administration-guide/scale/ to /deployment-guide/scale/ during the migration, but only the pre-migration /scale/ URLs were redirected. The published docs.mattermost.com URLs for those 21 pages — the ones in search results and in customers' bookmarks — currently 404. Co-authored-by: Cursor <[email protected]> * docs: fix broken link to the Prometheus and Grafana guide The Calls monitoring page linked to the page under /deployment-guide/scale/, but it lives under /administration-guide/scale/ and is now listed in Monitor and troubleshoot. Reported by the build's broken-link check. Co-authored-by: Cursor <[email protected]> * docs: trim sidebar generator comments to what code can't say Drop rationale prose that restates the data structures or duplicates the `unlisted: true` frontmatter, keeping only constraints a future reader would otherwise have to rediscover. Co-authored-by: Cursor <[email protected]> * docs: fix admin guide page titles instead of masking them with sidebar labels Six pages had a sidebar label papering over a title that was itself wrong: mis-cased, gerund where siblings are imperative, padded with "Mattermost"/ "guide", or (cloud-data-export) describing only half of what the page covers. Co-authored-by: Cursor <[email protected]> * docs: order the End User Guide sidebar by reader journey Access, Workflow Automation, Project Management, and Preferences had no ordering override, so they fell through to alphabetical-by-filename and lost the sequence their own landing pages describe. Curate all four, restore the notification pages as children of the hub that explains them, and fix the labels and placements that alphabetical order made ambiguous. Co-authored-by: Cursor <[email protected]> * docs: use the standard "license" spelling on the server maintenance page One bullet read "Install a license key ... Apply a licence", contradicting itself and the surrounding pages. Co-authored-by: Cursor <[email protected]> * docs: give the Deployment Guide one starting point The Plan landing page had drifted into a second entry point that contradicted the guide index: it linked to Prepare and Install pages instead of its own children, carried a stale fork of the PostgreSQL version policy, and duplicated Application architecture. Plan now routes to the three pages it introduces, and the deployment-method comparison moves to a new Deploy the Server landing page next to the install paths it describes, keeping the widely deep-linked #deployment-options anchor. Co-authored-by: Cursor <[email protected]> * docs: remove stray line-number prefixes breaking the MDX build The two new Deployment Guide pages were written with editor gutter markers embedded in the text, which put "10|" inside the CardGrid expressions and failed the acorn parse. Co-authored-by: Cursor <[email protected]> * docs: replace em dashes with plain punctuation on the new Plan pages Co-authored-by: Cursor <[email protected]> * docs: trim the remaining sidebar generator comments Removes comments that narrate what the next line does, restate a value that is visible beside them, or recount how a group came to be arranged this way. Keeps the ones stating something the code cannot: ordering rationale, why a page is hidden or duplicated, and the frontmatter a contributor has to set. Generated sidebar output is byte-identical. Co-authored-by: Cursor <[email protected]> * docs: tighten the Deployment Guide index intro The Start here paragraph told readers they were on the starting point of the guide, which the page title already says. Frames the two exceptions by what the reader wants rather than how new they are, since evaluating first is a reasonable choice at any experience level. Renames "When something goes wrong" to Troubleshooting, matching the page it points at and the term readers search for. Co-authored-by: Cursor <[email protected]> * docs: give each Prepare prerequisite its own page The Prepare landing page carried the PostgreSQL, file storage, and network procedures inline while also acting as the group hub. That left PostgreSQL, the required database, with no sidebar entry, so the deprecated MySQL page was the only database topic visible in the nav and read as a duplicate of the landing page above it. Split those three procedures into their own pages, reduce the landing page to a hub, and sort MySQL last. Drops a System requirements section that restated software-hardware-requirements and then linked to it anyway, plus a stale instruction to return to the Linux install that predates this page becoming a hub for all three methods. Deep links had to be repointed by hand rather than redirected, because gen-active-redirects.mjs drops any redirect whose source contains an anchor. Co-authored-by: Cursor <[email protected]> * docs: move Deployment Solution Programs to Support and Community Most of that page is a compliance spec for third parties building installers, not guidance for anyone deploying Mattermost, so it does not belong in the Deployment Guide's Plan group. Renames Get Help to Support and Community so the section can hold it. The Plan and Deploy landing pages still link to it, and the old paths redirect. Co-authored-by: Cursor <[email protected]> * docs: pair bulk import with bulk export under Manage Bulk import sat under Onboard users > Accounts, but it imports teams, channels, posts, and emoji as well as users, and it is the format reference the bulk export page already points readers to. Move it beside bulk export in the sidebar so the two halves of one JSONL format sit together, and rename both to name the task rather than the mechanism. The file stays put on disk, so no URLs move and no redirects are needed. Co-authored-by: Cursor <[email protected]> * docs: place deployment troubleshooting next to the steps that break The single Troubleshoot Deployments category made a reader in a failure state browse a separate top-level section, and left Desktop App Deployment and Mobile App Deployment with no troubleshooting entry of their own. Prev/next walked out of those sections and only a prose link pointed back. Move each surface-specific page beside the step that produces its errors: the database pages follow their setup pages under Prepare, Docker joins the Containers group, and the desktop and mobile pages close their own sections. Only the cross-cutting page, which covers log review, environment review, and the data to gather for a support ticket, has no section home. It stays at the guide root as the single entry point for a reader who cannot yet attribute the failure, and picks up the retired hub's by-layer list. The hub was an eleven-line list of its own children, so removing it costs no content. Its URL redirects to the page that replaced it, and the legacy /guides/deployment-troubleshooting entry was repointed so it does not chain through two hops. Co-authored-by: Cursor <[email protected]> * docs: restructure deployment, admin, and integrations navigation Group the operator's end-to-end path under a Server deployment parent so the deployment guide's top level reads as a sequence, and dissolve Scale by moving sizing into Plan and search and Redis setup into Prepare. Consolidate the admin guide's migration topics into one section after Upgrade, rename Users and access to Access control, and drop the nesting that paired MFA with the deprecated certificate-based auth page. Lead the integrations guide with pre-built integrations before the custom-build material, and remove the Mattermost-built plugins table that duplicated the pre-built integrations page. Pages leaving the sidebar keep working URLs: PostgreSQL troubleshooting folds into the database setup page with a redirect, while the MySQL pages and certificate-based auth stay published but unlisted. Co-authored-by: Cursor <[email protected]> * docs: move high availability into Prepare, rename Migration to Migrate High availability cluster-based deployment reads as setup work against real infrastructure, so it moves from Plan to Prepare alongside search and Redis. The file moves with it, from scale/ to server/ where the other Prepare pages live, which changes its URL: the four legacy redirects now target the new path and the old Docusaurus URL gets one of its own. Rename the admin guide's Migration section to Migrate so all seven sections are verbs, and add it to the guide index, which had no bullet for it. Two neighbouring bullets were stale after the earlier restructure: Onboard users still claimed to cover migrating from another platform, and Manage still referred to Users and access and data export. Co-authored-by: Cursor <[email protected]> * docs: drop the sidebar labels masking admin guide page titles Twenty admin guide pages carried a sidebar_label that showed a different, shorter string in the nav than the page's own title. The nav now falls back to each title, so what a reader clicks matches the heading they land on. The titles themselves are unchanged, which means the SAML pages read "Configure SAML with Okta" under a category already called SAML. Fixing those titles is a separate change. Co-authored-by: Cursor <[email protected]> * docs: restore the optional and recommended prefixes on Prepare steps Three Prepare steps lost an "(Optional)" or "(Recommended)" prefix during the IA reorganisation. The prefix tells an operator scanning the sidebar which steps they can skip, which the bare verb form doesn't. Co-authored-by: Cursor <[email protected]> * docs: shorten the AD/LDAP sync groups page title "Manage team and private channel membership with AD/LDAP sync groups" was the longest entry in the nav. Drop "private" so the sidebar stays scannable. Co-authored-by: Cursor <[email protected]> * docs: drop the note about the withdrawn AKS guide The AKS page was removed in ab62783c8 and its legacy URL already redirects to this page, so the note explained an absence the reader can't perceive. Co-authored-by: Cursor <[email protected]> --------- Co-authored-by: Cursor <[email protected]>

  • sabril(03 Sept 26)

    E2E/Cypress: fix flaky emoji picker reaction helper (#38225) * E2E/Cypress: re-hover until the emoji picker preview settles clickEmojiInEmojiPicker hovered an emoji once and then waited on the picker preview to name it. Loading recent or custom emojis re-renders the picker and resets its cursor to the first emoji, so a hover that landed just before that update was discarded and the retrying assertion could never recover. reactions_spec.js hit this in CI on MM-T2192, which then took the two tests after it down with it: the test failed before its own uiCloseRHS(), and the RHS it left open covers the center channel the rest of the file drives. Retry the hover alongside the assertion, and close the RHS before each test in reactions_spec.js so a single failure no longer cascades. Co-authored-by: Cursor <[email protected]> * E2E/Cypress: hover before waiting on emoji picker preview clickEmojiInEmojiPicker asserted emoji_picker_preview exists before hovering, but that testid is only rendered after an emoji is selected. MM-T2186 searches first, so the helper timed out. Hover each waitUntil retry and use Cypress.$ so a missing node is falsy instead of findAllByTestId throwing out of the loop. Co-authored-by: mattermost-code <[email protected]> --------- Co-authored-by: Cursor <[email protected]> Co-authored-by: mattermost-code <[email protected]>

  • Jesse Hallam(02 Sept 26)

    MM-69706: remove the ChannelBookmarks feature flag compatibility shim (#38291)

  • Jesse Hallam(02 Sept 26)

    Fix props, refs and keys that React was warning about (#38238) * webapp: let Tag forward a ref WithTooltip anchors its popover by cloning its child with a ref. Tag is a function component, so the ref was dropped and React warned about it, leaving the marketplace label tooltips without a positioning reference. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 3a34196e47a9a875a8ef4b68227d9c3a94045725) * webapp: stop leaking component props onto DOM elements isReadonly was hardcoded to false, never read, and fell through a prop spread onto the channel header menu's <li>. SearchChannelSuggestion was connected with a null mapDispatchToProps, so react-redux injected dispatch, which the suggestion container then spread onto its <li>. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 959ba3b90d997be0cc0df6063a6dc07d626f2a6c) * webapp: stop connect's injected dispatch reaching suggestion list items Suggestions are connected components that forward their rest props into SuggestionContainer, which spreads them onto its <li>. A connect() without a mapDispatchToProps injects dispatch, so React saw it as an invalid DOM attribute. Drop it in the container alongside item, which covers every suggestion rather than one call site. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 41d09dfbfd694bdadcecc44b636f20630137984f) * webapp: key the add-workspace menu on a remote cluster's full identity RemoteClusters is keyed on (RemoteId, Name), so the same remote_id can appear more than once in the dropdown and React reported duplicate keys. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit a4025d52718aa7504d2202101a8b9299daa27498) * fixup! webapp: let Tag forward a ref --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Jesse Hallam <[email protected]>

  • Jesse Hallam(02 Sept 26)

    Hand Cypress E2E deps to workers as a run-scoped artifact (#38253) prep-deps wrote node_modules + the Cypress binary to a shared Actions cache keyed on the cypress lockfile, and the 40 workers read it back within the same run. The repo is pinned at the 10 GB Actions cache ceiling (100 entries, 9.99 GB), so LRU eviction runs continuously. Every distinct cypress lockfile a run happens to build costs a ~275 MB entry in that budget — four are live today, 1.10 GB total — and they evict entries other jobs depend on: the webapp node_modules cache (3.7 GB), the Playwright deps cache, and the E2E npm registry cache. Build the deps once in prep-deps and upload them as a run-scoped artifact instead. The handoff is unchanged in shape — one producer, N consumers, within a run — but it costs the shared cache nothing, and it drops the fail-on-cache-miss cliff the workers previously depended on. The artifact name is scoped by edition: e2e-tests-ci.yml invokes this template twice per workflow run (default and fips) and artifact names are run-scoped, so the two invocations would otherwise collide. prep-deps loses its cache-hit shortcut and now always installs, so it restores the master-warmed ~/.npm registry cache read-only to keep that install short, and its timeout goes 10 -> 15 minutes. Playwright still uses the cache handoff; it is a larger payload with a churnier key and follows separately.

  • Nick Misasi(02 Sept 26)

    ABAC: plugin policy self-inclusion and editor/test robustness (#37926) * fix ABAC editor null-safety and ResizeObserver noise in local/dev mode. Null users from plugin RPC and incomplete PropertyField names no longer crash the test results modal or CEL editor; ignore Chromium ResizeObserver loop messages. Co-authored-by: Cursor <[email protected]> * Enforce self-inclusion on plugin-owned ABAC policy saves. Non-system-admins must match the expression they save via SavePluginAccessControlPolicy; system admins retain the same carve-out as channel/team policy saves. Co-authored-by: Cursor <[email protected]> * Share ABAC write guards across channel and plugin save paths. Extract enforceAccessControlPolicyWriteGuards so plugin saves get value-holding validation when AttributeValueMasking is on (without store merge), keep non-sysadmin self-inclusion always on, and normalize empty plugin query users. Co-authored-by: Cursor <[email protected]> * Finish ABAC test extraction after write-guard share. Drop duplicated self-inclusion cases from the ownership suite, remove the weaker users-slice test subsumed by gob coverage, and align the team self-inclusion comment with always-on helpers. Co-authored-by: Cursor <[email protected]> * Stub QueryUsersForExpression in channel/team-admin ABAC save tests. Always-on self-inclusion in CreateOrUpdateAccessControlPolicy calls QueryUsersForExpression for non-sysadmins; existing API tests that save policies as channel or team admins panicked on the unstubbed mock. Co-authored-by: mattermost-code <[email protected]> * Remove duplicate team self-inclusion check on policy save. CreateOrUpdateAccessControlPolicy already runs always-on self-inclusion via enforceAccessControlPolicyWriteGuards; the extra ValidateTeamAdminSelfInclusion loop double-queried expressions. HTTP still uses the team-specific check in the api4 handler. Co-authored-by: mattermost-code <[email protected]> * Type CEL attribute names honestly and cover team self-inclusion through the shared write guard. Plugin proxies can omit attribute names, so the editor type now allows null/undefined instead of a string cast. The new team save test hits checkSelfInclusion with a real expression so QueryUsersForExpression is asserted once. Co-authored-by: Cursor <[email protected]> * Satisfy eslint lines-around-comment on CELUserAttribute. Co-authored-by: Cursor <[email protected]> --------- Co-authored-by: Cursor <[email protected]> Co-authored-by: mattermost-code <[email protected]>

  • Bill Gardner(02 Sept 26)

    MM-70247: bump msgpack fork to cap byte-string allocation paths (#37980) * MM-70247: bump msgpack fork to cap byte-string allocation paths * MM-70247: bump golang.org/x/image to v0.43.0 to clear Snyk findings * MM-70247: remove stale go.sum entries after merge

  • Devin Binnie(02 Sept 26)

    [MM-70506] Apply request body size limit to plugin requests (#38229) * [MM-70506] Apply request body size limit to plugin CSRF validation * PR feedback --------- Co-authored-by: Mattermost Build <[email protected]>

  • Devin Binnie(01 Sept 26)

    [MM-69948] Validate roles on team member role updates (#38186)

  • Jesse Hallam(01 Sept 26)

    Avoid blank DMs / 0-count GMs in LHS (#37930) * Load sidebar DM/GM profiles once channels have loaded * Add e2e coverage for sidebar DM/GM profiles on load * Revert "Load sidebar DM/GM profiles once channels have loaded" This reverts commit b56294538b377fd2a05bbaab1750e5408036f281. * Gate sidebar profile loading on the channels and memberships too * Fix sidebar profile initialization load race * Batch the initial sidebar load flags with their data --------- Co-authored-by: Mattermost Build <[email protected]>

  • Jesse Hallam(01 Sept 26)

    Make PerformanceReporterController and PermissionSystemSchemeSettings safe to remount (#38239) * webapp: let PerformanceReporterController be unmounted The effect assumed the component would never unmount and logged an error if it did, so it had no cleanup. React re-runs effects on every mount, and StrictMode mounts twice on purpose, which left an orphaned PerformanceReporter behind on every page load: a PerformanceObserver still observing, a report timer still running, and a visibilitychange listener still attached, all duplicating the telemetry the live reporter sends. The reporter now disconnects on cleanup and ignores web vitals afterwards, since web-vitals callbacks can't be unregistered. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 8587f31f724f5d98a0d7d03af5c920262f667c61) * webapp: replace UNSAFE_componentWillReceiveProps in PermissionSystemSchemeSettings The last unsafe lifecycle left in the web app, and the one StrictMode reports when the system scheme page is opened. componentWillReceiveProps runs during the render phase, so an interrupted render can invoke it more than once per commit; the equivalent check in componentDidUpdate runs once, after the commit. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 68f324d1d32c5be5e9dda7f69ef255b70d2bdfea) --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Jesse Hallam <[email protected]>

  • Jesse Hallam(01 Sept 26)

    Stop react-transition-group from calling findDOMNode (#38236) * webapp: stop react-transition-group from calling findDOMNode Every CSSTransition and Transition in the web app was rendered without a nodeRef, so react-transition-group looked its DOM node up with findDOMNode. React 18 warns about that under StrictMode and React 19 removes the API entirely. Where the transitioning element was already ours, the existing ref is reused. MenuWrapperAnimation and the mobile right drawer animate arbitrary children, so those gained a wrapper element to hang the ref on; both wrappers are static boxes, so the positioned content inside them is unaffected. Passing nodeRef also changes the transition callback signature: the node is no longer the first argument, so AutoHeightSwitcher reads it from its own ref. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit d8ef48856a5f2864e0c6cb8d827a6cf64b1d7a5e) * webapp: update snapshots for the menu animation wrapper Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit c16e038956ab05b54b6d81ee08c02ed4150b89f2) --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Jesse Hallam <[email protected]>

  • Jesse Hallam(01 Sept 26)

    Take react-bootstrap's lifecycle fix and stop shipping a second react-dom (#38240) * webapp: stop bundling a second copy of react-dom into @mattermost/components react-dom is only a devDependency of the package, so rollup inlined the whole renderer (both the development and production builds) into dist/index.esm.js rather than treating it as external. The web app therefore loaded two react-dom instances: the shared singleton, and the one TourTipBackdrop's createPortal call pulled in. Two renderers sharing one tree is a hazard under concurrent rendering, and the duplicate also cost 1.2MB of bundle. dist/index.esm.js drops from 1,264,396 to 83,919 bytes. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 9d42d25a322f8dc9f21b605fe84d5fe2fa34cd89) * webapp: take react-bootstrap's unsafe lifecycle fix TabContent used UNSAFE_componentWillReceiveProps and Dropdown used UNSAFE_componentWillUpdate. React reports both under StrictMode, and neither is safe to interrupt under concurrent rendering. Every tab strip in the web app mounts TabContent, so this reached the emoji picker, drafts, scheduled posts and the admin console. The fix is mattermost/react-bootstrap#14. TabContent's only job in that lifecycle was clearing animation bookkeeping when animation is turned off, which is derived state, and Dropdown reads focus out of the DOM before the menu is removed, which is what getSnapshotBeforeUpdate exists for. Both workspaces that depend on react-bootstrap have to move together. Pinning only channels leaves platform/components on the old commit, which stops npm hoisting the two into one copy and puts a second, unfixed copy in the tree. Co-authored-by: Jesse Hallam <[email protected]> * webapp: repin react-bootstrap to the merged commit mattermost/react-bootstrap#14 landed on 0.34 as a squash merge, d693ec8. The branch was pinned to 797ff61, the pull request head, which is now unreachable from any branch there and will disappear whenever the fork is pruned. Content is unchanged: 797ff61 and d693ec8 share the tree e029175 and the parent c177015, so the lockfile's integrity hash is untouched. Only the resolved commit moves, in both workspaces that depend on react-bootstrap. --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Jesse Hallam <[email protected]>

  • Jesse Hallam(01 Sept 26)

    Remove the remaining string refs (#38237) * webapp: remove string refs from the file preview and multiselect lists String refs are rejected under StrictMode. Neither of these was read: the file preview row is looked up through its data-client-id attribute, and the multiselect list only needs a ref on the selected row. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit 0c718a4324127f74e7d413b29e42bc8d7d64011f) * webapp: remove the remaining string refs from selector modal rows Each of these list rows fell back to a string ref for the unselected case, which strict mode reports because string refs can't be attached twice and don't survive a render being restarted. The unselected row never needs a ref, and nothing read the one AddUsersToRoleModal was setting. Co-authored-by: Jesse Hallam <[email protected]> (cherry picked from commit e727ac0374909de1273ba668b4a541bf379c6999) --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Jesse Hallam <[email protected]>

  • Julien Tant(01 Sept 26)

    [MM-69864][MM-69870] Edit existing attributes and persist Applies-to add/remove on Save (#38056) * [MM-69866] Add Applies-to resource picker (Users, Channels, Posts) to New attribute Adds an "Applies to" Card to the Global Attributes "New attribute" page, letting a sysadmin pick which resources (Users, Channels, Posts) an attribute applies to before saving. Each selected resource becomes its own linked PropertyField, created serially after the template so a partial failure can be attributed to a specific resource and rolled back deterministically (linked fields deleted before the template, per the server's deletion-order protection). A `user`-scoped linked field shares its namespace with Custom Profile Attributes, so name conflicts and the shared 20-field cap are newly reachable failure modes -- both get distinct, actionable banners instead of a generic failure message. Client-only change; no server, migration, or Client4 changes required. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Split the Applies-to row into one component per resource type Replaces the single resourceType-parameterized AttributeAppliesToItem with three dedicated components (User/Channel/Post), each hardcoding its own icon, label, and testids instead of looking them up by a prop. All three share one prop signature (AttributeAppliesToItemProps, exported from attribute_applies_to_constants.tsx) so the parent's Record<ResourceObjectType, ComponentType<...>> lookup map fails to compile if any of the three drift from it. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Fix Prettier formatting in the global_attributes E2E files npm run check for e2e-tests/playwright runs lint && prettier && tsc, and CI's prettier --check step was failing on both files -- they'd only been checked against webapp's ESLint config locally, not this package's Prettier config. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Move the Applies-to row's Remove action into the expanded state The collapsed row no longer has any remove affordance -- the only way to remove a resource is to expand it first, then click "Remove resource" in the header (still a sibling of the toggle, not nested inside its clickable area). Styled per the design prototype: a plain text button, transparent by default, --error-text colored, with a rgba(--error-text-color-rgb, 0.08) hover tint -- the same pattern already used by OrphanedFieldDeleteButton (system_properties) rather than a new one-off style. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Add 12px right margin to the Applies-to row's Remove button Matches the design prototype's spacing between the button and the row's right edge. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Rename applies-to constants file to .ts The file has no JSX, so the .tsx extension was misleading. * Polish the Applies-to card empty state and expanded rows Match the design: updated copy and type, primary/tertiary add buttons, header-only open tint, and a 176px form row in the expanded body. * Drop bottom padding on the last Applies-to body row It stacked with the container padding and looked doubled. * Size Unique name label, value, and Edit to 12px The caption and Edit link were 14px against a 12px label; shrink the edit input to match. * Treat Unique name click-away as Done Opening Edit then clicking away left the input open and froze auto-derivation. Blur now uses the same commit path as Done, matching the channel URL field. * Lock Type to Text while an external source is linked LDAP and SAML only sync on text fields; disabling the type menu until the last chip is removed keeps that invariant in the UI. * Show linked sources on the Options line as Synced with chips Once a source is selected the chips replace the Text help copy; the divider stays until then so the unlinked state still separates Options from the add-source trigger. * Order flex container properties to satisfy stylelint. * Show CPA banners only for Users and copy leftover-template rollback. Channels and Posts name conflicts used User Attribute wording, and a leftover template after a linked-field rollback looked like a clean save. E2E cleanup now rediscovers template and linked fields instead of relying on the success-path list. * Use Compass Button for Applies-to row chrome. Override quaternary styling so the accordion header stays body-text chrome, and keep Remove as tertiary destructive. * Await hanging creates before unmount-save negative asserts. waitFor(() => Promise.resolve()) returns on the first check and can pass before finalizeSave, so the mount guard was not actually load-bearing. * Drop unused PropertyField and ResourceObjectType imports from the Playwright spec. * [MM-69864][MM-69870] Edit existing attributes and persist Applies-to add/remove on Save Open the Definition form for managed attributes, PATCH on Save, and keep Applies-to add/remove local until Save diffs against the linked fields loaded at mount. Co-authored-by: Julien Tant <[email protected]> * Wait for deferred Edit navigation in listing tests and satisfy no-negated-condition. Co-authored-by: Julien Tant <[email protected]> * Format Playwright global attributes edit tests with Prettier. Co-authored-by: Julien Tant <[email protected]> * Split Global Attributes Playwright specs into listing and form files. Flag-off access-gate coverage stays in the listing spec so the form spec never turns GlobalAttributes off. Co-authored-by: Julien Tant <[email protected]> * Use dedicated type-lock tooltip copy and skip Applies-to focus on edit hydrate. The external-source lock was showing the accessible name as a tooltip. Edit hydration of all three resource types was treated as adding the last type and stole Display name autofocus. Co-authored-by: Julien Tant <[email protected]> * Fix Applies-to removal data-loss and lock Name while resources are linked. Addresses review feedback: Save deleted removed linked fields before PATCHing the template, so a PATCH failure unrelated to type (e.g. a name conflict) still lost every value on the removed resource. Save now orders DELETE/PATCH based on whether the type actually changed -- PATCH first when it didn't, so a failure aborts before anything is deleted -- and warns with a confirmation dialog before removing any resource with a persisted linked field. Also locks Unique name editing while a linked field is still persisted, since the server does not propagate a rename onto it. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Report partial-save, not "nothing else was saved", when the removal DELETE fails after a successful PATCH. deleteRemovedLinkedFields is called both before and after the template PATCH depending on typeChanged, but reused the same error copy for both -- "nothing else was saved" is only true for the before-PATCH case. Give the after-PATCH case its own applies_to_remove_partial_save error kind/message so the banner doesn't contradict the update that actually went through. Co-Authored-By: Claude Sonnet 5 <[email protected]> * Disable linking a new external source while an attribute still applies to a resource * Fix Unique name silently unpinning after a no-op Edit/Done round-trip in edit mode. handleDoneClick's "did the committed value change from the current auto-slug" heuristic is correct for create mode (a coincidental match keeps live derivation on) but was also applying in edit mode, where the loaded name must stay pinned regardless. When the persisted name happened to equal the current auto-slug, opening Edit and clicking Done with no real change would unpin it, and the next Display name edit would silently re-slug the Unique name out from under the admin. Reported by Lindy on the PR. Adds Jest and Playwright regression coverage; verified the Playwright tests reproduce the exact symptom when the fix is reverted. Co-Authored-By: Claude Sonnet 5 <[email protected]> --------- Co-authored-by: Claude Sonnet 5 <[email protected]> Co-authored-by: Mattermost Build <[email protected]> Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Julien Tant <[email protected]>

  • Jesse Hallam(01 Sept 26)

    Allow direct modifications to non-English translation files (#38218) i18n-ci-template.yml existed to fail any PR that touched a non-English translation file unless it came from the weblate account, back when translations arrived exclusively through Weblate. Translations can now be authored in-repo and land in the same PR as the English string they translate, so that gate rejects exactly the change it should be letting through. The changed-file detection stays -- a direct edit to a locale catalog is still worth surfacing on the PR -- but it emits a warning annotation instead of failing, and the weblate-account bypass is gone with nothing left to bypass.

  • Ibrahim Serdar Acikgoz(01 Sept 26)

    Remove unused ABAC audit logging setting from system console (#38252)

  • Devin Binnie(01 Sept 26)

    [MM-70507] Filter OAuth endpoint requests that hit reserved IPs (#38222)

  • Jesse Hallam(01 Sept 26)

    MM-68613: raise post message size limit to 1MB (#37300) * MM-68613: raise post message size limit to 1MB * Read MaxPostSize from client config in E2E specs MaxPostSize is a computed value only present in the client config, not the admin config, so request the old-format client config.

  • Jesse Hallam(01 Sept 26)

    Graduate email notification settings to Site Configuration > Notifications (#38024) * [MM-57554][MM-57555] Graduate email batching buffer size and interval Move EmailSettings.EmailBatchingBufferSize and EmailSettings.EmailBatchingInterval out of System Console > Experimental > Features and into Site Configuration > Notifications, immediately after Enable Email Batching so the batching controls read as one group. The config keys, defaults and server-side semantics are unchanged. The access struct tags move from experimental_features to site_notifications so the settings are governed by sysconsole_read/write_site_notifications, and the settings now inherit the same gating as Enable Email Batching: disabled without email notifications, without email batching, in High Availability mode or without a Site URL, and hidden on Cloud where email batching itself isn't exposed. The i18n ids move from admin.experimental.* to the Notifications page convention, and the documentation entries move from the experimental configuration settings page to the site configuration settings page. * [MM-57819] Graduate use channel name in email notifications Move EmailSettings.UseChannelInEmailNotifications out of System Console > Experimental > Features and into Site Configuration > Notifications, next to Email Notification Contents since both shape email notification content. The config key, default and server-side semantics are unchanged. The access struct tag moves from experimental_features to site_notifications so the setting is governed by sysconsole_read/write_site_notifications, the i18n ids move to the Notifications page convention, and the documentation entry moves from the experimental configuration settings page to the site configuration settings page. * [MM-57554] Correct email batching queue-full documentation Immediate sends happen when the receiving buffer is full, not when queue size is compared to the batching interval. Point admins at increasing EmailBatchingBufferSize instead of decreasing the interval. Co-authored-by: mattermost-code <[email protected]> * [MM-57554] Cover graduated notification settings in admin console search Assert unique terms for Email Batching Buffer Size and Use Channel Name in Email Notifications so the index test does not pass from the pre- existing Enable Email Batching label alone. Co-authored-by: mattermost-code <[email protected]> * [MM-57554] Point experimental docs jq example at a remaining setting EmailBatchingBufferSize moved to Site Configuration > Notifications, so the experimental page's config.json lookup example now uses LinkMetadataTimeoutMilliseconds. Co-authored-by: mattermost-code <[email protected]> * [MM-57554] Drop redundant email batching isDisabled conditions The graduated Email Batching Buffer Size and Interval settings repeated the parent Enable Email Batching bool's own conditions. Depend on the parent alone, as enforced by @mattermost/no-redundant-admin-config-deps. * Trigger CI after removing paired enterprise branch --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: mattermost-code <[email protected]>

  • cursor[bot](01 Sept 26)

    [MM-70213] Allow custom URI schemes in DCR redirect URI validation (#37917) * [MM-70213] Allow custom URI schemes in DCR redirect URI validation The DCR redirect URI allowlist and client registration validation only permitted http:// and https:// schemes, which blocked desktop OAuth clients that use custom URI schemes (e.g. cursor://). Introduce IsValidDCRRedirectURI, which accepts any absolute URI with a scheme and host, and use it for both allowlist pattern validation and client registration redirect URI validation. Opaque URIs without a host (e.g. javascript:, data:) remain rejected. Co-authored-by: mattermost-code <[email protected]> * [MM-70213] Note custom URI scheme support in DCR allowlist help text Update the DCR Redirect URI Allowlist admin console help text to mention that custom URI schemes used by desktop OAuth clients are supported in addition to http and https. Co-authored-by: mattermost-code <[email protected]> * [MM-70213] Expand DCR redirect URI validation test coverage Add coverage for control-character rejection, whitespace inputs, invalid pattern/candidate glob paths, query wildcard matching, whitespace allowlist entry skipping, and query-required-but-absent matching. Co-authored-by: mattermost-code <[email protected]> * [MM-70213] Reject dangerous schemes in DCR redirect URIs Authority-form URIs like javascript://host/... parse with a scheme and host, so the previous host check alone accepted them as OAuth redirect targets. Reject javascript/data/vbscript/file/blob/about case-insensitively while preserving custom desktop schemes. Co-authored-by: mattermost-code <[email protected]> * [MM-70213] Accept custom scheme callbacks for DCR-registered OAuth apps DCR client registration maps redirect URIs to OAuthApp.CallbackUrls, but OAuthApp.IsValid still validated every callback with IsValidHTTPURL, so a custom-scheme redirect URI (e.g. cursor://) passed ClientRegistrationRequest validation and the allowlist check yet failed at SaveApp. Dynamically registered apps now validate callbacks with IsValidDCRRedirectURI; manually created OAuth apps remain restricted to http/https. --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: mattermost-code <[email protected]>

  • cursor[bot](01 Sept 26)

    Fix flaky TestCopyEmojiImages (#38156) TestCopyEmojiImages used a hardcoded ../exported_emoji_test path that resolves to a shared /tmp/exported_emoji_test directory for all parallel tests in the package. Concurrent TestExportCustomEmoji cleanup could remove that directory or leave it behind, causing mkdir/file-exists and missing-file assertion flakes under ENABLE_FULLY_PARALLEL_TESTS. Scope fixture paths with t.TempDir() per test and drop the unnecessary shared-directory cleanup in TestExportCustomEmoji (exportFiles=false). Tests-only change. Verified with `go test -run '^TestCopyEmojiImages$' -race -count=100` locally. Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: mattermost-code <[email protected]>

Mattermost Security

7.5/10

Repo Security Summary

Updated 24 Aug 26

  • Code-Review10/10
  • CII-Best-Practices0/10
  • Maintained10/10
  • Dangerous-Workflow10/10
  • Security-Policy10/10
  • License9/10
  • Signed-Releases10/10
  • Branch-Protection4/10
  • Token-Permissions0/10
  • Binary-Artifacts10/10
  • Packaging10/10
  • Pinned-Dependencies7/10
  • SAST10/10
  • Fuzzing0/10

Mattermost Website

Website

Mattermost | Collaboration Platform for Mission Critical Work

Accelerate your mission critical workflow by integrating people, processes, tools and AI infrastructure on a resilient and adaptable platform.

Redirects

Does not redirect

Security Checks

All 65 security checks passed

Server Details

  • IP Address104.18.1.109
  • LocationSan Francisco,California,United States of America,NA
  • ISPCloudFlare Inc.
  • ASNAS13335

Associated Countries

  • USUS

Safety Score

Website marked as safe

100%

Blacklist Check

mattermost.com was found on 0 blacklists

  • AntiSocial Blacklist
  • Artists Against 419
  • Badbitcoin
  • Bambenek Consulting
  • CERT Polska
  • CoinBlockerLists
  • CRDF
  • CryptoScamDB
  • EtherAddressLookup
  • EtherScamDB
  • Fake Website Buster
  • MetaMask EthPhishing
  • NABP Not Recommended Sites
  • OpenPhish
  • PetScams
  • PhishFeed
  • PhishFort
  • Phishing.Database
  • PhishStats
  • PhishTank
  • Phishunt
  • RPiList Not Serious
  • Scam.Directory
  • SecureReload Phishing List
  • Spam404
  • StopGunScams
  • Suspicious Hosting IP
  • ThreatFox
  • ThreatLog
  • TweetFeed
  • URLhaus
  • ViriBack C2 Tracker

Website Preview

Website preview

Mattermost Android App

APK Info

  • AppMattermost
  • Creation Date17 Dec 17
  • Last Updated19 Jul 24
  • Current Version1.5.1
  • CreatorMattermost
  • Downloads10,000+ downloads
  • Privacy ReportView on Exodus →

De-Googled Compatibility

Native3.00/ 41 ratings
microG3.00/ 41 ratings

Tested on Android 15 · Updated 11 May 25 · View on Plexus →

Trackers

  • Sentry

Permissions

  • Access Network State
  • Camera
  • Internet
  • Read App Badge
  • Read External Storage
  • Receive Boot Completed
  • System Alert Window
  • Vibrate
  • Wake Lock
  • Write External Storage
  • Update Count
  • Receive
  • Send
  • Read Settings
  • Update Shortcut
  • Change Badge
  • Read Settings
  • Write Settings
  • Update Badge
  • C2d Message
  • Read Settings
  • Write Settings
  • Read
  • Write
  • Broadcast Badge
  • Provider Insert Badge
  • Badge Count Read
  • Badge Count Write

Mattermost iOS App

App Info

Mattermost

Requires Mattermost Server v10.11.0+. Older servers may not be able to connect or have unexpected behavior. ------- Mattermost is the leading collaborative workflow platform for defense, intelligence, security, and critical infrastructure. The platform runs on-premises and in private clouds, delivering secure messaging, file sharing, workflow automation, audio/screenshare, and project management—all with full data and operational control. - Securely share messages, files, and links across from your preferred mobile devices. - Start 1:1 and group voice calls with a single click without leaving Mattermost. - Keep critical workflows moving forward with Playbook. - Get the message out without having to manage every endpoint with Enterprise Mobility Management (AppConfig) support. - Private mobility with ID-only push notifications to keep sensitive data protected while keeping stakeholders informed. To use this app, you need a URL for a Mattermost server. ------- Deploy your own server: https://docs.mattermost.com/guides/deployment.html Terms of Service: https://mattermost.com/terms-of-service/ Contribute to the project: https://github.com/mattermost/mattermost-mobile

Rating

Rated 4.76 out of 5 stars by 5,651 users

Version Info

  • Current Version2.42.3
  • Last Updated06 Aug 26
  • First Released10 Jul 17
  • Minimum iOS Version16.0
  • Device Models Supported127

App Details

  • IPA Size92.95 Mb
  • PriceFree (USD)
  • Age Advisory4+
  • Supported Languages21
  • DeveloperMattermost, Inc.
  • Bundle IDcom.mattermost.rn

Screenshots

  • App screenshot
  • App screenshot
  • App screenshot
  • App screenshot

Mattermost Reviews

More Team Collaboration

  • Privacy-focused messenger using the Matrix protocol. The Element client allows for group chat rooms, media sharing, voice and video group calls. End-to-end encryption by default for message content, but not metadata, which remains visible to the home server operator.

    Security Audited Open Source element-hq/element-web
  • Easy-to-deploy, self-hosted Slack alternative with polished cross-platform apps. End-to-end encryption is supported, but off by default - without it, workspace admins can read all messages. Usage statistics are sent by default.

  • A decentralized, encrypted P2P friend-to-friend app for chat, forums, channels, boards, voice calls and anonymous file sharing. Best for trusted contacts, as it isn't anonymous unless you route it through Tor (off by default).

  • Open source team chat organized around topic-based threading, which keeps busy conversations easier to follow than channel-only tools. Can be self-hosted, or used as a paid cloud service. The threading model takes some getting used to.

About the Data: Mattermost

Change History

  • Amended (description, openSource, url) by @lissy93 #770
  • Amended (androidApp, iosApp)

Edit Mattermost Data

You can edit Mattermost's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

Origin Data

Modify Data

API

You can access Mattermost's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/mattermost

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share Mattermost

Help your friends compare Team Collaboration, and pick privacy-respecting software and services.
Share Mattermost and Awesome Privacy with your network!