diff --git a/Commands/index.html b/Commands/index.html index 64588e76..ae1bdb80 100644 --- a/Commands/index.html +++ b/Commands/index.html @@ -1334,7 +1334,7 @@

CommandsBuilt-in commands

Chatterino comes with a collection of built-in commands to help with channel management, Twitch interaction, and other misc. features.

/banid

-

Usage: /banid <userID>1

+

Usage: /banid <userID>

Bans a user by their userID instead of their username. Useful for banning users who are temporarily suspended from Twitch, which /ban cannot do anymore.

Note: If you ban a suspended user this way, they cannot be unbanned from Chatterino, you must wait until their suspension ends or unban them from browser chat.

/block & /unblock

@@ -1437,14 +1437,6 @@

Using placeholders -
-
    -
  1. -

    Added in 2.4.2 

    -
  2. -
- @@ -1465,7 +1457,7 @@

Using placeholders - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Contributing for Developers/index.html b/Contributing for Developers/index.html index 578a96a3..efd88900 100644 --- a/Contributing for Developers/index.html +++ b/Contributing for Developers/index.html @@ -1435,7 +1435,7 @@

QObject classes - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Crash Analysis/index.html b/Crash Analysis/index.html index 538a9426..84cd5d5c 100644 --- a/Crash Analysis/index.html +++ b/Crash Analysis/index.html @@ -880,7 +880,7 @@

Crash Analysis

-

When running on Windows, Chatterino 2.4.1 and later will automatically save information about a crash in a minidump.

+

When running on Windows, Chatterino will automatically save information about a crash in a minidump.

Crashdumps are saved inside the Crashes/reports folder in your Chatterino folder.

Minidumps contain the stacks of all threads, their state (registers), the exception associated with the crash, and some metadata about the CPU and the OS. If you are unsure if your crashdump contains sensitive information, ask a Chatterino developer on the Discord server.

There are several ways of analyzing crashes. To get started, you need to have a symbol (PDB) file for your installation. These files are unique per build meaning that you need to download the file (this is especially important when using nightly builds). For GitHub builds, you can find the PDB file in the release - it's zipped in an archive ending in .pdb.7z. For simplicity, extract the .pdb to the location of your chatterino.exe.

@@ -928,7 +928,7 @@

minidump-stackwalk - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Environment Variables/index.html b/Environment Variables/index.html index df34ab2e..63dacfa7 100644 --- a/Environment Variables/index.html +++ b/Environment Variables/index.html @@ -1073,7 +1073,7 @@

QT_MESSAGE_PATTERN - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Features/index.html b/Features/index.html index 09407c1d..01e067e3 100644 --- a/Features/index.html +++ b/Features/index.html @@ -886,7 +886,7 @@

Replies - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Filters/index.html b/Filters/index.html index 5b88ba6d..eb8cad29 100644 --- a/Filters/index.html +++ b/Filters/index.html @@ -1714,7 +1714,7 @@

Order of Operations -

Available since nightly 69bdac9 

+

Available since 2.5.1 

@@ -1738,7 +1738,7 @@

Order of Operations - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Glossary/index.html b/Glossary/index.html index 212b6f35..3aa71045 100644 --- a/Glossary/index.html +++ b/Glossary/index.html @@ -998,7 +998,7 @@

Replies - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Help/index.html b/Help/index.html index 629f689c..c1f99648 100644 --- a/Help/index.html +++ b/Help/index.html @@ -698,15 +698,6 @@ - - -
  • - - - You are on a Chatterino version older than 2.4.0: - - -
  • @@ -1119,15 +1110,6 @@ - - -
  • - - - You are on a Chatterino version older than 2.4.0: - - -
  • @@ -1326,8 +1308,6 @@

    Y NOTE: A Verified Phone Number is NOT the same thing as Two-Factor Authentication.
    You can add a phone number to your account in Twitch Settings. twitch_phone_auth

    -

    You are on a Chatterino version older than 2.4.0:

    -

    On February 24th 2023 Twitch shutdown the service old versions of Chatterino used to send whispers. You must update to 2.4.0 or newer to continue sending whispers.

    FFZ/BTTV emotes are not working

    You need to be logged in to see emotes. Try hitting F5 once to manually refresh the emotes.

    @@ -1400,7 +1380,7 @@

    My Reply was sent to the wrong m - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Hotkeys/index.html b/Hotkeys/index.html index 097e2748..55186f2b 100644 --- a/Hotkeys/index.html +++ b/Hotkeys/index.html @@ -990,7 +990,7 @@

    Arguments - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Image Uploader/index.html b/Image Uploader/index.html index c75761fd..cf822982 100644 --- a/Image Uploader/index.html +++ b/Image Uploader/index.html @@ -1192,7 +1192,7 @@

    Unsupported sites - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Link Previews/index.html b/Link Previews/index.html index faa523bc..96b74efe 100644 --- a/Link Previews/index.html +++ b/Link Previews/index.html @@ -853,7 +853,7 @@

    Demo&par - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Moderation/index.html b/Moderation/index.html index 92b857d4..2eabb7a9 100644 --- a/Moderation/index.html +++ b/Moderation/index.html @@ -989,7 +989,7 @@

    User Timeout Buttons - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Regex/index.html b/Regex/index.html index 16f500b1..acfb1acd 100644 --- a/Regex/index.html +++ b/Regex/index.html @@ -960,7 +960,7 @@

    Regex& - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Search/index.html b/Search/index.html index ea69b53a..cb848bbe 100644 --- a/Search/index.html +++ b/Search/index.html @@ -1113,7 +1113,7 @@

    Search filtersShows messages that do NOT con - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Settings/index.html b/Settings/index.html index f159f06d..5e89681b 100644 --- a/Settings/index.html +++ b/Settings/index.html @@ -991,7 +991,7 @@

    My settings / command - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Themes/index.html b/Themes/index.html index 5032296a..99740a58 100644 --- a/Themes/index.html +++ b/Themes/index.html @@ -1019,7 +1019,7 @@

    Themesnightly 5d0bdc1.

    +

    Chatterino supports custom-made themes since 2.5.1.

    Custom themes are JSON files that are stored in the Themes folder inside your Chatterino folder.

    Creating A Theme

    To create a theme, it's best to use one of the built-in themes as the starting point. @@ -1095,7 +1095,7 @@

    Migrations - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/Third_party_services/index.html b/Third_party_services/index.html index 4190dc62..6fc962ca 100644 --- a/Third_party_services/index.html +++ b/Third_party_services/index.html @@ -950,7 +950,7 @@

    Chatterino API - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/index.html b/index.html index c5bb938b..5689a386 100644 --- a/index.html +++ b/index.html @@ -823,7 +823,7 @@

    Chatterino Wiki - May 18, 2024 09:39:59 + May 25, 2024 11:03:38 diff --git a/search/search_index.json b/search/search_index.json index 16333fd8..ddce48fe 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Chatterino Wiki","text":"

    This wiki provides information for Chatterino.

    "},{"location":"Commands/","title":"Commands","text":"

    Commands are used as shortcuts for long messages. If a message starts with the \"trigger\" then the message will be replaced with the Command.

    "},{"location":"Commands/#built-in-commands","title":"Built-in commands","text":"

    Chatterino comes with a collection of built-in commands to help with channel management, Twitch interaction, and other misc. features.

    "},{"location":"Commands/#banid","title":"/banid","text":"

    Usage: /banid <userID>1

    Bans a user by their userID instead of their username. Useful for banning users who are temporarily suspended from Twitch, which /ban cannot do anymore.

    Note: If you ban a suspended user this way, they cannot be unbanned from Chatterino, you must wait until their suspension ends or unban them from browser chat.

    "},{"location":"Commands/#block-unblock","title":"/block & /unblock","text":"

    Usage: /(block|unblock) <user>

    Blocks or unblocks the specified user. Blocking will hide that user's messages/whispers as well as disassociate them from you on Twitch. For more information about blocking, see Twitch's help article.

    "},{"location":"Commands/#chatters","title":"/chatters","text":"

    Usage: /chatters

    Shows the total amount of chatters currently connected to the channel.

    "},{"location":"Commands/#clearmessages","title":"/clearmessages","text":"

    Usage: /clearmessages

    Clears all messages from the current split/channel. This command is purely visual and is not related to the /clear moderator command.

    "},{"location":"Commands/#clip","title":"/clip","text":"

    Usage: /clip

    Creates a clip from the last 30 seconds of the current channel. Also provides an edit link to edit a clip from the current point in time.

    "},{"location":"Commands/#debug-args","title":"/debug-args","text":"

    Usage: /debug-args

    Displays the arguments that chatterino was launched with.

    "},{"location":"Commands/#delete","title":"/delete","text":"

    Usage: /delete <msg-id>

    Moderator only, deletes a message in chat with the provided ID. Usually used in mod actions as they can pass through the message ID.

    "},{"location":"Commands/#fakemsg","title":"/fakemsg","text":"

    Usage: /fakemsg <raw message>

    Displays the provided IRC messsage in chat as if it was sent from Twitch's IRC server.

    "},{"location":"Commands/#marker","title":"/marker","text":"

    Usage: /marker

    Editor only, creates a stream marker in the current stream. Streamer must be live to create markers.

    "},{"location":"Commands/#openurl","title":"/openurl","text":"

    Usage: /openurl <url>

    Opens a URL in the default web browser. Useful in custom commands.

    "},{"location":"Commands/#popout","title":"/popout","text":"

    Usage: /popout [channel]

    Opens the current channel or provided channel's chat in Twitch's popout webchat, using your default browser.

    "},{"location":"Commands/#popup","title":"/popup","text":"

    Usage: /popup [channel]

    Opens the current channel or provided channel's chat in a new window.

    "},{"location":"Commands/#r","title":"/r","text":"

    Usage: /r <message>

    Replies to the last received whisper.

    "},{"location":"Commands/#setgame","title":"/setgame","text":"

    Usage: /setgame <game>

    Broadcaster only, sets the current channel's game to the best match of the provided game name.

    "},{"location":"Commands/#settitle","title":"/settitle","text":"

    Usage: /settitle <title>

    Broadcaster only, sets the current channel's title to the provided text.

    "},{"location":"Commands/#streamlink","title":"/streamlink","text":"

    Usage: /streamlink [channel]

    Attempts to open current or specified stream in streamlink. For more information, see Streamlink's website.

    "},{"location":"Commands/#uptime","title":"/uptime","text":"

    Usage: /uptime

    Displays the uptime of the current channel's livestream.

    "},{"location":"Commands/#user","title":"/user","text":"

    Usage: /user <user> [channel]

    Opens the specified user's Twitch usercard for the given channel (or the channel provided) in the default browser.

    "},{"location":"Commands/#usercard","title":"/usercard","text":"

    Usage: /usercard <user> [channel]

    Opens the specified user's Chatterino usercard for the given channel or the channel provided.

    "},{"location":"Commands/#w-whisper","title":"/w (Whisper)","text":"

    Usage: /w <user> <message>

    Whispers the provided text to a user on Twitch. See Chatterino's whisper FAQ item for whisper-related issues.

    "},{"location":"Commands/#custom-commands","title":"Custom commands","text":""},{"location":"Commands/#example","title":"Example","text":"

    Add Command Hello chat :) with the trigger /hello. Now typing /hello in chat will send Hello chat :) instead of /hello.

    "},{"location":"Commands/#advanced","title":"Advanced","text":"
    • The trigger has to be matched at the start of the message but there is a setting to also match them at the end.
    • Triggers don't need to start with /
    "},{"location":"Commands/#using-placeholders","title":"Using placeholders","text":"
    • {1}, {2}, {3} and so on can be used to insert the 1st, 2nd, 3rd, ... word after the trigger. Example: Add Command /timeout {1} 1 with trigger /warn. Now typing /warn user123 will send /timeout user123 1

    • Similarly {1+} and so on can be used to insert all words starting with the 1st, ... word. Example: Add Command Have a {1+} day! with trigger /day. Now typing /day very super nice will send Have a very super nice day!

    • You can use {{1} if you want to send {1} literally.

    • {channel.name} can be used to insert the name of the current channel. Example: Add Command /openurl https://twitch.tv/{channel.name} with trigger /openchannel. Now typing /openchannel will open the current channel in your browser.

    • {channel.id} can be used to insert the Twitch account ID of the owner of current channel.

    • {my.name} can be used to insert the Twitch username of the currently selected account.

    • {my.id} can be used to insert the Twitch account ID of the currently selected account.

    • {stream.title} can be used to insert the title set in the current channel. Only works if the channel is live. Example: Add Command The title is {stream.title} with trigger /title. Now typing /title will send a message like The title is Programming.S04E74.1440p.MP4-XD.NVENC

    • {stream.game} can be used to insert the game set in the current channel. Only works if the channel is live. Example: Add Command I'm currently playing {stream.game} with trigger /game. Now typing /game will send a message like I'm currently playing World of Warcraft.

    1. Added in 2.4.2\u00a0\u21a9

    "},{"location":"Contributing%20for%20Developers/","title":"Contribution Guidelines","text":"

    This is a set of guidelines for contributing to Chatterino. The goal is to teach programmers without C++ background (java/python/etc.), people who haven't used Qt or otherwise have different experience the idioms of the codebase. Thus, we will focus on those which are different from those other environments. There are extra guidelines available here, but they are considered as extras and not as important.

    "},{"location":"Contributing%20for%20Developers/#tooling","title":"Tooling","text":""},{"location":"Contributing%20for%20Developers/#formatting","title":"Formatting","text":"

    Code is automatically formatted using clang-format. It takes the burden off of the programmer and ensures that all contributors use the same style (even if mess something up accidentally). We recommend that you set up automatic formatting on file save in your editor.

    "},{"location":"Contributing%20for%20Developers/#code","title":"Code","text":""},{"location":"Contributing%20for%20Developers/#comments","title":"Comments","text":"

    Comments should only be used to:

    • Increase readability (e.g. grouping member variables).
    • Containing information that can't be expressed in code.

    Try to structure your code so that comments are not required.

    "},{"location":"Contributing%20for%20Developers/#good-example","title":"Good example","text":"
    /**\n * @return 0 if a == b, negative if a < b and positive if b > a. (1)\n */\nint /* (2)! */ compare(const QString &a, const QString &b);\n
    1. You can't know this from the function signature, so it's good to clarify this.
    2. Even better: Return a \"strong ordering\" type (but we don't have such a type right now).
    "},{"location":"Contributing%20for%20Developers/#bad-example","title":"Bad example","text":"
    /*\n * Matches a link and returns boost::none if it failed and a\n * QRegularExpressionMatch on success. (1)\n *\n * @param text The text that will be checked if it contains a link. (2)\n */\nboost::optional<QRegularExpressionMatch> matchLink(const QString &text);\n
    1. This repeats the function signature.
    2. This is obvious from the function and parameter names.
    "},{"location":"Contributing%20for%20Developers/#code_1","title":"Code","text":""},{"location":"Contributing%20for%20Developers/#arithmetic-types","title":"Arithmetic Types","text":"

    Arithmetic types (like char, int, float or size_t), bool, and pointers are NOT initialized by default in C++. They keep whatever value is already at their position in the memory. This makes debugging harder and is unpredictable, so we initialize them to zero by using {} after their name when declaring them.

    class ArithmeticTypes\n{\n    // DO\n    int n{}; // (1)!\n    bool isEnabled{}; // (2)!\n    QWidget *myPtr{}; // (3)!\n    int thisIs5 = 5; // (4)!\n    std::vector<int> myVec; // (5)!\n\n    // DON'T\n    int m; // (6)!\n    bool isHidden; // (7)!\n    QWidget *yourPtr; // (8)!\n    std::vector<int> myVec{}; // (9)!\n};\n
    1. Initialized to 0.
    2. Initialized to false.
    3. Initialized to nullptr.
    4. Explicitly initialized to 5.
    5. Other non-arithmetic types call constructors instead, so no need for {}.
    6. \u26a0 Random value.
    7. \u26a0 Random value.
    8. \u26a0 Random value. Dereferencing this will likely segfault.
    9. Unnecessary {} as the default constructor will be called even without {}.
    "},{"location":"Contributing%20for%20Developers/#passing-parameters","title":"Passing parameters","text":"

    The way a parameter is passed signals how it is going to be used inside the function. C++ doesn't have multiple return values, so there is \"out parameters\" (reference to a variable that is going to be assigned inside the function) to simulate multiple return values.

    Cheap to copy types like int/enum/etc. can be passed in per value since copying them is fast.

    void setValue(int value /* (1)! */) {\n    this->value_ = value;\n}\n\nvoid sendGreeting(const /* (2)! */ User &user /* (3)! */, MessageFlags flags /* (4)! */) {\n    this->sendMessage(user.id(), user.name(), flags);\n}\n
    1. ints are cheap to copy. Here, the parameter will likely be passed in a register.
    2. We only need to read the user's name, so it's marked as const.
    3. User is a class that contains the user's name and other fields, thus it's expensive to copy - so a reference is used.
    4. MessageFlags is an enum, so it's cheap to copy.

    References mean that the variable doesn't need to be copied when it is passed to a function.

    Type Meaning const Type& name in Parameter. It is NOT going to be modified and may be copied inside the function. Type& name out or in+out Parameter. It will be modified.

    Pointers signal that objects are managed manually. While the above are only guaranteed to live as long as the function call (= don't store and use later) these may have more complex lifetimes.

    Type Meaning Type* name The lifetime of the parameter may exceed the length of the function call. It may use the QObject parent/children system (see QObject Classes).

    R-value references && work similar to regular references but signal the parameter should be \"consumed\".

    void storeLargeObject(LargeObject &&object) {\n    // ...\n}\n\nvoid storeObject(std::unique_ptr<Object> &&object) {\n    // ...\n}\n\nvoid main() {\n    LargeObject large = { /*...*/ };\n\n    storeLargeObject(std::move(large)); // (1)!\n\n    std::unique_ptr<Object> unique = std::make_unique(/*...*/);\n    storeObject(std::move(unique)); // (2)!\n\n    assert(unique.get() == nullptr); // (3)!\n}\n
    1. storeLargeObject accepts an r-value reference, and we use std::move(), thus we move the object and avoid the need to copy.
    2. You can't copy a std::unique_ptr, so we need to move here.
    3. The pointer contained by unique has now been consumed by storeObject, so it just holds a null pointer now.

    Generally the lowest level of requirement should be used e.g. passing Channel& instead of std::shared_ptr<Channel>& (aka ChannelPtr) if possible.

    "},{"location":"Contributing%20for%20Developers/#members","title":"Members","text":"

    All functions names are in camelCase. Private member variables are in camelCase_ (note the underscore at the end). We don't use the get prefix for getters. We mark functions as const if applicable.

    class NamedObject\n{\npublic:\n    const QString &name() const; // (1)!\n    void setName(const QString &name);\n    bool hasLongName() const; // (2)!\n\n    static void myStaticFunction(); // (3)!\n    QString publicName;\n\nprivate:\n    QString name_; // (4)!\n    // QString name; (5)\n\n    void myPrivateMethod(); // (6)!\n};\n\nvoid myFreeStandingFunction(); // (7)!\n
    1. No get prefix.
    2. A has or is prefix is okay.
    3. Static member functions start lowercase as well.
    4. Private members have a _ suffix.
    5. This declaration would collide with the name() accessor.
    6. Private methods don't have a _ suffix.
    7. Free standing functions start lowercase as well.
    "},{"location":"Contributing%20for%20Developers/#casts","title":"Casts","text":"
    • Avoid c-style casts: (type)variable.
    • Instead use explicit type casts: type(variable)
    • Or use one of static_cast, const_cast and dynamic_cast
    • Try to avoid reinterpret_cast unless necessary.
    void example(float f, Base *b, const User &user, int p) {\n    // DO\n    int i = int(f); // (1)!\n    Derived* derived = dynamic_cast<Derived*>(base); // (2)!\n    if (derived != nullptr) // (3)!\n    {\n        // use derived\n    }\n\n    // BE CAREFUL\n    const_cast<User &>(c).setName(\"foo\"); // (4)!\n    float *pp = reinterpret_cast<float*>(&p); // (5)!\n\n    // DON'T (6)\n    int i = (int)f;\n    Derived* derived = (Derived*)base;\n    ((int &)c) = 123;\n    float *pp = (float*)&p;\n}\n
    1. Use explicit type casts.
    2. Use explicit dynamic_cast.
    3. Unless extremely obvious, always check the result of dynamic_cast.
    4. Only use const_cast if using proper const correctness doesn't work.
    5. reinterpret_cast is required very rarely.
    6. Avoid C-style casts.
    "},{"location":"Contributing%20for%20Developers/#this","title":"This","text":"

    Always use this to refer to instance members to make it clear where we use either locals or members.

    class Test\n{\n    void testFunc(int a);\n    int testInt_{};\n}\n\nTest::testFunc(int a)\n{\n    // DO\n    this->testInt_ += 2;\n    this->testFunc();\n\n    // DON'T\n    testInt_ -= 123;\n    testFunc(2);\n    this->testFunc(testInt_/*(1)!*/ + 1);\n}\n
    1. It's unclear if it's a local or member variable, especially if the method is more complex.
    "},{"location":"Contributing%20for%20Developers/#managing-resources","title":"Managing resources","text":""},{"location":"Contributing%20for%20Developers/#regular-classes","title":"Regular classes","text":"

    Keep the element on the stack if possible. If you need a pointer or have complex ownership you should use one of these classes:

    • Use std::unique_ptr if the resource has a single owner.
    • Use std::shared_ptr if the resource has multiple owners.
    "},{"location":"Contributing%20for%20Developers/#qobject-classes","title":"QObject classes","text":"
    • Use the object tree to manage lifetime where possible. Objects are destroyed when their parent object is destroyed.
    • If you have to explicitly delete an object use variable->deleteLater() instead of delete variable. This ensures that it will be deleted on the correct thread.
    • If an object doesn't have a parent consider using std::unique_ptr<Type, DeleteLater> with DeleteLater from \"common/Common.hpp\". This will call deleteLater() on the pointer once it goes out of scope or the object is destroyed.
    "},{"location":"Crash%20Analysis/","title":"Crash Analysis","text":"

    When running on Windows, Chatterino 2.4.1 and later will automatically save information about a crash in a minidump.

    Crashdumps are saved inside the Crashes/reports folder in your Chatterino folder.

    Minidumps contain the stacks of all threads, their state (registers), the exception associated with the crash, and some metadata about the CPU and the OS. If you are unsure if your crashdump contains sensitive information, ask a Chatterino developer on the Discord server.

    There are several ways of analyzing crashes. To get started, you need to have a symbol (PDB) file for your installation. These files are unique per build meaning that you need to download the file (this is especially important when using nightly builds). For GitHub builds, you can find the PDB file in the release - it's zipped in an archive ending in .pdb.7z. For simplicity, extract the .pdb to the location of your chatterino.exe.

    "},{"location":"Crash%20Analysis/#windbg","title":"WinDbg","text":"

    For analyzing with a GUI, install WinDbg. After the installation, you should be able to open the crashdumps (.dmp files) right from the Windows Explorer. By default, you won't get much information.

    To add names to functions (symbols), open the settings (Home > Settings), go to Debugging Settings, and add the directory you extracted your symbol file to the Symbol path. If there's no srv* entry, consider adding one - this will try to load symbols from servers for system libraries.

    To add source-files, clone the repository and checkout the source-tree at the version of your executable. Then add this path to Source Path in the Debugging Settings.

    Note: You might need to reload your window to have your changes be picked up.

    Example Settings"},{"location":"Crash%20Analysis/#minidump-stackwalk","title":"minidump-stackwalk","text":"

    If you want to use the terminal or don't have a Windows machine, you can use minidump-stackwalk. Install minidump-stackwalk and dump_syms with cargo (installation): cargo install <app>.

    First, you need to generate a symbol-store from the PDB file with dump_syms:

    dump_syms chatterino.exe -s <store-path> # (1)!\n
    1. This can be any folder you want. Symbols will be extracted here.

    After you dumped the symbols, run:

    minidump-stackwalk <path-to-crashdump> --symbols-path <store-path>\n

    Since Chatterino has quite a few threads, the output will be long. Most of the time, you're interested in the first thread (GUI thread) since it's the crashing thread.

    "},{"location":"Environment%20Variables/","title":"Environment Variables","text":"

    Below I have tried to list all environment variables that can be used to modify the behaviour of Chatterino. Used for things that I don't feel like fit in the settings system.

    "},{"location":"Environment%20Variables/#chatterino2_recent_messages_url","title":"CHATTERINO2_RECENT_MESSAGES_URL","text":"

    Used to change the URL that Chatterino2 uses when trying to load historic Twitch chat messages (if the setting is enabled). Default value: https://recent-messages.robotty.de/api/v2/recent-messages/%1 (an open-source service written and currently run by @RAnders00 - visit the homepage for more details about the service) Arguments:

    • %1 = Name of the Twitch channel
    "},{"location":"Environment%20Variables/#chatterino2_link_resolver_url","title":"CHATTERINO2_LINK_RESOLVER_URL","text":"

    Used to change the URL that Chatterino2 uses when trying to get link information to display in the tooltip on hover. Default value: https://braize.pajlada.com/chatterino/link_resolver/%1 Arguments:

    • %1 = Escaped URL the link resolver should resolve
    "},{"location":"Environment%20Variables/#chatterino2_twitch_emote_set_resolver_url","title":"CHATTERINO2_TWITCH_EMOTE_SET_RESOLVER_URL","text":"

    Used to change the URL that Chatterino2 uses when trying to get emote set information Default value: https://braize.pajlada.com/chatterino/twitchemotes/set/%1/ Arguments:

    • %1 = Emote set ID
    "},{"location":"Environment%20Variables/#chatterino2_twitch_server_host","title":"CHATTERINO2_TWITCH_SERVER_HOST","text":"

    String value used to change what Twitch chat server host to connect to. Default value: irc.chat.twitch.tv

    "},{"location":"Environment%20Variables/#chatterino2_twitch_server_port","title":"CHATTERINO2_TWITCH_SERVER_PORT","text":"

    Number value used to change what port to use when connecting to Twitch chat servers. Currently known valid ports for secure usage: 6697, 443. Currently known valid ports for non-secure usage (CHATTERINO2_TWITCH_SERVER_SECURE set to false): 6667, 80. Default value: 443

    "},{"location":"Environment%20Variables/#chatterino2_twitch_server_secure","title":"CHATTERINO2_TWITCH_SERVER_SECURE","text":"

    Bool value used to tell Chatterino whether to try to connect securely (secure irc) to the Twitch chat server. Default value: true

    "},{"location":"Environment%20Variables/#chatterino2_proxy_url","title":"CHATTERINO2_PROXY_URL","text":"

    Used to set a proxy for network interactions of Chatterino. Both HTTP and SOCKS51 proxies are supported. The URL supports username and password authentication. Example: http://username:password@127.0.0.1:1080 or socks5://127.0.0.1 (defaults to port 1080).

    "},{"location":"Environment%20Variables/#qt_logging_rules","title":"QT_LOGGING_RULES","text":"

    Used to enable/disable logging at run time. For example: QT_LOGGING_RULES=\"chatterino.*.debug=true\" to enable debug logging in release builds. (It's on by default in debug builds). See Qt docs for more details.

    "},{"location":"Environment%20Variables/#qt_message_pattern","title":"QT_MESSAGE_PATTERN","text":"

    Used to customize logging at run time. For example: QT_MESSAGE_PATTERN=\"%{time hh:mm:ss.zzz} %{category}: %{function} %{message}\" enables a timestamp and function name in log messages. See Qt docs for more details.

    1. When using a SOCKS5 proxy, WebSockets (Twitch PubSub, 7TV EventAPI, and BTTV EventSockets) are not proxied. Only IRC and HTTP requests are proxied.\u00a0\u21a9

    "},{"location":"Features/","title":"Features","text":""},{"location":"Features/#replies","title":"Replies","text":"

    We support Twitch's Chat Replies feature.

    A reply can be executed by right-clicking a message, and selecting Reply to message, or by opening an existing Reply Thread and sending your message there. Users who replied to your message, or messages sent in a reply thread you participated in, are highlighted and can be customized in the highlight setting Participated Reply Threads.

    "},{"location":"Filters/","title":"Filters","text":"

    Filters are a powerful tool to create your own custom, filtered channel splits. Filters allow you to selectively show messages that satisfy your own custom criteria: show subscribers' messages, moderator messages, channel point redemptions, new subscriptions, and more.

    Looking for inspiration? Look at some example filters.

    "},{"location":"Filters/#introduction-to-filters","title":"Introduction to Filters","text":"

    Filters can be applied to splits to provide a selective view of messages. Filters are created in the Settings page and are applied by opening the Split menu (three dots) and selecting \"Set filters\". Applied filters are saved when you close and open Chatterino.

    Multiple filters can be applied to a Split. A message must pass all applied filters for it to be displayed.

    Simple filters are available through the Channel Filter Creator dialog. Advanced filters take inspiration from many programming languages, and the full description of keywords and operators can be found below.

    "},{"location":"Filters/#writing-your-own-filters","title":"Writing your own filters","text":"

    To begin writing your own filters, take a look at the available operators and variables below.

    For most tasks involving the message content, you can make use of the contains operator, or the matches operator with a regular expression. Then, try to break your desired behavior into multiple conditions. Combine them like this:

    • If you need all the conditions satisfied, combine them with AND (condition1 && condition2)
    • If you only need one of the conditions, combine them with OR (condition1 || condition2)
    • If you need the opposite of one of the conditions, wrap it with parentheses and add a NOT: !(condition)
    "},{"location":"Filters/#example","title":"Example","text":"

    Consider the following intention: \"Only show me messages that are from moderators and mention me\". We can break this filter into two individual conditions:

    1. Messages that are from moderators
    2. Messages that mention me

    We can then write the corresponding filter parts:

    1. author.badges contains \"moderator\"
    2. message.content contains \"@my_name\"

    Finally, because we want both of these conditions to be true, we combine them with the AND operator && and end up with this final filter:

    (author.badges contains \"moderator\") && (message.content contains \"@my_name\")

    "},{"location":"Filters/#quick-add","title":"Quick Add","text":"

    If you already have a filter, you can use the Quick Add button and paste your filter into the Filter section.

    "},{"location":"Filters/#terminology","title":"Terminology","text":"

    Here is some terminology that you'll encounter in the rest of this document.

    1. Value: A value is the simplest element of a filter. It can take on multiple forms: a number, a string (i.e. text), a regular expression, or a list of multiple values.
    2. Type: A type describes the general form of a value. For example, every number has type Int. Every string has type String.
    3. Variable: A variable is a placeholder for some information about a message. For example, the variable message.content represents the text of a message
    4. Operator: An operator acts on one or two values and evaluates to another value. For example, the plus operator + can add two numbers, 1 + 1 or concatenate strings, \"a\" + \"b\"
    "},{"location":"Filters/#example-filters","title":"Example filters","text":"
    • message.content contains \"hello\"
      • Only messages that contain the phrase hello
    • message.length < 40 || author.subbed
      • Messages that are less than 40 characters long, OR are sent by a subscriber.
    • channel.name == \"somestreamer\" && author.badges contains \"moderator\"
      • Messages that originated in the channel somestreamer AND are from users with a moderator badge
    "},{"location":"Filters/#filter-syntax-semantics","title":"Filter Syntax + Semantics","text":"

    This section is aimed at technical users who have experience with general purpose programming languages.

    A filter must be a valid expression. An expression is comprised of conditions and values which are evaluated to a single True or False value to decide whether to filter a message. Evaluating to something other than True or False will lead to all messages being filtered out.

    "},{"location":"Filters/#values","title":"Values","text":"

    A value can be:

    1. An integer (123, 5)
    2. A string (\"hello\", \"this is a string\")
    3. A variable (author.name, message.length)
      • Technically, a variable isn't a value, but is given value by substitution
      • When a filter is evaluated, variables are replaced with the values they represent
    4. A regular expression (r\"\\d\\d\\d\\d\")
    5. A list of values ({123, \"hello\", author.name})

    Regular expressions are similar to strings, but are denoted with an r before the opening quotation mark (e.g. r\"something\"). To make a regular expression case-insensitive, use ri before the opening quotation mark (e.g. ri\"something\").

    Literals:

    Name Example Int 123, 5 String \"Hello there\", \"Escaped \\\" quote\" RegEx r\"\\d\\d\\d\\d\", ri\"something.*\" List {\"list item\", 123}"},{"location":"Filters/#operators","title":"Operators","text":"

    Binary operators act on two values:

    • 1 + 2
    • author.subbed && flags.highlighted
    • \"long sentence\" contains \"ten\"

    Unary operators act on one value:

    • !author.subbed

    The following operators are available:

    Operator Description && Logical AND || Logical OR ! Negation == Equals != Not equals < Less than <= Less than or equal to > Greater than >= Greater than or equal to contains String, List, or Map contains startswith String or List starts with text or value, respectively endswith String or List ends with text or value, respectively match Match string with regular expression + Add (or string concatenation) - Subtract * Multiply / Divide (integer) % Modulus

    Please read about the type rules to better understand the evaluation semantics for operators that take multiple data types.

    "},{"location":"Filters/#variables","title":"Variables","text":"

    The following variables are available:

    Variable Type Description Author User who sent the message author.badges List List of author's badges author.color Color* Color code of author, or none author.name String Display name of author author.no_color Bool Whether the author has no color set (i.e. gray name) author.subbed Bool Whether author is subscribed author.sub_length Int How long author has been subscribed (or zero) Channel The channel where the message was sent channel.name String Channel name channel.watching Bool Whether the channel is being watched (requires Chatterino extension) channel.live Bool Whether the channel is currently live Flags Message-specific flags flags.highlighted Bool Whether the message is highlighted flags.reward_message Bool Whether the message is a redeemed channel point reward message (except \"Highlight my Message\") flags.points_redeemed Bool Whether the message was redeemed through the channel point reward \"Highlight my Message\" flags.sub_message Bool Whether the message is a sub/resub/gift message flags.system_message Bool Whether the message is a system message (i.e. timeout/ban/info) flags.first_message Bool Whether the message is the author's first message in the channel flags.cheer_message Bool Whether the message includes bits flags.whisper Bool Whether the message is a whisper flags.reply Bool Whether the message is a reply flags.automod Bool Whether the message has automod information or actions Message Actual message sent message.content String Message content message.length Int Message length Reward Information about the channel point redemption of this message, if any reward.title1 String Title of the redemption (e.g. Drink water!) reward.cost1 Int Cost of the redemption (e.g. 500) reward.id1 String ID of the redemption (e.g. 1ed437f5-9dc3-4510-8a3f-abcad67985e1)

    *Note: To compare a Color, compare it to a color hex code string: author.color == \"#FF0000\"

    "},{"location":"Filters/#data-types","title":"Data types","text":"

    The Chatterino filter language is typed, meaning that every value has a type and only specific combinations of types are allowed when using operators. Generally, you won't run in to issues. The type system exists to warn you about any mistakes that your filter contains.

    "},{"location":"Filters/#type-rules","title":"Type Rules","text":"Operator Form Result Description + Int + Int Int Adds two integers + String + Any String Concatenates the first string with the second argument - Int - Int Int Subtracts two integers * Int * Int Int Multiplies two integers / Int / Int Int Divides two integers, discarding the remainder % Int % Int Int Computes the modulus of two integers && Bool && Bool Bool Logical AND of two booleans || Bool || Bool Bool Logical OR of two booleans == Any == Any Bool Equality comparison of any two values != Any != Any Bool Inequality comparison of any two values > Int > Int Bool Greater than comparison of two integers >= Int >= Int Bool Greater than or equal to comparison of two integers < Int < Int Bool Less than comparison of two integers <= Int <= Int Bool Less than or equal to comparison of two integers startswith List startswith Any Bool Checks whether the list has the given value as its first value startswith String startswith String Bool Checks whether the first string starts with the second string endswith List endswith Any Bool Checks whether the list has the given value as its last value endswith String endswith String Bool Checks whether the first string ends with the second string contains List contains Any Bool Checks whether the list contains the given value contains Map contains Any Bool Checks whether the map has the given value as a key contains String contains String Bool Checks whether the first string contains the second string match String match RegEx Bool Checks whether the string matches the given regular expression match String match {RegEx, n : Int} String Returns the nth matching capture group, or the empty string"},{"location":"Filters/#regular-expressions","title":"Regular Expressions","text":"

    Chatterino can match string variables to a regular expression, returning whether the expression matched or, optionally, the value of a capture group.

    "},{"location":"Filters/#simple-matching","title":"Simple matching","text":"

    \"some string\" match r\"some regex\" returns True or False.

    For example: message.content match r\"\\d\\d\"

    "},{"location":"Filters/#group-capturing","title":"Group capturing","text":"

    \"some string\" match {r\"some regex\", capture number} returns False if no match or the value of the nth captured group.

    For example: message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3} matches the year component of a date like 12/31/2020.

    (message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3}) == \"2020\" will filter only messages that contain a written date with 2020 as the year.

    "},{"location":"Filters/#order-of-operations","title":"Order of Operations","text":"

    The order of operations in filters may not be exactly what you expect.

    • Expressions in parentheses are evaluated first
    • Math operations are evaluated from left to right, not by MDAS. 2 + 3 * 4 yields 20, not 14.
    • a && b || c && d is evaluated as (a && b) || (c && d)
    • a || b && c || d is evaluated as a || (b && c) || d

    Basically, if you're unsure about the order of operations, use extra parentheses.

    1. Available since nightly 69bdac9 \u21a9\u21a9\u21a9

    "},{"location":"Glossary/","title":"Glossary","text":"

    Explain common words used in Chatterino.

    "},{"location":"Glossary/#anatomy-of-a-chatterino-window","title":"Anatomy of a Chatterino window","text":"Term Description Split Includes the chat, input field and a split header Split Header Contains split title, moderation actions, viewer list, split menu button and add split button Split Menu Settings or actions for the specific split Tab Can contain multiple splits"},{"location":"Glossary/#moderation","title":"Moderation","text":"Term Description Moderation buttons Allow you to quickly delete messages, timeout users or execute custom commands. They can be configured in Settings > Moderation > Moderation buttons Moderation mode button Toggles whether Moderation buttons are shown Usercard Contains useful information about a user, action buttons as well as their recent messages. Can be opened by clicking someone's username in chat or by typing /usercard username User Timeout Buttons Allow you time a user out from their Usercard. They can be configured in Settings > Moderation > User Timeout Buttons"},{"location":"Glossary/#replies","title":"Replies","text":"Term Description Reply Context Contains the message a user was replying to. Reply Thread Contains the history of replies to a message that Chatterino has loaded Reply Input The input box to send a reply. Available in both the normal Chatterino window, and the Reply Thread."},{"location":"Help/","title":"Help","text":"

    Having issues with Chatterino or need general assistance? Check the below troubleshooting below corresponding to your operating system for assistance!

    Please search for your problem in the GitHub Issues. If there is no such issue, please create a new one. If you have more questions, feel free to join the Discord.

    "},{"location":"Help/#basic-troubleshooting","title":"Basic troubleshooting","text":"

    Prior to starting on the below, you should first try the basic troubleshooting steps listed here. These steps can resolve a variety of issues:

    • Ensure that your Chatterino is up to date.
    • [Windows] Try running Chatterino in administrator mode.
    • [Windows] Ensure that you have the x64 Visual C++ Redistributables installed AND have restarted your PC after installation:
      • x64: https://aka.ms/vs/16/release/vc_redist.x64.exe
      • Chocolatey: choco install vcredist140
    • [MacOS] Open System Preferences go to Security & Privacy [General Tab] and select Open Anyway or see this Apple support article.
    "},{"location":"Help/#i-am-having-an-issue-with-the-chatterino-extension","title":"I am having an issue with the Chatterino extension","text":"

    Chatterino extension issues should be posted here.

    "},{"location":"Help/#chatterino-not-startingcrashing-upon-startup","title":"Chatterino not starting/Crashing upon startup","text":"
    • [Windows] Try running Chatterino in administrator mode.
    • [Windows] Adding Chatterino to your anti-virus/malware whitelist.
    • [Windows] If nothing else works, try resetting your settings using the Fresh Install option in the installer.
    "},{"location":"Help/#does-using-chatterino-accumulate-twitch-channel-points","title":"Does using Chatterino accumulate Twitch channel points?","text":"

    Unfortunately not. This is a limitation due to Twitch using internal APIs for channel points. This will however work with most chatbots, as they simply take you being connected to chat as \"watching the stream\".

    "},{"location":"Help/#can-i-use-chatterino-as-my-chat-overlay-for-my-stream","title":"Can I use Chatterino as my chat overlay for my stream?","text":"

    You definitely can, but it's not recommended. We suggest using a service similar to KapChat.

    "},{"location":"Help/#why-are-my-messages-being-sent-in-webchat-but-not-in-chatterino","title":"Why are my messages being sent in webchat, but not in Chatterino?","text":"

    There's a few things to cover here:

    • If your message is not sent in Chatterino, it is likely not sent in webchat either. Webchat renders messages whether they are sent or not, Chatterino will only render the message if it is accepted by the server.
    • If you're trying to type in a chat where there are a lot of active chatters, then your message may be dropped by Twitch's chat servers (due to the volume).
    • If an alt account has been banned in that chat, you have likely been shadowbanned by Twitch in that channel. Which prevents any of your other accounts from speaking in that channel.
    • If you have spammed too much in another chat, you have likely been temporarily shadowbanned by Twitch in channels where you are not: Subscribed, VIP or Moderator.

    If all else fails, you may be having connection issues to Twitch or your network may be blocking the necessary IRC ports in order to connect.

    "},{"location":"Help/#chatterino-is-repeatedly-disconnecting-from-twitch-chat","title":"Chatterino is repeatedly disconnecting from Twitch chat","text":"

    If you are having troubles with Chatterino repeatedly connecting/disconnecting, it is likely due to the large amount of channels you are connected to. The maximum channel limit is usually around the 100 mark, but may differ from user to user. Try closing splits in Chatterino in order to fix this.

    "},{"location":"Help/#i-am-unable-to-send-whispers-from-chatterino","title":"I am unable to send whispers from Chatterino","text":"

    You may be unable to send a whisper via Chatterino for the following reasons:

    "},{"location":"Help/#you-dont-have-a-verified-phone-number-attached-to-your-twitch-account","title":"You don't have a verified phone number attached to your Twitch account.","text":"

    Twitch requires users to have a verified Phone Number attached to their account to send whispers from Chatterino. NOTE: A Verified Phone Number is NOT the same thing as Two-Factor Authentication. You can add a phone number to your account in Twitch Settings.

    "},{"location":"Help/#you-are-on-a-chatterino-version-older-than-240","title":"You are on a Chatterino version older than 2.4.0:","text":"

    On February 24th 2023 Twitch shutdown the service old versions of Chatterino used to send whispers. You must update to 2.4.0 or newer to continue sending whispers.

    "},{"location":"Help/#ffzbttv-emotes-are-not-working","title":"FFZ/BTTV emotes are not working","text":"

    You need to be logged in to see emotes. Try hitting F5 once to manually refresh the emotes.

    Chatterino only makes a connection to the necessary APIs to fetch these emotes, if you are still having issues fetching them, then your network may be blocking requests to those APIs.

    "},{"location":"Help/#i-have-link-information-turned-on-but-am-unable-to-see-the-information-when-hovering-over-a-link","title":"I have link information turned on, but am unable to see the information when hovering over a link","text":"
    • The server (braize) used to fetch the link information may be down. Braize uptime can be found here.
    • Your network may be having issues connecting to braize. Try restarting your PC and router.
    "},{"location":"Help/#how-do-i-get-the-supporter-badge","title":"How do I get the supporter badge?","text":"

    Donate \u20ac10 to fourtf here (can be done in multiple donations). You should get your badge automatically after about 5 minutes. Make sure to restart Chatterino if you can't see the badge. If you still can't see it, ask fourtf on Chatterino Discord for assistance.

    "},{"location":"Help/#how-do-i-disable-the-supporter-badge","title":"How do I disable the supporter badge?","text":"

    Log in to the badge manager and click on Disable My Chatterino Badge.

    "},{"location":"Help/#login-expired-error","title":"Login expired error","text":"

    If you're getting the Login expired for user <user>! Try adding your account again. error, simply re-add your account and it will start working again.

    "},{"location":"Help/#how-do-i-add-chatterino-as-an-obs-dock","title":"How do I add Chatterino as an OBS dock?","text":"

    This is not natively supported, but there is a workaround:

    1. Add a dock into OBS for standard Twitch chat.
    2. Turn on Always on top in Chatterino.
    3. Click the 3 dots up the top of a channel split and click Popup.
    4. Move and resize the chat to overlay on top of the standard Twitch chat.
    "},{"location":"Help/#what-is-nightly-and-how-to-use-install-it","title":"What is nightly and how to use / install it","text":""},{"location":"Help/#overview","title":"Overview","text":"

    Nightly is a \"developer release\" of Chatterino. It is released every time there's a new change added to source code. It includes some features that may not be available in the latest stable release.

    "},{"location":"Help/#installation","title":"Installation","text":"
    1. Go to nightly release page on GitHub.
    2. Download nightly:
      • For Windows download chatterino-windows-x86-64.zip
      • For Linux download Chatterino-x86_64.AppImage
      • For Mac download chatterino-osx.dmg
    3. Install nightly:
      • On Windows, right-click the archive > Extract All > Extract (Override files if prompted). Open the newly extracted folder and create a shortcut for the chatterino.exe file to the Desktop for easy access.
      • On Linux, open up the download directory in your terminal and execute the following command chmod +x Chatterino-x86_64.AppImage && sudo mv Chatterino-x86_64.AppImage /usr/local/bin
      • On Mac, open the dmg file and drag Chatterino into the Applications folder.
    "},{"location":"Help/#updating","title":"Updating","text":"

    Nightly ignores version checking and it will not attempt to update on its own. Because of that it will not notify you when a new stable update is available. To update, repeat steps above. If you want to switch back to stable release, download and install it from Chatterino's website.

    "},{"location":"Help/#issues","title":"Issues","text":"

    Since nightly is a testing release, it may be a little unstable. If you find any bugs, make sure to report an issue on GitHub. Before opening an issue make sure you're on latest nightly (to check it, go to Settings > About and compare commit hash) and that there's no duplicate issue already open.

    "},{"location":"Help/#i-see-white-borders-on-full-screen","title":"I see white borders on full screen","text":"

    This is a Windows issue, it can be mitigated by turning on Compatibility mode for Chatterino. Right click chatterino.exe -> Properties -> Compatibility -> Enable \"Run this program in compatibility mode for:\" -> Select Windows 8 in the drop-down menu.

    "},{"location":"Help/#my-reply-was-sent-to-the-wrong-message","title":"My Reply was sent to the wrong message","text":"

    Twitch updated replies to add the functionally we needed to correct this, it was fixed in 5209e47 and the fixed version can be obtained by downloading the latest nightly build.

    "},{"location":"Hotkeys/","title":"Hotkeys","text":""},{"location":"Hotkeys/#introduction-to-hotkeys","title":"Introduction to Hotkeys","text":"

    By default, Chatterino contains a set of default hotkeys. A hotkey can be described using five parameters:

    • Its name
    • A category
    • An action
    • A keybinding
    • The arguments

    "},{"location":"Hotkeys/#categories","title":"Categories","text":"

    Categories describe where in the app the hotkeys action takes place. For example:

    • Sending a message by pressing enter takes place in the Split input box,
    • Closing the current split takes place in the current Split.
    "},{"location":"Hotkeys/#actions","title":"Actions","text":"

    An action simply describes what a hotkey does. For example:

    • The Reconnect to chat action in a Split causes Chatterino to reconnect to Twitch/IRC.
    • The Zoom in/out action in a Window causes Chatterino to zoom in or out (depending on the arguments given)
    "},{"location":"Hotkeys/#keybindings","title":"Keybindings","text":"

    TODO: Short blurb how more advanced keybindings work

    "},{"location":"Hotkeys/#arguments","title":"Arguments","text":"

    Arguments describe the specifics of how the action will behave. For example:

    • The Zoom in/out action in a Window takes a single argument (in, out, or reset) which tells Chatterino to either zoom in or zoom out.
    "},{"location":"Image%20Uploader/","title":"Image Uploader","text":"

    You can drag and drop images to Chatterino or paste them from clipboard to upload them to an external service.

    By default, the image uploader is turned off. You can enable by checking the Chatterino Settings -> External Tools -> Image Uploader -> Enable image uploader option and configuring per one of the below options.

    Note to advanced users: This module sends multipart-form requests via POST method, so uploading via SFTP/FTP won't work. However, popular hosts like imgur.com and s-ul.eu are supported. Scroll down to see example configurations.

    "},{"location":"Image%20Uploader/#configuration-explanation","title":"Configuration Explanation","text":"Row Description Request URL Link to an API endpoint, which is requested by Chatterino. Any needed URL parameters should be included here. Form field Name of a field, which contains image data. Extra headers Extra headers, that will be included in the request. Header name and value must be separated by colon (:). Multiple headers need to be separated with semicolons (;).Example: Authorization: supaKey ; NextHeader: value. Image link Schema that tells where is the link in service's response. Leave empty if server's response is just the link itself. Refer to json properties by {property}. Supports dot-notation, example: {property.anotherProperty}. Deletion link Same as above."},{"location":"Image%20Uploader/#examples","title":"Examples","text":""},{"location":"Image%20Uploader/#inuulscom","title":"i.nuuls.com","text":"Row Description Request URL https://i.nuuls.com/upload Form field attachment

    Other fields empty.

    "},{"location":"Image%20Uploader/#imgurcom","title":"imgur.com","text":"Row Description Request URL https://api.imgur.com/3/image Form field image Extra headers Authorization: Client-ID c898c0bb848ca39 Image link {data.link} Deletion link https://imgur.com/delete/{data.deletehash}

    You can also upload images to your imgur account by putting the following as Extra headers:

    Replace XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX with the token which you can obtain here.

    Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    "},{"location":"Image%20Uploader/#s-uleu","title":"s-ul.eu","text":"

    Replace XXXXXXXXXXXXXXX with your API key from s-ul.eu. It can be found on your account's configuration page.

    Row Description Request URL https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX Form field file Extra headers Image link {url} Deletion link https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX"},{"location":"Image%20Uploader/#ifourtfcom","title":"i.fourtf.com","text":"

    This is not a hosted service, but rather a service that can be self-hosted. Click on the URL for more information. Replace XXXXXXXXXXXXXXX with your Base64-encoded user and password

    Row Description Request URL https://i.yourwebsite.com/upload Form field file Extra headers Authorization: Basic XXXXXXXXXXXXXXX Image link Deletion link"},{"location":"Image%20Uploader/#kappalol","title":"kappa.lol","text":"Row Description Request URL https://kappa.lol/api/upload Form field file Extra headers Image link {link} Deletion link {delete}"},{"location":"Image%20Uploader/#unsupported-sites","title":"Unsupported sites","text":"
    • catbox.moe: It's not possible yet to upload to catbox.moe due to how their upload method is constructed.
    "},{"location":"Link%20Previews/","title":"Link Previews","text":"

    Link Previews make it easy to check what's behind a link without visiting the link in the browser. All links go through github.com/chatterino/api to protect your IP from any leaks.

    "},{"location":"Link%20Previews/#privacy-policy-terms-of-service","title":"Privacy Policy & Terms of Service","text":"

    Enabling this feature means your client will send additional data to our API to power this feature. You should read the Privacy Policy and Terms of Service before enabling this feature. If you have any questions about this, please contact us through the GitHub repo.

    "},{"location":"Link%20Previews/#enabling","title":"Enabling","text":"

    By default link previews are disabled. Turn them on under \"Link Previews\" in the settings. Optionally also turn on thumbnails in your preferred size for an even richer link experience.

    "},{"location":"Link%20Previews/#supported-links","title":"Supported Links","text":"

    By default chatterino will use Open Graph tags to enrich tooltips. To enhance the tooltips even more, we have custom integrations for the following sites:

    • BetterTTV
    • Discord
    • FrankerFaceZ
    • Imgur
    • Livestreamfails
    • Supinic
    • Twitch
    • Twitter
    • Wikipedia
    • YouTube
    "},{"location":"Link%20Previews/#demo","title":"Demo","text":""},{"location":"Moderation/","title":"Moderation","text":"

    Chatterino contains a slew of features to assist moderators in moderating.

    "},{"location":"Moderation/#chat-mode","title":"Chat Mode","text":"

    You can easily change the chat modes in Chatterino using the button on the streamer bar.

    You can choose from: Emote only, Subscriber only, Slow mode, R9K mode and Followers only mode.

    "},{"location":"Moderation/#logging","title":"Logging","text":"

    Moderators are able to log all the channels they are in using the logging feature.

    "},{"location":"Moderation/#moderation-mode","title":"Moderation Mode","text":"

    Moderation mode is enabled by clicking in a channel that you moderate. Available variables are {user.name}, {msg.id}, {msg.text} & {channel.name}. Below is a list of examples that can be used:

    Function Action Ban a user /ban {user.name} Unban a user /unban {user.name} Timeout a user /timeout {user.name} 600 Delete a user's message /delete {msg.id} pajbot2 report /w botname #{channel.name} !report {user.name} being rude pajbot2 longreport /w botname #{channel.name} !longreport {user.name} being very rude Open the user's usercard /user {user.name} pajbot banphrase /w botname !add banphrase {msg.text}"},{"location":"Moderation/#user-timeout-buttons","title":"User Timeout Buttons","text":"

    User timeout buttons are very useful while looking at a user's logs. All 8 buttons can be configured to various timeout lengths:

    User timeout buttons look like this:

    "},{"location":"Regex/","title":"Regex","text":"

    Regular expressions (or short regexes) are often used to check if a text matches a certain pattern. For example the regex ab?c would match abc or ac, but not abbc or 123. In Chatterino, you can use them to highlight messages (and more) based on complex conditions.

    You can try out your regex patterns on a website like regex101, using the PCRE2 flavor.

    Basic patterns:

    Pattern Matches x? nothing or x x* x, repeated any number of times x+ x, repeated any number of times but at least 1 ^ The start of the text $ The end of the text x|y x or y

    You can group multiple statements with ():

    Pattern Matches asd? asd or as (asd)? asd or nothing \\(asd\\) (asd), literally

    You can also group multiple characters with []:

    Pattern Matches [xyz] x, y or z [1-5a-f] 1,2,3,4,5,a,b,c,d,e,f [^abc] Anything, except a, b and c [\\-] -, literally (escaped with \\) \\[xyz\\] [xyz], literally

    Special patterns:

    Pattern Matches \\d Digit characters (0-9) \\D Non-digit characters \\w Word characters (a-zA-Z0-9_) \\W Non-word characters \\s Spaces, tabs, etc. \\S Not spaces, tabs, etc. \\b Word boundaries (between \\w and \\W) \\B Non-word boundaries"},{"location":"Search/","title":"Search","text":"

    Chatterino has a Search Popup which lets you quickly find messages in the chat. You can open it with the Ctrl+F shortcut.

    "},{"location":"Search/#search-filters","title":"Search filters","text":"

    You can use several search filters (format filter:value) to narrow down your search. value can have multiple comma-separated entries (look at examples below). Surround value in quotation marks to use whitespaces within it, useful for dealing with the regex filter. Starting in 2.4.1 the ability to negate searches is possible. (format !filter:value)

    • from:<username> - shows messages from certain users
    • has:<flags> - shows messages containing specified elements. List of flags:
      • link - filters messages with links
    • in:<channel> - shows messages that originate from certain channels, useful in #/mentions channel
    • is:<flags> - shows certain types of messages. List of flags:
      • deleted or disabled - shows deleted messages
      • sub or subscription - shows subscription messages
      • timeout or ban - shows moderation messages
      • highlighted - shows highlighted messages
      • system - shows system messages (grey text ones like: \"Now hosting username\", \"streamer is live\", etc.)
      • first-msg - shows a user's first message in the channel
      • cheer-msg - shows messages containing bits
      • redemption - shows messages that cost the user Twitch channel points
      • reply - shows messages sent using the Twitch reply feature
    • regex:<regex> - shows messages matching a given regex
    • badge:<value> - shows messages from users that have a given badge
    • subtier:<value> - shows messages from users that are subscribed at a given tier
    "},{"location":"Search/#examples","title":"Examples","text":""},{"location":"Search/#shows-messages-from-user-fourtf-containing-word-merge","title":"Shows messages from user fourtf containing word merge","text":"

    from:fourtf merge

    "},{"location":"Search/#shows-messages-from-users-pajbot-and-zneix-that-have-links-containing-word-chatterino","title":"Shows messages from users pajbot and zneix that have links containing word chatterino","text":"

    has:link from:pajbot,zneix chatterino

    "},{"location":"Search/#shows-messages-only-from-channels-pajlada-and-supinic-from-user-supibot","title":"Shows messages only from channels pajlada and supinic from user supibot","text":"

    in:pajlada,supinic from:supibot

    "},{"location":"Search/#shows-subscription-messages","title":"Shows subscription messages","text":"

    is:sub

    "},{"location":"Search/#shows-deleted-messages-containing-word-vanish","title":"Shows deleted messages containing word vanish","text":"

    is:deleted vanish

    "},{"location":"Search/#shows-timeoutban-messages","title":"Shows timeout/ban messages","text":"

    is:timeout

    "},{"location":"Search/#shows-highlighted-messages","title":"Shows highlighted messages","text":"

    is:highlighted

    "},{"location":"Search/#shows-messages-matching-a-given-regex","title":"Shows messages matching a given regex","text":"

    regex:^gachi\\w*$

    "},{"location":"Search/#shows-messages-from-users-who-have-the-listening-only-badge","title":"Shows messages from users who have the \"Listening only\" badge","text":"

    badge:no_video

    "},{"location":"Search/#shows-messages-from-users-who-are-tier-3-subscribed","title":"Shows messages from users who are tier-3 subscribed","text":"

    subtier:3

    "},{"location":"Search/#shows-messages-from-users-who-are-not-gazatu","title":"Shows messages from users who are NOT gazatu","text":"

    !from:gazatu

    "},{"location":"Search/#shows-messages-that-do-not-contain-links","title":"Shows messages that do NOT contain links","text":"

    !has:link

    "},{"location":"Settings/","title":"Settings","text":""},{"location":"Settings/#where-is-my-chatterino-folder-located","title":"Where is my Chatterino folder located?","text":"

    On Windows: %APPDATA%/Chatterino2

    On Linux: $HOME/.local/share/chatterino

    On Mac: $HOME/Library/Application Support/chatterino

    "},{"location":"Settings/#files","title":"Files","text":"

    Commands and Settings have a small backup mechanism that saves the older version in a file like commands.json.bkp-2 in case you want to return to older versions of the file.

    • commands.json - Will contain all your Chatterino commands
    • settings.json - This contains most of your settings, including sensitive data like your login token
    • window-layout.json - This contains information which tabs and splits you have open and how they are positioned
    • irc.json - When you have a non-twitch IRC connection, this contains the configured servers and settings
    "},{"location":"Settings/#help","title":"Help","text":""},{"location":"Settings/#how-do-i-delete-the-chatterino-cache-settings","title":"How do I delete the Chatterino cache / settings?","text":"

    Navigate to your Chatterino folder and remove corresponding folders.

    • The Cache folder contains cached network requests from Chatterino.
    • The Logs folder contains chat logs from chats you've had open in Chatterino.
    • The Misc folder contains internal information about the current running instance of Chatterino.
    • The Settings folder contains any settings you may have configured in Chatterino (e.g. font size, highlight phrases) and your list of channels open.
    "},{"location":"Settings/#my-settings-commands-window-layout-are-not-saving","title":"My settings / commands / window layout are not saving","text":"

    This is usually a case because Chatterino is unable to save settings on your disk. To fix that, try following steps:

    1. Run Chatterino as Administrator.
    2. Back up your settings by copying them from your Chatterino folder to a safe location on your disk and delete them. Restart your computer and try launching Chatterino again.
    3. Back up your settings, uninstall Chatterino and install it again, but make sure Fresh Install option is checked.
    4. Try running Chatterino in portable mode.
    "},{"location":"Themes/","title":"Themes","text":"

    Beta Warning

    Custom themes are not yet stable. There may be breaking changes in the future (see Migrations).

    Chatterino supports custom-made themes since nightly 5d0bdc1.

    Custom themes are JSON files that are stored in the Themes folder inside your Chatterino folder.

    "},{"location":"Themes/#creating-a-theme","title":"Creating A Theme","text":"

    To create a theme, it's best to use one of the built-in themes as the starting point. You can find them in the resources/themes folder inside the source-code. Copy one into the Themes folder and restart Chatterino. When you open the settings and select a theme, you should see one prefixed with Custom:. Make sure, you're familiar with the common words used in Chatterino.

    "},{"location":"Themes/#schema","title":"Schema","text":"

    Chatterino themes have a JSON schema that must match in order for the theme to be displayed correctly. Many editors support JSON schemas out of the box and warn you about invalid values and provide completions.

    If you used one of the base themes, then the $schema key inside the JSON is invalid, since its value is configured to work inside the Chatterino source-code. You should change the value of $schema to https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json as shown below. If you want to pin the schema to a specific version, replace master with your desired version (for example v2.4.4).

    {\n    \"$schema\": \"https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json\",\n    // ...\n}\n
    "},{"location":"Themes/#auto-reloading","title":"Auto Reloading","text":"

    When developing themes, you often want to reload your changes and see how they look. To aid you in doing that, Chatterino can automatically reload your theme. Use the /c2-theme-autoreload command in any chat to toggle auto-reload.

    Warning

    Make sure to disable auto-reloading after you're done with your changes to reduce resource usage.

    "},{"location":"Themes/#colors","title":"Colors","text":"

    Colors in themes can be specified in various ways. All values that expect a qt-color accept one of the following values. Make sure you're using the schema to get editor feedback. Technically, the values are passed to QColor which does the parsing.

    "},{"location":"Themes/#hex-colors","title":"Hex Colors","text":"

    A, R, G, and B are single hex digits (0-9, a-f, A-F).

    • #RGB
    • #RRGGBB
    • #AARRGGBB This format is different from the CSS Color Moudle Level 4 <hex-color>, where the alpha value is at the end.

    • #RRRGGGBBB

    • #RRRRGGGGBBBB
    "},{"location":"Themes/#named-colors","title":"Named Colors","text":"
    • SVG color keyword names - For example red, mediumspringgreen. Note that these color names are technically case-insensitive and accept spaces, but this isn't supported by the schema, which only accepts lower-case names.
    • transparent
    "},{"location":"Themes/#alternate-editors","title":"Alternate editors","text":"

    These are some alternate ways of creating your own custom themes:

    • Chatterino Theme Creator by doge41732
    "},{"location":"Themes/#migrations","title":"Migrations","text":"

    This section contains added, updated, and removed properties in a release, and commit for nightly versions.

    "},{"location":"Third_party_services/","title":"Third party services","text":"

    Chatterino integrates with a bunch of third party services to provide extended functionality for you.

    "},{"location":"Third_party_services/#betterttv","title":"BetterTTV","text":"

    For Twitch channels, we load emotes from BetterTTV.

    BetterTTV provides global emotes that are available in every channel. These can be disabled with the \"Show BTTV global emotes\" setting.

    BetterTTV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show BTTV channel emotes\" setting.

    "},{"location":"Third_party_services/#frankerfacez","title":"FrankerFaceZ","text":"

    For Twitch channels, we load emotes and badges from FrankerFaceZ.

    FrankerFaceZ provides global emotes that are available in every channel. These can be disabled with the \"Show FFZ global emotes\" setting.

    FrankerFaceZ provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show FFZ channel emotes\" setting.

    Badges are for developers & supporters of FrankerFaceZ and will be displayed next to their username. These can be disabled with the \"FrankerFaceZ\" setting under Advanced -> Visible badges.

    FrankerFaceZ allows supporters to upload custom moderator and VIP badges for their channel, these can be disabled with the \"Use custom FrankerFaceZ moderator badges\" and \"Use custom FrankerFaceZ VIP badges\" settings.

    "},{"location":"Third_party_services/#7tv","title":"7TV","text":"

    For Twitch channels, we load emotes and badges from 7TV.

    7TV provides global emotes that are available in every channel. These can be disabled with the \"Show 7TV global emotes\" setting.

    7TV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show 7TV channel emotes\" setting.

    7TV provides a streaming Event API that posts live updates when emotes change in channels. These can be disabled with the \"Enable 7TV live emote updates\" setting.

    7TV provides the ability to use unlisted emotes. By default, Chatterino will not display these emotes even if they're added to a Channel. You can modify this behaviour with the \"Show unlisted 7TV emotes\" setting.

    Badges are for developers & supporters of 7TV and will be displayed next to their username. These can be disabled with the \"7TV\" setting under Advanced -> Visible badges.

    "},{"location":"Third_party_services/#chatterino-api","title":"Chatterino API","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Chatterino Wiki","text":"

    This wiki provides information for Chatterino.

    "},{"location":"Commands/","title":"Commands","text":"

    Commands are used as shortcuts for long messages. If a message starts with the \"trigger\" then the message will be replaced with the Command.

    "},{"location":"Commands/#built-in-commands","title":"Built-in commands","text":"

    Chatterino comes with a collection of built-in commands to help with channel management, Twitch interaction, and other misc. features.

    "},{"location":"Commands/#banid","title":"/banid","text":"

    Usage: /banid <userID>

    Bans a user by their userID instead of their username. Useful for banning users who are temporarily suspended from Twitch, which /ban cannot do anymore.

    Note: If you ban a suspended user this way, they cannot be unbanned from Chatterino, you must wait until their suspension ends or unban them from browser chat.

    "},{"location":"Commands/#block-unblock","title":"/block & /unblock","text":"

    Usage: /(block|unblock) <user>

    Blocks or unblocks the specified user. Blocking will hide that user's messages/whispers as well as disassociate them from you on Twitch. For more information about blocking, see Twitch's help article.

    "},{"location":"Commands/#chatters","title":"/chatters","text":"

    Usage: /chatters

    Shows the total amount of chatters currently connected to the channel.

    "},{"location":"Commands/#clearmessages","title":"/clearmessages","text":"

    Usage: /clearmessages

    Clears all messages from the current split/channel. This command is purely visual and is not related to the /clear moderator command.

    "},{"location":"Commands/#clip","title":"/clip","text":"

    Usage: /clip

    Creates a clip from the last 30 seconds of the current channel. Also provides an edit link to edit a clip from the current point in time.

    "},{"location":"Commands/#debug-args","title":"/debug-args","text":"

    Usage: /debug-args

    Displays the arguments that chatterino was launched with.

    "},{"location":"Commands/#delete","title":"/delete","text":"

    Usage: /delete <msg-id>

    Moderator only, deletes a message in chat with the provided ID. Usually used in mod actions as they can pass through the message ID.

    "},{"location":"Commands/#fakemsg","title":"/fakemsg","text":"

    Usage: /fakemsg <raw message>

    Displays the provided IRC messsage in chat as if it was sent from Twitch's IRC server.

    "},{"location":"Commands/#marker","title":"/marker","text":"

    Usage: /marker

    Editor only, creates a stream marker in the current stream. Streamer must be live to create markers.

    "},{"location":"Commands/#openurl","title":"/openurl","text":"

    Usage: /openurl <url>

    Opens a URL in the default web browser. Useful in custom commands.

    "},{"location":"Commands/#popout","title":"/popout","text":"

    Usage: /popout [channel]

    Opens the current channel or provided channel's chat in Twitch's popout webchat, using your default browser.

    "},{"location":"Commands/#popup","title":"/popup","text":"

    Usage: /popup [channel]

    Opens the current channel or provided channel's chat in a new window.

    "},{"location":"Commands/#r","title":"/r","text":"

    Usage: /r <message>

    Replies to the last received whisper.

    "},{"location":"Commands/#setgame","title":"/setgame","text":"

    Usage: /setgame <game>

    Broadcaster only, sets the current channel's game to the best match of the provided game name.

    "},{"location":"Commands/#settitle","title":"/settitle","text":"

    Usage: /settitle <title>

    Broadcaster only, sets the current channel's title to the provided text.

    "},{"location":"Commands/#streamlink","title":"/streamlink","text":"

    Usage: /streamlink [channel]

    Attempts to open current or specified stream in streamlink. For more information, see Streamlink's website.

    "},{"location":"Commands/#uptime","title":"/uptime","text":"

    Usage: /uptime

    Displays the uptime of the current channel's livestream.

    "},{"location":"Commands/#user","title":"/user","text":"

    Usage: /user <user> [channel]

    Opens the specified user's Twitch usercard for the given channel (or the channel provided) in the default browser.

    "},{"location":"Commands/#usercard","title":"/usercard","text":"

    Usage: /usercard <user> [channel]

    Opens the specified user's Chatterino usercard for the given channel or the channel provided.

    "},{"location":"Commands/#w-whisper","title":"/w (Whisper)","text":"

    Usage: /w <user> <message>

    Whispers the provided text to a user on Twitch. See Chatterino's whisper FAQ item for whisper-related issues.

    "},{"location":"Commands/#custom-commands","title":"Custom commands","text":""},{"location":"Commands/#example","title":"Example","text":"

    Add Command Hello chat :) with the trigger /hello. Now typing /hello in chat will send Hello chat :) instead of /hello.

    "},{"location":"Commands/#advanced","title":"Advanced","text":"
    • The trigger has to be matched at the start of the message but there is a setting to also match them at the end.
    • Triggers don't need to start with /
    "},{"location":"Commands/#using-placeholders","title":"Using placeholders","text":"
    • {1}, {2}, {3} and so on can be used to insert the 1st, 2nd, 3rd, ... word after the trigger. Example: Add Command /timeout {1} 1 with trigger /warn. Now typing /warn user123 will send /timeout user123 1

    • Similarly {1+} and so on can be used to insert all words starting with the 1st, ... word. Example: Add Command Have a {1+} day! with trigger /day. Now typing /day very super nice will send Have a very super nice day!

    • You can use {{1} if you want to send {1} literally.

    • {channel.name} can be used to insert the name of the current channel. Example: Add Command /openurl https://twitch.tv/{channel.name} with trigger /openchannel. Now typing /openchannel will open the current channel in your browser.

    • {channel.id} can be used to insert the Twitch account ID of the owner of current channel.

    • {my.name} can be used to insert the Twitch username of the currently selected account.

    • {my.id} can be used to insert the Twitch account ID of the currently selected account.

    • {stream.title} can be used to insert the title set in the current channel. Only works if the channel is live. Example: Add Command The title is {stream.title} with trigger /title. Now typing /title will send a message like The title is Programming.S04E74.1440p.MP4-XD.NVENC

    • {stream.game} can be used to insert the game set in the current channel. Only works if the channel is live. Example: Add Command I'm currently playing {stream.game} with trigger /game. Now typing /game will send a message like I'm currently playing World of Warcraft.

    "},{"location":"Contributing%20for%20Developers/","title":"Contribution Guidelines","text":"

    This is a set of guidelines for contributing to Chatterino. The goal is to teach programmers without C++ background (java/python/etc.), people who haven't used Qt or otherwise have different experience the idioms of the codebase. Thus, we will focus on those which are different from those other environments. There are extra guidelines available here, but they are considered as extras and not as important.

    "},{"location":"Contributing%20for%20Developers/#tooling","title":"Tooling","text":""},{"location":"Contributing%20for%20Developers/#formatting","title":"Formatting","text":"

    Code is automatically formatted using clang-format. It takes the burden off of the programmer and ensures that all contributors use the same style (even if mess something up accidentally). We recommend that you set up automatic formatting on file save in your editor.

    "},{"location":"Contributing%20for%20Developers/#code","title":"Code","text":""},{"location":"Contributing%20for%20Developers/#comments","title":"Comments","text":"

    Comments should only be used to:

    • Increase readability (e.g. grouping member variables).
    • Containing information that can't be expressed in code.

    Try to structure your code so that comments are not required.

    "},{"location":"Contributing%20for%20Developers/#good-example","title":"Good example","text":"
    /**\n * @return 0 if a == b, negative if a < b and positive if b > a. (1)\n */\nint /* (2)! */ compare(const QString &a, const QString &b);\n
    1. You can't know this from the function signature, so it's good to clarify this.
    2. Even better: Return a \"strong ordering\" type (but we don't have such a type right now).
    "},{"location":"Contributing%20for%20Developers/#bad-example","title":"Bad example","text":"
    /*\n * Matches a link and returns boost::none if it failed and a\n * QRegularExpressionMatch on success. (1)\n *\n * @param text The text that will be checked if it contains a link. (2)\n */\nboost::optional<QRegularExpressionMatch> matchLink(const QString &text);\n
    1. This repeats the function signature.
    2. This is obvious from the function and parameter names.
    "},{"location":"Contributing%20for%20Developers/#code_1","title":"Code","text":""},{"location":"Contributing%20for%20Developers/#arithmetic-types","title":"Arithmetic Types","text":"

    Arithmetic types (like char, int, float or size_t), bool, and pointers are NOT initialized by default in C++. They keep whatever value is already at their position in the memory. This makes debugging harder and is unpredictable, so we initialize them to zero by using {} after their name when declaring them.

    class ArithmeticTypes\n{\n    // DO\n    int n{}; // (1)!\n    bool isEnabled{}; // (2)!\n    QWidget *myPtr{}; // (3)!\n    int thisIs5 = 5; // (4)!\n    std::vector<int> myVec; // (5)!\n\n    // DON'T\n    int m; // (6)!\n    bool isHidden; // (7)!\n    QWidget *yourPtr; // (8)!\n    std::vector<int> myVec{}; // (9)!\n};\n
    1. Initialized to 0.
    2. Initialized to false.
    3. Initialized to nullptr.
    4. Explicitly initialized to 5.
    5. Other non-arithmetic types call constructors instead, so no need for {}.
    6. \u26a0 Random value.
    7. \u26a0 Random value.
    8. \u26a0 Random value. Dereferencing this will likely segfault.
    9. Unnecessary {} as the default constructor will be called even without {}.
    "},{"location":"Contributing%20for%20Developers/#passing-parameters","title":"Passing parameters","text":"

    The way a parameter is passed signals how it is going to be used inside the function. C++ doesn't have multiple return values, so there is \"out parameters\" (reference to a variable that is going to be assigned inside the function) to simulate multiple return values.

    Cheap to copy types like int/enum/etc. can be passed in per value since copying them is fast.

    void setValue(int value /* (1)! */) {\n    this->value_ = value;\n}\n\nvoid sendGreeting(const /* (2)! */ User &user /* (3)! */, MessageFlags flags /* (4)! */) {\n    this->sendMessage(user.id(), user.name(), flags);\n}\n
    1. ints are cheap to copy. Here, the parameter will likely be passed in a register.
    2. We only need to read the user's name, so it's marked as const.
    3. User is a class that contains the user's name and other fields, thus it's expensive to copy - so a reference is used.
    4. MessageFlags is an enum, so it's cheap to copy.

    References mean that the variable doesn't need to be copied when it is passed to a function.

    Type Meaning const Type& name in Parameter. It is NOT going to be modified and may be copied inside the function. Type& name out or in+out Parameter. It will be modified.

    Pointers signal that objects are managed manually. While the above are only guaranteed to live as long as the function call (= don't store and use later) these may have more complex lifetimes.

    Type Meaning Type* name The lifetime of the parameter may exceed the length of the function call. It may use the QObject parent/children system (see QObject Classes).

    R-value references && work similar to regular references but signal the parameter should be \"consumed\".

    void storeLargeObject(LargeObject &&object) {\n    // ...\n}\n\nvoid storeObject(std::unique_ptr<Object> &&object) {\n    // ...\n}\n\nvoid main() {\n    LargeObject large = { /*...*/ };\n\n    storeLargeObject(std::move(large)); // (1)!\n\n    std::unique_ptr<Object> unique = std::make_unique(/*...*/);\n    storeObject(std::move(unique)); // (2)!\n\n    assert(unique.get() == nullptr); // (3)!\n}\n
    1. storeLargeObject accepts an r-value reference, and we use std::move(), thus we move the object and avoid the need to copy.
    2. You can't copy a std::unique_ptr, so we need to move here.
    3. The pointer contained by unique has now been consumed by storeObject, so it just holds a null pointer now.

    Generally the lowest level of requirement should be used e.g. passing Channel& instead of std::shared_ptr<Channel>& (aka ChannelPtr) if possible.

    "},{"location":"Contributing%20for%20Developers/#members","title":"Members","text":"

    All functions names are in camelCase. Private member variables are in camelCase_ (note the underscore at the end). We don't use the get prefix for getters. We mark functions as const if applicable.

    class NamedObject\n{\npublic:\n    const QString &name() const; // (1)!\n    void setName(const QString &name);\n    bool hasLongName() const; // (2)!\n\n    static void myStaticFunction(); // (3)!\n    QString publicName;\n\nprivate:\n    QString name_; // (4)!\n    // QString name; (5)\n\n    void myPrivateMethod(); // (6)!\n};\n\nvoid myFreeStandingFunction(); // (7)!\n
    1. No get prefix.
    2. A has or is prefix is okay.
    3. Static member functions start lowercase as well.
    4. Private members have a _ suffix.
    5. This declaration would collide with the name() accessor.
    6. Private methods don't have a _ suffix.
    7. Free standing functions start lowercase as well.
    "},{"location":"Contributing%20for%20Developers/#casts","title":"Casts","text":"
    • Avoid c-style casts: (type)variable.
    • Instead use explicit type casts: type(variable)
    • Or use one of static_cast, const_cast and dynamic_cast
    • Try to avoid reinterpret_cast unless necessary.
    void example(float f, Base *b, const User &user, int p) {\n    // DO\n    int i = int(f); // (1)!\n    Derived* derived = dynamic_cast<Derived*>(base); // (2)!\n    if (derived != nullptr) // (3)!\n    {\n        // use derived\n    }\n\n    // BE CAREFUL\n    const_cast<User &>(c).setName(\"foo\"); // (4)!\n    float *pp = reinterpret_cast<float*>(&p); // (5)!\n\n    // DON'T (6)\n    int i = (int)f;\n    Derived* derived = (Derived*)base;\n    ((int &)c) = 123;\n    float *pp = (float*)&p;\n}\n
    1. Use explicit type casts.
    2. Use explicit dynamic_cast.
    3. Unless extremely obvious, always check the result of dynamic_cast.
    4. Only use const_cast if using proper const correctness doesn't work.
    5. reinterpret_cast is required very rarely.
    6. Avoid C-style casts.
    "},{"location":"Contributing%20for%20Developers/#this","title":"This","text":"

    Always use this to refer to instance members to make it clear where we use either locals or members.

    class Test\n{\n    void testFunc(int a);\n    int testInt_{};\n}\n\nTest::testFunc(int a)\n{\n    // DO\n    this->testInt_ += 2;\n    this->testFunc();\n\n    // DON'T\n    testInt_ -= 123;\n    testFunc(2);\n    this->testFunc(testInt_/*(1)!*/ + 1);\n}\n
    1. It's unclear if it's a local or member variable, especially if the method is more complex.
    "},{"location":"Contributing%20for%20Developers/#managing-resources","title":"Managing resources","text":""},{"location":"Contributing%20for%20Developers/#regular-classes","title":"Regular classes","text":"

    Keep the element on the stack if possible. If you need a pointer or have complex ownership you should use one of these classes:

    • Use std::unique_ptr if the resource has a single owner.
    • Use std::shared_ptr if the resource has multiple owners.
    "},{"location":"Contributing%20for%20Developers/#qobject-classes","title":"QObject classes","text":"
    • Use the object tree to manage lifetime where possible. Objects are destroyed when their parent object is destroyed.
    • If you have to explicitly delete an object use variable->deleteLater() instead of delete variable. This ensures that it will be deleted on the correct thread.
    • If an object doesn't have a parent consider using std::unique_ptr<Type, DeleteLater> with DeleteLater from \"common/Common.hpp\". This will call deleteLater() on the pointer once it goes out of scope or the object is destroyed.
    "},{"location":"Crash%20Analysis/","title":"Crash Analysis","text":"

    When running on Windows, Chatterino will automatically save information about a crash in a minidump.

    Crashdumps are saved inside the Crashes/reports folder in your Chatterino folder.

    Minidumps contain the stacks of all threads, their state (registers), the exception associated with the crash, and some metadata about the CPU and the OS. If you are unsure if your crashdump contains sensitive information, ask a Chatterino developer on the Discord server.

    There are several ways of analyzing crashes. To get started, you need to have a symbol (PDB) file for your installation. These files are unique per build meaning that you need to download the file (this is especially important when using nightly builds). For GitHub builds, you can find the PDB file in the release - it's zipped in an archive ending in .pdb.7z. For simplicity, extract the .pdb to the location of your chatterino.exe.

    "},{"location":"Crash%20Analysis/#windbg","title":"WinDbg","text":"

    For analyzing with a GUI, install WinDbg. After the installation, you should be able to open the crashdumps (.dmp files) right from the Windows Explorer. By default, you won't get much information.

    To add names to functions (symbols), open the settings (Home > Settings), go to Debugging Settings, and add the directory you extracted your symbol file to the Symbol path. If there's no srv* entry, consider adding one - this will try to load symbols from servers for system libraries.

    To add source-files, clone the repository and checkout the source-tree at the version of your executable. Then add this path to Source Path in the Debugging Settings.

    Note: You might need to reload your window to have your changes be picked up.

    Example Settings"},{"location":"Crash%20Analysis/#minidump-stackwalk","title":"minidump-stackwalk","text":"

    If you want to use the terminal or don't have a Windows machine, you can use minidump-stackwalk. Install minidump-stackwalk and dump_syms with cargo (installation): cargo install <app>.

    First, you need to generate a symbol-store from the PDB file with dump_syms:

    dump_syms chatterino.exe -s <store-path> # (1)!\n
    1. This can be any folder you want. Symbols will be extracted here.

    After you dumped the symbols, run:

    minidump-stackwalk <path-to-crashdump> --symbols-path <store-path>\n

    Since Chatterino has quite a few threads, the output will be long. Most of the time, you're interested in the first thread (GUI thread) since it's the crashing thread.

    "},{"location":"Environment%20Variables/","title":"Environment Variables","text":"

    Below I have tried to list all environment variables that can be used to modify the behaviour of Chatterino. Used for things that I don't feel like fit in the settings system.

    "},{"location":"Environment%20Variables/#chatterino2_recent_messages_url","title":"CHATTERINO2_RECENT_MESSAGES_URL","text":"

    Used to change the URL that Chatterino2 uses when trying to load historic Twitch chat messages (if the setting is enabled). Default value: https://recent-messages.robotty.de/api/v2/recent-messages/%1 (an open-source service written and currently run by @RAnders00 - visit the homepage for more details about the service) Arguments:

    • %1 = Name of the Twitch channel
    "},{"location":"Environment%20Variables/#chatterino2_link_resolver_url","title":"CHATTERINO2_LINK_RESOLVER_URL","text":"

    Used to change the URL that Chatterino2 uses when trying to get link information to display in the tooltip on hover. Default value: https://braize.pajlada.com/chatterino/link_resolver/%1 Arguments:

    • %1 = Escaped URL the link resolver should resolve
    "},{"location":"Environment%20Variables/#chatterino2_twitch_emote_set_resolver_url","title":"CHATTERINO2_TWITCH_EMOTE_SET_RESOLVER_URL","text":"

    Used to change the URL that Chatterino2 uses when trying to get emote set information Default value: https://braize.pajlada.com/chatterino/twitchemotes/set/%1/ Arguments:

    • %1 = Emote set ID
    "},{"location":"Environment%20Variables/#chatterino2_twitch_server_host","title":"CHATTERINO2_TWITCH_SERVER_HOST","text":"

    String value used to change what Twitch chat server host to connect to. Default value: irc.chat.twitch.tv

    "},{"location":"Environment%20Variables/#chatterino2_twitch_server_port","title":"CHATTERINO2_TWITCH_SERVER_PORT","text":"

    Number value used to change what port to use when connecting to Twitch chat servers. Currently known valid ports for secure usage: 6697, 443. Currently known valid ports for non-secure usage (CHATTERINO2_TWITCH_SERVER_SECURE set to false): 6667, 80. Default value: 443

    "},{"location":"Environment%20Variables/#chatterino2_twitch_server_secure","title":"CHATTERINO2_TWITCH_SERVER_SECURE","text":"

    Bool value used to tell Chatterino whether to try to connect securely (secure irc) to the Twitch chat server. Default value: true

    "},{"location":"Environment%20Variables/#chatterino2_proxy_url","title":"CHATTERINO2_PROXY_URL","text":"

    Used to set a proxy for network interactions of Chatterino. Both HTTP and SOCKS51 proxies are supported. The URL supports username and password authentication. Example: http://username:password@127.0.0.1:1080 or socks5://127.0.0.1 (defaults to port 1080).

    "},{"location":"Environment%20Variables/#qt_logging_rules","title":"QT_LOGGING_RULES","text":"

    Used to enable/disable logging at run time. For example: QT_LOGGING_RULES=\"chatterino.*.debug=true\" to enable debug logging in release builds. (It's on by default in debug builds). See Qt docs for more details.

    "},{"location":"Environment%20Variables/#qt_message_pattern","title":"QT_MESSAGE_PATTERN","text":"

    Used to customize logging at run time. For example: QT_MESSAGE_PATTERN=\"%{time hh:mm:ss.zzz} %{category}: %{function} %{message}\" enables a timestamp and function name in log messages. See Qt docs for more details.

    1. When using a SOCKS5 proxy, WebSockets (Twitch PubSub, 7TV EventAPI, and BTTV EventSockets) are not proxied. Only IRC and HTTP requests are proxied.\u00a0\u21a9

    "},{"location":"Features/","title":"Features","text":""},{"location":"Features/#replies","title":"Replies","text":"

    We support Twitch's Chat Replies feature.

    A reply can be executed by right-clicking a message, and selecting Reply to message, or by opening an existing Reply Thread and sending your message there. Users who replied to your message, or messages sent in a reply thread you participated in, are highlighted and can be customized in the highlight setting Participated Reply Threads.

    "},{"location":"Filters/","title":"Filters","text":"

    Filters are a powerful tool to create your own custom, filtered channel splits. Filters allow you to selectively show messages that satisfy your own custom criteria: show subscribers' messages, moderator messages, channel point redemptions, new subscriptions, and more.

    Looking for inspiration? Look at some example filters.

    "},{"location":"Filters/#introduction-to-filters","title":"Introduction to Filters","text":"

    Filters can be applied to splits to provide a selective view of messages. Filters are created in the Settings page and are applied by opening the Split menu (three dots) and selecting \"Set filters\". Applied filters are saved when you close and open Chatterino.

    Multiple filters can be applied to a Split. A message must pass all applied filters for it to be displayed.

    Simple filters are available through the Channel Filter Creator dialog. Advanced filters take inspiration from many programming languages, and the full description of keywords and operators can be found below.

    "},{"location":"Filters/#writing-your-own-filters","title":"Writing your own filters","text":"

    To begin writing your own filters, take a look at the available operators and variables below.

    For most tasks involving the message content, you can make use of the contains operator, or the matches operator with a regular expression. Then, try to break your desired behavior into multiple conditions. Combine them like this:

    • If you need all the conditions satisfied, combine them with AND (condition1 && condition2)
    • If you only need one of the conditions, combine them with OR (condition1 || condition2)
    • If you need the opposite of one of the conditions, wrap it with parentheses and add a NOT: !(condition)
    "},{"location":"Filters/#example","title":"Example","text":"

    Consider the following intention: \"Only show me messages that are from moderators and mention me\". We can break this filter into two individual conditions:

    1. Messages that are from moderators
    2. Messages that mention me

    We can then write the corresponding filter parts:

    1. author.badges contains \"moderator\"
    2. message.content contains \"@my_name\"

    Finally, because we want both of these conditions to be true, we combine them with the AND operator && and end up with this final filter:

    (author.badges contains \"moderator\") && (message.content contains \"@my_name\")

    "},{"location":"Filters/#quick-add","title":"Quick Add","text":"

    If you already have a filter, you can use the Quick Add button and paste your filter into the Filter section.

    "},{"location":"Filters/#terminology","title":"Terminology","text":"

    Here is some terminology that you'll encounter in the rest of this document.

    1. Value: A value is the simplest element of a filter. It can take on multiple forms: a number, a string (i.e. text), a regular expression, or a list of multiple values.
    2. Type: A type describes the general form of a value. For example, every number has type Int. Every string has type String.
    3. Variable: A variable is a placeholder for some information about a message. For example, the variable message.content represents the text of a message
    4. Operator: An operator acts on one or two values and evaluates to another value. For example, the plus operator + can add two numbers, 1 + 1 or concatenate strings, \"a\" + \"b\"
    "},{"location":"Filters/#example-filters","title":"Example filters","text":"
    • message.content contains \"hello\"
      • Only messages that contain the phrase hello
    • message.length < 40 || author.subbed
      • Messages that are less than 40 characters long, OR are sent by a subscriber.
    • channel.name == \"somestreamer\" && author.badges contains \"moderator\"
      • Messages that originated in the channel somestreamer AND are from users with a moderator badge
    "},{"location":"Filters/#filter-syntax-semantics","title":"Filter Syntax + Semantics","text":"

    This section is aimed at technical users who have experience with general purpose programming languages.

    A filter must be a valid expression. An expression is comprised of conditions and values which are evaluated to a single True or False value to decide whether to filter a message. Evaluating to something other than True or False will lead to all messages being filtered out.

    "},{"location":"Filters/#values","title":"Values","text":"

    A value can be:

    1. An integer (123, 5)
    2. A string (\"hello\", \"this is a string\")
    3. A variable (author.name, message.length)
      • Technically, a variable isn't a value, but is given value by substitution
      • When a filter is evaluated, variables are replaced with the values they represent
    4. A regular expression (r\"\\d\\d\\d\\d\")
    5. A list of values ({123, \"hello\", author.name})

    Regular expressions are similar to strings, but are denoted with an r before the opening quotation mark (e.g. r\"something\"). To make a regular expression case-insensitive, use ri before the opening quotation mark (e.g. ri\"something\").

    Literals:

    Name Example Int 123, 5 String \"Hello there\", \"Escaped \\\" quote\" RegEx r\"\\d\\d\\d\\d\", ri\"something.*\" List {\"list item\", 123}"},{"location":"Filters/#operators","title":"Operators","text":"

    Binary operators act on two values:

    • 1 + 2
    • author.subbed && flags.highlighted
    • \"long sentence\" contains \"ten\"

    Unary operators act on one value:

    • !author.subbed

    The following operators are available:

    Operator Description && Logical AND || Logical OR ! Negation == Equals != Not equals < Less than <= Less than or equal to > Greater than >= Greater than or equal to contains String, List, or Map contains startswith String or List starts with text or value, respectively endswith String or List ends with text or value, respectively match Match string with regular expression + Add (or string concatenation) - Subtract * Multiply / Divide (integer) % Modulus

    Please read about the type rules to better understand the evaluation semantics for operators that take multiple data types.

    "},{"location":"Filters/#variables","title":"Variables","text":"

    The following variables are available:

    Variable Type Description Author User who sent the message author.badges List List of author's badges author.color Color* Color code of author, or none author.name String Display name of author author.no_color Bool Whether the author has no color set (i.e. gray name) author.subbed Bool Whether author is subscribed author.sub_length Int How long author has been subscribed (or zero) Channel The channel where the message was sent channel.name String Channel name channel.watching Bool Whether the channel is being watched (requires Chatterino extension) channel.live Bool Whether the channel is currently live Flags Message-specific flags flags.highlighted Bool Whether the message is highlighted flags.reward_message Bool Whether the message is a redeemed channel point reward message (except \"Highlight my Message\") flags.points_redeemed Bool Whether the message was redeemed through the channel point reward \"Highlight my Message\" flags.sub_message Bool Whether the message is a sub/resub/gift message flags.system_message Bool Whether the message is a system message (i.e. timeout/ban/info) flags.first_message Bool Whether the message is the author's first message in the channel flags.cheer_message Bool Whether the message includes bits flags.whisper Bool Whether the message is a whisper flags.reply Bool Whether the message is a reply flags.automod Bool Whether the message has automod information or actions Message Actual message sent message.content String Message content message.length Int Message length Reward Information about the channel point redemption of this message, if any reward.title1 String Title of the redemption (e.g. Drink water!) reward.cost1 Int Cost of the redemption (e.g. 500) reward.id1 String ID of the redemption (e.g. 1ed437f5-9dc3-4510-8a3f-abcad67985e1)

    *Note: To compare a Color, compare it to a color hex code string: author.color == \"#FF0000\"

    "},{"location":"Filters/#data-types","title":"Data types","text":"

    The Chatterino filter language is typed, meaning that every value has a type and only specific combinations of types are allowed when using operators. Generally, you won't run in to issues. The type system exists to warn you about any mistakes that your filter contains.

    "},{"location":"Filters/#type-rules","title":"Type Rules","text":"Operator Form Result Description + Int + Int Int Adds two integers + String + Any String Concatenates the first string with the second argument - Int - Int Int Subtracts two integers * Int * Int Int Multiplies two integers / Int / Int Int Divides two integers, discarding the remainder % Int % Int Int Computes the modulus of two integers && Bool && Bool Bool Logical AND of two booleans || Bool || Bool Bool Logical OR of two booleans == Any == Any Bool Equality comparison of any two values != Any != Any Bool Inequality comparison of any two values > Int > Int Bool Greater than comparison of two integers >= Int >= Int Bool Greater than or equal to comparison of two integers < Int < Int Bool Less than comparison of two integers <= Int <= Int Bool Less than or equal to comparison of two integers startswith List startswith Any Bool Checks whether the list has the given value as its first value startswith String startswith String Bool Checks whether the first string starts with the second string endswith List endswith Any Bool Checks whether the list has the given value as its last value endswith String endswith String Bool Checks whether the first string ends with the second string contains List contains Any Bool Checks whether the list contains the given value contains Map contains Any Bool Checks whether the map has the given value as a key contains String contains String Bool Checks whether the first string contains the second string match String match RegEx Bool Checks whether the string matches the given regular expression match String match {RegEx, n : Int} String Returns the nth matching capture group, or the empty string"},{"location":"Filters/#regular-expressions","title":"Regular Expressions","text":"

    Chatterino can match string variables to a regular expression, returning whether the expression matched or, optionally, the value of a capture group.

    "},{"location":"Filters/#simple-matching","title":"Simple matching","text":"

    \"some string\" match r\"some regex\" returns True or False.

    For example: message.content match r\"\\d\\d\"

    "},{"location":"Filters/#group-capturing","title":"Group capturing","text":"

    \"some string\" match {r\"some regex\", capture number} returns False if no match or the value of the nth captured group.

    For example: message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3} matches the year component of a date like 12/31/2020.

    (message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3}) == \"2020\" will filter only messages that contain a written date with 2020 as the year.

    "},{"location":"Filters/#order-of-operations","title":"Order of Operations","text":"

    The order of operations in filters may not be exactly what you expect.

    • Expressions in parentheses are evaluated first
    • Math operations are evaluated from left to right, not by MDAS. 2 + 3 * 4 yields 20, not 14.
    • a && b || c && d is evaluated as (a && b) || (c && d)
    • a || b && c || d is evaluated as a || (b && c) || d

    Basically, if you're unsure about the order of operations, use extra parentheses.

    1. Available since 2.5.1\u00a0\u21a9\u21a9\u21a9

    "},{"location":"Glossary/","title":"Glossary","text":"

    Explain common words used in Chatterino.

    "},{"location":"Glossary/#anatomy-of-a-chatterino-window","title":"Anatomy of a Chatterino window","text":"Term Description Split Includes the chat, input field and a split header Split Header Contains split title, moderation actions, viewer list, split menu button and add split button Split Menu Settings or actions for the specific split Tab Can contain multiple splits"},{"location":"Glossary/#moderation","title":"Moderation","text":"Term Description Moderation buttons Allow you to quickly delete messages, timeout users or execute custom commands. They can be configured in Settings > Moderation > Moderation buttons Moderation mode button Toggles whether Moderation buttons are shown Usercard Contains useful information about a user, action buttons as well as their recent messages. Can be opened by clicking someone's username in chat or by typing /usercard username User Timeout Buttons Allow you time a user out from their Usercard. They can be configured in Settings > Moderation > User Timeout Buttons"},{"location":"Glossary/#replies","title":"Replies","text":"Term Description Reply Context Contains the message a user was replying to. Reply Thread Contains the history of replies to a message that Chatterino has loaded Reply Input The input box to send a reply. Available in both the normal Chatterino window, and the Reply Thread."},{"location":"Help/","title":"Help","text":"

    Having issues with Chatterino or need general assistance? Check the below troubleshooting below corresponding to your operating system for assistance!

    Please search for your problem in the GitHub Issues. If there is no such issue, please create a new one. If you have more questions, feel free to join the Discord.

    "},{"location":"Help/#basic-troubleshooting","title":"Basic troubleshooting","text":"

    Prior to starting on the below, you should first try the basic troubleshooting steps listed here. These steps can resolve a variety of issues:

    • Ensure that your Chatterino is up to date.
    • [Windows] Try running Chatterino in administrator mode.
    • [Windows] Ensure that you have the x64 Visual C++ Redistributables installed AND have restarted your PC after installation:
      • x64: https://aka.ms/vs/16/release/vc_redist.x64.exe
      • Chocolatey: choco install vcredist140
    • [MacOS] Open System Preferences go to Security & Privacy [General Tab] and select Open Anyway or see this Apple support article.
    "},{"location":"Help/#i-am-having-an-issue-with-the-chatterino-extension","title":"I am having an issue with the Chatterino extension","text":"

    Chatterino extension issues should be posted here.

    "},{"location":"Help/#chatterino-not-startingcrashing-upon-startup","title":"Chatterino not starting/Crashing upon startup","text":"
    • [Windows] Try running Chatterino in administrator mode.
    • [Windows] Adding Chatterino to your anti-virus/malware whitelist.
    • [Windows] If nothing else works, try resetting your settings using the Fresh Install option in the installer.
    "},{"location":"Help/#does-using-chatterino-accumulate-twitch-channel-points","title":"Does using Chatterino accumulate Twitch channel points?","text":"

    Unfortunately not. This is a limitation due to Twitch using internal APIs for channel points. This will however work with most chatbots, as they simply take you being connected to chat as \"watching the stream\".

    "},{"location":"Help/#can-i-use-chatterino-as-my-chat-overlay-for-my-stream","title":"Can I use Chatterino as my chat overlay for my stream?","text":"

    You definitely can, but it's not recommended. We suggest using a service similar to KapChat.

    "},{"location":"Help/#why-are-my-messages-being-sent-in-webchat-but-not-in-chatterino","title":"Why are my messages being sent in webchat, but not in Chatterino?","text":"

    There's a few things to cover here:

    • If your message is not sent in Chatterino, it is likely not sent in webchat either. Webchat renders messages whether they are sent or not, Chatterino will only render the message if it is accepted by the server.
    • If you're trying to type in a chat where there are a lot of active chatters, then your message may be dropped by Twitch's chat servers (due to the volume).
    • If an alt account has been banned in that chat, you have likely been shadowbanned by Twitch in that channel. Which prevents any of your other accounts from speaking in that channel.
    • If you have spammed too much in another chat, you have likely been temporarily shadowbanned by Twitch in channels where you are not: Subscribed, VIP or Moderator.

    If all else fails, you may be having connection issues to Twitch or your network may be blocking the necessary IRC ports in order to connect.

    "},{"location":"Help/#chatterino-is-repeatedly-disconnecting-from-twitch-chat","title":"Chatterino is repeatedly disconnecting from Twitch chat","text":"

    If you are having troubles with Chatterino repeatedly connecting/disconnecting, it is likely due to the large amount of channels you are connected to. The maximum channel limit is usually around the 100 mark, but may differ from user to user. Try closing splits in Chatterino in order to fix this.

    "},{"location":"Help/#i-am-unable-to-send-whispers-from-chatterino","title":"I am unable to send whispers from Chatterino","text":"

    You may be unable to send a whisper via Chatterino for the following reasons:

    "},{"location":"Help/#you-dont-have-a-verified-phone-number-attached-to-your-twitch-account","title":"You don't have a verified phone number attached to your Twitch account.","text":"

    Twitch requires users to have a verified Phone Number attached to their account to send whispers from Chatterino. NOTE: A Verified Phone Number is NOT the same thing as Two-Factor Authentication. You can add a phone number to your account in Twitch Settings.

    "},{"location":"Help/#ffzbttv-emotes-are-not-working","title":"FFZ/BTTV emotes are not working","text":"

    You need to be logged in to see emotes. Try hitting F5 once to manually refresh the emotes.

    Chatterino only makes a connection to the necessary APIs to fetch these emotes, if you are still having issues fetching them, then your network may be blocking requests to those APIs.

    "},{"location":"Help/#i-have-link-information-turned-on-but-am-unable-to-see-the-information-when-hovering-over-a-link","title":"I have link information turned on, but am unable to see the information when hovering over a link","text":"
    • The server (braize) used to fetch the link information may be down. Braize uptime can be found here.
    • Your network may be having issues connecting to braize. Try restarting your PC and router.
    "},{"location":"Help/#how-do-i-get-the-supporter-badge","title":"How do I get the supporter badge?","text":"

    Donate \u20ac10 to fourtf here (can be done in multiple donations). You should get your badge automatically after about 5 minutes. Make sure to restart Chatterino if you can't see the badge. If you still can't see it, ask fourtf on Chatterino Discord for assistance.

    "},{"location":"Help/#how-do-i-disable-the-supporter-badge","title":"How do I disable the supporter badge?","text":"

    Log in to the badge manager and click on Disable My Chatterino Badge.

    "},{"location":"Help/#login-expired-error","title":"Login expired error","text":"

    If you're getting the Login expired for user <user>! Try adding your account again. error, simply re-add your account and it will start working again.

    "},{"location":"Help/#how-do-i-add-chatterino-as-an-obs-dock","title":"How do I add Chatterino as an OBS dock?","text":"

    This is not natively supported, but there is a workaround:

    1. Add a dock into OBS for standard Twitch chat.
    2. Turn on Always on top in Chatterino.
    3. Click the 3 dots up the top of a channel split and click Popup.
    4. Move and resize the chat to overlay on top of the standard Twitch chat.
    "},{"location":"Help/#what-is-nightly-and-how-to-use-install-it","title":"What is nightly and how to use / install it","text":""},{"location":"Help/#overview","title":"Overview","text":"

    Nightly is a \"developer release\" of Chatterino. It is released every time there's a new change added to source code. It includes some features that may not be available in the latest stable release.

    "},{"location":"Help/#installation","title":"Installation","text":"
    1. Go to nightly release page on GitHub.
    2. Download nightly:
      • For Windows download chatterino-windows-x86-64.zip
      • For Linux download Chatterino-x86_64.AppImage
      • For Mac download chatterino-osx.dmg
    3. Install nightly:
      • On Windows, right-click the archive > Extract All > Extract (Override files if prompted). Open the newly extracted folder and create a shortcut for the chatterino.exe file to the Desktop for easy access.
      • On Linux, open up the download directory in your terminal and execute the following command chmod +x Chatterino-x86_64.AppImage && sudo mv Chatterino-x86_64.AppImage /usr/local/bin
      • On Mac, open the dmg file and drag Chatterino into the Applications folder.
    "},{"location":"Help/#updating","title":"Updating","text":"

    Nightly ignores version checking and it will not attempt to update on its own. Because of that it will not notify you when a new stable update is available. To update, repeat steps above. If you want to switch back to stable release, download and install it from Chatterino's website.

    "},{"location":"Help/#issues","title":"Issues","text":"

    Since nightly is a testing release, it may be a little unstable. If you find any bugs, make sure to report an issue on GitHub. Before opening an issue make sure you're on latest nightly (to check it, go to Settings > About and compare commit hash) and that there's no duplicate issue already open.

    "},{"location":"Help/#i-see-white-borders-on-full-screen","title":"I see white borders on full screen","text":"

    This is a Windows issue, it can be mitigated by turning on Compatibility mode for Chatterino. Right click chatterino.exe -> Properties -> Compatibility -> Enable \"Run this program in compatibility mode for:\" -> Select Windows 8 in the drop-down menu.

    "},{"location":"Help/#my-reply-was-sent-to-the-wrong-message","title":"My Reply was sent to the wrong message","text":"

    Twitch updated replies to add the functionally we needed to correct this, it was fixed in 5209e47 and the fixed version can be obtained by downloading the latest nightly build.

    "},{"location":"Hotkeys/","title":"Hotkeys","text":""},{"location":"Hotkeys/#introduction-to-hotkeys","title":"Introduction to Hotkeys","text":"

    By default, Chatterino contains a set of default hotkeys. A hotkey can be described using five parameters:

    • Its name
    • A category
    • An action
    • A keybinding
    • The arguments

    "},{"location":"Hotkeys/#categories","title":"Categories","text":"

    Categories describe where in the app the hotkeys action takes place. For example:

    • Sending a message by pressing enter takes place in the Split input box,
    • Closing the current split takes place in the current Split.
    "},{"location":"Hotkeys/#actions","title":"Actions","text":"

    An action simply describes what a hotkey does. For example:

    • The Reconnect to chat action in a Split causes Chatterino to reconnect to Twitch/IRC.
    • The Zoom in/out action in a Window causes Chatterino to zoom in or out (depending on the arguments given)
    "},{"location":"Hotkeys/#keybindings","title":"Keybindings","text":"

    TODO: Short blurb how more advanced keybindings work

    "},{"location":"Hotkeys/#arguments","title":"Arguments","text":"

    Arguments describe the specifics of how the action will behave. For example:

    • The Zoom in/out action in a Window takes a single argument (in, out, or reset) which tells Chatterino to either zoom in or zoom out.
    "},{"location":"Image%20Uploader/","title":"Image Uploader","text":"

    You can drag and drop images to Chatterino or paste them from clipboard to upload them to an external service.

    By default, the image uploader is turned off. You can enable by checking the Chatterino Settings -> External Tools -> Image Uploader -> Enable image uploader option and configuring per one of the below options.

    Note to advanced users: This module sends multipart-form requests via POST method, so uploading via SFTP/FTP won't work. However, popular hosts like imgur.com and s-ul.eu are supported. Scroll down to see example configurations.

    "},{"location":"Image%20Uploader/#configuration-explanation","title":"Configuration Explanation","text":"Row Description Request URL Link to an API endpoint, which is requested by Chatterino. Any needed URL parameters should be included here. Form field Name of a field, which contains image data. Extra headers Extra headers, that will be included in the request. Header name and value must be separated by colon (:). Multiple headers need to be separated with semicolons (;).Example: Authorization: supaKey ; NextHeader: value. Image link Schema that tells where is the link in service's response. Leave empty if server's response is just the link itself. Refer to json properties by {property}. Supports dot-notation, example: {property.anotherProperty}. Deletion link Same as above."},{"location":"Image%20Uploader/#examples","title":"Examples","text":""},{"location":"Image%20Uploader/#inuulscom","title":"i.nuuls.com","text":"Row Description Request URL https://i.nuuls.com/upload Form field attachment

    Other fields empty.

    "},{"location":"Image%20Uploader/#imgurcom","title":"imgur.com","text":"Row Description Request URL https://api.imgur.com/3/image Form field image Extra headers Authorization: Client-ID c898c0bb848ca39 Image link {data.link} Deletion link https://imgur.com/delete/{data.deletehash}

    You can also upload images to your imgur account by putting the following as Extra headers:

    Replace XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX with the token which you can obtain here.

    Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    "},{"location":"Image%20Uploader/#s-uleu","title":"s-ul.eu","text":"

    Replace XXXXXXXXXXXXXXX with your API key from s-ul.eu. It can be found on your account's configuration page.

    Row Description Request URL https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX Form field file Extra headers Image link {url} Deletion link https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX"},{"location":"Image%20Uploader/#ifourtfcom","title":"i.fourtf.com","text":"

    This is not a hosted service, but rather a service that can be self-hosted. Click on the URL for more information. Replace XXXXXXXXXXXXXXX with your Base64-encoded user and password

    Row Description Request URL https://i.yourwebsite.com/upload Form field file Extra headers Authorization: Basic XXXXXXXXXXXXXXX Image link Deletion link"},{"location":"Image%20Uploader/#kappalol","title":"kappa.lol","text":"Row Description Request URL https://kappa.lol/api/upload Form field file Extra headers Image link {link} Deletion link {delete}"},{"location":"Image%20Uploader/#unsupported-sites","title":"Unsupported sites","text":"
    • catbox.moe: It's not possible yet to upload to catbox.moe due to how their upload method is constructed.
    "},{"location":"Link%20Previews/","title":"Link Previews","text":"

    Link Previews make it easy to check what's behind a link without visiting the link in the browser. All links go through github.com/chatterino/api to protect your IP from any leaks.

    "},{"location":"Link%20Previews/#privacy-policy-terms-of-service","title":"Privacy Policy & Terms of Service","text":"

    Enabling this feature means your client will send additional data to our API to power this feature. You should read the Privacy Policy and Terms of Service before enabling this feature. If you have any questions about this, please contact us through the GitHub repo.

    "},{"location":"Link%20Previews/#enabling","title":"Enabling","text":"

    By default link previews are disabled. Turn them on under \"Link Previews\" in the settings. Optionally also turn on thumbnails in your preferred size for an even richer link experience.

    "},{"location":"Link%20Previews/#supported-links","title":"Supported Links","text":"

    By default chatterino will use Open Graph tags to enrich tooltips. To enhance the tooltips even more, we have custom integrations for the following sites:

    • BetterTTV
    • Discord
    • FrankerFaceZ
    • Imgur
    • Livestreamfails
    • Supinic
    • Twitch
    • Twitter
    • Wikipedia
    • YouTube
    "},{"location":"Link%20Previews/#demo","title":"Demo","text":""},{"location":"Moderation/","title":"Moderation","text":"

    Chatterino contains a slew of features to assist moderators in moderating.

    "},{"location":"Moderation/#chat-mode","title":"Chat Mode","text":"

    You can easily change the chat modes in Chatterino using the button on the streamer bar.

    You can choose from: Emote only, Subscriber only, Slow mode, R9K mode and Followers only mode.

    "},{"location":"Moderation/#logging","title":"Logging","text":"

    Moderators are able to log all the channels they are in using the logging feature.

    "},{"location":"Moderation/#moderation-mode","title":"Moderation Mode","text":"

    Moderation mode is enabled by clicking in a channel that you moderate. Available variables are {user.name}, {msg.id}, {msg.text} & {channel.name}. Below is a list of examples that can be used:

    Function Action Ban a user /ban {user.name} Unban a user /unban {user.name} Timeout a user /timeout {user.name} 600 Delete a user's message /delete {msg.id} pajbot2 report /w botname #{channel.name} !report {user.name} being rude pajbot2 longreport /w botname #{channel.name} !longreport {user.name} being very rude Open the user's usercard /user {user.name} pajbot banphrase /w botname !add banphrase {msg.text}"},{"location":"Moderation/#user-timeout-buttons","title":"User Timeout Buttons","text":"

    User timeout buttons are very useful while looking at a user's logs. All 8 buttons can be configured to various timeout lengths:

    User timeout buttons look like this:

    "},{"location":"Regex/","title":"Regex","text":"

    Regular expressions (or short regexes) are often used to check if a text matches a certain pattern. For example the regex ab?c would match abc or ac, but not abbc or 123. In Chatterino, you can use them to highlight messages (and more) based on complex conditions.

    You can try out your regex patterns on a website like regex101, using the PCRE2 flavor.

    Basic patterns:

    Pattern Matches x? nothing or x x* x, repeated any number of times x+ x, repeated any number of times but at least 1 ^ The start of the text $ The end of the text x|y x or y

    You can group multiple statements with ():

    Pattern Matches asd? asd or as (asd)? asd or nothing \\(asd\\) (asd), literally

    You can also group multiple characters with []:

    Pattern Matches [xyz] x, y or z [1-5a-f] 1,2,3,4,5,a,b,c,d,e,f [^abc] Anything, except a, b and c [\\-] -, literally (escaped with \\) \\[xyz\\] [xyz], literally

    Special patterns:

    Pattern Matches \\d Digit characters (0-9) \\D Non-digit characters \\w Word characters (a-zA-Z0-9_) \\W Non-word characters \\s Spaces, tabs, etc. \\S Not spaces, tabs, etc. \\b Word boundaries (between \\w and \\W) \\B Non-word boundaries"},{"location":"Search/","title":"Search","text":"

    Chatterino has a Search Popup which lets you quickly find messages in the chat. You can open it with the Ctrl+F shortcut.

    "},{"location":"Search/#search-filters","title":"Search filters","text":"

    You can use several search filters (format filter:value) to narrow down your search. value can have multiple comma-separated entries (look at examples below). Surround value in quotation marks to use whitespaces within it, useful for dealing with the regex filter. The ability to negate searches is also possible. (format !filter:value)

    • from:<username> - shows messages from certain users
    • has:<flags> - shows messages containing specified elements. List of flags:
      • link - filters messages with links
    • in:<channel> - shows messages that originate from certain channels, useful in #/mentions channel
    • is:<flags> - shows certain types of messages. List of flags:
      • deleted or disabled - shows deleted messages
      • sub or subscription - shows subscription messages
      • timeout or ban - shows moderation messages
      • highlighted - shows highlighted messages
      • system - shows system messages (grey text ones like: \"Now hosting username\", \"streamer is live\", etc.)
      • first-msg - shows a user's first message in the channel
      • cheer-msg - shows messages containing bits
      • redemption - shows messages that cost the user Twitch channel points
      • reply - shows messages sent using the Twitch reply feature
    • regex:<regex> - shows messages matching a given regex
    • badge:<value> - shows messages from users that have a given badge
    • subtier:<value> - shows messages from users that are subscribed at a given tier
    "},{"location":"Search/#examples","title":"Examples","text":""},{"location":"Search/#shows-messages-from-user-fourtf-containing-word-merge","title":"Shows messages from user fourtf containing word merge","text":"

    from:fourtf merge

    "},{"location":"Search/#shows-messages-from-users-pajbot-and-zneix-that-have-links-containing-word-chatterino","title":"Shows messages from users pajbot and zneix that have links containing word chatterino","text":"

    has:link from:pajbot,zneix chatterino

    "},{"location":"Search/#shows-messages-only-from-channels-pajlada-and-supinic-from-user-supibot","title":"Shows messages only from channels pajlada and supinic from user supibot","text":"

    in:pajlada,supinic from:supibot

    "},{"location":"Search/#shows-subscription-messages","title":"Shows subscription messages","text":"

    is:sub

    "},{"location":"Search/#shows-deleted-messages-containing-word-vanish","title":"Shows deleted messages containing word vanish","text":"

    is:deleted vanish

    "},{"location":"Search/#shows-timeoutban-messages","title":"Shows timeout/ban messages","text":"

    is:timeout

    "},{"location":"Search/#shows-highlighted-messages","title":"Shows highlighted messages","text":"

    is:highlighted

    "},{"location":"Search/#shows-messages-matching-a-given-regex","title":"Shows messages matching a given regex","text":"

    regex:^gachi\\w*$

    "},{"location":"Search/#shows-messages-from-users-who-have-the-listening-only-badge","title":"Shows messages from users who have the \"Listening only\" badge","text":"

    badge:no_video

    "},{"location":"Search/#shows-messages-from-users-who-are-tier-3-subscribed","title":"Shows messages from users who are tier-3 subscribed","text":"

    subtier:3

    "},{"location":"Search/#shows-messages-from-users-who-are-not-gazatu","title":"Shows messages from users who are NOT gazatu","text":"

    !from:gazatu

    "},{"location":"Search/#shows-messages-that-do-not-contain-links","title":"Shows messages that do NOT contain links","text":"

    !has:link

    "},{"location":"Settings/","title":"Settings","text":""},{"location":"Settings/#where-is-my-chatterino-folder-located","title":"Where is my Chatterino folder located?","text":"

    On Windows: %APPDATA%/Chatterino2

    On Linux: $HOME/.local/share/chatterino

    On Mac: $HOME/Library/Application Support/chatterino

    "},{"location":"Settings/#files","title":"Files","text":"

    Commands and Settings have a small backup mechanism that saves the older version in a file like commands.json.bkp-2 in case you want to return to older versions of the file.

    • commands.json - Will contain all your Chatterino commands
    • settings.json - This contains most of your settings, including sensitive data like your login token
    • window-layout.json - This contains information which tabs and splits you have open and how they are positioned
    • irc.json - When you have a non-twitch IRC connection, this contains the configured servers and settings
    "},{"location":"Settings/#help","title":"Help","text":""},{"location":"Settings/#how-do-i-delete-the-chatterino-cache-settings","title":"How do I delete the Chatterino cache / settings?","text":"

    Navigate to your Chatterino folder and remove corresponding folders.

    • The Cache folder contains cached network requests from Chatterino.
    • The Logs folder contains chat logs from chats you've had open in Chatterino.
    • The Misc folder contains internal information about the current running instance of Chatterino.
    • The Settings folder contains any settings you may have configured in Chatterino (e.g. font size, highlight phrases) and your list of channels open.
    "},{"location":"Settings/#my-settings-commands-window-layout-are-not-saving","title":"My settings / commands / window layout are not saving","text":"

    This is usually a case because Chatterino is unable to save settings on your disk. To fix that, try following steps:

    1. Run Chatterino as Administrator.
    2. Back up your settings by copying them from your Chatterino folder to a safe location on your disk and delete them. Restart your computer and try launching Chatterino again.
    3. Back up your settings, uninstall Chatterino and install it again, but make sure Fresh Install option is checked.
    4. Try running Chatterino in portable mode.
    "},{"location":"Themes/","title":"Themes","text":"

    Beta Warning

    Custom themes are not yet stable. There may be breaking changes in the future (see Migrations).

    Chatterino supports custom-made themes since 2.5.1.

    Custom themes are JSON files that are stored in the Themes folder inside your Chatterino folder.

    "},{"location":"Themes/#creating-a-theme","title":"Creating A Theme","text":"

    To create a theme, it's best to use one of the built-in themes as the starting point. You can find them in the resources/themes folder inside the source-code. Copy one into the Themes folder and restart Chatterino. When you open the settings and select a theme, you should see one prefixed with Custom:. Make sure, you're familiar with the common words used in Chatterino.

    "},{"location":"Themes/#schema","title":"Schema","text":"

    Chatterino themes have a JSON schema that must match in order for the theme to be displayed correctly. Many editors support JSON schemas out of the box and warn you about invalid values and provide completions.

    If you used one of the base themes, then the $schema key inside the JSON is invalid, since its value is configured to work inside the Chatterino source-code. You should change the value of $schema to https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json as shown below. If you want to pin the schema to a specific version, replace master with your desired version (for example v2.4.4).

    {\n    \"$schema\": \"https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json\",\n    // ...\n}\n
    "},{"location":"Themes/#auto-reloading","title":"Auto Reloading","text":"

    When developing themes, you often want to reload your changes and see how they look. To aid you in doing that, Chatterino can automatically reload your theme. Use the /c2-theme-autoreload command in any chat to toggle auto-reload.

    Warning

    Make sure to disable auto-reloading after you're done with your changes to reduce resource usage.

    "},{"location":"Themes/#colors","title":"Colors","text":"

    Colors in themes can be specified in various ways. All values that expect a qt-color accept one of the following values. Make sure you're using the schema to get editor feedback. Technically, the values are passed to QColor which does the parsing.

    "},{"location":"Themes/#hex-colors","title":"Hex Colors","text":"

    A, R, G, and B are single hex digits (0-9, a-f, A-F).

    • #RGB
    • #RRGGBB
    • #AARRGGBB This format is different from the CSS Color Moudle Level 4 <hex-color>, where the alpha value is at the end.

    • #RRRGGGBBB

    • #RRRRGGGGBBBB
    "},{"location":"Themes/#named-colors","title":"Named Colors","text":"
    • SVG color keyword names - For example red, mediumspringgreen. Note that these color names are technically case-insensitive and accept spaces, but this isn't supported by the schema, which only accepts lower-case names.
    • transparent
    "},{"location":"Themes/#alternate-editors","title":"Alternate editors","text":"

    These are some alternate ways of creating your own custom themes:

    • Chatterino Theme Creator by doge41732
    "},{"location":"Themes/#migrations","title":"Migrations","text":"

    This section contains added, updated, and removed properties in a release, and commit for nightly versions.

    "},{"location":"Third_party_services/","title":"Third party services","text":"

    Chatterino integrates with a bunch of third party services to provide extended functionality for you.

    "},{"location":"Third_party_services/#betterttv","title":"BetterTTV","text":"

    For Twitch channels, we load emotes from BetterTTV.

    BetterTTV provides global emotes that are available in every channel. These can be disabled with the \"Show BTTV global emotes\" setting.

    BetterTTV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show BTTV channel emotes\" setting.

    "},{"location":"Third_party_services/#frankerfacez","title":"FrankerFaceZ","text":"

    For Twitch channels, we load emotes and badges from FrankerFaceZ.

    FrankerFaceZ provides global emotes that are available in every channel. These can be disabled with the \"Show FFZ global emotes\" setting.

    FrankerFaceZ provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show FFZ channel emotes\" setting.

    Badges are for developers & supporters of FrankerFaceZ and will be displayed next to their username. These can be disabled with the \"FrankerFaceZ\" setting under Advanced -> Visible badges.

    FrankerFaceZ allows supporters to upload custom moderator and VIP badges for their channel, these can be disabled with the \"Use custom FrankerFaceZ moderator badges\" and \"Use custom FrankerFaceZ VIP badges\" settings.

    "},{"location":"Third_party_services/#7tv","title":"7TV","text":"

    For Twitch channels, we load emotes and badges from 7TV.

    7TV provides global emotes that are available in every channel. These can be disabled with the \"Show 7TV global emotes\" setting.

    7TV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show 7TV channel emotes\" setting.

    7TV provides a streaming Event API that posts live updates when emotes change in channels. These can be disabled with the \"Enable 7TV live emote updates\" setting.

    7TV provides the ability to use unlisted emotes. By default, Chatterino will not display these emotes even if they're added to a Channel. You can modify this behaviour with the \"Show unlisted 7TV emotes\" setting.

    Badges are for developers & supporters of 7TV and will be displayed next to their username. These can be disabled with the \"7TV\" setting under Advanced -> Visible badges.

    "},{"location":"Third_party_services/#chatterino-api","title":"Chatterino API","text":""}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 5d16e99c..0aa88916 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,92 +2,92 @@ https://wiki.chatterino.com/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Commands/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Contributing%20for%20Developers/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Crash%20Analysis/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Environment%20Variables/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Features/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Filters/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Glossary/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Help/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Hotkeys/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Image%20Uploader/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Link%20Previews/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Moderation/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Regex/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Search/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Settings/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Themes/ - 2024-05-18 + 2024-05-25 daily https://wiki.chatterino.com/Third_party_services/ - 2024-05-18 + 2024-05-25 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index c9359ad2..05912284 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ