This blog post was originally a wall of text on GNOME’s Discourse to discuss how we want our instant messaging to look like.

I’ve come to talk with you about instant messaging platforms and peaceful coexistence. This is a pretty heated issue, so I count on everyone to keep the conversation constructive so we can shape our future platform together in a positive way!


Our experience with instant messaging is suboptimal on IRC and Matrix. We can make it better, but not on both ends at the same time because of their very nature.

Matrix and IRC users are able to communicate thanks to a bridge. The bridge creates an IRC puppet for each Matrix user, so it can post messages there in their name. At each bridge restart, all puppets leave then join again the IRC channels. IRC sees this as a flood attack and kicks all the puppets.

Today when a puppet is kicked from IRC, the corresponding user on Matrix is kicked from the Matrix channel as well. It is done to avoid having inconsistent states between IRC and Matrix. We now have the possibility to enable an option to bypass this. Once enabled, getting a puppet kicked on IRC would not propagate the kick to Matrix.

The downside of this is that it would also prevent a few messages to make it from Matrix to IRC for a few minutes, on very rare occasions that will be known beforehand so admins can announce it. While not ideal, this seems to be less disruptive for the conversation than having half of people suddenly removed from it.

Please keep in mind that the solution described in this post corresponds to what we can do to improve what we have today and my personal opinion about which platform is the most suitable for our needs. It does not mean that the choice of our recommended platform has been made.

Diving into the problem, and solutions

Let’s walk together through our history of instant messaging, what our needs are, before moving to some problems we have already solved, what else we can do to move forward, and what I consider to be the most realistic way to change platforms.

First, a bit of history

The GNOME contributors community never really had an official platform for instant messaging. Historically, developers used to hang on the GIMPnet IRC network. This platform is still very active today, and many of our core contributors still rely on this platform.

IRC is a very text-oriented platform, and some other teams didn’t feel at ease there. For example, the design team tried Telegram in the past and found the ability to easily share images and media to be very helpful. Foundation staff also felt more comfortable on Telegram than on IRC.

In the meantime, there were coordinated efforts to bring most of our tooling to modern standards so we keep attracting new contributors. GNOME moved from the sturdy and battle-tested Bugzilla to the more welcoming GitLab. GNOME moved away from the 90s vibe of mailing lists to the more engaging Discourse board.

IRC is the last system powering human interactions that hasn’t been updated to a more comfortable solution. Newcomers didn’t grow up with the customs of IRC, and have very different expectations for their instant messaging platforms. Persistent messages, rich media, edits, text formatting, or even the seemingly silly reactions: most of those features are supported by the tools we use to chat with our relatives.

Some people from the contributing community heard about the Matrix protocol. They got intrigued, then convinced, and we saw the first demands from people from the GNOME community to get a bridge between and GIMPnet IRC in December 2016. The Matrix Foundation entered in talks with the GNOME Foundation, and eventually on March 2, 2017 was bridged with GIMPnet IRC. The promise sounded good: you could keep in touch with people from IRC, all while benefiting from the goodness of a more modern protocol and client. No hard split, no migration. Everyone could live on the platform they loved in harmony.

The company Element, which was then called New Vector, offered to host a Matrix instance and to bridge it with GIMPnet. As a result, the dedicated GNOME instance was deployed on March 18, 2019. The bridge was moved from to in April 17, 2019. Even if the Foundation didn’t host the server, it could be in control of things since they were hosted behind the domain name. That’s the instance many use and love today.

Reality was a tad disappointing in terms of peace and harmony: on the GNOME end we didn’t do our homework, the bridge was not properly tuned to our needs and we didn’t deploy everything to allow the remote Matrix instance to work properly. The experience ended up suboptimal on both ends of the bridge. Before commenting, remember the point is that every tool is unpleasant when it’s not used correctly.

Shortly after, the Foundation’s ED asked for a trial of a Rocket.Chat instance on August 26, 2019. Today, this Rocket.Chat instance is still online and mostly used by Foundation staff.

A global community

Locally, different teams of the GNOME contributing community have different requirements. Still, it’s important to have a single place where we can easily reach out, bond, and discover especially during a pandemic when we are deprived of in-person events. One of the goals of the Foundation is to foster collaboration inside the community. The looser the ties between our members, the more the platform they are creating is likely to crumble.

That crumbling is already starting to happen because of the fragmentation of our tooling. IRC and Matrix are bridged, so it’s more or a less a global community, but Rocket is completely on its own. @kprogri made the very welcome effort to join the IRC/Matrix world to keep in touch with the rest of the contributors. But even within the IRC/Matrix world there is some fragmentation. Invite-only IRC rooms are nearly impossible to bridge without being kicked all the time. And some people got so fed up of IRC spam and kicks they created Matrix-only rooms for their project. Plus, all the kicking, editing, code-pasting issues are upsetting people on both ends of the bridge.

GNOME is also part of a wider community: the desktop environment community. We are more than happy to organize the LAS with our friends from KDE every year. So far, the organisation of LAS happens on Telegram. KDE folks were invited on our Rocket.Chat instance, but unsurprisingly it never really caught on. An open-source federated system where both organisations can use their own identity would be a huge improvement over the current situation.

At an even larger scale, the GNOME project is a successful project used by many others. There is a global movement of organisations getting out of silos. The open source community is widely adopting a federated system: Mozilla, Fedora, KDE, Debian, Archlinux… all those organisations are either Matrix-first or are transitioning to Matrix. If GNOME decided to stand out for the sake of it and decided to use another platform, it would self-segregate itself from others.

What we have achieved

It’s important for the target solution to answer most people’s needs so they can feel at home here. We cherish our long time contributors as much as we want to keep attracting new ones. IRC can’t be shut down by force, its users can’t be coerced somewhere else and that’s a good thing.

We’ve been sitting with IRC users to understand what makes it so important to their eyes. One of the key points was that they rely on IRC for work or to hang out with other communities such as Freenode. We found out that there was a CLI client that more or less allows to see Matrix as another IRC server. This way people who really need IRC can keep browsing their usual channels using the IRC protocol, and browse the GNOME ones using the Matrix protocol.

We also took into consideration complaints from IRC and Matrix users to try to make the bridge easier to live with. We finished the deployment of the Matrix instance on the GNOME side to make it easier to connect to.

Another common complaint was the bridged room alias on the IRC end. They were quite convoluted, since #newcomers on IRC was on Matrix. We updated the bridged room aliases to match what people are used to on IRC (e.g. #newcomers on GIMPnet is now on Matrix).

In terms of discoverability and decluttering the environment, we curated the Matrix directory so rooms are easy to find, and documented how to use it for every Matrix user.

We also learnt from Mozilla how to set up a moderation bot so abuse can be handled properly on Matrix. We have already banned a few people and ensured it’s technically possible to perform moderation on both IRC and Matrix sides from the Matrix end to keep our community safe.

Finally, Matrix is already culturally well anchored in our community. Fractal, the GNOME client for Matrix has been around for quite some time and is in very active development. Julian Sparber received grants by the EU to fund his full time work on Fractal. We have two GSoC interns to make it even better this summer.

What we can do

A few more issues can still be fixed with a bit of work and tweaking, but in the end compromises have to be made at one or both ends of the bridge. The current situation is IRC users are mostly unhappy about Matrix because it forwards events not supported by IRC, such as message edits or quote replies. And Matrix users are mostly happy except at very specific points of time… when this happens:

Screenshot of someone being kicked from the gnome-hackers rooms

This happens because of how the bridge works. When people join a bridged channel from the Matrix side, the bridge creates a puppet user for them on IRC. When the user sends a message on Matrix, the bridge controls their puppet and uses it to send the same message on IRC. When a second Matrix user joins, the same bridge, with the same address, creates a second puppet user on IRC.

You might have seen it coming: when the bridge restarts, all the puppets leave IRC at once, and they all rejoin at once. IRC sees a burst of joins happening in a short period of time: it enters in flood protection mode and kicks every joiner. This means every puppet is kicked.

Since the bridge tries to keep IRC and Matrix in the same state as much as possible, when a puppet is kicked from IRC it kicks the user from Matrix as well to avoid having a split-brain view.

People from Element have landed a MR offering an option (disabled by default) so the Matrix user is not kicked from the Matrix room when their puppet is kicked on IRC. This means that the source of truth when it comes to instant messaging would be on Matrix. During a short period of time, people on IRC might not see what people on Matrix post.

The issue here is not a technical one, but mostly a governance one. Today the experience is suboptimal on both ends of the bridge. It is possible to make the experience exellent on one end at a time, but not both. One of those ends has served very well for a long time, but doesn’t have a future. The other has the potential to be a welcoming platform to work with others, with modern features every newcomer could expect in 2021. We can make the experience great on Matrix if we toggle that switch, but we can’t do it if we don’t accept IRC is now a legacy platform that needs to slowly fade away.

What we can’t do

The analysis is clear: IRC and Matrix cannot be bridged fully in a user friendly way. IRC was never designed to be managed by another system. It doesn’t handle automatic registration on behalf of others. Its defense systems against spam make it kick every newcomer whenever too many of them join at the same time.

IRC used to be the top notch system for a while, and is still pretty reliable. There are issues here and there, but given how basic the whole protocol is, it is fairly sturdy. The frugality of the protocol that was once its strength has turned into its weakness in the modern world. People’s expectations have shifted. Most of our contributing community is already “working for the computer” when producing the great software we all enjoy. It’s time for instant messaging to get out of the way, and to allow the computer to work for us when it comes to talking to each other. No NickServ spells, no ChanServ incantations, no bouncer to rent or to host on a server. It’s time for us to just enter our credentials, browse the channels, and enjoy the conversation with the ones we like to work with.

Such a thing can’t happen without a transition plan. IRC has been around for a long time, and people have good reasons to love it. It’s difficult to change one’s workflow after many years of good service. We learnt it the hard way with the Rocket.Chat experiment: it never caught on because the step was too high. It required too much effort to move a whole community from one system to a completely different one.

That’s where the infamous bridges can finally help us. By shifting where we want the best experience to be, we can keep the bridge for a transition period. We can make the experience on Matrix better, keep in touch with people who really want to use IRC, incentivize them to progressively join us, and eventually, one day, remove the bridge entirely.