Tech Digest

Communication

Mattermost

Self-hosted team chat shaped like Slack, with free tiers that narrowed sharply in v11

CommunicationAGPL-3.0 core, Mattermost Source Available License for `server/enterprise/`, Apache-2.0 for webapp and admin tools, MIT for official binariesMaturex86-64 onlyNative OIDC
Last reviewed Profile maintained against the project's own documentation
Operational load
3 / 5
Moderate
Idle memory
500 MB
typical use ~1500 MB
Moving parts
2
containers in a normal deployment
Backup shape
Postgres dump
needs a dump or a stop

Mattermost is a self-hosted messaging platform with channels, threads, file sharing and integrations, aimed at a single organization rather than a federated network. It replaces Slack or Microsoft Teams on your own PostgreSQL and your own disk.

Our verdict on Mattermost#

Mattermost is the pragmatic answer when you want Slack's shape without Slack's invoice, and in 2026 you have to choose your free edition deliberately. Team Edition is the AGPL build with unlimited message history, but from v11 it is capped at 250 activated users and no longer ships GitLab SSO, so free means local accounts. Entry, introduced October 2025, hands you the Enterprise Advanced feature set and then meters it: 10,000 channel messages of searchable history, 10,000 push notifications a month, 1,000 board cards, five playbook runs a month, 40 minute calls and 250 AI queries a month. Paid tiers gate AD/LDAP and SAML, group sync, compliance export, high availability clustering and Elasticsearch. v11 also removed MySQL support rather than deprecating it, so PostgreSQL 14 or newer is mandatory. Official images are amd64 only; an ARM board needs a community build.

Who Mattermost is for#

Choose it if

  • A small business leaving Slack that wants the same interface and will either accept local accounts or pay for SSO.
  • Teams under 250 people who value unlimited searchable history more than enterprise features: that is Team Edition, not Entry.
  • GitLab shops that already run PostgreSQL and want chat sitting next to CI.
  • Anyone who needs on-premises compliance export or eDiscovery and is prepared to buy Enterprise for it.

Look elsewhere if

  • You want to federate with other servers or other people's communities. Mattermost does not federate; that is Matrix's job.
  • Your server is a Raspberry Pi or another arm64 box. There is no official ARM image, only community rebuilds.
  • You need SSO without paying. Since v11 that combination no longer exists in any free edition.

What running it actually looks like#

Two containers, the Mattermost app and PostgreSQL 14 or newer, plus an optional third for nginx if nothing else terminates TLS. The app listens on 8065. Before the first start create ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes} and chown them to UID 2000, because the container runs unprivileged and a permission mismatch is the classic first failure. Set SiteURL in the System Console immediately: push notifications, OAuth callbacks and email links all break silently when it is wrong. On first run, the first account created becomes system admin. Upgrades are in place: stop, change the image tag, start, and the server migrates the schema on boot. Do not skip major versions, and if you are still on MySQL, that path terminates at v11.

Resource profile#

Memory
500 MB idle, around 1500 MB in ordinary use. The requirements docs quote 2 GB RAM and 1 vCPU for up to 1,000 users. The Go server itself is modest; PostgreSQL and the built-in Bleve search index take most of the rest.
CPU and acceleration
One vCPU covers a small team per the requirements table. Spikes come from Bleve index rebuilds and from Calls, which relays audio through the server rather than peer to peer.
Storage growth
PostgreSQL holds posts and grows slowly. The `data/` directory holds every upload and is what actually gets large; `bleve-indexes` also grows but is regenerable.
Operational load
3 of 5, Moderate. One app container plus a real database, and in-place upgrades that are usually clean. It scores 3 because v11 removed MySQL support outright and changed what the free editions contain, which is exactly the class of change you only survive by reading release notes.

Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.

Data and backup surface#

Back up a pg_dump of the Mattermost database and the data/ directory, which holds every uploaded file and every custom emoji. config/config.json matters only if you configure through the file; on modern installs most settings live in PostgreSQL instead, which means the database alone carries your configuration. bleve-indexes is regenerable: exclude it and rebuild from the System Console after a restore. logs/ is disposable. A live copy of data/ is safe because uploaded files are write-once, but dump PostgreSQL properly rather than copying its data directory. Restore the database first, then files, then start the app so schema and blobs agree.

Derived backup shape

Postgres dump. pg_dump (or pg_dumpall) into a file, then snapshot that file plus the app's data volume.

Traps and surprises#

v11 removed MySQL rather than deprecating it

From v11 the MySQL driver is gone from the codebase and the server errors out on an invalid configuration instead of warning. If you are on MySQL or MariaDB you must migrate to PostgreSQL 14+ while still on a v10 release, using the documented migration tooling, and verify it before touching the v11 tag. MariaDB is not a drop-in substitute for MySQL here either; it is explicitly unsupported.

Entry hides history, it does not delete it

The Entry edition's 10,000 message limit applies across all channels server-wide, and older posts remain in the database but stop being searchable or reachable. That means the limit is silent: nothing errors, people just cannot find last quarter's decision. If you later license Professional or Enterprise the history comes back. If you never do, you are running a chat server whose archive you cannot read.

Team Edition lost SSO in v11

GitLab SSO was the one single sign-on method Team Edition had, and it was removed in v11 as part of repositioning Team Edition for hobbyists and small teams, alongside a 250 activated user cap. If you upgrade a GitLab-authenticated Mattermost to v11 without planning, your users cannot log in. Provision local accounts or move to a licensed edition first.

Volume permissions are the usual first failure

The app container runs as UID 2000 and will not create its own directory tree. If ./volumes/app/mattermost/* is owned by root, the container starts and then fails on config write or file upload with errors that read like database problems. chown -R 2000:2000 on the volume tree before the first docker compose up saves an hour.

No official arm64 image

Mattermost documents support for 64-bit x86 only, and the official mattermost/mattermost-team-edition and mattermost-enterprise-edition tags publish amd64 manifests only. Community arm64 rebuilds exist and generally work, but they lag official releases and you are trusting a third party with your chat server. Plan for x86 hardware or a VPS if you want supported builds.

Specifications#

Category
Chat, mail and notifications
Licence
AGPL-3.0 core, Mattermost Source Available License for `server/enterprise/`, Apache-2.0 for webapp and admin tools, MIT for official binaries (Source available)
Written in
Go / React
First release
2015
Maturity
Mature
Datastore
PostgreSQL 14+
Default ports
8065
Ships as
docker, deb/rpm package, native binary (tar.gz), kubernetes operator
arm64 builds
No
Identity
Native OIDC. OIDC and SAML are compiled into the binary but unlock only with a license key; from v11 Team Edition lost even GitLab SSO, so free self-hosters get local accounts.
Replaces
Slack, Microsoft Teams, Discord, Google Chat
Project site
mattermost.com
Source
github.com/mattermost/mattermost
Documentation
docs.mattermost.com

Alternatives to Mattermost#

Everything else in chat, mail and notifications, closest in operational weight first.

ToolOps loadIdle RAMLicence
Stalwart3, Moderate150 MBAGPL-3.0 for the Community edition, dual licensed with the proprietary Stalwart Enterprise License for gated features
Synapse4, Heavy700 MBAGPL-3.0-only (or a commercial license from Element)
mailcow: dockerized4, Heavy3500 MBGPL-3.0 for mailcow's own code; bundled components keep their own licenses
Gotify1, Set and forget20 MBMIT
ntfy1, Set and forget30 MBApache-2.0 (dual licensed with GPL-2.0)

Where Mattermost comes up elsewhere#

Migration guides

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.