Tech Digest

Migration

Replace Slack

Leaving Slack is easy. Leaving Slack with your history, your files and your team's willingness to keep using chat is the hard part.

Last reviewed

What should you replace Slack with?

Use Mattermost Team Edition for a single organization that wants Slack's shape, unlimited searchable history and a supported import path through mmetl. Use Matrix with Synapse only if you specifically need federation, meaning your users talking to people on other servers, because it costs a real PostgreSQL, periodic state compression and a much rougher mobile experience. Whichever you pick, download the actual files out of your Slack export before you cut over: the export contains links to files, not the files themselves, and those links die with the workspace.

Slack's free plan shows the last 90 days of messages and files and permanently deletes anything older than a year. That is why this page exists. Teams do not leave Slack because they dislike it; they leave when they search for a decision from eighteen months ago and it is not there.

What you give up#

Be honest about this before you schedule a migration, because the team will notice within a week.

  • Search that works. Slack's search is excellent. Mattermost's built-in Bleve index is adequate and needs Elasticsearch, a paid feature, to be good at scale. Synapse search over encrypted rooms happens client side and is worse than both.
  • The app ecosystem. Every SaaS product ships a Slack integration. Mattermost has webhooks and a plugin marketplace, which covers most of it with more work. Matrix covers less.
  • Someone else's uptime and someone else's mobile push. Both are now your problem, and push is the one that decides whether people keep using it.
  • Polished calls. Mattermost Calls relays audio through your server rather than peer to peer, and Entry caps calls at 40 minutes. Matrix voice and video is workable and not as smooth.
  • Free single sign-on. From Mattermost v11, no free edition has any SSO at all. Team Edition lost GitLab SSO and gained a 250 activated user cap.

If your team is under ten people and pays nothing today, read When not to self-host first. A self-hosted chat server that nobody trusts to notify them is worse than a 90 day history limit.

Get your data out, and understand what is missing#

Export from Admin, then Workspace settings, Security, Import and export data, Export. On Free and Pro plans you get messages and file links from public channels, in JSON. Private channels, DMs and Slackbot conversations require Business+ or Enterprise and an approved application. There is no workaround on a free workspace.

That word "links" is the trap. The export is a zip of JSON files, one folder per channel, one file per day, plus users.json and channels.json. Attachments appear as url_private URLs pointing at Slack's storage. Delete the workspace, or let files age past the free plan's 90 day window, and those URLs return nothing. Your archive becomes a transcript full of dead references.

So walk the export and fetch every file while a token still works:

bash
jq -r '.[] | .files[]? | select(.url_private) | .url_private' \
  ./export/*/*.json | sort -u > files.txt
wget --header="Authorization: Bearer $SLACK_TOKEN" -i files.txt -P ./attachments/

Check the count before you touch anything else, then keep the raw zip forever, backed up with restic as covered in Backups that actually restore. It is the only copy of your first years as a company.

A Slack-shaped product, or a protocol#

Mattermost is a product that looks like Slack. Channels, threads, an admin console, one PostgreSQL 14 or newer, one Go binary on port 8065. It behaves the way people expect, and the migration path is documented: mmetl check slack, then mmetl to transform, then mmctl import. Mattermost's own docs are blunt that a full migration takes several days to multiple weeks of effort for a larger organization.

Pick your free edition deliberately. Team Edition is the AGPL build with unlimited message history, capped at 250 activated users and no SSO. Entry, introduced in October 2025, hands you the Enterprise Advanced feature set and then meters it: 10,000 searchable channel messages server-wide, 10,000 push notifications a month, 40 minute calls, five playbook runs a month. For a team leaving Slack over a history limit, Entry reproduces the exact problem they are running from. Take Team Edition.

Two more facts that bite. v11 removed MySQL from the codebase rather than deprecating it, so migrate to PostgreSQL while still on a v10 release. And the official images are amd64 only, so a Raspberry Pi means trusting a community rebuild with your company's chat.

Synapse is a homeserver for a federated protocol. Users get addresses like @you:yourdomain and can talk to anyone on any other Matrix server, with end-to-end encryption by default and bridges to Signal, WhatsApp and IRC. It has been AGPL-3.0-only since Element relicensed it in late 2023, and the repository moved to element-hq in December 2023. The README now points at Element Server Suite; ESS Community is free but scoped to non-commercial use up to 100 users, so check that before you standardize on it.

The operational profile is genuinely different. Create the database with --encoding=UTF8 --locale=C --template=template0 or Synapse refuses to start. Set server_name once and never change it, because it is signed into every event you have ever sent. Keep the *.signing.key off the host, because losing it means other servers reject you. Then deal with growth: state_groups_state dominates the database, with tracker reports of 274 million rows and 51 GB, and remote media caches forever by default. Run synapse_auto_compressor on a schedule from day one. That is why it scores 4 out of 5 on operational load against Mattermost's 3.

If your answer to "do we need federation" is anything but an immediate yes, that is the whole decision.

Mobile push decides whether the team stays#

This is the uncomfortable part, and it is not a footnote. A chat server your colleagues do not get notified by is a chat server they stop opening.

Mattermost has the better story, with a caveat. The official iOS and Android apps deliver reliable push, but they route through Mattermost's hosted push service, and on Entry that service is metered at 10,000 notifications a month, which a twenty person team burns through in about two weeks. The push proxy is open source, but wiring the official apps to your own means rebuilding and distributing them with your own Apple and Firebase credentials. Most self-hosters do not.

Matrix is harder. Because rooms are end-to-end encrypted, a push cannot carry the message. The app is woken with an event identifier and has to fetch and decrypt before it can show anything, and when that fetch does not complete in time you get a delayed notification or one that says nothing useful. Element's apps have improved at this, but on iOS it remains the most common reason a team quietly drifts back to WhatsApp.

Pilot this first. Give five people accounts, message them at 8am on a Tuesday, and ask whether their phone buzzed.

Which one for your situation#

Your situationUseWhy
One company, wants Slack's shape, under 250 peopleMattermost Team EditionUnlimited history, documented mmetl import, familiar UI
You need to talk to people on other serversSynapseFederation is the only reason to accept the rest
SSO is required and you will not paySynapseoidc_providers in homeserver.yaml; no free Mattermost edition has SSO
arm64 board is all you haveSynapseMattermost publishes no official ARM image
You want history imported, not re-createdMattermostMatrix has no comparable archive import
Small disk, small VPSMattermostSynapse in busy federated rooms will fill it
You want a bridge to WhatsApp and Signal in one clientSynapseThat ecosystem only exists on Matrix

What it costs, what breaks, and the point of no return#

Cost. Mattermost's docs quote 2 GB of RAM and 1 vCPU for up to 1,000 users, and it idles around 500 MB. Synapse idles near 700 MB and sits around 2 GB with PostgreSQL. Either fits a 4 GB VPS at 10 to 20 euros a month, against Slack Pro billed per active user, which for a twenty person team is four figures a year. The saving is real. Attention is the price.

What breaks. Mattermost's app container runs as UID 2000 and will not create its own directories, so chown -R 2000:2000 the volume tree before the first start or you will debug errors that read like database faults. Set SiteURL immediately, because push, OAuth callbacks and email links all fail silently when it is wrong. On Synapse, docs/upgrade.md is not optional: 1.157.0 removed the experimental MSC3861 auth delegation outright, and upgrading blind locks every user out of a running server. Put both behind a reverse proxy you trust (Reverse proxy and TLS, usually Caddy) and a check in Uptime Kuma, and read An update strategy that does not lose data before you enable anything unattended.

The point of no return is not the cutover message. It is deleting the Slack workspace or letting it downgrade, because that kills every url_private link in your export at once. Sequence it: export, download every attachment, trial-import into a scratch server, run both in parallel for two weeks with Slack read-only, then close the workspace. Back up from day one: a pg_dump plus the data/ directory for Mattermost, or a dump plus media_store plus the signing key for Synapse. Backing up a running database covers doing that on a running database.

What to do next#

Export today, even if you have decided nothing. The 90 day window and the one year deletion are running whether you act or not, and the export is free.

Then run the push pilot before the software choice, because it is the constraint that decides adoption. If federation is not a requirement, install Mattermost Team Edition, do a trial mmetl run, and read Single sign-on for self-hosters for what you are giving up on identity. If it is, budget the operational load honestly and plan the eventual move to new hardware with Moving a service to a new machine, before the database is large enough to make it painful.

Questions#

Does Slack's free plan really delete my messages?

Yes, and this is the part people miss. Free workspaces can view and search only the last 90 days, and messages and files more than one year old are permanently deleted. Since 26 August 2024, customer data older than a year may be removed on a rolling basis. Hidden and deleted are different things: what is past 90 days is invisible to you but still exportable, and what is past a year is gone. Export before you decide, not after.

What does a Slack export not include?

On Free and Pro plans, an export covers messages and file links from public channels in JSON, and nothing else. Private channels, direct messages and Slackbot conversations require Business+ or Enterprise and an approved application. The word links matters: you get URLs pointing at Slack's storage, not the file bytes. Free workspaces can only export links to files from the last 90 days, and every one of those URLs stops working when the workspace goes.

Can I import Slack history into Mattermost?

Yes, through a documented three-step path: validate the export with mmetl check slack, transform it with mmetl, then load it with mmctl import. It handles users, channels, message history, DMs and threads. Mattermost's own documentation says a full migration can take from several days to multiple weeks of dedicated effort for larger organizations, and that manual adjustment during transformation is often required. Do a trial import into a scratch server first.

Can I import Slack history into Matrix?

Not in any comparable way. Matrix bridges are built for live two-way traffic between a running Slack workspace and Matrix rooms, not for loading a JSON archive into room history. If you move to Matrix, plan for the Slack archive to live somewhere else entirely, such as a static viewer or a file server. That is a real disadvantage and it is the sort of thing you should discover now rather than on cutover weekend.

Do I get single sign-on for free?

Not with Mattermost. OIDC and SAML are compiled into the binary but unlock only with a license key, and from v11 Team Edition lost even GitLab SSO, so free self-hosting means local accounts. Synapse is the opposite: oidc_providers, SAML2 and CAS are configured directly in homeserver.yaml at no cost, though Element's strategic direction is the separate Matrix Authentication Service. If SSO is non-negotiable and you will not pay, that argues for Matrix.

How much disk will Synapse use?

More than you expect, and not because of your messages. Room state in state_groups_state is the growth driver, and joining large public federated rooms multiplies it: the project's own tracker has reports of that single table reaching 274 million rows and 51 GB. Remote media is cached indefinitely by default on top of that. Schedule synapse_auto_compressor from day one, which routinely cuts row counts to under 10 percent, and purge remote media on a timer.

Sources#

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