Voice: Discord-style voice and video rooms, now bundled with Discourse 🎙

Late last year we shared Resenha, an experiment that added Discord-style voice and video rooms directly into Discourse. No external apps required, just peer-to-peer WebRTC in your sidebar.

The experiment worked. We’ve been using it for our own meetings ever since, and today it graduates: Resenha is now called Voice, and it ships as a core plugin bundled with every Discourse install. :tada:

What you get

  • Sidebar-first rooms — click to join or leave, see live participant avatars with animated speaking indicators, and keep browsing the forum while you talk. No route change, no popup window, and a compact call widget follows you around the site.
  • Video and screen sharing — each room gets a full page with a tile grid; camera and screen share toggle instantly, and quality scales automatically with the number of watchers.
  • Background blur — MediaPipe person segmentation running entirely in your browser, with a live preview and adjustable strength.
  • Noise suppression — pick between three AI engines (RNNoise, DTLN, DeepFilterNet3) running as WebAssembly audio worklets, from lightweight to studio-grade.
  • Live subtitles — opt-in, viewer-side captions powered by NVIDIA Parakeet speech recognition running locally via WebGPU. Multilingual, and no audio ever leaves your browser. You can also record a transcript of the call straight into a topic draft.
  • Direct calls — call someone straight from their user card or profile.
  • Per-room text chat — backed by real Discourse chat: each call gets its own thread in the room’s chat channel.
  • Room permissions and management — public, group-restricted, and private rooms; user room creation gated by groups; mute, deafen, per-user volume, and kick.
  • Themed audio cues — join/leave and call tones follow your chat notification sound pack, so Voice sounds like the rest of your site.

How it works

By default, everything is peer-to-peer: your Discourse server only handles signaling, and media flows directly between participants with DTLS-SRTP encryption. Zero extra infrastructure, ideal for rooms of up to ~50 people on voice, or up to 10 with video.

All the audio and video processing (noise suppression, background blur, subtitles) runs locally on each participant’s device. Nothing is sent to third parties.

Need bigger calls? Point the plugin at a cloud or a self-hosted LiveKit server and route all rooms (or just some) through it. Each participant then publishes every track exactly once, whatever the room size. LiveKit-routed rooms can also record calls, with recording controlled right from the room UI in Discourse.

How to enable it

:discourse: Voice is available on all our hosting plans. The LiveKit integration for larger calls is available on our Business and Enterprise plans; self-hosters :discourse-bw: can point it at their own LiveKit server.

Voice is bundled with Discourse, so there is nothing to install. Turn it on via Admin > Settings > Plugins > voice enabled. The plugin seeds a default “Watercooler” room so there’s somewhere to hang out right away.

From there, voice_allowed_groups controls who can join rooms, and voice_create_room_allowed_groups controls who can create them (admins, moderators, and TL2 by default). Video is on by default. Direct calls are off until you pick some groups in voice_direct_calls_allowed_groups, and subtitles are opt-in via voice_subtitles_enabled (they need WebGPU, and each user downloads the ~2.5 GB model once).

If you were running the Resenha plugin from my personal repository, remove it from your app.yml when you have a chance, since the bundled Voice plugin replaces it.

Status

This is still early. We’ve been dogfooding it daily for months and it works very well for small groups, but test it with your team before opening it to a whole community. There’s no call recording on the default peer-to-peer path, and moderation tools beyond user flags, kick, and “End call” are still on the roadmap.

Feedback welcome

Try it out and let us know how it goes! Bugs, ideas, and questions are all welcome in this topic. PRs too, now easier than ever: the code lives in core. :microphone:

24 Likes

wait … wah … video too?

Man's Mind Blown Reaction

fantastic!

6 Likes

Wow, really?

Any instructions how to test this on self-hosted instances? E.g. with some separate docker container?

2 Likes

Just update to latest with a rebuild, and enable the new plugin on the admin page. There is nothing extra necessary.

5 Likes

I think you mean Discourse-style voice and video rooms? :innocent: :grin:

2 Likes

So I can leave behind the pub/secret keys in Nats, the subdomains, Coturn server, and all the scripts I was trying to create, to have a secure Livekit server as a bridge?

Even if I have to continue on it, thank you for building this!

1 Like

I mean, if you want to have a dedicated Coturn for STUN/TURN on your instance, go for it. Same for LiveKit; if you want to use it, be my guest.

It is not mandatory for doing calls out of the box, but we do offer that flexibility.

1 Like