More Features of Matrix

Now that you have aced the basics, let’s talk about the intricate details of various features of Matrix. The guide assumes that you have done some preliminary discovery of features and that you are here for specifics that may not be too intuitive.

All about chatting

IMPORTANT! You cannot change your Matrix user name. Choose it wisely.


  • If a message has been edited, all of its edits, plus the original message, must be deleted to fully remove its content!
  • Due to a spec defect, initial revision of a message can only be removed if the message is removed altogether. Subsequent revisions can be removed on their own.
  • If a message has been replied to, all of its replies, plus the original message, must be deleted to fully remove its content!
  • Note that anyone who could read the message may still record its content before deletion. (For unencrypted messages, this includes the homeserver operators.) This applies to virtually any instant messaging platforms in existence, so you still need to be careful of what you say.
  • If a user annoys you, you can ignore them. Careful not to ignore yourself!


Without prefixing a message with /html, Matrix supports basic markdown, as in everything in the CommonMark spec. The changes are:

  • For embedding images, the link must be an MXC URI, not an HTTP/S URL. This is required by Matrix specification to prevent remote homeservers from creating IP trackers to track users of multiple homeservers.
  • Language syntax highlighting in code blocks is supported - simply specify the language on the same line after the first three backticks.

Aside from the above:

  • For strikethrough, Element and SchildiChat use <del>text</del> (without /html), while FluffyChat uses ~~text~~.
  • For underline, Element and SchildiChat use <u>text</u> (also without /html), while FluffyChat uses __text__.
    • Note that the above differences only exist in composing a message, and both clients render existing messages in the same way.
  • For spoilers…
    • On Element and SchildiChat, you must prefix the message with /html, and then insert one of the following lines of code at the position you desire, so it will hide the spoiler content and, optionally, show the reason alongside it. Note that if you want the entire message to be a spoiler and without inserting a reason, you can just prefix a message with /spoiler without writing HTML.
      <span data-mx-spoiler="reason">spoiler content</span> # with reason
      <span data-mx-spoiler>spoiler content</span> # without
    • On FluffyChat, you can achieve the same using ||reason|spoiler content||.
  • Tables are only supported on HTML (see below).

And, about slash commands on Element and SchildiChat on PC related to text messages:

  • Matrix also supports these HTML tags if you prefix a message with /html.
  • Prefixing your message with one of the following commands will trigger the corresponding visual effect for all Element/SchildiChat users on PC who are currently focused on the room: /confetti, /fireworks, /rainfall, /snowfall and /spaceinvaders. The effect will only be triggered once for these users only.
  • Prefixing your message with /me will cause your message to start with * followed by your display name1.
  • Prefixing your message with /rainbow will make the text appear in rainbow colours.
    • The two commands above can be combined using /rainbowme.
  • Prefixing your message with /shrug, /tableflip, /unflip and /lenny will place the corresponding ASCII emote at the beginning of the message content. (This differs from Discord, where the emote is placed at the end.)


You can upload files onto messages. The size limit varies by the homeserver you’re on, but most homeservers have it between 50 and 100 MB. There are no restrictions for file types, allowing some apps to offer the ability to record and send voice messages.

All files you upload onto Matrix are assigned an MXC URI, which you can use for referencing to the corresponding file. The MXC URI can be retrieved with the following steps:

  1. Find the message.
  2. On Element and SchildiChat on PC, hover over the message and click the three dots. On FluffyChat, long press the message and click the three dots on the top.
  3. “View Source.”
  4. Under the content JSON object, locate the url attribute. The URI the starts with mxc:// is the MXC URI.

If the attachment is an image, the URI allows you to do the following, at least on Element and SchildiChat:

  • Change your avatar for the current room using /myroomavatar mxc://...
  • Embed the image on text messages by inserting ![alt text](mxc://...) (You can also use <img> tags under /html)

Embedding an image

The attachment can be accessed on the internet by replacing the mxc:// prefix with https://$SERVER/_matrix/media/r0/download/, where $SERVER is the domain of any homeserver (it does not need to be in the room).

The attachments themselves can only be deleted by the homeserver operator, and until then, they are visible to the public. This means, especially, that deleting a message will NOT delete its attachments! (However, attachments uploaded in an encrypted room are visible to the public in the encrypted form, where only its intended recipients have the keys to decrypt it.)
It is possible to use "custom emojis/emotes" in text messages by embedding the emote: simply adjust the image, upload it in an unencrypted room, get its MXC URI, and place the embedding code in messages. Furthermore, FluffyChat allows you to assign a :shortcode: to custom emotes so that they can be entered like normal emotes: Go to user settings, then "Conversations", then emoji settings. Note that embed GIFs will not animate.

Custom Emotes & Stickers

Note that emotes/stickers sent from any app are visible to most clients.

Integration managers (which Element uses) are minimally used by the community; instead MSC2545 is preferred. Emote rooms are available at the space.

Nheko, FluffyChat and Cinny supports sending emotes/stickers and managing emote/sticker packs. SchildiChat supports sending emotes.

See here if you want more details.


You may react to any message with any unicode emoji or any plaintext content2. The latter is available…

  • On FluffyChat, by replying to a message and entering the desired text prefixed with /react in the composer;
  • On SchildiChat, by clicking the reaction picker for a message, entering the desired text in the search box, and then choosing “React with (text).”

Voice/Video calling

Voice/video calling is currently only supported for private messages (rooms with only 2 participants).

Currently, if you try to start a call in a room with more than 2 participants, a Jitsi Meet (not part of Matrix) widget will be displayed for all users as a temporary solution. However, work is underway to allow native voice/video calling for groups, which hopefully will be enabled by early 2022.

All about bridges

Matrix prides itself in technical interoperability, i.e. ability to work with other platforms. Therefore, Matrix allows you to connect your chats to another platform.

Note that encryption is not supported on most bridges. Furthermore, the following instructions apply across the Matrix federation, but private homeserver providers as well as some public homeservers operate certain bridges for the benefit of their users, in which case please inquire the relevant providers.

Some bridges offer the possibility to bridge an account from another platform onto Matrix (known as puppeting). However, it is often against the ToS of the platform to do so (as interoperability is antithetical to centralized "walled garden" approaches) and may result in loss of account. Furthermore, it may damage the encryption mechanisms of the platform, as messages must be decrypted first before re-encryption. Lastly, the bridge operator can see your login credentials (not an issue if you're hosting the bridges yourself). You have been warned.


To bridge a Matrix room with a Discord channel, you can install matrix-appservice-discord if you’re running your own homeserver3, or set up one of the free public bridges otherwise:

Matrix users will show up as webhooks on Discord, and Discord users will show up as standard users on Matrix (but you cannot DM them). There is no puppeting.


To bridge a Matrix room with a Telegram group chat, you can install mautrix telegram if you’re running your own homeserver, or use one of the free public bridges otherwise:

When a Matrix room is bridged with a Telegram group, Matrix users will be represented by the bridging bot on Telegram, while Telegram users will show up as standard users on Matrix (but you cannot DM them).

When you log into a Telegram account on a bridge, you may use it to control your own account such that you may interact with the entirety of Telegram from Matrix. This is called “puppeting” and is not supported by all bridges.


To bridge a Matrix room with a Slack channel, do the following on Element or SchildiChat on PC:

  1. In your desired room, click the info button on the top-right.
  2. “Add widgets, bridges & bots”
  3. Navigate to “Slack bridge” and follow the instructions.


You can join any IRC channel on these networks directly from Matrix. Matrix users will show up in their display name, suffixed with [m].

You can register the nickname, but your NickServ password would be visible to your homeserver as encryption is not supported for bridges, so do so at your own risk.


You can join any XMPP MUC on any instance directly from Matrix, using the Bifrost bridge provided by or


Matrix supports many other platforms, but such bridges generally require setup. If you want to bridge those platforms, or if you have performance requirements that cannot be met by existing public bridges, you may either:

  • Host the bridges yourself, if you run your own homeserver
  • Use public bridges (which you’re encouraged to donate for):
    • Aria Network (Facebook, Instagram, MS Teams, Twitter, WhatsApp; only available to accounts on the homeserver)
    • (Signal, Slack, WhatsApp)
    • TeDomum (WhatsApp)
  • Set up bridges as part of a managed homeserver hosting:

All about rooms

Because FluffyChat’s room management capabilities are somewhat limited by design, this guide will base this section upon Element and SchildiChat on PC.


If you want to promote a public room, you can publish public addresses and/or place it on your homeserver’s room directory.

To publish an address:

  1. Go to room settings.
  2. In the “General” tab, under “Room Addresses” there is “Local Addresses.” As indicated, you can only create addresses on the homeserver you are on4.
  3. Enter the localpart (the part before :) of your desired address and then click “Add”.
  4. Under “Published Addresses,” enter the entire address (with homeserver domain), then click “Add”.
  5. The “Main Address” is used for room directories and for mentioning the room in other rooms. Select one from the published addresses.
  6. If you want to advertise your room in your homeserver’s4 room directory, enable “Publish this room to the public in (server)’s room directory?”

Steps 1 to 3 can be done by anyone, whereas step 4 by 6 requires the user to have a power level equal to or higher than the required level for “Change main address for the room.”

A public address also allows you to link the room from a webpage.


See the official guide for general information.

The commonly-taken approach is:

  1. Host Draupnir, or request Draupnir4All.
  2. Subscribe to ban lists. To combat spam, it is enough to subscribe to, but other lists are also available in the space.
  3. Review the Moderator’s Guide for various commands.
If you promote a user to the same power level as you, then you will not be able to demote them!
If you do not have Draupnir/Mjolnir, It is a good idea to copy ACLs of other rooms (especially those of popular public rooms) and use them on your own to strengthen your room's defense to unwanted content. To do so:
  1. Enter /devtools in the room you want to copy ACL from.
  2. Click "Explore Room State."
  3. Click
  4. Click "Edit."
  5. Copy the content in the box. (It is futile to try to hit "Send" as you probably don't have the permission to.)
  6. Repeat steps 1 to 4, this time in the room you want to use the copied ACL in.
  7. Paste the content in the box and hit "Send."
  8. Confirm success. A state event will be created in the room, indicating that you have changed the ACL.
  9. Note that denying a homeserver whose users are already present in a room will not automatically kick the users. If necessary, enter the homeserver domain in the search box of the member list and kick them from your room. They will not be able to join back.
Hosting Draupnir/Mjolnir without permission to bypass ratelimit on the homeserver may result in reduced performance, but it is still possible.


Integrations in Matrix include widgets and bots.

Widgets display an interactive HTML page on top of chat messages. This only works on Element and SchildiChat on PC. You can use the /addwidget command, or the “Add widgets, bridges & bots” link in the room info sidebar. Note that individual members must opt into displaying the widget, and can choose to dismiss (“unpin”) the widget for themselves at any time. Furthermore, anyone with power level above the required level for “Modify Widgets” will be able to dismiss (“unpin”) the widget for everyone in the room.

Bots perform automated actions (like sending messages). maubot is the only well-known self-hostable bot, containing a variety of plugins. as well as some homeservers host certain plugins for public use.

Bridges are also bots, but some bridges need to create new accounts to serve as puppets, which should only be operated on a homeserver that you own or otherwise have permission to run such bots on.


  1. Similar to the eponymous command in Minecraft. 

  2. Unlike Instagram Direct, where doing so will actually overflow the screen (you can try it but it will involve reverse engineering), Matrix apps handle this properly by showing the first few (≈10) characters followed by ellipsis. It seems to be mostly intended to be used by bots, as seen in This Week in Matrix, but since most bots are no different from other users, humans are welcomed to use it too. 

  3. If you’re running your own bridge, please manually incorporate this pull request to support parsing Discord replies. (The t2bot bridge incorporates it since December 2021.) 

  4. If you want addresses or/and publicity on other homeservers, you can create accounts, join the room, and do these steps. But be nice and don’t spam. Remember, homeserver operators can remove your room from the room directory or even prevent anyone on their homeservers from joining your room.  2