Tulir Asokan / Blog

October 2025 releases // Verification in bridges, hosted Meowlnirs & Zulip bridge

Posted on • 749 words

This month's releases include self-signing support in bridges, better multi-tenant support in Meowlnir for Asgard.Chat, a Zulip bridge, and a new versioning scheme for bridges and Meowlnir.

Bridge/library Version
mautrix-gmessages v25.10
mautrix-whatsapp v25.10
mautrix-bluesky v25.10
mautrix-twitter v25.10
mautrix-gvoice v25.10
mautrix-signal v25.10
mautrix-slack v25.10
mautrix-meta v25.10
meowlnir v25.10
mautrix-go v0.25.2
go-util v0.9.2

Versioning

All Go bridges have been following a monthly release schedule ever since the WhatsApp bridge was accidentally released on the same day for 3 months in a row. To simplify picking version numbers and telling how old a given version is, all megabridges and Meowlnir have switched to calendar versioning using the vYY.0M.patch format.

This months releases are v25.10 with v0.2510.0 as the git tags. In the unlikely event of a patch release, it'd be v25.10.1 and v0.2510.1.

Due to restrictions from Go modules, the actual git tags will still follow 0ver, so they'll be formatted as v0.YY0M.patch instead. Docker tags will be available in both formats.

Other projects like maubot and gomuks are also expected to switch to calendar versioning in the future. Legacy bridges like Telegram and Discord won't switch over before being rewritten though.

Meowlnir

If you've read This Week In Matrix or watched this morning's keynote at the Matrix conference, you may have already heard about Asgard.Chat, a hosted moderation bot service I recently launched with some other people. Check it out if you need a moderation bot (which you do if you run any public Matrix rooms), but can't host one yourself.

To work with Asgard, Meowlnir has some improved multi-tenancy features. In particular, the untrusted flag in the config can be set to indicate the instance is meant for multiple tenants to enable some additional checks to the policy list cache. Without the checks, separate bots may be able to access policy list info without actually being in the list room.

Additionally, there's a new meowlnir4all section in the config which can be set to enable the !provision command. The command can be used from an admin room to fully provision a new bot and management room for a given user.

mautrix-zulip

There's a new puppeting bridge for Zulip. It doesn't have a lot of features yet, but should work for basic bridging. As with all bridgev2 bridges, it also supports relay mode, but I haven't tested logging in as a bot.

Zulip topics are bridged as Matrix threads. It works best with a client like gomuks, which shows all messages in the main timeline, but allows focusing on a thread.

https://github.com/mautrix/zulip

E2EE self-signing in bridges

As mentioned last month, mautrix-go and mautrix-python now have basic support for cross-signing the bridge bot for future proofing against MSC4153. You can enable it using the self_sign option under encryption in the bridge config. When enabled, the bridge will generate a new recovery key and cross-signing keys, then sign its own device.

Megabridges will save the recovery key in the kv_store table in the database, while legacy bridges (i.e. Telegram) will just log it. If the bridge is reset such that the bridge has to sign itself again, Go bridges will ask you to put the old recovery key in the database, or a special overwrite value to tell the bridge you want it to overwrite existing cross-signing keys. However, Python will just always try to overwrite keys.

Note that the bridge can't do user-interactive auth, which means by default it can only upload cross-signing keys if the bot doesn't have those keys yet. This means that overwriting as mentioned above will fail if the bridge bot already has cross-signing keys uploaded. However, recent changes to MSC4190 allow bridges to replace keys without UIA, so the problem can be avoided by enabling MSC4190 and ensuring you have the latest version of Synapse (v1.139 or higher). Also note that until Synapse v1.141, enabling MSC4190 requires updating the bridge registration. See the docs for more info.

In addition to verification, the support for MSC3202 (the appservice mode in the encryption config) was updated to work with Synapse, so it is now safe to enable as long as you regenerate the registration and enable the relevant experimental_features in the Synapse config as well.

gomuks

gomuks was less active this month, but there is an account data explorer now in addition to the old room state explorer. Also, a dedicated share button was added to rooms and spaces to avoid having to go through the event share menu to get a room link.