After running Matrix/Element for my friend group and Mattermost at work, I ended up building Spokes to get a real self-hosted Discord alternative with official mobile apps, working push notifications and built-in voice channels in a single Docker container.
The story
My friend group has been using Discord since 2015. Initially, the server was only for our group of 6 high school friends. As time went on, other family members joined. Then girlfriends also joined. Everything was great, DMs, group chats, gaming nights, irl event planning, memes, etc... All in the same server. We would still be on Discord today if it wasn't for 1 small detail. We all, myself included, started having kids.
Now, we are not that privacy conscious of a group, but sharing pictures of our children on Discord (or any other social media platform) is a step too far for us. The idea of actually owning our communications is also very appealing.
We were aware of the children privacy issue before the first one was even born. Therefore, as the self-hosting guy, I went down the self-hosted Discord alternatives rabbit hole in search of a solution.
The requirements for a self-hosted Discord alternative
Discord has a lot of features. If you want a self-hosted Discord alternative that a real-life friend group will actually migrate to and use every day, you really only need 5 things :
Organized channels and direct messages. A single shared server with clear text channels, categories, private messages, group chats, good built-in GIF and photo sharing.
Official mobile apps with working push notifications. This is the real dealbreaker. The goal is for whatever platform we choose to become the group's main chat app. If people can't get reliable notifications to their phone then it's never going to work.
Voice / Video support. Discord style voice channels where people can simply drop in and play games. Voice and video call support for DMs.
Simple installation and maintenance. As the person hosting it, I want the simplest possible Docker setup and SSO support. I also need the data to be easy to backup, restore and very hard to corrupt. In general, the fewer containers required to get everything working the better.
No per-user fees. Per-server fees are ok. Free would be best.
What we tried : Matrix/Element and Mattermost
Before building my own solution, I ran two of the most commonly recommended self-hosted chat platforms : Matrix/Element for my friend group and Mattermost at work.
Matrix/Element
When we initially decided to leave Discord, I had prior experience with Mattermost, tried to setup a few of the other options and finally settled on Matrix/Element.
The Element app felt the closest to matching the requirements and had, usually, reliable notifications. We ran that Matrix server as our daily driver for about a year and a half. Matrix is a great technology, but as a Discord server replacement for an isolated group, it has some issues.
It doesn't feel like an organized Discord server. Even with Spaces, Element works like a loose collection of separate chat rooms rather than a cohesive server. For non-technical friends and spouses, the apps feel clunky and a bit confusing to navigate.
Voice and video are hard to host and maintain : Getting Discord-style persistent voice and video rooms working on a self-hosted Matrix server means running a complex multi-container stack. Maybe it's a skill issue, but I did not bother and we kept using Discord for voice chat.
Mattermost
I also work at a small 15-employee business where, among other roles, I manage IT. Around 3 years ago, we needed an internal chat platform. We wanted a local self-hosted server to avoid per-user SaaS fees, get fast local file uploads and downloads, good channel permissions, SSO, and a solid desktop client.
We settled on Mattermost and have been really happy with it for workplace chat. However, Mattermost is built as an enterprise Slack replacement, not a Discord alternative.
Built for work threads, not hangouts. It is great for workplace text channels, but it isn't designed around persistent Discord-style drop-in voice channels, family photo albums or casual group events.
Increasing free-tier restrictions. Because Mattermost is an enterprise SaaS company first, they have gradually removed or restricted features in the free self-hosted version. On the free tier, mobile push notifications through their hosted relay are capped, group calls have limits and SSO options are restricted unless you pay per-user enterprise pricing ($10/user/month).
Why I built Spokes
Last year, I started building what would eventually become Spokes (https://spokes.sh/). The goal was to take some of my newly acquired free time, learn new skills and build the Discord server replacement my friend group and I have been looking for. Because I built Spokes specifically to solve the issues we hit with Matrix, Mattermost, and open-source Discord clones, every architectural decision was made around reducing friction for both the server owner and the people using it.
Architectural Decision 1 : Everything in a single Docker container
One of the biggest admin pain points with self-hosted chat is container sprawl. Hosting Matrix with voice often requires managing 4 to 6 separate containers. Last time I tried Mattermost with voice support, it wasn't much better. With Spokes, I bundled the entire stack into one Docker container (ghcr.io/pcbeeqc/spokes:latest):
- The chat and web server (organized text channels, direct messages, shared photo albums and a group calendar).
- An embedded LiveKit WebRTC server for persistent, Discord-style drop-in voice and video channels with screen sharing and local noise cancellation.
- A built-in Casdoor OIDC identity provider so SSO works out of the box (while also supporting external OIDC providers if you already run Authentik, Pocket ID, or Authelia).
- Simple file-based JSON storage instead of an external SQL database. Backing up or migrating your entire server is as simple as copying one
/datafolder.
Architectural Decision 2 : Solving the self-hosted mobile push notification problem
When you look at a list of open-source Discord alternatives, almost all of them fail at mobile apps and push notifications. There is a technical reason for this. Apple and Google only accept push notifications from a server that holds the private developer signing keys tied to the official app published on the App Store and Google Play. You cannot distribute private Apple and Google signing keys inside a public Docker image or open-source code. Because of that, most open-source alternatives either don't bother at all or give you mobile apps that you must compile from source yourself and sign with your own developer keys. To make Spokes work effortlessly for non-technical friends and family, I published iOS and Android apps on the official stores. I also built and host a push relay that all self-hosted Spokes instances can use.
- Can't Apple and Google read all notifications this way? No. Your Spokes server encrypts the notification payload locally before sending it through the relay. Your phone then decrypts them on arrival. (Fun fact, Discord's notifications are not encrypted and can be read by Apple and Google)
- Standard Web Push (for browsers and PWAs) is also built directly into the server with no relay needed.
Architectural Decision 3 : Encrypted channels without key-verification headaches
I wanted encryption for private DMs and sensitive channels so that a leaked backup or a curious server admin browsing the database files can't read private conversations. Because the server owner controls the SSO system, we can't rely on the SSO login for this. We need something that only the user controls, without the complicated device cross-signing and recovery keys that can lock people out of their old messages on Matrix.
What I chose to do is build a feature I call Secure Chat. Each user sets a separate Chat Password to unlock their personal key vault, and that vault unlocks the keys for their encrypted channels on disk. This password is completely separate from the SSO auth and only lives on the user's devices and in their head. When someone gets a new phone, they just enter their Chat Password to unlock their messages, while the files on the server stay unreadable to anyone else.
Architectural Decision 4 : Flat per-server licensing instead of per-user fees
Running official mobile apps on the App Store and Google Play and maintaining a push notification relay costs money every year. At the same time, I hate per-user pricing for self-hosted software. You shouldn't be penalized for inviting more friends or family members to your own server. Spokes uses a simple flat server pass model. The only thing gated by the Spokes pass is mobile push notifications (and every new server comes with a 2-month free trial). Every other feature is free.
Conclusion
Having run all three, I think each one has its place. Mattermost has been great at work where we just need a self-hosted Slack replacement for text channels. Matrix/Element is great technology if you care about federation across public servers and don't mind a more complex setup. However, when you try moving a real-life friend group or family off Discord, friction is everything. Having organized channels, drop-in voice chat and working mobile notifications in a single Docker container with Spokes is what finally made the switch stick for us.
If you want to try Spokes, you can test the live demo at https://demo.spokes.sh/ or check out the download page at https://spokes.sh/download/. I also maintain a larger comparison table of self-hosted chat platforms on GitHub here : PCBeeQC/self-hosted-discord-alternatives.

