ircbits.com

Index / Matterbridge setup guide: one binary, sixteen protocols

Matterbridge setup guide: one binary, sixteen protocols

Updated July 26, 2026

A single Go binary that relays messages between IRC and most other chat platforms, configured with one TOML file. It is the standard way an open source project keeps an IRC channel without losing everyone who only uses Discord.

Get the community fork, not the original

Upstream 42wim/matterbridge has not tagged a release since v1.26.0 in January 2023 and last saw a commit in August 2024. The community fork picked it up, merged the backlog of unmerged fixes, dropped protocols nobody maintained, and is still shipping dependency updates this month.

Download: matterbridge-org/matterbridge — build from source with Go 1.26 or later, or use the provided Dockerfiles.

The fork has no tagged binary releases of its own yet, which is its one real rough edge. If you need a prebuilt binary today, distribution packages and the old upstream releases still work for basic IRC-to-Discord relaying; you just miss the fixes.

The config has three kinds of block

Every configuration is the same shape, whatever the platforms:

  1. An account block per platform[irc.libera], [discord.myproject]. The part after the dot is a label you choose.
  2. A gateway block[[gateway]] with a name, one per set of channels that should share messages.
  3. Channel blocks inside it[[gateway.inout]] for two-way, or [[gateway.in]] / [[gateway.out]] for one-way relaying.
[irc.libera]
Server="irc.libera.chat:6697"
UseTLS=true
Nick="myprojectbridge"
UseSASL=true
NickServNick="myprojectbridge"     # with SASL, this is the account name
NickServPassword="…"
RemoteNickFormat="<{NICK}> "

[telegram.mygroup]
Token="…"                          # from BotFather

[[gateway]]
name="general"
enable=true
    [[gateway.inout]]
    account="irc.libera"
    channel="#myproject"
    [[gateway.inout]]
    account="telegram.mygroup"
    channel="-100123456789"

RemoteNickFormat is worth setting deliberately on the IRC side — it is what decides whether the channel reads <dave> hello or [telegram] <dave> hello on every line.

Channel identifiers per platform

The most common cause of a bridge that starts cleanly and relays nothing is a channel named the wrong way:

Platform Channel format
IRC #channel, lowercase, keep the #
Discord general — the name without #, or ID:123456789
Matrix #room:server.org
Telegram the numeric chat ID
Slack #channel
Mumble the numeric channel id from its Edit window
XMPP the room name, with the MUC host set in the account block

Notable platforms

Discord

Needs a bot token, the Manage Webhooks permission, and two privileged intents switched on or it silently relays nothing. That trap and a complete config are in bridging IRC and Discord.

Slack

Slack shut down its own IRC and XMPP gateways on 15 May 2018, and Matrix retired its hosted Slack bridge in November 2025. Matterbridge with a Slack bot token is what remains, and it works — with the usual one-relay-nick compromise. If you are weighing the platforms rather than joining them, that is IRC vs Slack.

Telegram

Straightforward: a bot token from BotFather and the group's numeric chat ID. The dedicated teleirc exists for Telegram specifically and still gets commits, but has not tagged a release since v2.3.0 in October 2022 — reach for it only if Telegram is the only thing you need.

WhatsApp

Pairs by QR code and rides an unofficial client library, which makes it the most fragile connector in the set. Expect to re-pair it.

The rest

Mumble, Zulip, Mastodon, Rocket.Chat, Microsoft Teams, Nextcloud Talk, VK and ssh-chat all work through the same three-block config. Several are marked "no active maintainer" in the fork's own docs — Mattermost, Microsoft Teams, Nextcloud Talk, Rocket.Chat and Slack among them — so treat those as working until proven otherwise rather than actively developed.

Keybase, Gitter and Steam support have been dropped entirely, because the services either died or moved.

Files need a media server

Matterbridge cannot put a file on IRC, because IRC has nowhere to put it. Configure MediaDownloadPath — a directory your web server serves — together with MediaServerDownload, the public URL it maps to, and IRC gets a link instead. Without them, shared files produce Could not share file (no mediaserver configured) and nothing crosses. Attachments from platforms that already give a public URL are unaffected.

Where to go next