Commands.
Commands are the heart of the bot. A viewer types a trigger, the bot replies with your text, with live data filled in. Custom commands, keyword triggers, permissions, cooldowns and aliases are all here.
Custom commands
A command is a trigger plus a response. Type the trigger in chat (with your prefix) and the bot posts the response. The response can mix your own words with variables that fill in live.
Trigger: !discord
Response: Join the $(channel) Discord at discord.gg/yourcodeVariables make a command dynamic. A !uptime command whose response is $(channel) has been live for $(uptime) posts the real elapsed time every time.
Finding variables
Under the response box, the quick chips insert the common ones and the All variables button opens the full library, where every entry has examples you can insert whole (press the bulb on a row to see them). ⌘ / (Ctrl / on Windows) opens the library from the response box. Typing $( shows matching variables as you write: inside $(if …) it lists the conditions, after $(command your own commands, and after a variable that takes something, like $(countdown, ready-made shapes for it.
Build a command with AI
Do not want to wire up variables by hand? On the Commands page hit Build a command for me (or Build a keyword for me on the Keywords tab), describe what you want in plain language, and the AI writes a ready-to-use command for you: the trigger, a response with the right variables, a sensible permission level and cooldown. You get a preview to review and tweak before it saves.
a !hype command that hypes up the streamer
a command that suggests a random retro game to play
a keyword that posts the Discord link when someone says "discord"The builder is honest about what it can do. If a request needs data the bot does not have, it tells you instead of quietly building a command that does nothing, and when a request needs live data it will wire up an API command for you where one fits.
This one builds chat commands. The Describe & Build under Build your own is a separate tool that generates overlay widgets.
Add and remove commands from chat
You and your mods can manage commands without leaving chat. These are built-in commands, available to you and your moderators by default.
| Command | What it does |
|---|---|
!addcommand <description> | Describe a command in plain language and the bot builds it with the same AI as the dashboard button. Example: !addcommand find a cat fact api and give me a random cat fact. If your channel has AI turned off, !addcommand becomes a manual builder instead: !addcommand <name> <text> makes a plain command, e.g. !addcommand drops Gift 2+ subs for the skin. If that name already exists, the bot asks you to confirm | reply yes to overwrite it or no to keep it (reply to the bot's message, or @yourbot yes). Protected and default commands cannot be overwritten from chat. |
!delcommand / !remcommand <name> | Remove a command by name (the two are aliases). The bot works out which command you mean and deletes it, if you are allowed to. |
Who can remove what
Deletion from chat is permission-gated so a mod cannot wipe commands above their station:
- You (the broadcaster) and Lead Moderators can remove any command, including ones built from the dashboard.
- Anyone else can remove a command only if they created it themselves, or if its creator ranked strictly below them. So a moderator can delete a command a subscriber made, but not one another moderator made.
- A command with no recorded creator (older commands and seeded defaults) can be removed only by you or a Lead Moderator.
A Lead Moderator is Twitch's elevated moderator role. OverlayThing recognises it everywhere a mod check matters, so your most-trusted mods get the wider delete reach automatically.
Default commands
You start with a set of commands already made for you. They are normal commands you can edit, disable or delete.
| Command | Replies with | Who |
|---|---|---|
!commands | A link to your public command list. | Everyone |
!uptime | How long you have been live. | Everyone |
!followage | How long the viewer (or an @user) has followed. | Everyone |
!accountage | How old the viewer (or an @user) Twitch account is. | Everyone |
!watchtime | Tracked watch time for the viewer (or an @user). | Everyone |
!title | Your current stream title. | Everyone |
!game | Shows the category you are streaming. !game <name> switches it for anyone who meets the switch level (Moderator by default, configurable). | Everyone |
!so | A shout-out to another streamer, plus a native Twitch shoutout. | Mods |
!socials | A pointer to your social links. | Everyone |
!discord | Your Discord invite pointer. | Everyone |
!lurk | A friendly lurk message. | Everyone |
!clip | Creates a clip of the current stream and posts the link. Needs the clips:edit permission connected first (Chatbot > Commands > !clip > Connect). Has a 30s cooldown. | Subs+ |
!marker | Drops a stream marker at the current moment (optional note), so you can find highlights later. | Mods |
!poll | Starts a native Twitch poll, for example !poll "Best game?" A;B;C 60. | Mods |
!quote | Shows a random saved quote. Managed in the Quotes module, off until you enable it. | Everyone |
Deleted one you wanted back? The Commands page has a Restore defaults button that puts back any missing default without touching commands you have customised.
Category switching
!game on its own replies with the current category. Give it a name, like !game Just Chatting, and anyone at or above the switch level can change the category from chat: an exact title switches immediately, a close match sends back a did-you-mean without switching anything, and a title that does not match at all gets a not-found reply. The switch level defaults to Moderator but is configurable in the command's editor, which also exposes all four replies, the view reply plus the switch, did-you-mean and not-found templates, each with $(game.name) and $(game.query) tokens for the matched category and the text the caller typed. No re-authorization is needed, it runs on the connection you already granted.
Keywords and match types
Most commands match the first word of a message (a prefix command). A keyword command instead watches the whole message and fires when it matches a pattern, no prefix needed. Each keyword has a match type:
| Match type | Fires when the message… | Example |
|---|---|---|
| Exact | is exactly the phrase, nothing more. | Phrase hi bot matches only "hi bot". |
| Contains | has the phrase anywhere in it, as whole words. | Phrase discord matches "what is your discord?" |
| Starts | begins with the phrase, as a whole word. | Phrase gg matches "gg everyone" but not "ggwp". |
| Regex | matches a regular-expression pattern. | Pattern h[ae]llo matches "hello" or "hallo". |
Whole words by default
Contains and Starts match whole words, so a keyword gg fires on "gg everyone" and "that was GG!" but not on "eggs" or "ggwp". If you really want a keyword to fire inside other words, turn on Match inside words on that keyword. Letters, digits and underscores count as word characters, in any language.
Priority
When two keywords could both match one message, the higher priority wins; on a tie, the older keyword wins. Leave it at 0 unless you need one keyword to beat another.
Regex, plainly
A regular expression is a mini pattern language for "does this text look like X". You do not need it for most keywords, contains and starts cover the common cases. When you do, a few pieces go a long way:
| Piece | Means | Example |
|---|---|---|
| | either / or | lol|lmao|haha matches any of the three. |
? | the thing before it is optional | colou?r matches "color" and "colour". |
[ae] | any one character in the brackets | gr[ae]y matches "gray" and "grey". |
\b | a word boundary (so you match whole words) | \bgg\b matches "gg" but not "egg". |
Exact, Contains and Starts ignore upper and lower case, and a long message is capped before a regex runs so a heavy pattern cannot bog the bot down. Regex triggers can opt into case-sensitive matching with the Case sensitive toggle, which matches the raw message exactly as typed.
Regex Assist
Do not want to write the pattern yourself? When a keyword is set to Matches regex, a Regex Assist button appears next to it. Click it, describe in plain language what you want to match, add an example message if you like, and it writes a regular expression for you. You get a live preview that highlights what the pattern would catch, so you can confirm it before you insert it.
any greeting like hi, hey, hello or yo
a message that is just a string of question marks
someone saying gg or good game as a whole wordThe pattern it produces is valid for our chatbot and is checked before it lands in the box, so you never paste in something broken. You will also find the same Regex Assist helper in Flows, on the keyword trigger.
Treat the result as a strong first draft. You can tweak the pattern by hand afterwards, and the live preview updates as you go so you can see the effect of each change.
What wins when several could match
One message fires at most one command. A prefix command (or one of its aliases) always beats a keyword. Only when no prefix command matches does the bot check keywords, highest priority first and oldest first on a tie, and the first match wins.
Permissions (user levels)
Each command has a who can use it level. A viewer must be at that level or higher to run it.
| Level | Who can run it |
|---|---|
| Everyone | Anyone in chat. |
| Follower | Anyone following the channel, and every level above. |
| Regular | Anyone with at least the hours of watch time you set on the Loyalty page (10 by default), and every level above. Needs Loyalty turned on. |
| Subscriber | Subscribers, VIPs, mods and you. |
| VIP | VIPs, mods and you. |
| Moderator | Your mods and you. |
| Broadcaster | Only you. |
Higher levels always qualify: a subscriber can run a Follower command without the bot checking whether they follow. If a viewer below the level tries a command, the bot simply stays quiet.
Availability
Each command can be limited to when you are Live, when you are Offline, or run at Any time (the default). Outside its window the command is simply not there: no reply, no cooldown used, no count added.
Required arguments
A command that needs something typed after it, like a name for !so, can turn on Requires an argument. When a viewer runs it bare, the bot replies with the usage line built from the argument hint instead of running the command, and no cooldown or count is used.
!so
→ Usage: !so <user>Cooldowns
Cooldowns stop a command being spammed. There are two, and both can be set on the same command:
| Cooldown | What it limits |
|---|---|
| Global | How often the command can run for the whole channel, regardless of who runs it. |
| Per user | How often a single viewer can run it. Others are unaffected. |
By default mods and you bypass cooldowns entirely (you can turn that off in Bot settings). When someone hits a cooldown the bot either stays silent or posts a short "wait Ns" reply, your choice in Bot settings.
Aliases
Give a command extra trigger words that do the same thing. A !commands command with aliases cmds and help answers all three. Aliases share the command response, permission and cooldowns, and they cannot collide with another command trigger.
Public list visibility
Each command has a show in public list toggle. Public commands appear on your shareable command page at overlaything.com/c/yourname (built-in module commands from Queue, Quotes, Counters, Music and a live giveaway keyword show there too). Turn it off for internal or mod-only commands you would rather not advertise.
You can also assign your custom commands to specific categories on the public list, so they group under their own headings on the command page instead of sitting in one long list.
Turn on suggestions in Bot settings and when a viewer mistypes (like !uptme) the bot can reply "Did you mean !uptime?". It is rate-limited per viewer so it never spams.