Why we built xenaxio's team chat on Matrix 🟩
TL;DR 🍿
- We wanted Slack, but on your own server 🏠, and still able to chat with other companies.
- Matrix gives us the hard part: an open standard where every company runs its own server and the servers talk to each other.
- Self-hosted is the main option. Our cloud is for trying it out and for small teams without their own server.
- The server is Tuwunel 🦀 (Rust, Apache-2.0), one per company. The Slack-like UI is ours.
📱 The crime scene: work chat in WhatsApp
Ask a small German company where their team chat is. Nine times out of ten: "Uh… the WhatsApp group?" 🙈
And that's a DSGVO horror show:
- 📇 every member's phone book goes to Meta;
- 🚪 the employee leaves, the conversation leaves with them;
- 🤷 the admin controls exactly nothing.
xenaxio already does mail, calendar, contacts, files and AI, and you can run all of it on your own server. Chat was the missing piece. The brief from the boss: "Make it feel like Slack." Challenge accepted. 💪
🥊 The contenders
| Mattermost Team Edition | Our own chat on Matrix | |
|---|---|---|
| Looks like Slack | ✅ out of the box | ✅ once we build it |
| Runs on your own server | ✅ | ✅ |
| Quick to ship | ✅ | ❌ we write the UI |
| Free tier limits | 😬 250 users, no SSO (v11); "Entry": 10,000 messages, 40-min calls | ✅ none from the protocol |
| Chat with other companies | 🤏 | ✅ that's the whole point |
| German customers trust it | 🙂 | ✅ Bundeswehr, healthcare, openDesk |
Winner: Matrix. 🏆 More work, much more upside.
🤓 Matrix in one paragraph
Matrix is chat that works like email 📧. Every organisation runs its own server, servers talk to each other, and an address looks like @anna:hanse.agency. The protocol belongs to the non-profit Matrix.org Foundation. The protocol defines the what, the client decides the how it looks. So "Slack on Matrix" is simply this: workspace = space, channel = room, DM = direct room. 🧩
🎁 What Matrix itself gives us
These come with the protocol. Any Matrix server would give us these.
1. 🏠🌍 Your own server and chat across companies
The killer feature. In Matrix, every company running its own server isn't a special enterprise option, it's how the protocol is designed. And those servers talk to each other. Straight from the boss:
💬 "This is the whole main advantage of Matrix." — the owner of xenaxio, approving the federation part of the plan
Slack can't be self-hosted at all, and Slack Connect only works inside Slack. Self-hosted Mattermost Team Edition stays inside its own walls. With Matrix a company on xenaxio can write to its tax advisor at @max:steuerberater.de, to a partner on any other Matrix server, or to someone on matrix.org. Any server software, any app. No "first, both of you buy the same product". 🙅 Your messages live on your server, not in somebody's cloud.
2. 📜 An open standard, not a vendor
Public spec, run by a foundation. Several servers (Synapse, Tuwunel, Dendrite) and many clients (Element, FluffyChat, Cinny). If one server project goes quiet 🦗, we move to another and keep our client, our integrations and the federation with everyone else. Slack is a single company's closed box. 📦
3. 🧰 A feature set we didn't have to invent
Threads with per-thread unread counters, reactions, mentions, edits, deletions, pins, polls, "typing…", presence, spaces with a room directory, push rules, authenticated media, server-side search: all in the spec. We didn't design a chat protocol or a sync model. We "only" had to build the UI. 😅
4. 🔐 End-to-end encryption, when we want it
Olm/Megolm is built into the protocol. Slack has no E2EE at all. We launched without it on purpose (see below 👇), but it's there for DMs later, no new platform needed.
5. 🌱 An ecosystem to grow into
📞 calls (MatrixRTC on LiveKit) · 🔌 integrations (matrix-hookshot: GitHub, GitLab, Jira) · 📱 mobile SDKs (matrix-rust-sdk) · 🌉 bridges to WhatsApp, Signal, Telegram, Teams. All already exist, waiting for us.
6. 🦀 A tiny server with a friendly license
A standard means you get to pick your server. We picked Tuwunel: Rust, Apache-2.0. Before writing a single line of product code we put version 1.9.4 through a sandbox test. 🧪
📊 Spoiler: the benchmark numbers
- 😴 idle: 35–40 MB RAM per instance
- 🏃 10 users × 10,000 messages: 43 s total, p95 72 ms per message, then ~67 MB RAM and ~60 MB on disk
- 🔎 search over 10,000 messages: 34 ms
- 📦 60 MB upload: 1.8 s
Verdict: a separate server for every company is cheap. Synapse, the plan B, stayed on the bench. 🪑
⚖️ Spoiler: the license table (the lawyers will love it)
| Component | License |
|---|---|
| Tuwunel (server) | Apache-2.0 ✅ |
| matrix-js-sdk, matrix-rust-sdk | Apache-2.0 ✅ |
| matrix-hookshot | Apache-2.0 ✅ |
| LiveKit (calls) | Apache-2.0 ✅ |
| Synapse, MAS, Sygnal | AGPL since Nov 2023 🚫 not needed |
7. 🇩🇪 Trust in Germany
Matrix already powers BwMessenger (Bundeswehr) 🪖, TI-Messenger (gematik, healthcare) 🏥 and the chat in openDesk 🏛️. "Same standard as the army and the doctors" sells itself.
🛠️ What we built on top
None of this ships with Matrix. It's our sweat. 💦
- 🏠 self-hosted first: the chat server runs next to the rest of xenaxio on the customer's own server. In our cloud (for demos and small teams), each company still gets its own isolated server with separate backups and hard CPU and RAM limits;
- 🚦 federation policy: "internal only" / "xenaxio + allowed servers" (default) / "all of Matrix", plus allow and block lists. The platform enforces it in both directions;
- 🚪 internal channels never take outsiders, and outside invites arrive as "Accept / Decline";
- 🔍 discovery checks: a .well-known file or DNS, checked in the admin panel like MX and SPF;
- 🎨 the Slack-like UI: sidebar, threads, mentions, "in:#channel" / "from:@name" search, Ctrl+K, shortcuts, mobile layout;
- 🔔 our own push gateway (Web Push, VAPID, aes128gcm) instead of Sygnal;
- 🔑 one login, one employee list with mail;
- 🤖 xenaxio extras: "Share in chat" for emails, AI "What did I miss?", Slack-compatible webhooks.
💸 The bill (honestly)
- ✍️ We write the UI ourselves. The expensive part.
- 🪶 We dumped matrix-js-sdk in the browser. It drags along ~5 MB of WebAssembly crypto plus calls and widgets we don't use. Our own client: one long-poll sync, done.
- 🔓 No E2EE at launch, on purpose. Same as Slack and Mattermost: TLS, and the server is yours anyway. Search and AI keep working, and nobody has to verify devices or lose recovery keys. 🗝️😵
- 🕳️ Small server gaps. Tuwunel searches whole words only ("Angebot" ✅, "Angeb" ❌), and its allow-list is still "experimental". We patch around both in the platform.
- 🌀 Federation discovery is fiddly.
🤦 Spoiler: the SRV plot twist
Plan A: a DNS SRV record pointing at our server, with our certificate. Looked great on paper. 📝 Then we read the spec: once a remote server finds you via SRV, it expects a certificate for the customer's own domain. Ours won't do. 💥 Plan B: two ways. A .well-known/matrix/server file on the company website, or DNS with a certificate issued for the company domain. Whichever the company sets up first wins.
- 🪞 Federation means copies. In an external room, messages also live on the other company's server. We say so in the UI.
- ™️ "Matrix" is a trademark of the foundation. "Works on Matrix" is fine. Calling the product "Matrix" is not. 💊🐇
🏁 Where we are
✅ per-company chat servers ✅ Slack-like web chat ✅ push notifications ✅ mail and AI integration ✅ federation between companies (18/18 checks on two live servers) ⏳ native mobile apps and calls are next
Until then the chat works on phones as an installable web app, with push on iOS 16.4+ and Android. 📲
🧩 Chat is just one room in the house
Xenaxio is a whole AI workspace you run on your own server. Chat moved in next to:
- 📬 Mail: your own domain, shared mailboxes like info@ and invoices@, all on standard protocols;
- 📅 Calendar, contacts, tasks: invitations, free/busy of colleagues, meeting rooms and cars to book;
- 📁 Files: your own and shared by colleagues;
- 🤖 AI assistant: summarizes a thread, drafts a reply, finds a free slot, reads the PDF. It drafts and suggests, it never sends or deletes on its own. Mistral (EU) by default, or your own model (Ollama, vLLM, Azure, a Mac Studio under the desk 🖥️);
- 🔌 One MCP server for all of it: connect Claude, Claude Code or any MCP agent once and it gets mail, calendar, contacts, tasks and files with the user's own rights. Personal tokens, revocable in one click, every call in the audit log. Chat tools for MCP are next on the list.
One login, one admin panel, one server. Yours. 🔑
Is your team chat still a WhatsApp group? 👀 Move it onto your own server, right next to your mail, and still reach your tax advisor: 👉 xenaxio.com




Comments
Loading comments...