The short answer
For a company moving off Slack, pick Mattermost: it looks and works most like Slack, took our Slack export best, accepts Slack-style webhooks, comes in Swedish and needs about 130 MB of memory. Its free edition has no guest accounts, no single sign-on, no group calls and no retention rules; those need a paid licence. Pick Zulip if your team works asynchronously and wants guests, single sign-on and retention for free: every message has a topic, which makes catching up easy, but it needs about 2.3 GB of memory, its Swedish translation is about 9 % done, and its Slack import needs your Slack workspace to still be running. Pick Matrix if you need end-to-end encryption or federation with other organisations: it is the only one of the three that encrypts private chats so the server cannot read them, and the only one where partners can join from their own servers, but it has no guests, webhooks or importer of its own, and users must look after their recovery keys.
What we tested
We installed all three on the same fresh Melonslab VC-P Alloy (2 vCPU, 8 GB) with Debian 13 by following our guides step by step: Mattermost with rootless Podman, a Matrix server with rootless Podman with the Matrix calls guide, and Zulip with rootless Podman. Each ran under a user of its own, behind the same Caddy, and all three ran at the same time: with all three running, the whole server used 3.3 GB of its 8 GB, including Caddy and the system. Every step in the guides worked as written.
Then we set up the same team in all three:
- four users: Anna, the admin, Bo and Cecilia, and Gustav, a customer, as a guest who should see one channel only;
- five channels: general, projekt, support, a private ledning for Anna and Bo, and kund-acme, the only one Gustav was invited to;
- the same six messages, four of them in Swedish, such as "Semestern börjar vecka 28, glöm inte att söka friskvårdsbidrag före juni." and "Fakturan från Göteborg är betald";
- a thread under Anna's first message, where Bo mentioned Anna and attached a 300 KB file;
- a direct message from Anna to Bo, an edited message and a deleted one.
We then ran the same 22 searches as Bo and as Cecilia, sent a monitoring alert to each one's incoming webhook, posted as a bot through each API, checked the email notifications, tried the retention settings, imported the same Slack export, rebooted the server, measured memory at rest and while three people used each app, and ran each guide's backup. We drove all of this through each app's API, as the same three users, rather than clicking through a browser. Phones and calls are covered under their own headings below.
Slack and Microsoft Teams themselves were not tested. We did not sign up for either. What this page says about them comes from Slack's and Microsoft's own pages, linked where we use them and read on 14 October 2026.
The numbers
| Mattermost 11.11.1 | Matrix: Synapse 1.162.0 | Zulip 12.3 | |
|---|---|---|---|
| Containers | 2: Mattermost, PostgreSQL 17 | 2: Synapse, PostgreSQL 18; calls add LiveKit and an authorization service | 5: Zulip, PostgreSQL 14, RabbitMQ, Redis, memcached |
| Memory at rest after a reboot | 131 MB (Mattermost 116) | 151 MB (Synapse 135); calls add 19 MB | 2.31 GB (Zulip 2.11 GB, RabbitMQ 177 MB) |
| Memory at the peak of use | 189 MB | 173 MB | 2.56 GB |
| Images on disk | 0.98 GB | 0.66 GB, and 0.12 GB for calls | 3.65 GB |
| Data after the test | 238 MB, mostly plugins Mattermost unpacks | 78 MB | 126 MB |
From useradd to a working login | 1 minute 20 seconds | 1 minute 16 seconds, and 22 seconds for calls | about 6 minutes |
| Guest limited to one channel, free | no, paid licence | no guest role; a space with restricted rooms comes close | yes |
| End-to-end encryption | no | yes, in private rooms and direct messages | no |
| Slack import | yes, with mmetl | no, only bridges to a running Slack | yes, but only with a live Slack token |
| Webhook from a monitoring tool | Slack format | none built in | Slack format and over 130 ready-made integrations |
| Single sign-on, free | no | OpenID Connect, SAML, CAS | SAML, OpenID Connect, LDAP, Google and more |
| Retention rules, free | no, paid licence | yes, in Synapse's settings | yes |
| Group calls, free | no, one-to-one only | yes, with LiveKit | through Jitsi or BigBlueButton |
| Swedish interface | yes | yes, in Element | about 9 % translated |
| Licence | MIT for the Team Edition image, AGPL 3.0 source | AGPL 3.0 | Apache 2.0 |
Memory is the sum of each app's containers, measured with podman stats five and a half minutes after a reboot. The peak is the highest reading while Anna, Bo and Cecilia posted, searched and read a channel through each app's API for three minutes, about five requests a second in all. Times are how long the guide's commands took to run, mostly downloading images, not the time you need to read and type them. Our messages and files take well under a megabyte; the rest of the data is the databases themselves and, for Mattermost, its plugins.
Setup
All three are a few containers behind Caddy, and all three guides worked as written. The differences:
- Mattermost is two containers. The guide creates the admin and the team from the command line before Mattermost goes online, and colleagues join with an invite link. It was the quickest to a working login.
- Matrix is two containers, and two more for calls from a second guide. It also needs two small files on your main domain, so that addresses can be
@anna:example.comwhile the server runs atmatrix.example.com, and that server name cannot be changed later. There is no admin web interface: you create accounts from the command line. Our Matrix guide has no email step; we added Synapse's email settings ourselves for this test. - Zulip is five containers and 3.6 GB of images, and its first start took about six minutes, most of it downloading. Each later start takes about a minute and a half. It needs working email before you invite anyone, since invitations and sign-up confirmations go by email.
Day-to-day use
Mattermost is organised like Slack: a team with channels in a sidebar, threads that open beside the channel, direct messages, mentions, reactions and Markdown. Editing a message marks it as edited, and deleting one removed it for everyone.
Matrix, through Element, is organised around rooms, gathered in spaces. A space is the closest thing to a Slack workspace: we made a space called Example and let its members join the team's rooms. People are invited by their Matrix address and accept before they see a room. Threads, mentions, reactions, edits and deletion all worked. An edit is a new message that replaces the old one on screen, and search still finds the old text: after Anna changed "torsdag" to "fredag", a search for torsdag still found her message.
Zulip puts every channel message under a topic, such as projekt > Semester. A topic works like a thread that has a name, and a channel holds many of them. When you come back after a day away, the inbox lists what you have not read, topic by topic. Editing kept every earlier version, which anyone could open; Bo, an ordinary member, could delete his own message, which the organisation's settings decide.
In all three, a 300 KB file attached in the thread downloaded intact for Cecilia.
Guests
Our test guest, Gustav from a customer, should see kund-acme and nothing else.
- Mattermost Team Edition has no guests. Creating one failed with "Your license does not support guest accounts". The account was created as an ordinary user, who can see every public channel and every user in the team. Mattermost's pricing page, read on 14 October 2026, lists guest accounts in its paid editions, with single-channel guests free up to one per paid user.
- Matrix has no guest role. We came close with a space: the team's rooms were open only to the space's members, and Gustav, who was invited to kund-acme only, got "You do not belong to any of the required rooms/spaces to join this room." when he tried to join projekt, and found nobody else when he searched the user directory. He can still start a direct message with anyone whose address he knows. And files are not tied to rooms in Matrix: Gustav could download the file Bo posted in projekt when we gave him its address, although a visitor without a login could not.
- Zulip has a guest role. Gustav saw only kund-acme, joining projekt failed with "Not allowed for guest users", and Bo's file in projekt answered him with
403. Zulip adds new users to its default channels, so untick those when you invite a guest, as its guide explains. One setting also hides the other users from guests.
Search, in English and Swedish
We ran the same 22 searches as Bo and as Cecilia, who is not in ledning. All three kept Cecilia's results to what she could see. Results for the Swedish words:
| Search | Message says | Mattermost | Matrix | Zulip |
|---|---|---|---|---|
semestern | "Semestern" | found | found | found |
semester | "Semestern" | no | no | no |
friskvårdsbidrag | "friskvårdsbidrag" | found | found | found |
friskvård, bidrag | "friskvårdsbidrag" | no | no | no |
fakturan / faktura | "Fakturan" | found / no | found / no | found / no |
göteborg / goteborg | "Göteborg" | found / no | found / no | found / no |
älvsjö | "Älvsjö" | found | no | found |
konferensrum | "konferensrummet" | no | no | no |
The pattern is the same in all three: whole words only, no Swedish word forms, no parts of compound words, and å, ä and ö must be typed. In English, all three understand word forms: restore found "restoring" and snapshots found "snapshot".
Two differences:
- Mattermost finds the start of a word with
*:friskv*,semest*andbudget*all found their messages. Synapse did not understand*. - Synapse did not find
älvsjöin lower case, onlyÄlvsjö. Synapse requires a database with theCcollation, as our Matrix guide sets up, and with it PostgreSQL does not turn a capital Å, Ä or Ö into lower case. Words that start with one of them are found only with the same capital letter.
And in Matrix, the server cannot search encrypted rooms at all: ledning, which was encrypted, is searched only in Element's desktop app, on each user's own computer.
Edits, deletion and retention
All three let people edit and delete their messages, and an admin can limit both.
- Mattermost keeps messages forever in Team Edition. Retention rules answered "Your license does not support Data Retention."; they are in its Enterprise edition, according to its pricing page.
- Synapse has retention rules in its own settings, for the whole server and per room. We switched them on and set a one-year limit on support, which Synapse accepted; we did not wait to see messages expire.
- Zulip has a retention period for the organisation and per channel in the free version. We set 365 days through the API, and it was accepted.
Webhooks and bots
We sent each app the same alert, in the JSON that Prometheus Alertmanager sends, and the same alert in Slack's webhook format, which most monitoring tools can send.
- Mattermost posted the Slack-format alert, with its colour and fields, straight away. The Alertmanager JSON was refused with "Failed to handle the payload of media type application/json". A bot account with a token posted through the API, after we switched on Enable Bot Account Creation and Enable Personal Access Tokens, which are off by default.
- Zulip has a ready-made Alertmanager integration, which posted "FIRING BackupFailed", and a Slack-compatible webhook, which posted the Slack-format alert. The Alertmanager JSON sent to the Slack webhook was accepted, but nothing was posted. Its generic bot posted through the API without any setting.
- Synapse has no webhooks. The address we tried answered "Unrecognized request". Webhooks in Matrix need a separate service, such as Element's matrix-hookshot, which we did not test. A bot is an ordinary Matrix account that a script logs in as, and it posted fine; it cannot read encrypted rooms unless it supports encryption.
Email notifications
We pointed all three at a test mail server on the same server and sent Cecilia a direct message while she was away.
- Mattermost sent "New Direct Message from @anna" within a minute.
- Zulip sent "DMs with Anna Andersson" about two minutes later.
- Synapse sent its notification after ten minutes, as it waits that long before mailing about unread messages. It needs settings our Matrix guide does not include, and each user must add an email address in Element first.
Phones, desktop apps and push
All three have official apps for Windows, macOS, Linux, Android and iOS: Mattermost's own, Element and Element X for Matrix, and Zulip's own. We did not test them on phones: our test server used test certificates the apps do not trust.
Push notifications to phones are where a third party comes in. Apple and Google only deliver notifications from the app's maker, so each app sends them through a service its maker runs. According to each project's documentation, read on 14 October 2026:
- Mattermost uses
push-test.mattermost.comby default, which we saw in the server's settings. Its documentation calls it a free, basic service for non-commercial self-hosted customers, without production SLAs; the production service is for Professional and Enterprise customers. Our guide limits notifications to the sender and channel, not the text. Running your own push proxy means building your own apps. - Matrix: Element's apps from the app stores get notifications through Element's push gateway, Sygnal, and on through Apple and Google. For encrypted rooms, a notification carries only an ID, and the app fetches and decrypts the message itself. On Android, Element can also use UnifiedPush with your own ntfy server, so no notification passes Google; on iOS, that is not possible.
- Zulip sends notifications through its own service at
push.zulipchat.com, encrypted from your server to the phone in Zulip 12. It is free for up to 10 users; larger organisations need a paid plan, and registering the server shares some basic statistics with Kandra Labs, as the Zulip guide describes.
Calls
We did not make calls in browsers on this test server. Here is what we checked, and what our earlier comparison of Mattermost and Matrix saw on the same versions with two real browsers.
- Mattermost comes with its Calls plugin, which our guide switches off because it needs a UDP port of its own. Switched back on as the guide shows, it reported group calls as not allowed and video off, and a STUN server at
stun.global.calls.mattermost.com. Our earlier test connected a one-to-one call in a direct message; the call button was missing in channels. Group calls are in the paid editions, according to the pricing page. - Matrix calls come from the calls guide: LiveKit and Element's authorization service, set up here in 22 seconds. Synapse told apps where the call service was. The authorization service could not check our users here, because it does not trust test certificates; with real certificates, our earlier test made a group video call in Element with no licence.
- Zulip does not run calls itself. Its video and phone buttons create a call on
meet.jit.si, Jitsi's public server, by default, which was the only choice offered. You can point it at your own Jitsi Meet, or set up BigBlueButton or Zoom in the server's settings.
Import from Slack
We did not use a real Slack workspace. We built a small export by hand in the format Slack's export help page and Slack's export files describe, and say plainly: this is a constructed export, not one from Slack. It held:
users.jsonwith four users, Anna as owner and Gustav as a single-channel guest;channels.jsonwith four public channels,groups.jsonwith the private ledning anddms.jsonwith one direct message;- a folder per channel with a day's messages: a thread with a reply that mentions Anna and has a PDF file, reactions, an edited message, Swedish text, and an alert from a bot with a coloured attachment.
Slack's export holds links to files, not the files themselves. Mattermost's tool expects the files to have been fetched into the ZIP file first, so we made a second copy with the PDF in an __uploads folder, as Mattermost's documentation describes.
What came out:
- Mattermost imports with two tools:
mmetl0.6.0 turns the export into Mattermost's import format, andmmctl import processloads it. The first run stopped with "Cannot demote last System Admin.": Anna already existed as our admin, and the Slack export made her an ordinary user. After we changed her role in the converted file, the second run brought in every channel, the private channel, the direct message, the thread with its file, the reactions, the mention and the bot's alert. The edited mark was lost. Two things to know: the import changed the existing accounts with the same names, so Anna, Bo and Cecilia had to be given new passwords; and Gustav came in as a guest who could not log in, as guests need a licence.mmetlhas a--guest-handling useroption for that. - Zulip has
convert_slack_databuilt in, but it needs a Slack bot token with theusers:read,users:read.email,team:readandemoji:readpermissions. It checks the token with Slack and reads users, emoji and the workspace from Slack's API while it runs, so it stopped with "Invalid token" on our constructed export. It also refused the copy with the files in it: "Uploaded zip file is not a valid Slack export." To see the rest, we ran the converter once more in a test harness that answered those three Slack API calls from ourusers.json, which a reader cannot do. Users came in with their roles, Gustav as a guest, with the channels, the private channel, the direct message and the reactions. Our thread became a topic of its own, named after its date and first words, and the other messages landed under the topic "imported from Slack". The bot's alert came through as a heading and text, and the edited mark was lost. Our PDF stayed a link, as Zulip only downloads files stored atfiles.slack.com, with the token. Plan to convert before you close the Slack workspace. The same Zulip image also has importers for Microsoft Teams and Mattermost, which we did not test. - Matrix has no importer for a Slack export. Bridges such as mautrix-slack connect a running Slack workspace to Matrix, with a Slack user's login, so that messages pass both ways. That suits a move in stages, while both are in use; we did not test one.
What a Slack export holds depends on your plan, according to Slack's help page: on Free and Pro, only public channels; private channels and direct messages need Business+ or Enterprise, and on Business+ the owner must apply for it.
Single sign-on and encryption
Single sign-on. We tested only the passwords each guide sets up.
- Mattermost Team Edition has none. SAML, OpenID Connect and AD/LDAP are in every paid edition, according to its pricing page.
- Synapse supports OpenID Connect, SAML and CAS in its free version, according to its documentation.
- Zulip supports SAML, OpenID Connect, LDAP, Google, GitHub and more in the free server. Only email and password were switched on by default. Its paid self-hosted plans add support for setting them up, not the features.
End-to-end encryption. Only Matrix has it: Element encrypts private rooms and direct messages by default, and our earlier comparison found none of their words in Synapse's database. That means the server cannot search them, bots need to support encryption, and every user must keep a recovery key, or lose their history when they change devices. Mattermost and Zulip keep messages readable in the database on your server, which is what lets an admin search, export and restore everything. Anyone with access to the server or the backups can read them, so keep both private.
Swedish
- Mattermost comes in Swedish: Svenska under Settings > Display > Language, and its guide shows how to make it the default for everyone. Its emails follow each user's language.
- Element comes in Swedish: its Swedish translation covered all but one of Element Web's 3,678 texts when we checked version 1.12.31. Each user picks Svenska under All settings > Preferences.
- Zulip reports its Swedish as 9 % translated in 12.3, so menus are a mix of Swedish and English, and emails are in English.
Resources
Mattermost and Synapse are small: about 130 and 150 MB at rest, and under 200 MB at the peak of our test. Zulip is a different size: 2.3 GB at rest and 2.6 GB at the peak, even with the setting in its guide that halves its memory, because it runs its web server, queue workers and RabbitMQ whether ten people or a thousand use it. That is still well within a VC-P Alloy, and all three ran on our test server at once, but Zulip does not fit next to many other apps on a smaller server.
Updates and backups
Mattermost's guide follows the 11.11 tag, so patch releases install by themselves, and you change the tag for each monthly release. Synapse's guide follows latest and updates by itself every few weeks. Zulip's image has no tag that follows releases, so each update is a tag you change after reading the release notes, and Zulip's PostgreSQL image is still PostgreSQL 14, whose fixes end in November 2026.
Each backup is a database dump and one or two volumes: 1.2 MB for Mattermost, 1.3 MB for Matrix and 1.1 MB for Zulip in our test. All three came back by themselves after a reboot. Keep Synapse's backup private: it holds the server's signing key.
Licence and cost
We read the licences and pricing pages on 14 October 2026.
- Mattermost is made by Mattermost, Inc. in the United States. The Team Edition image our guide uses is licensed under MIT, and the source under AGPL 3.0. Its pricing page lists Professional, Enterprise and Enterprise Advanced and shows no prices, only "Contact Sales". Single sign-on, guests and group calls are in all three; retention rules, compliance export and shared channels between servers in Enterprise and up.
- Synapse and Element are made by Element in the United Kingdom, under AGPL 3.0, or a commercial licence from Element. Running them unchanged for your company is free. Element's pricing page lists its packaged Element Server Suite as Community, "Free of charge" for non-professional use and evaluations up to 100 users, Enterprise from 100 users "Priced per seat/month", and Sovereign, priced per deployment, with no prices shown. The paid tiers add Synapse Pro, support, long-term support releases and an admin console.
- Zulip is made by Kandra Labs, Inc. in the United States, under Apache 2.0. Its plans page says every self-hosted plan is a "Complete team chat solution, with all Zulip features included". What you pay for is push notifications beyond 10 users and support: Basic at $3.50 per user a month, Business at $6.67 per user a month billed yearly for at least 25 users, and Enterprise at a price you ask for.
For a company running chat for its own staff, all three licences allow it at no cost, and on your own server the messages stay in Sweden.
Slack and Teams today
What follows is from Slack's and Microsoft's own pages, read on 14 October 2026, not from our tests.
Slack is a hosted service only. Its pricing page showed us Pro at €8.25 per user a month, or €6.75 billed yearly, Business+ at €18, or €15 billed yearly, and Enterprise+ at €45 billed yearly. The Free plan keeps "90 days of message history". Huddles are on every plan, but "On the free plan, huddles can have a maximum of two participants", and on paid plans up to 50, "but only 25 can enable video at a time", according to Slack's huddles page. Clips, short recorded audio and video, are "Available on all plans" (Slack). SAML single sign-on is "Available on the Business+ and Enterprise plans" (Slack). By default, "your data will be stored in the US"; keeping it in Frankfurt is possible from Business+ up, according to its data residency page.
Microsoft Teams comes alone or in Microsoft 365. Microsoft's Teams plans page, in US dollars, showed us Teams Essentials, "Affordable, professional meeting solution", at $4.00 per user a month, paid yearly, Microsoft 365 Business Basic at $7.00 with Teams and $5.40 without, and Microsoft 365 Business Standard with Copilot at $23.50 with Teams and $20.30 without.
What you give up compared with Slack and Teams
Moving to your own server keeps your messages in Sweden, costs a fixed server price instead of a price per user, and nobody can change your plan's limits for you. But be honest about what you leave behind:
- The integrations marketplace. Slack and Teams connect to thousands of apps with a click. Mattermost has webhooks, bots and plugins, Zulip over 130 ready-made integrations, and many tools speak Slack's webhook format, but some apps you use today will have no ready-made link. Matrix needs a bridge or bot for most of them.
- Huddles and Clips. Mattermost's free edition calls one person at a time, Zulip hands calls to Jitsi or BigBlueButton, and only Matrix with LiveKit has group calls of its own. None of the three has anything like Clips.
- Uptime and push. Slack and Microsoft run the service for you. On your own server, updates, backups and outages are yours, and notifications to phones still pass through a service the app's maker runs, free only with limits.
- The move itself. Our constructed Slack export moved best into Mattermost, with work: an admin role to fix, passwords to reset, guests that need a licence. Zulip's import needs the Slack workspace still running, and Matrix has no import.
- Search. None of the three understood Swedish word forms in our test:
semesterfound nothing when the message said "Semestern".
Which one to pick
A company moving off Slack: Mattermost. It feels like Slack, ran in about 130 MB, imported our Slack export with threads, files and reactions, took our Slack-format webhook, and works in Swedish for everyone. Its weak points are what the free edition leaves out: guests, single sign-on, group calls and retention rules need a paid licence with no public price, push notifications use a test service, and there is no end-to-end encryption. Follow the Mattermost guide; it runs comfortably on a VC-P Alloy, next to other apps.
Teams that need federation or end-to-end encryption: Matrix. Private rooms and direct messages are encrypted so the server cannot read them, partners can join from their own Matrix servers, and group calls are free with LiveKit. Its weak points are the recovery keys users must keep, server search that skips encrypted rooms and missed lower-case älvsjö, no guest role, no webhooks, no importer, no admin web interface and email settings our guide does not cover. Follow the Matrix guide and the calls guide, on a VC-P Alloy.
Async-heavy teams: Zulip. Topics make it easy to follow many conversations and catch up after a day away, and the free server has guests, single sign-on, retention, an Alertmanager integration and over 130 more. Its weak points are 2.3 GB of memory, a Swedish translation that is 9 % done, a Slack import that needs a live Slack token, push notifications that cost money above 10 users, and calls that depend on Jitsi or BigBlueButton. Follow the Zulip guide, on a VC-P Alloy, which has the 8 GB it is sized for.