Stoat has rather advanced message formatting. Need proof? Check this out:
Advanced Stoat message markup.
There is no image attached to that message. That is something called KaTeX, but before we get ahead of ourselves, let's take a moment to cover the basics. If you're just looking for a quick overview, you should check out the 'Formatting your Messages' page on our support site, but if you're looking for more comprehensive coverage, read on.
Markdown
Developers structure content on the web with a language called HTML (Hypertext Markup Language). For example, here is the structure for a link: <a href="https://stoat.chat">Stoat</a>. That is then handled by your device and looks like this: Stoat.
Markdown is a simpler way to author content. It has been around since 2004 and is used on Stoat, here on Reddit, and in a multitude of other places. It simplifies that complex HTML into something you actually want to write. You're likely already familiar with the basics, but let's take a look. Feel welcome to copy and paste bits into Stoat so you can get a hang of things. Your 'Shared Notes' section is a good place to do this.
Links
Stoat automatically detects links you write, but if you don't want them to get an embed, you can wrap the link in angle brackets (<, >), like so: https://example.com
If you want custom text to be a link, you can use this syntax: [Text to appear](https://example.com). That'll output 'Text to appear'.
Italic, Bold, and Strikethrough
You can make text italic (slanted) by wrapping it with an asterisk (*) on either side. Like this: *italic text*, which outputs: 'italic text'. You can also use a single underscore instead of an asterisk: _italic text_.
You can make text bold by wrapping it with two asterisks on either side. Like this: **bold text**, which outputs: 'bold text'. You can also use two underscores on either side: __bold text__.
To have text which is both bold and italic, you can combine those wrapping characters. You can write ***bold italic text***, ___bold italic text___, **_bold italic text_**, or _**bold italic text**_, or *__bold italic text__*, or __*bold italic text*__. They all do the exact same, but you can write it any of those ways.
To write strikethrough text, which is useful for indicating a retraction, you wrap the text in one or two tildes (~), like so: ~Pluto is a planet~, which outputs '~Pluto is a planet~'. You can also mix it with bold, italic, and other formatting, but I don't think I need to run you through every possible permutation.
Headings
To structure text, you can use headings. They make text larger and expose text hierarchy to assistive technologies. You write headings by prefixing them with a number of octothorpes (#) representing the heading level. There are a maximum of six heading levels.
Heading level one: # Heading
Heading level two: ## Heading
Heading level three: ### Heading
Heading level four: #### Heading
Heading level five: ##### Heading
Heading level six: ###### Heading
(you can also close these headings by ending them with the same number of octothorpes, like so:### Heading ###*, but you don't need to, and nobody ever really does)*
You can also write a level one heading by having a line underneath it with any number of equals signs (=):
Heading
===
You can write a level two heading by having any number of hyphens (-) on the line underneath the heading text:
Heading
---
Blockquotes
You can quote text by placing it in a blockquote. They look something like this:
Wow, it is a blockquote. How wonderful is this?
You do this by placing a greater-than sign (>) before the line you want to quote. You can quote multiple by starting multiple sequential lines of text with the greater-than sign.
> Quoted text.
> More quoted text.
You can also use other formatting within a block quote, like so: > **Bold quote text**. You can even nest layers of block quotes by starting a block quote within a block quote.
Lists
Lists are wonderfully useful. There are two main types. Ordered lists, which have numbers, and unordered lists, which just have bullet points.
Ordered lists are written by starting the line with a number and then a full stop, like this:
1. List item one.
2. List item two.
3. Believe it or not, but this is list item three.
On Stoat, you can write unordered lists by starting the line with either an asterisk or a hyphen. They both work the exact same. Here is an example:
- List item.
- Another list item.
- Yet another list item
* List item.
* Another list item.
* Yet another list item
Code
If you have content you wish to include in a message that needs to be formatted exactly as is, you can designate it as code.
If you only have one line of text, you can just wrap it in backticks () like this: \code text. Then it'll render like socode text`.
If your content stretches across multiple lines, you can wrap it with triple backticks. Further, you can start the first line of backticks with a note of what format the content is, so Stoat can provide syntax highlighting. For example, you can write 'html', or 'text', or 'markdown'. Here is an example of a full code block:
```markdown
- List item.
- Another list item.
**Bold text.**
```
Tables
You can create tables in messages with lots of pipe and hyphen characters. Unfortunately, it isn't very nice to write and can be a real pain I recommend using a tool to make it easier, like the one on TablesGenerator.com.
If you want a big line to cut across your message – such as to indicate the change of a topic – you can use horizontal rules. They're written by placing three hyphens together: `---`.
Spoilers
To stop exposing people to the fact that Aquaman drowns in Endgame, you can spoiler content so that a user must click on it to expose it. This is done by wrapping the text you wish to spoiler in two pipe characters (`||`). It will look something like this.
Timestamps
You can write timestamps in this format: <t:1787315340:f>. That'll appear something like this in chat: '21 August 2026 at 8:29 pm'. It is extremely useful, as you can display times which will adapt to people's time zones or which will count down as the time approaches. They are hard to write without the assistance of a tool, however.
As an only semi-intended side-effect of the system Stoat uses for handling markdown, you can write footnotes in your Stoat messages. This is done using the below markdown:
Vale is a member of the Stoat team.[^1]
[^1]: Their real name is Declan Chidlow.
Which outputs looking like this:
KaTeX
If you've ever tried to type maths on a computer, you've likely run into trouble. You can get by with a simple '2 + 2 = 4', but what about fractions, or square roots, or matrices? They're a tad trickier to present nicely. This is where TeX comes in. It was made in the 1970s as a way to format mathematical notation on a computer. LaTeX is an improved version, first released in the mid-1980s, and from that came KaTeX, which is a library that Stoat uses to convert LaTeX into formatted output.
Typical syntax for writing LaTeX in markdown is to wrap in a single dollar sign for inline maths and two dollar signs for block maths. However, on Stoat, you must always use two dollar signs to wrap LaTeX, like so: $$e^{i\pi} + 1 = 0$$. This avoids false positives when people use dollar signs in messages.
Wondering about the demo from the start of this article? Here is the LaTeX for that:
That is quite the complex LaTeX concoction, but you should be able to comprehend it by reading it through. You can get a full idea of what KaTeX supports here: https://katex.org/docs/supported.html
Keep in mind that not every server owner will appreciate your zany formatting antics, but here are some more cool things you can do:
I'm going on a roller-coaster, '$$\textsf{\raisebox{0pt}{w}\raisebox{1pt}{o}\raisebox{2pt}{o}\raisebox{2pt}{o}\raisebox{2pt}{o}\raisebox{1pt}{o}\raisebox{0pt}{o}\raisebox{-1pt}{o}\raisebox{-2pt}{a}\raisebox{-2pt}{h}\raisebox{-2pt}{!}}$$'
I hope this guide is helpful. I know that it can all be a bit overwhelming and confusing if you're new to writing Markdown. You can always try using your Saved Notes as a bit of a sandbox for testing if you want to experiment with how it works and functions on Stoat.
If the service appears functional on the status page but you're encountering a problem, such as a blank grey screen, your antivirus, telecommunications provider, or internet service provider might have us incorrectly flagged. This is an error on their part and out of our control, though we try to appeal when this occurs.
If you encounter a block, try switching networks (such as to mobile data from Wi-Fi, or vice versa), whitelisting us, or using another device to access the service until your chosen provider relaxes their block.
3. Is Stoat open-source?
Yes, most of Stoat's code is licensed under the GNU Affero General Public License (AGPL) v3. You can check the individual licences in the code repositories on GitHub: https://github.com/stoatchat
Absolutely! We'd love for you to build on or around the platform. There are many libraries developed both officially and by the community that you can use, and there are servers on-platform for discussing development. You can find everything you'd need to get started at https://developers.stoat.chat
You can also support the project financially. Stoat has a Ko-Fi page which is used to cover operational costs. Everyone's support here has gone a long way to helping the platform quickly scale without being too stressed about financials. If you send £3 or more to the platform, send an email to support@stoat.chat with some proof so we can give you a supporter badge on your profile.
7. Is a subscription planned?
Yes, a subscription is planned. Exactly what form this will take is not entirely defined, but the intent is not to paywall things unnecessarily and to focus on ensuring the service can be operated sustainably. This means paywalling things like higher-quality video streaming and keeping cheap-to-provide things (like custom banners, animated profile pictures, and platform-wide custom emojis) free.
Currently contributors and team members aren't paid (though some do have open support pages if you wish to contribute to them directly). A subscription would assist in making sure that people are reimbursed for their work and can dedicate more time to the platform.
Profiteering gluttons we are not!
8. What are your plans for age verification?
Stoat must comply with the law as applicable, so some form of age verification will be implemented in relevant jurisdictions as necessary. Regardless of our sentiment on age verification legislation, from a legal perspective we cannot just refuse to comply.
We have no plans for an overzealous blanket requirement and only intend to implement it where and as legally required. There is ongoing discussion about how to ensure any verification we implement respects privacy, handles data responsibly, and does the right thing by our users.
It is likely to be externalised to a third-party due to the great deal of complexity intrinsic to handling such sensitive data. We'll have more to share in time and welcome discussion regarding age verification.
Currently, Stoat has taken the temporary measure of blocking access to age-gated content where necessitated.
9. Will you have end-to-end encryption (E2EE)?
We don't currently have E2EE, but it is a long-standing planned feature on our roadmap to introduce E2EE for direct messagess. It takes a lot of work to implement E2EE, and we have to make sure we get it right. A poor E2EE implementation is far worse than no E2EE.
10. When is Y feature going to be available? What is the ETA?
We can't provide accurate estimations for when new features will be live, so we don't. It isn't fair to you, or to Stoat's contributors, to give inaccurate figures and set false expectations.
Stoat is developed rather openly, so you're more than welcome to check-in on discussions and work happening on GitHub.
Not at all. We welcome other languages completely. Diversity is good and if we didn't want people speaking other languages we certainly wouldn't go through the efforts of translating the app and ensuring we have platform moderators that speak different languages.
That said, the official Stoat server on-platform is English only (with the exception of the support channel) purely for the sake of moderation. We don't have the capacity to ensure there are moderators speaking every language in that server around the clock, so we limit it to English.
14. Where do Stoat's GIFs come from?
Stoat sources GIFs from our very own service: Gifbox! You can upload your own GIFs to the platform for anyone to use and the catalogue of available GIFs is growing by the day.
Gifbox gives us full control to make the Stoat GIF experience as good as it can be, and down the line you'll be able to link Gifbox to your Stoat account. For developers, it even has an API for you to use.
Let us know of any other questions you may have, and we'll endeavour to answer them. Remember, we're a small team working as volunteers and we have jobs and lives atop all of our Stoat commitments.
After doing some searching and reading I can see Tenor was retired and caused some issues for Gifbox, at least for those now setting up self hosted instances such as myself. I can see that a new service has been launched as per : https://stoat.chat/updates/introducing-gifbox
How do self hosted users connect to this service to start pulling Gifs into the gif selector? I apologize if this has already been covered but I have not seen anything on searching the reddit or official git.
TLDR I downloaded Stoat and some reason my microphone is not working at all, when asked my friends about it they told me they did not have any issues with sounds etc.
Very new to Stoat and have just finished setting it up on my home server. So far as roles, as standard there is the "Everyone" role which is the permissions all new users get when joining. I also created another "Admin" role for obvious reasons.
I am seeing something strange regarding the "Everyone" role. I have ensured that the permission "Manage Messages" under Channels is disabled, to prevent any users from being able to delete other users messages.
However when I log in as my Test user, I am still able to delete my Admin accounts posted messages. To be clear, it is not just the fact the delete icon appears in the UI, it actually does delete the message.
I have made sure my test account has no additional roles. Thinking it might be a gremlin, I went back to the Everyone role and enabled Manage Messages, saved it and then disabled it again. This however has not fixed the issue.
Any suggestions?
I am on version 0.16.2 (Self Host)
*Update\*
I have just created a new Group Chat (under Direct Messages). Inside the group chat, the permissions I have set are being abided by as expected as users under the "Everyone" role cannot delete posts, only Admins.
This now just leaves the main servers '#General' channel where these permissions are not working as expected.
If I create a new Text channel in the server, in this channel the permissions set are abided by. It is odd that the permissions are not sticking inside of the '#General' channel
text chat worked totally fine but voice calls just sat on "connecting" forever spent way too long chasing the wrong things before finding the actual cause so im writing this up in case it saves someone the headache
TLDR: voice is livekit based now and the voice server has both ipv6 and ipv4 addresses. on my network the ipv6 side is just dead (connection refused, or reset mid handshake) while ipv4 works perfectly. the app tries ipv6 first and never falls back to ipv4 so voice hangs forever. text chat kept working the whole time because the chat socket is ipv4 only, which is why it never even looked like a network issue posting the whole thing because the fix is buried in a wall of diagnosis, skip to 'the fix that actually worked for me' if you just want the flag
there were a bunch of red herrings and i fell for basically all of them:
the "default device" audio fix from another thread, tried it, did nothing for me. might work for you though
post quantum key agreement / clienthello size stuff. i actually replayed the exact clienthello over raw sockets and it worked fine over ipv4, so only the address family mattered. red herring
my vpn/proxy tunnel. fine, ipv4 worked directly. red herring
app version. v1.5.4 behaves the same as the older ones, updating does not help
how to check if this is your problem
first get your voice nodes hostname, stoat publishes it in the settings api:
if the -4 one does a tls handshake fine and the -6 one gets refused or instantly reset, congrats, this is your issue
if you want actual proof instead of guessing, run the app with a net log:
flatpak run chat.stoat.StoatDesktop --log-net-log=/tmp/netlog.json --net-log-capture-mode=IncludeSocketBytes
quit the app after (it only writes the file when it exits) and search it for the livekit host. a dead ipv6 attempt shows up as net_error -101 / os_error 104 on an ipv6 address with no ipv4 retry after it. seeing that in the log is the thing that finally made it click for me
the fix that actually worked for me
didn't touch the app itself, just copied the flatpaks desktop file into my user applications dir and added one chromium flag to the Exec line:
this pins the voice host straight to the ipv4 address so the app never wastes its one attempt on the broken ipv6 route. voice joined on the first try after that. checked with ss -tnp | grep 157.180.45.15 and there was a proper estab connection
two catches though. the ip is current as of october 2026, if stoat ever moves the node you have to re-run the curl and update the MAP rule. also the override only applies when you launch from the desktop entry (menu, gtk-launch), typing flatpak run yourself skips it
while im here, two other linux things people keep running into: turning your webcam on inside a voice call can disconnect you (known upstream bug, still open), and screen share is capped at 720p30
honestly the real bug is that the client never falls back to ipv4 after an ipv6 socket fails, worth filing that with the for-desktop repo. the net log evidence above is enough for a decent report if you want to do it
tried the desktop app, the web app, and the legacy website. also tried copying invite links from the web app and adding it via the plus symbol- nothing.
is there a grace period for new accounts before they can join servers?
I've wanted to jump off discord recently so i was looking at Stoat, Osmium, and Fluxxer, and i want stoat to work cause of the customization but its just not going to if i cant get mobile notifs, is there something im missing? is there some addon i can use to fix this?
Me and my friends have slowly started to move ourselves and our group chat over to Stoat in the event Discord gets banned in their country. Stoat is great for this! Open source, free customization and the like. But, at least on my end, i'm not able to upload a PFP or banner, or send images. Really, anything that isn't sending/receiving text messages or friend requests doesn't work, and it's quite upsetting, as i can't discover servers or communities either. Furthermore, the web client doesn't work on my phone (iOS 17, iPhone SE 2, gray screen), so i'm having to resort to old.stoat.chat to do so. The dedicated Apple Silicon desktop client doesn't work either.
Hey so been using Stoat for a little bit now, and while I think its great, theres one major issue I have been having. Almost every few minutes, no matter if I'm on wifi, on the desktop app, mobile data, or the browser version, i disconnect and reconnect. I cant even scroll back in chat for more than a minute or two to check what I missed before the reconnect shoots me back to the most current message. Not to mention I usually have it full screen on a separate monitor, and when it does this it flashes and makes just enough motion to make me constantly check it thinking its like a pop-up or something. And it does the same thing on my phone too no matter where I am so I know my computer isn't the issue either. I'd just like to be able to browse without the entire page blinking every few seconds
Hello everyone! I'm very new to stoat and I have no idea how to set roles to people. I've been trying for a while and i cant find the option to do it. Please help
As the title suggests, I self hosted Stoat on my machine. I want to use it on my android and iOS phone but there is no way to set your instance to your host and login. What do I do here?
Me and some friends are trying to use Stoat's video streaming as an alternative to Discord since it's currently banned in Brazil and one of my friends lives there, but I'm having an issue that makes Stoat's video streaming basically unusable for our use case: it's streaming full desktop audio even in single-application streaming mode, which means my friends' voices get echoed back at them. I tried messing with the input/output settings, but none of them seemed to help aside from running Stoat's voice call output to a different audio device (but then I couldn't hear it, so that's not really a solution). Is there something else I should be changing, or is this just a bug on Stoat's end?
Discord just implemented the mass-surveillance bullshit in my country & I'm looking for alternatives that people actually use.
I thought about moving to Stoat but I want to make sure this isn't just another Guilded & that there isn't anything fishy about it (waiting to get popular to then become Discord 2.0, asking for ID & such).
For communities I'm looking for : TF2 (people who actually play the game) & Pokémon.
For some reason when I try to use Stoat on my iPad, all I get is a completely dark gray screen! It didn’t do this before until a few hours ago. Does anyone know why this is happening and how it can be fixed?