Revolt

Open-source chat platform for communities

Team Chat ★ 3.3k stars Medium setup AGPL-3.0

Revolt is an open-source, self-hostable chat platform built for communities, offering a Discord-like experience. It targets community organizers wanting control over their chat. It is deployed via Docker.

Key features

  • Discord-style servers and channels
  • Self-hostable backend
  • Roles and permissions
  • Open-source clients

Pros & cons

Strengths

  • Familiar Discord-like UX
  • Community-focused
  • Self-hostable

Trade-offs

  • Younger ecosystem
  • Self-hosting is involved

Revolt replaces

Last reviewed Sep 13, 2026 · 832 words

Self-hosting Revolt means running about 10 containers: MongoDB, Redis, RabbitMQ, MinIO for file storage, a Caddy front, and then Revolt's own API, events gateway, file server, embed proxy, push daemon and web client. The catalogue's 1 GB minimum is a floor, not a comfortable number; 2 GB is where it stops swapping. For a community that wants Discord's servers, channels, roles and emoji on hardware it owns, and can absorb that operational weight, Revolt is the most faithful open-source answer. For a company chat with 20 people, it is the wrong tool and I say why below.

A note on the name

The project has been rebranding to Stoat, and the source now lives under the stoatchat organisation on GitHub; the catalogue lists it under both names. Images, config keys and documentation are in the middle of the rename at the time of writing, so when a guide you find says Revolt and the repo says Stoat, they mean the same code. Check which image tags the self-hosted repo's compose file currently references rather than trusting a blog post from last year.

What the stack looks like on disk

The official self-hosted repository ships a compose.yml and two files you must edit before the first start: Revolt.toml (renamed to match the new brand in recent releases) and an env file that sets the public hostname. The pieces that carry state are MongoDB (users, servers, messages), MinIO (every uploaded avatar and attachment), and Redis (presence, transient). RabbitMQ carries events between the API and the push and notification workers. Point the hostname variables at a single public domain and let the bundled Caddy route /api, /ws, /autumn (files) and /january (link previews) to the right container. Get the hostname wrong on first boot and the web client loads but every websocket and upload fails, which is the number one issue thread.

Backups are three jobs, not one: mongodump on a schedule, an S3-compatible sync of the MinIO bucket, and a copy of the config files. Skip MinIO and you restore a chat where every image is a broken link.

Registration, invites and email

By default a fresh instance lets anyone register. The config has an invite-only flag and SMTP settings for email verification; turn on at least one of them before the URL goes anywhere, because open registration on a public chat server attracts bots within a day. Users, servers and everything else are per instance. There is no federation between Revolt instances and none planned; if your friends are on the public revolt.chat, your self-hosted server is a separate universe with separate accounts. That is the same model as Discord, and the opposite of Synapse and the Matrix world, where a self-hosted server still talks to everyone.

Voice is the part that lags

Text chat, threads, reactions, custom emoji, roles with granular permissions, and server discovery are solid, and the desktop and web clients are pleasant. Voice channels have historically been the weak point: the media server component has been rewritten more than once and its self-hosted setup involves extra ports and a TURN server that the basic compose does not fully configure. If voice is why your community uses Discord, test it on your network before you migrate anyone, and expect to spend the most time on it. There is no video calling or screen share parity with Discord yet.

Mattermost or Zulip for teams, Revolt for communities

The team chat category splits on one question: is this a workplace or a hangout. Mattermost is a single Go binary plus Postgres, uses less RAM than Revolt's stack, and has the integrations and compliance features a company needs. Zulip is the best option if long-running topical threads matter more than presence. Both are bigger, older projects with commercial backing, and both are the safer pick for anything with a payroll. Revolt earns its place when the goal is specifically a Discord feel, with the community-style server list and a client people who grew up on Discord will accept without complaint. That is the honest reason to run it, and it is a good enough reason for a gaming group or an open-source project moving off Discord.

What I'd do

A 2 vCPU, 4 GB VPS dedicated to the stack, the official compose with only the hostname and invite-only settings changed, MinIO bucket and MongoDB dumped nightly to off-box storage, and a written procedure for upgrades, because the rename means image names may change under you. Invite the community to the text channels first and keep the old Discord voice channels alive until the self-hosted voice has survived a month of real use. If the group is fewer than 15 people and mostly talks in text, I would skip the whole stack and run Mattermost in a tenth of the resources.

Similar team chat apps