# Bloopbot > Bloopbot is a Twitch and Kick chat bot where every command, alert and timer is a visual flow you draw in your browser. Bloopbot works with Twitch and Kick (sign in with either, or add Kick to a Twitch channel so both chats run the same flows; [what works on Kick](https://bloopbot.com/docs/bloopbot-on-kick)); you set it up and run it from your browser -- there is nothing to install. Every behaviour a bot needs -- commands, alerts, timers, giveaways, moderation checks -- is a flow built from a trigger, optional checks and actions, and built-in templates and packs give you a working flow to start from and customise. Free to start. Plus and Pro add more flows, editors and AI features. New sign-ups are sometimes paused; check the homepage for current availability. - [Bloopbot](https://bloopbot.com/): the homepage - [Pricing](https://bloopbot.com/pricing): Free, Plus and Pro compared, with prices - [Agent guide](https://bloopbot.com/AGENTS.md): supported interfaces, authentication and approval boundaries - [About](https://bloopbot.com/about): who provides Bloopbot - [Contact](https://bloopbot.com/contact): support, privacy and security questions - [Documentation](https://bloopbot.com/docs): guides for every part of Bloopbot - [Compact documentation](https://bloopbot.com/llms-small.txt): pricing, every comparison and feature page, and the opening of every guide in one short file - [What’s new](https://bloopbot.com/changelog.md): recent changes to Bloopbot, newest first - [Privacy](https://bloopbot.com/privacy) - [Terms](https://bloopbot.com/terms) This file holds the complete text in the order a buyer needs it: pricing, comparisons and feature pages, getting started, then every guide. A shorter edition that fits one read is at https://bloopbot.com/llms-small.txt. # Twitch and Kick chat bot pricing: Free, Plus and Pro — Bloopbot Compare Free, Plus and Pro for flows, editors, overlays and automation. See monthly and yearly prices in pounds, dollars or euros. Prices include applicable VAT or sales tax. Checkout confirms the total before you pay. Paid plans can be cancelled at any time. ## Free Make commands, alerts and overlays without a paid plan. Free. No card needed. Every channel gets: - 15 custom flows - !sr song requests (Spotify app and Premium needed) - Alerts and overlays for OBS - Polls, predictions and hype trains - Your public page, with your links and sections - Giveaways viewers enter from chat or the web - 200 MB of media storage [Sign in with Twitch](https://bloopbot.com/admin/oauth/start) or [Sign in with Kick](https://bloopbot.com/auth/kick/start) ## Plus 75 custom flows and three channel editors. GBP: £5.99/month or £59.99/year. USD: $7.99/month or $79.99/year. EUR: €6.99/month or €69.99/year. Everything in Free, plus: - 75 custom flows - 3 editors to share your channel with - AI that finds the song chat meant - AI that wakes a flow when chat means something - A prize vault winners claim from - 2 web requests per flow run [Upgrade to Plus](https://bloopbot.com/admin/upgrade) ## Pro Unlimited custom flows and your own bot account. GBP: £12.99/month or £129.99/year. USD: $17.49/month or $174.99/year. EUR: €14.99/month or €149.99/year. Everything in Plus, plus: - Unlimited custom flows - 25 editors - AI moderation and text screening - 20 web requests per flow run - Build flows with a compatible AI assistant - Your own bot account in chat [Upgrade to Pro](https://bloopbot.com/admin/upgrade) ## Limits, side by side | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Flows: How many custom flows this channel can keep — built-in flows are free until you change them. | 15 | 75 | Unlimited | | Editors: How many people this channel can share itself with. | None | 3 | 25 | | Media storage: How much media this channel can upload to the library. | 200 MB | 500 MB | 1 GB | | Widget themes: How many widget themes this channel can keep — every style control works on every plan. | 1 | 15 | Unlimited | | Flow variables: How many variables this channel's flows can keep. | 20 | 100 | Unlimited | | Open giveaways: How many giveaways can be open at the same time. | 1 | 3 | Unlimited | | Vault prizes: How many stocked, unclaimed prizes the prize vault can hold at once. | None | 250 | Unlimited | | Collections: How many collections, inventories and achievement lists this channel can keep; any over the limit stay readable. | 1 | 5 | Unlimited | | Items per viewer: How many different items one viewer can hold in one collection. | 200 | 1,000 | 5,000 | | Catalogue items: How many items one collection's catalogue can list. | 250 | 2,000 | 10,000 | | Web requests per flow run: How many outbound web requests one flow run can attempt; the channel security limit also applies. | None | 2 | 20 | | Run history: The maximum age of flow runs; only the newest 50 runs per flow are kept. | 7 days | 30 days | 90 days | | Audit history: The maximum age of audit entries; only the newest 200 entries per channel are kept. | 30 days | 90 days | 365 days | Reaching a creation limit keeps what you’ve already built. Run and audit history also have age and record limits. On every plan: as many overlays as you need, the whole flow editor, the six moderation filters, Shield mode and chat settings, and command import from Nightbot and StreamElements. In the shipped !sr flow, the song queue size is a variable that starts at 20. ## Daily AI allowance | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | AI chat rules: Chat messages the AI moderation filter checks. | Not included | Not included | 4,000 a day | | Text screening: Pieces of viewer text checked before they go on screen or in the book. | Not included | Not included | 500 a day | | Intent trigger: Chat messages checked for what they mean. | Not included | 1,000 a day | 2,000 a day | | Judge & route nodes: AI yes/no, route by meaning, pick-out-a-detail, which-one-they-meant and answer-from-your-FAQ steps. | Not included | 700 a day | 1,500 a day | | Smarter song matching: Song requests the AI picks a track for. | Not included | 200 a day | 400 a day | | Song policy: Tracks checked against your song rules. | Not included | Not included | 400 a day | | AI credits: Every AI check draws on these: a chat-rule check uses 1, a song match 2. | Not included | 2,000 a day | 6,000 a day | ## What’s included Some features work only on Twitch, or also need a Twitch permission, an external account or a paid service. AI assistant connections need an assistant that supports custom connectors. ### AI judgments | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Judge & route nodes: Flow nodes that ask a question about a message in plain English and branch on the answer, work out which of your options a viewer meant, and answer a question from your own FAQ. | Not included | Included | Included | | Intent trigger: Wake a flow when chat means something, instead of when it matches an exact word. | Not included | Included | Included | | Smarter song matching: Pick the track a viewer actually meant out of the candidates Spotify returned, and fix a wrong one. | Not included | Included | Included | | Song policy: Write your song rules in plain English and have requests screened against them. | Not included | Not included | Included | | AI moderation filter: A moderation filter that judges what a message means rather than which words it contains. | Not included | Not included | Included | | Text screening: Screen viewer-written text before it is saved or shown on the overlay. | Not included | Not included | Included | | Command import help: Recognise what your Nightbot or StreamElements commands do when you bring them over. | Included | Included | Included | ### Overlays | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Hosted overlays: Overlays Bloopbot builds and serves for you, like the label, alerts, goal bar and event stack, and the Show alert, Play media, Alert queue and Spin a wheel steps that put alerts, media and spins on your overlay. | Included | Included | Included | | Chat widget: The Chat widget, including BTTV, FFZ and 7TV emotes in the chat it shows. | Included | Included | Included | | Media library: Uploading images, sounds and videos for your widgets and alerts to use. Every plan includes a small library; paid plans hold more. | Included | Included | Included | | Text-to-speech: Turn text, such as a viewer message or a cheer, into speech that plays on your stream, alone or inside one of your alerts. Comes with Free+ (join the Bloopbot Discord) and every paid plan, with a daily limit on characters. | Not included | Included | Included | ### Spotify and song requests | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Song requests: Use !sr, !queue, the Song Requests page and queue nodes with your own linked Spotify app and a Premium account. | Included | Included | Included | | Channel-points requests: Let viewers spend channel points on a song request. | Included | Included | Included | | Your own Spotify app: Connect the Spotify developer app required for song requests on every plan. | Included | Included | Included | ### Twitch | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Polls & predictions: Start and show Twitch polls and predictions from a flow. | Included | Included | Included | | Hype trains: React to a hype train and put its progress bar on your overlay. | Included | Included | Included | | Creator goals: Read and update your channel's Twitch creator goals. | Included | Included | Included | | Ad breaks: Schedule and show ad breaks, and let chat snooze the next one. | Not included | Not included | Included | | Stream markers: Drop a marker on your VOD when something worth finding again happens. | Included | Included | Included | | Channel controls: Change your channel info from a flow. | Not included | Not included | Included | | Giveaways: Run giveaways from chat, with follow-locks, luck and a confirm window. | Included | Included | Included | | Multi-winner giveaways: Draw more than one winner from a single giveaway. | Included | Included | Included | | Prize vault: Stock keys, links, physical prizes and perks that winners claim from their own claim page. | Not included | Included | Included | | Web entry: Let viewers enter a giveaway from its public page on the web, not only from chat. | Included | Included | Included | | Links on your page: Put your own links, like YouTube, Discord or merch, on your channel home so it works as your one link in bio. | Included | Included | Included | | Sections on your page: Add your schedule, recent broadcasts, top clips, YouTube uploads, an About section, a Work with me section and your gear to your public page, in the order you choose. | Included | Included | Included | | Custom domain: Serve your public page from your own domain, like live.yoursite.com, instead of a Bloopbot address. | Not included | Not included | Included | ### Moderation | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Nukes: The Nukes page and its action, for cleaning up recent messages in bulk. | Included | Included | Included | ### Automation | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Collections: Keep collections, inventories and achievements for each viewer or for the channel, and let flows give, take and check items. | Included | Included | Included | | Outbound requests: Let a flow make a request to a public HTTPS service. Private addresses and redirects are blocked. | Not included | Included | Included | | Webhook triggers: Start a flow from a URL, so a Stream Deck key or a phone shortcut can fire it. | Included | Included | Included | | AI assistant connection: Connect an AI assistant such as Claude or ChatGPT, so it can build, test and run your flows with you. | Not included | Not included | Included | | Your own X app: Post to X through your own X developer app, so X bills you directly instead of you adding X balance. | Included | Included | Included | ### Sharing a channel | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Channel editors: Share your channel with editors and invite links. | Not included | Included | Included | ### Your bot | Feature | Free | Plus | Pro | | --- | --- | --- | --- | | Your own bot account: Let Bloopbot speak as your own bot account instead of the shared one. | Not included | Not included | Included | For `!sr`, every plan needs a Spotify app you create and link, Spotify Premium, and active playback. [Set up Spotify for song requests](https://bloopbot.com/docs/song-requests#connect). ## Before you choose ### Can I cancel any time? Yes. Open Manage billing from Your plan. You keep the paid plan until the end of that billing period, then your channel returns to Free. ### What happens if I reach a limit? A creation limit keeps what you already built and refuses the next item until there is room. There is no limit on overlays. The shipped !sr flow refuses requests when its song queue is full. Run and audit history are capped by age and number of records. ### Is tax included? Prices include applicable VAT or sales tax. Checkout confirms the total before you pay. You can add a business tax ID there too. ### Can I switch between Plus and Pro? Yes, from Manage billing, and between monthly and yearly too. The difference is charged or credited for the rest of your billing period. ### Which currencies can I pay in? Pounds, US dollars and euros. Check the currency on the checkout page before you pay. ### I used Bloopbot before plans existed. What changes? Your channel stays on Legacy and keeps what it already had. [How plans work](https://bloopbot.com/docs/what-your-plan-includes) · [Sign in](https://bloopbot.com/admin) --- # Best no-code Twitch bots for automation (2026) Five Twitch bots ranked by how far you can automate without writing code: cloud versus desktop, how you build logic, overlays included and who each one suits. ## The short answer | | Where it runs | How you build logic | Code needed for custom work | Overlays included | Best for | | --- | --- | --- | --- | --- | --- | | **1. Bloopbot** | Cloud | A canvas of triggers, checks and actions | No; a **Web request** step for your own backend | Yes, hosted | Visual automation that keeps running when your PC is off | | 2. Streamer.bot | Your Windows PC | Lists of sub-actions | C# | Build your own | Controlling OBS and apps on your PC | | 3. Fossabot | Cloud | Text templates with `$(variable)` tokens | `$(customapi)` to your own backend | No | Developers with their own API | | 4. Nightbot | Cloud | Commands with `$(variables)` | `$(urlfetch)` | No | Simple dynamic replies | | 5. Streamlabs Cloudbot | Cloud | Custom commands with variables | Not covered here | Through the Streamlabs suite | Streamlabs users | ## Templates, panels or a canvas? A **template** bot gives each command one line of text with tokens in it. It's fast, but logic gets crammed into tokens. A **panel** bot gives you forms. A **canvas** bot shows each step as a box you can follow from trigger to action, with a yes path and a no path for every check. Canvases take a minute longer to learn and are much easier to read a month later. ## 1. Bloopbot: best visual automation in the cloud Every command, alert and timer in Bloopbot is a flow: a trigger, optional checks, and actions. - **Real logic, drawn.** Check steps branch yes or no. **For each** loops over a list. Variables are declared once and read anywhere as `$(var.name)`. - **Triggers beyond chat.** Chat commands, timers, channel-point rewards, follows, subs, raids, a burst of follows and webhooks you can call from anything. - **Reusable pieces.** Group steps several flows share into a node group, and install ready-made flow packs instead of starting from nothing. - **AI as a check, not a writer.** An AI step answers a question about a message, such as "is this text OK to show on stream?", and your flow takes the path you wired. It never writes what viewers read. AI steps may not be included on your plan. - **Test before you trust it.** **Test fire** runs a flow, and the **Run log** shows every step it took. - **Runs without your PC.** Flows live on Bloopbot's servers and keep answering when your PC is off. **An example:** a reward where viewers type a message for the screen. **On a reward redeemed** → **AI: text OK to show?** → clean text plays your alert with their message; flagged text never reaches the screen and the points are refunded. **Where it falls short:** It can't reach into your PC to switch OBS scenes or drive VTube Studio, and it works with Twitch and Kick, not YouTube. ![The node library reading 132 nodes, grouping Chat and commands into When triggers, Only if conditions and Then actions, with every topic — including Music, Moderation, AI and Groups — across the top, and, along the bottom, Ready-made snippets such as Announce the winner (Giveaway changes → Chat message) and Nuke command (Chat command → Who can trigger → Nuke chat), each with a Details button, and an Add button for all of them.](https://bloopbot.com/docs/screenshots/node-library.jpg) _The node library: triggers, checks and actions you drag onto the canvas._ ## 2. Streamer.bot: most powerful, if you're on Windows Streamer.bot builds actions from lists of sub-actions, with If/Else, Switch and While, and C# for anything custom. It controls OBS, Stream Deck, VTube Studio, Voicemod and more, and supports Twitch, YouTube, Kick and Trovo. It runs on your Windows PC, which has to stay on. **Pick it if** your automation is about your PC, not your chat. Many streamers run both: Streamer.bot for the PC, Bloopbot for chat. [Streamer.bot vs Bloopbot](https://bloopbot.com/vs/streamer-bot) maps one onto the other. ## 3. Fossabot: best for calling your own API Fossabot's commands are text templates, and `$(customapi)` hands logic to a server you run. That's powerful if you're a developer, and it's code, just somewhere else. ## 4. Nightbot: best simple dynamic replies Nightbot's `$(variables)` and `$(urlfetch)` cover counters and fetched replies with very little setup. ## 5. Streamlabs Cloudbot: best inside Streamlabs Cloudbot has custom commands with variables, loyalty, giveaways, polls and quotes, inside the Streamlabs suite. ## Which one should you pick? - **You want logic you can see, running in the cloud:** Bloopbot. - **You want the bot to drive your PC:** Streamer.bot. - **You already run your own API:** Fossabot, or a **Web request** step in Bloopbot. - **One-line replies are enough:** Nightbot. --- # The 5 best Twitch chat bots for beginners (2026) Five Twitch chat bots compared for a first-time streamer: setup time, what you need to install, how far each one grows with you, and which one we'd pick first. ## The short answer | | Install anything? | Time to first command | Overlays and alerts | Grows into | Platforms | | --- | --- | --- | --- | --- | --- | | **1. Bloopbot** | No | A few minutes, guided by Pebble | Hosted, added to OBS as a Browser Source | Flows you can open and change, step by step | Twitch and Kick | | 2. Nightbot | No | A few minutes | None | Commands with `$(variables)` | Twitch, YouTube, Trovo and SOOP | | 3. Moobot | No | A few minutes | None; follows and subs as chat notices | Panels for commands, timers and giveaways | Twitch | | 4. StreamElements | No | Longer: a full toolkit to set up | Overlays and alerts | Loyalty, a store and overlays in one place | Twitch, YouTube and Kick | | 5. Streamer.bot | Yes, a Windows app | Longest: actions, sub-actions and triggers | Build your own | Almost anything, including C# | Twitch, YouTube, Kick and Trovo | ## How we ranked them We asked what a first-time streamer actually runs into: Do I have to install something? Does it keep working when my PC is off? Can I see why a command did what it did? Will I outgrow it in a month? A bot scored higher when the answer was _no_, _yes_, _yes_ and _no_. We left out size of community and years in business. Those matter, and the older bots win them, so we say so in each entry. ## 1. Bloopbot: best for a beginner who wants to grow Bloopbot is a Twitch and Kick chat bot where every command, alert and timer is a visual flow you draw in your browser. For a beginner, that means you never stare at a blank settings page. - **Pebble shows you around.** Pebble, Bloopbot's robot, builds your first alert with you on the real pages, from Twitch through a flow to your overlay in OBS, and finishes when the test alert really plays. - **It makes the bot a mod for you.** One press of **Make @your\_bot\_username a mod** asks Twitch to make the bot a moderator, and Bloopbot checks with Twitch, so you know it can actually act in your chat. - **Coming from another bot?** Pebble looks your channel up in Nightbot and StreamElements, and its **Bring your commands over** tutorial brings your commands across, counts included. - **You can see why things happen.** Each command is a row of steps, such as **Chat command** → **Cooldown** → **Chat message**. **Test fire** runs it before you go live, and the **Run log** shows the path it took. - **It runs in the cloud.** Commands, timers and moderation keep working when your PC is off, on a Mac, a PC or a laptop. - **Overlays come with it.** Add a hosted alerts overlay to OBS as a Browser Source, and follows, subs, cheers and raids each play an alert from a flow you can open. **Where it falls short:** Twitch and Kick only, with raids, clips, polls and predictions on Twitch alone. It can't switch OBS scenes or drive apps on your PC. It's newer than everything else on this list. Some features, such as AI steps, may not be included on your plan; [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes) lists them. ![Studio in the middle of Your first overlay, step 4 of 10: the page is dimmed except for the Follow alert tile, Pebble’s card beside it says Drag the Follow alert onto your canvas and shows the path Twitch, Flow, Overlay, OBS, and a ghost hand drags the tile toward the canvas.](https://bloopbot.com/docs/screenshots/tutorials-step.jpg) _Your first overlay: Pebble points at the Follow alert tile and a ghost hand shows the drag onto your canvas._ ## 2. Nightbot: best for "just a few commands" Nightbot is simple, free, long trusted and fast to set up. You add a command, type its reply, and you're done. Custom logic uses `$(variables)` such as `$(urlfetch)`, and it has timers, a blacklist and spam filters, and YouTube and SoundCloud song requests. **Pick it if** one line per command is all you'll ever need, or you also stream on YouTube, Trovo or SOOP. **Skip it if** you want alerts on screen or loyalty points: Nightbot has neither. If you outgrow it later, Bloopbot [imports your Nightbot commands](https://bloopbot.com/vs/nightbot). ## 3. Moobot: best for rewarding subscribers Moobot is very easy to set up and long trusted. Commands, timers and spam filters are configured in panels, and it's good at subscriber perks, with subscriber-only or weighted giveaway entries. Follows and subs are announced as chat notices. **Pick it if** its panels already cover what you need, or you want its Discord integration and game stats. **Skip it if** you want those follows and subs as alerts on your overlay. [Moobot vs Bloopbot](https://bloopbot.com/vs/moobot) shows the same perk built as a flow. ## 4. StreamElements: best all-in-one toolkit StreamElements is a free toolkit with overlays, alerts, a chatbot and loyalty points in one place, on Twitch, YouTube and Kick. That breadth is the draw, and also the reason it takes longer to set up as a beginner. **Pick it if** you stream to YouTube as well as Twitch. **Worth knowing:** Razer acquired StreamElements' assets in July 2026, and SEPay tipping is closing. [Switching from StreamElements](https://bloopbot.com/vs/streamelements) explains what moves across. ## 5. Streamer.bot: most powerful, least beginner-friendly Streamer.bot is a free Windows app that can do almost anything: switch OBS scenes, drive VTube Studio and Voicemod, and run your own C# code. It runs on your PC, so your PC has to stay on, and on a Mac or Linux it only runs through compatibility layers it calls experimental. **Pick it if** you're comfortable with technical setup and want the bot to control apps on your PC. **Skip it if** you're on a Mac or this is your first stream. [Streamer.bot vs Bloopbot](https://bloopbot.com/vs/streamer-bot) compares them in detail. ## Which one should you pick? - **Brand new and on Twitch:** Bloopbot. Pebble gets you to working commands and alerts in one sitting, and spam filters are one page away, and every piece stays open for you to change later. - **Only ever want three text commands:** Nightbot. - **Streaming to Kick too:** Bloopbot, with both chats running the same flows ([Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick)). - **Streaming to YouTube too:** StreamElements, or Nightbot for chat only. - **Want the bot to run your PC:** Streamer.bot, once you're comfortable. You can run Bloopbot beside any of them while you decide, as long as the two never answer the same command. --- # Best Twitch moderation bots for small channels with no mods (2026) Five Twitch bots ranked for a small channel with few or no human moderators: spam filters, disguised links, follow-bot raids and who helps when you're live alone. ## The short answer | | Spam filters | Disguised links | Follow-bot raids | AI reading of chat | Help from people you trust | | --- | --- | --- | --- | --- | --- | | **1. Bloopbot** | Blacklist, links, caps, symbols, emotes, repetition | Sees through look-alike letters, spelled-out dots and invisible characters | A ready-made flow turns Twitch Shield mode on and off | An optional step you watch first, then let act | Editors with their own sign-in, plus an Audit log | | 2. Fossabot | Blocked terms, emote and message-height filters | Look-alike detection | Not covered here | Not covered here | Mod teams with roles and audit logs | | 3. Nightbot | Blacklist and spam filters | Not covered here | Not covered here | No | Shared access | | 4. Moobot | Spam and comment filters, subscriber exemptions | Not covered here | Not covered here | No | Shared access | | 5. Streamlabs Cloudbot | Caps, emotes, paragraphs, links, symbols, profanity | Not covered here | Not covered here | No | Shared access | "Not covered here" means we didn't find it on the bot's own pages, not that it's missing. ## What a channel with no mods actually needs 1. **Filters that work on their own**, so a link or a wall of caps is gone before you notice it. 2. **Filters that can't be tricked** by `example dot com` or fancy letters. 3. **A plan for raids**, because follow-bot waves arrive in seconds. 4. **Proof the bot can act at all.** A bot that isn't a moderator in your channel can't delete anything. 5. **Someone to call on later**, without giving away your Twitch password. ## 1. Bloopbot: best when you're moderating alone - **Six filters on one page.** Blacklist, links, caps, symbols, emotes and repetition, each with thresholds, an exempt level and a response: warn, delete or time out. - **Disguised links get caught.** The link filter and blacklist see through `example . com`, `example(.)com`, look-alike or fancy letters, and invisible characters. - **Follow-bot raids handled.** The **Follow-bot protection** pack notices 20 or more follows within a minute, checks whether most of the accounts are under a week old, turns on Twitch **Shield mode**, posts a calm announcement and turns it off 10 minutes later. A real rush after a shoutout, mostly older accounts, doesn't set it off. It works on every plan. - **The bot proves it's a mod.** Bloopbot asks Twitch whether the bot is a moderator. Until it is, Bloopbot pauses the things that need it, so you don't think you're protected when you aren't. - **AI moderation you can watch first.** An optional flow reads chat for harassment, hate speech, sexual content, scams and a rule you write. Run it in watch-only mode for a stream, read its verdicts in the **Run log**, then let it act. It may not be included on your plan. - **Help without passwords.** Editors sign in with their own Twitch account, and the **Audit log** shows who changed what. Editors may not be included on your plan. **Where it falls short:** No message-height filter and no roles within editors. Twitch and Kick only, and Shield mode and the follow-bot pack are Twitch’s. ## 2. Fossabot: best pure moderation depth Fossabot's moderation filters are deep, free and trusted by large channels. It has look-alike detection, a message-height filter Bloopbot doesn't have, and role-based mod teams with audit logs. **Pick it if** moderation is what you need most and you'll add human mods soon, or you stream on YouTube. [Fossabot vs Bloopbot](https://bloopbot.com/vs/fossabot) compares them row by row. ## 3. Nightbot: best simple spam filter Nightbot has a blacklist and spam filters that are quick to switch on, and it's long trusted. **Pick it if** you want basic filters and simple commands, nothing more. ## 4. Moobot: best subscriber exemptions Moobot's spam and comment filters can exempt subscribers, which keeps your regulars from being caught by a caps filter. **Pick it if** you mostly need to keep filters off your subscribers' backs. ## 5. Streamlabs Cloudbot: best if you already use Streamlabs Cloudbot filters caps, emotes, paragraphs, links, symbols and profanity, inside the Streamlabs suite. **Pick it if** you already stream with Streamlabs Desktop and want everything from one company. ## A ten-minute setup for a channel with no mods 1. Sign in to Bloopbot with Twitch. Pebble starts **Set up your bot** on your dashboard. 2. Send the `/mod` command Pebble shows you in your own chat, in the **Make your bot a mod** step of Set up your bot or from the **Not a mod** bar. 3. On **Moderation**, check the filters, which are all on from the start, and add the words your chat should never see to the blacklist. 4. In **Flows → Add**, add **Follow-bot protection**, read it once and switch it on. 5. Set up Shield mode in Twitch itself, so the flow has something sensible to turn on. [Moderate your chat](https://bloopbot.com/docs/moderation) covers every filter and option. --- # Botrix alternative for Kick and Twitch Looking for a Botrix alternative? Compare Botrix with Bloopbot, a free Kick bot that also runs on Twitch, with commands built as flows you can see and a KICKs trigger. Checked October 2026 against [Botrix](https://botrix.live). ## Botrix and Bloopbot compared Botrix lists Twitch, Kick, YouTube, Trovo and Discord. Bloopbot covers Twitch and Kick, and builds each command as a flow. Neither needs a download. There’s no importer for Botrix, so you rebuild the commands you use as flows. | | Botrix | Bloopbot | | --- | --- | --- | | Platforms | Twitch, Kick, YouTube, Trovo and Discord | Twitch and Kick, one set of flows for both | | Commands | Built-in and custom commands with `$(variables)`, editable from chat with `!addcom` | A flow with a **Chat command** trigger, checks and actions on a canvas | | Loyalty | Points, watch time and a level system | Points and watch time, for Kick viewers too | | Moderation | Spam and link removal, configurable | Filters on Kick chat, `!permit` and `!filters` for your Kick mods, **Time out** and **Delete message** steps | | Alerts | Alerts and widgets, with custom HTML and CSS | Hosted alerts for follows, subs, resubs and gifted subs on Kick | | Price | Free access, with optional paid memberships | Free to start | On Kick, Bloopbot flows can also start on KICKs with the **Cheer** trigger, rank supporters with **Top KICKs**, accept or reject Kick rewards, run Kick ads with **Run a commercial**, and change your title, category and Kick tags with **Set title or category**. ## The same Kick bot, as a flow A `!topkicks` command that posts this week’s KICKs leaders: 1. **Chat command** (`topkicks`). 2. **Top KICKs**, with **Period** set to **This week** and **Places to read** set to `3`. 3. **Chat message** reading `Top KICKs this week: ` followed by the step’s **The list, written out**. Type `!topkicks` in Kick chat and the bot answers there. Every step is on the canvas, so a mod can read what the command does. [Use Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick) covers signing in with Kick, or adding Kick to a Twitch channel so both chats run the same flows. The [Kick bot page](https://bloopbot.com/features/kick-bot) lists what each Kick event can start. ## When Botrix is the better fit Botrix reaches YouTube, Trovo and Discord, which Bloopbot doesn’t, and its docs list a level system on top of points, plus ready-made commands you can manage from chat with `!addcom`. If you stream beyond Twitch and Kick from one bot, Botrix covers more places. --- # Firebot alternative for Mac, in your browser How Bloopbot compares with Firebot: both are free to start and need no code, but Bloopbot runs on its own servers, so there is nothing to install on a Mac or PC and your commands keep answering when your computer is off. Checked October 2026 against [Firebot](https://firebot.app). ## Firebot and Bloopbot compared Both are free to start and both avoid code. They differ in where the bot runs. | | Firebot | Bloopbot | | --- | --- | --- | | Where it runs | An app on your computer | Bloopbot’s servers | | Operating systems | Windows 10/11, macOS 12 or later, most common Linux distros | Any computer with a browser | | Price | Free and open source | Free, with [Plus and Pro plans](https://bloopbot.com/pricing) | | Building logic | Effects in lists, with conditional, switch and loop effects | A canvas of triggers, checks and actions | | Your own code | Custom Script and Evaluate JavaScript effects | No code in flows; [custom overlays](https://bloopbot.com/features/custom-twitch-overlays) take your own HTML, CSS and JavaScript | | Overlays | Overlay widgets, added to your broadcasting software as a browser source | Hosted overlays you add to OBS as a Browser Source | | Loyalty and games | Currencies, with built-in Slots and Heists | Loyalty points, with slots, roulette, duels, heists and bets | | Your computer | Effects can run a program or press keys and mouse buttons | Flows can switch OBS scenes and start recording, but can’t run programs or press keys | | Platforms | Twitch | Twitch and Kick | ## A Firebot alternative for Mac Firebot lists macOS 12 and later as supported, so it does run on a Mac. You install it and keep it on your computer, and macOS and Linux versions don’t update automatically. Bloopbot has nothing to install, so a Mac is no different from a PC: - You build and change flows in your browser, signed in with Twitch or Kick. - Your overlays and alerts are web pages that OBS for Mac shows as a Browser Source ([Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs)). - Commands, timers and moderation keep answering in chat when the Mac is asleep or off. - Flows can start from what OBS does and switch scenes through your overlay ([Control OBS from flows](https://bloopbot.com/docs/control-obs-from-flows)). ## The same ideas on a canvas There’s no importer for Firebot, so you rebuild the commands and events you use most. | | Firebot | Bloopbot | | --- | --- | --- | | Effects | Effects in an effect list | Action steps in a flow | | Commands and events | Custom commands; events such as follows, subs and raids | The flow’s trigger, such as **Chat command** | | Timers | Timers | An **On a timer** trigger | | Restrictions | Conditions on a command or reward, such as a role | **Who can trigger** and **Cooldown** checks | | Sharing | Setups, exportable files of commands, counters and more | Flow packs on the [Marketplace](https://bloopbot.com/docs/the-marketplace) | ## When Firebot is the better fit Firebot is free and open source. Its effects can run programs, press keys and click for you, and run your own JavaScript as a step, and Bloopbot can’t do those. If you want that reach, or full control of the code, Firebot is the better fit. Bloopbot suits you if you’d rather build on a canvas, stream to Kick as well, or have a bot that doesn’t depend on your computer being on. --- # Fossabot alternative How Bloopbot compares with Fossabot: commands built as flows on a canvas instead of variable templates, plus loyalty, giveaways and hosted overlays. Checked October 2026 against [Fossabot](https://fossabot.com). ## Fossabot and Bloopbot compared Both run in the cloud and are free to start. They differ in how you build a command and in what sits around the chat bot. Song requests, hosted overlays and web requests may not be available on your channel yet. There’s no importer for Fossabot, so you rebuild the commands you use as flows. | | Fossabot | Bloopbot | | --- | --- | --- | | Building commands | Text templates with `$(variable)` tokens | Flows of triggers, checks and actions on a canvas | | Your own backend | `$(customapi)` | A **Web request** step, or a flow started from its own URL | | Timers, keywords, counters, cooldowns | Built in | **On a timer** and **When chat mentions** triggers, variables and **Cooldown** checks | | Moderation filters | Blocked terms, lookalike detection, emote and message-height filters | Blacklist, links, caps, symbols, emotes and repetition filters; the blacklist and link filter see through look-alike letters; no message-height filter | | Nukes | Yes | `!nuke`, with the **Nukes** page | | Team access | Mod teams with role-based access and audit logs | Editors with their own sign-in, and an **Audit log**; no roles within editors; editors may not be included on your plan | | Media requests | YouTube and SoundCloud | Spotify, through your own Spotify account | | Loyalty points | None found | Points and watch time | | Giveaways | None found | Keyword entry, a draw and a panel on stream | | Alerts and overlays | None found | Hosted overlays with alert layers | | Platforms | Twitch, YouTube and Kick | Twitch and Kick | ## The same command, as a flow A `!discord` command anyone can use, with a moderator-only `!setdiscord` that changes the link: 1. On **Variables**, declare a text variable `discord_url` holding your invite link. 2. **Chat command** (`discord`) → **Chat message** reading `Join us: $(var.discord_url)`. 3. **Chat command** (`setdiscord`) → **Who can trigger** (moderator) → **Set a variable** (`discord_url`, set to `$(query)`) → **Chat message** reading `Discord link updated.` Every step is on the canvas, so a mod reading the flow later can see who’s allowed to change the link and what the bot says back. The [guide](https://bloopbot.com/docs/coming-from-fossabot) maps the rest of Fossabot onto flows, including its moderation. ## When Fossabot is the better fit Fossabot’s moderation filters are deep, free and trusted by large channels, with a message-height filter and role-based mod teams Bloopbot doesn’t have. If moderation is what you need most, or you stream on YouTube, Fossabot does that well. --- # Moobot alternative How Bloopbot compares with Moobot: an easy start from ready-made packs, commands you can extend as flows, loyalty points, and hosted overlays with alerts. Checked September 2026 against [Moobot](https://moo.bot). ## Moobot and Bloopbot compared Both are cloud chat bots for Twitch, with nothing to download. They differ in how you build a command and in what comes with the bot. Song requests, hosted overlays and Twitch polls may not be available on your channel yet. | | Moobot | Bloopbot | | --- | --- | --- | | Getting started | Nothing to download | Nothing to install: sign in with Twitch, make the bot a moderator and install a ready-made pack | | Custom commands | Configured in panels | A flow with a **Chat command** trigger, plus any checks and actions you add | | Timers | Timers | A flow with an **On a timer** trigger | | Spam filters | Spam and comment filters, with subscriber exemptions | Blacklist, links, caps, symbols, emotes and repetition filters on **Moderation**, each with an **Exempt Level** | | Giveaways | Subscriber-only or weighted entries | Keyword entry, tickets that can cost points, and extra luck for subscribers, VIPs and regulars | | Polls | Polls | Twitch polls and predictions, started or announced from a flow | | Follows and subs | Notices posted in chat | A chat message, an alert on your overlay, or both, from the **New follower** and **New subscriber** triggers | | Song requests | A song request player | Spotify, through your own Spotify account | | Price | Free, with paid MoobotPlus tiers | Free, with [Plus and Pro plans](https://bloopbot.com/pricing) | ## A subscriber perk, as a flow A `!hug` command for subscribers and up, once a minute each: 1. **Chat command** (`hug`) → **Who can trigger** (**At least**: subscriber) → **Cooldown** (per viewer, 60 seconds) → **Chat message** reading `$(user) sends the whole chat a hug!` 2. Save, then use **Test fire** to check the path in the **Run log** before you switch it on. VIPs, moderators and you pass a subscriber check too. To change who gets the perk later, open the flow and change that one check. The [guide](https://bloopbot.com/docs/getting-started) takes you from signing in to your first command. ## What comes with the bot - **Loyalty points and watch time.** Viewers check them with `!points`, `!watchtime` and `!top`, and a subscriber multiplier sets what subscribers earn. - **Hosted overlays with alerts.** Add an overlay to OBS as a Browser Source, then give it follow, sub, cheer and raid alerts, each played by a flow you can open. - **A quote book.** `!quote` pulls up a numbered quote, and your moderators add new ones from chat. - **A giveaway panel on stream**, showing the prize, the keyword, the entries and the draw. There’s no importer for Moobot, so you rebuild the commands you use as flows. Start from the **Starter** pack and change the ones that are close. ## When Moobot is the better fit Moobot is very easy to set up, long trusted, and good at rewarding subscribers. If its panels already do everything you need, or you rely on its Discord server integration or game stats, Moobot does that well and there’s no need to switch. --- # Switching from Nightbot Bring your Nightbot commands to Bloopbot as flows, keep $(user), $(query) and your counts, and see where timers, filters and song requests live. Checked October 2026 against [Nightbot](https://nightbot.tv). ## Nightbot and Bloopbot compared Both run in the cloud, with nothing to install. Nightbot commands use $(variables), such as $(urlfetch), for custom logic; in Bloopbot each command is a flow you can add steps to. Song requests, hosted overlays and web requests may not be available on your channel yet. | | Nightbot | Bloopbot | | --- | --- | --- | | Commands | Commands with `$(variables)` | A flow with a **Chat command** trigger, imported for you | | User levels and cooldowns | Set on each command | **Who can trigger**, **Has a role** and **Cooldown** checks, imported for you | | Counters | Through variables | A counter variable, imported with its current count | | Custom logic | `$(urlfetch)` | A **Web request** step, plus checks and variables on the canvas | | Timers | Timers | A flow with an **On a timer** trigger | | Spam protection | Blacklist and spam filters | The filters on **Moderation**, plus an optional AI moderation step | | Song requests | YouTube and SoundCloud | Spotify, through your own Spotify account | | Giveaways | Winner picks | Giveaways with keyword entry, a draw and a panel on stream | | Loyalty points | None | Points and watch time, with `!points` and `!top` | | Overlays and alerts | None | Hosted overlays with alert layers, added to OBS as a Browser Source | | Platforms | Twitch, YouTube, Trovo and SOOP | Twitch and Kick | ## What the importer brings over - No Nightbot sign-in. Bloopbot reads the command list Nightbot already shows publicly, and nothing changes there. - Each command arrives as its own flow called `!command (from Nightbot)`, with its user level as a check and its cooldown as a **Cooldown** check. - `$(user)`, `$(touser)`, `$(query)` and `$(1)` to `$(9)` stay as they are. `$(count)` becomes a counter variable that starts at Nightbot’s current count. - An alias such as `!dc` for `!discord` becomes an extra word on the `!discord` flow. - A row Bloopbot can’t finish for you, such as one with a $(time) token, arrives paused, with Turn on now greyed out. - Timers, spam filters, your Regulars list and song requests don’t come across. The [guide](https://bloopbot.com/docs/coming-from-nightbot#rebuild) shows how to rebuild each one. ![Pebble on the Bring commands from another bot page at step 1 of 4 of Bring your commands over: I found your Nightbot commands, with a Next button, and the importer dimmed behind.](https://bloopbot.com/docs/screenshots/tutorials-import.jpg) _Pebble’s Bring your commands over tutorial finds your Nightbot commands and walks you through the import._ ## What a flow adds to a command Once a command is a flow, you can add steps that a reply on its own can’t do. A `!discord` command can read a link your mods change with `!setdiscord`, a raid can give the raider a shoutout, and a reward can have a viewer’s typed-in text checked by AI before it goes on screen, where your channel includes it. Each is a trigger, a few checks and actions you can see. [Build a flow on the canvas](https://bloopbot.com/docs/flow-basics) shows how the parts connect. ## When Nightbot is the better fit Nightbot is simple, free, long trusted and fast to set up. If one line per command is all you need, or you stream on YouTube, Trovo or SOOP, Nightbot does that well and there’s no need to switch. --- # Switching from StreamElements Bring your StreamElements commands to Bloopbot as flows, with their permissions and cooldowns, and see where timers, loyalty, overlays and song requests live. Checked October 2026 against [StreamElements](https://streamelements.com). ## Where each StreamElements feature lives Commands come across for you. The rest maps onto something you set up once in Bloopbot. Song requests, hosted overlays and AI moderation may not be available on your channel yet. | | StreamElements | Bloopbot | | --- | --- | --- | | Custom commands | Custom commands | A flow with a **Chat command** trigger, imported for you | | Permissions and cooldowns | Set on each command | **Who can trigger**, **Has a role** and **Cooldown** checks, imported for you | | Command variables | Command variables | `$(user)`, `$(1)` and a counter variable | | Timers | Timers | A flow with an **On a timer** trigger | | Spam filters | Spam filters | The filters on **Moderation**, plus an optional AI moderation step | | Loyalty points | Points and the Stream Store | Bloopbot loyalty, with its own balances; points don’t carry over | | Overlays and alerts | Overlays and alerts | Hosted overlays with alert layers, each added to OBS as a Browser Source | | Song requests | YouTube media requests | Spotify song requests through your own Spotify account | | Tips | SEPay tipping | Not part of Bloopbot | | Platforms | Twitch, YouTube and Kick | Twitch and Kick | ## How the switch works Razer acquired StreamElements’ assets in July 2026, and SEPay tipping is closing, with balances withdrawable until 31 December 2026. You can keep StreamElements running while you try Bloopbot, and move one command at a time. 1. Sign in with Twitch, then make the bot a moderator in your chat by sending the `/mod` command Pebble shows you in the **Make your bot a mod** step of Set up your bot. 2. Start Pebble’s **Bring your commands over** tutorial from **Tutorials**, which opens the importer. Untick anything you don’t want, and tick **Turn on now** for commands that should answer straight away. 3. Open a command on the canvas to add a check, a counter or an alert. 4. When a Bloopbot flow does the same job, switch the StreamElements command off, so chat never gets two replies. ## What the importer brings over - No StreamElements sign-in. Bloopbot reads the command list StreamElements already shows publicly. - Each command arrives as its own flow called `!command (from StreamElements)`, with its aliases, its permission level and its cooldowns. - `${user}`, `${touser}` and `${1}` to `${9}` become their `$(…)` equivalents, and `${count}` becomes a counter variable. - A row Bloopbot can’t finish for you, such as one with a ${random.pick} token, arrives paused, with Turn on now greyed out. - Timers, spam filters, quotes and loyalty points don’t come across. The [guide](https://bloopbot.com/docs/coming-from-streamelements#rebuild) shows how to rebuild each one. ![Pebble on the Bring commands from another bot page at step 1 of 4 of Bring your commands over: I found your Nightbot commands, with a Next button, and the importer dimmed behind.](https://bloopbot.com/docs/screenshots/tutorials-import.jpg) _Pebble’s Bring your commands over tutorial finds your commands and walks you through the import._ ## When StreamElements is the better fit StreamElements is a free toolkit with overlays, alerts, a chatbot and loyalty points in one place, on Twitch, YouTube and Kick. If you stream to YouTube as well as Twitch, StreamElements covers it and Bloopbot doesn’t. --- # Streamer.bot alternative for Mac and Linux How Bloopbot compares with Streamer.bot: flows built in your browser on Mac, Windows or Linux, with no code, that keep running on Bloopbot’s servers when your PC is off. Checked October 2026 against [Streamer.bot](https://streamer.bot). ## Streamer.bot and Bloopbot compared Both are free to start. They differ in where the bot runs and how you build it. | | Streamer.bot | Bloopbot | | --- | --- | --- | | Where it runs | An app on your PC | Bloopbot’s servers | | PC must stay on | Yes | No | | Mac and Linux | Windows; macOS and Linux only through Whisky or Wine, which it calls experimental | Any computer with a browser | | Building logic | Lists of sub-actions, plus C# for anything custom | A canvas of triggers, checks and actions | | Shared state | Global and per-user variables | Channel and per-viewer variables that every flow can read | | Overlays and alerts | Build your own on its WebSocket or HTTP server | Hosted overlays you add to OBS as a Browser Source | | Apps on your PC | OBS, Stream Deck, VTube Studio, Voicemod and more | OBS through your overlay, and a Stream Deck key can start a flow; nothing else on your PC | | Platforms | Twitch, YouTube, Kick and Trovo | Twitch and Kick | | Price | Free, with an optional Patreon tier for cloud backups | Free, with [Plus and Pro plans](https://bloopbot.com/pricing) | ## A Streamer.bot alternative for Mac Streamer.bot is built for Windows. Its own [macOS guide](https://docs.streamer.bot/get-started/installation/macos) calls running it on a Mac experimental and not officially supported: you install it through Whisky, which needs macOS 14 or later and is no longer actively maintained, and its built-in chat and event feed windows do not work there. Linux runs it the same way through [Wine](https://docs.streamer.bot/get-started/installation/linux). Bloopbot has nothing to install, so a Mac is no different from a PC: - You build and change flows in your browser, signed in with Twitch or Kick. - Your overlays and alerts are web pages that OBS for Mac shows as a Browser Source ([Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs)). - Commands, timers and moderation keep answering in chat when the Mac is asleep or off. - [Spotify song requests](https://bloopbot.com/features/song-requests) and [sounds on a channel points reward](https://bloopbot.com/docs/reward-redemptions#sound) work the same as on Windows. What you give up is most of the reach into your computer: Bloopbot can [start flows from OBS and switch scenes](https://bloopbot.com/docs/control-obs-from-flows) through your overlay, but it cannot drive VTube Studio or Voicemod, which Streamer.bot can on Windows. See [when Streamer.bot is the better fit](https://bloopbot.com/vs/streamer-bot#fit). ## The same ideas, drawn instead of listed An action becomes a flow, and each sub-action becomes a step you can see on the canvas. There’s no importer, so you rebuild the actions you use most; the [guide](https://bloopbot.com/docs/coming-from-streamer-bot) maps each one. | | Streamer.bot | Bloopbot | | --- | --- | --- | | Actions | An action and its sub-actions | A flow | | Triggers | Triggers on an action | The flow’s trigger, such as **Chat command** or **On a reward redeemed** | | Logic | If / Else and Switch sub-actions | Check steps, each with a path for yes and a path for no | | Loops | While sub-actions | **For each**, once per item in a list | | State | Global and user variables | Variables, declared once and read anywhere as `$(var.name)` | | Sharing | Extensions you import | Flow packs, the Community group and shared flow files | ## What changes when the bot isn’t on your PC - Your chat commands and moderation filters keep answering when your PC is off, and you can change a flow from any browser. - You start from a ready-made pack, such as **Starter**, then change the steps you want. - Your overlays are hosted, so OBS loads the same URL on whichever PC you stream from. - An editor you trust can sign in with their own Twitch account and fix a flow for you. Editors may not be included on your plan. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: add a ready-made pack, then change any step._ ## When Streamer.bot is the better fit If your bot drives VTube Studio, Voicemod or other apps on your PC, runs your own C# code, or you stream to YouTube or Trovo, Streamer.bot does that and Bloopbot doesn’t. If you need both, you can keep Streamer.bot for your PC and hand chat to Bloopbot, as long as the two never answer the same command. --- # Streamlabs Cloudbot alternative How Bloopbot compares with Streamlabs Cloudbot: every command, alert and timer is a flow you can open and change, and AI works as checks inside those flows. Checked September 2026 against [Streamlabs](https://streamlabs.com). ## Streamlabs Cloudbot and Bloopbot compared Both chat bots run in the cloud and are free to start. Cloudbot sits inside the Streamlabs suite, beside its streaming app and tipping. Bloopbot is a chat bot with hosted overlays that you add to the streaming app you already use. Song requests, hosted overlays, Twitch polls and AI steps may not be available on your channel yet. | | Streamlabs | Bloopbot | | --- | --- | --- | | Building commands | Custom commands with variables | Flows of triggers, checks and actions on a canvas | | Timers | Timers | A flow with an **On a timer** trigger | | Moderation filters | Caps, emotes, paragraphs, links, symbols and profanity | Blacklist, links, caps, symbols, emotes and repetition filters on **Moderation** | | Loyalty | A loyalty store | Points and watch time, with `!points`, `!top` and `!give` | | Giveaways | Giveaways | Keyword entry, tickets that can cost points, a draw and a panel on stream | | Polls | Polls | Twitch polls and predictions, started or announced from a flow | | Quotes | Quotes | A numbered quote book, with `!quote` | | Media requests | Media share | Spotify song requests, through your own Spotify account | | Alerts and overlays | Part of the Streamlabs suite | Hosted overlays with alert layers, added to OBS as a Browser Source | | AI | Intelligent Streaming Agent, a 3D co-host for specific games that runs on your own RTX graphics card | Checks inside your flows that read what a message means and pick a path | | The bot’s name | Renaming the bot needs Ultra | Your own bot account, which may not be included on your plan | | Streaming app and tipping | Streamlabs Desktop and tipping | Not part of Bloopbot | | Platforms | Twitch, YouTube and Kick | Twitch and Kick | | Price | Free, with Ultra at $27 a month or $189 a year | Free, with [Plus and Pro plans](https://bloopbot.com/pricing) | ## How an AI step works in a flow An AI step in Bloopbot answers a question about a chat message or a viewer’s typed-in text, then your flow takes the path you wired to that answer. It never writes a reply of its own, so nothing viewers read is written by the AI. The **Check reward text before it goes on stream** template shows how that works: 1. **On a reward redeemed** starts the flow when a viewer redeems a reward and types something. 2. Inside the flow’s **Screen reward text** group, **AI: text OK to show?** reads what they typed. 3. Clean text plays your `redemption` alert with the viewer’s name and what they typed. Flagged text never reaches the screen, and the flow asks Twitch to refund the points, which Twitch allows for a reward Bloopbot created. [AI features and what’s included](https://bloopbot.com/docs/ai-features) lists each AI step and shows how to check which ones your channel has. ## Moving over from Cloudbot There’s no importer for Cloudbot, so you rebuild the commands you use as flows. You can keep Cloudbot running while you try Bloopbot. 1. Sign in with Twitch, then make the bot a moderator in your chat by sending the `/mod` command Pebble shows you in the **Make your bot a mod** step of Set up your bot. 2. Add the **Starter** pack from **Flows → Add**. Its flows arrive paused. 3. Open a flow, change its command and message to match the Cloudbot command it replaces, and switch it on. 4. Switch the Cloudbot command off, so chat never gets two replies. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: add a ready-made pack, then change any step._ ## When Streamlabs is the better fit Streamlabs puts a streaming app, overlays, tipping and a chat bot in one suite, with multistreaming and a mobile app. If you want all of that from one company, or you stream on YouTube as well as Twitch, Streamlabs is the better choice. --- # WizeBot alternative How Bloopbot compares with WizeBot: both run in the cloud with nothing to install, but Bloopbot builds commands as flows on a canvas, works on Twitch and Kick, and ships ready-made packs for games, alerts and song requests. Checked October 2026 against [WizeBot](https://wizebot.tv). ## WizeBot and Bloopbot compared Both run in the cloud, so your bot keeps answering when your PC is off. They differ in how you build and in how far the feature list goes. There’s no importer for WizeBot, so you rebuild the commands you use as flows. | | WizeBot | Bloopbot | | --- | --- | --- | | Building commands | Custom commands with keywords, permissions and activation criteria such as time slot or game | Flows of triggers, checks and actions on a canvas | | Your own code | JavaScript commands | No code in commands; [custom overlays](https://bloopbot.com/features/custom-twitch-overlays) take your own HTML, CSS and JavaScript | | Loyalty | Virtual currency, shop, ranks and levels | Loyalty points, a points store and a leaderboard | | Games | Mini-games, bets, bingo and giveaways | Slots, roulette, duels, heists, bets and giveaways | | Song requests | A song request system | Spotify, through your own Spotify Premium account | | Alerts and overlays | Alerts, chat overlay, goals, emote wall and more | Hosted overlays with alert layers, chat box, emote wall and more | | Moderation | Anti-spam, banned words, link control, warnings, follow-bot checks, emergency mode | Blacklist, links, caps, symbols, emotes and repetition filters, plus AI moderation | | Integrations | Discord, X, Bluesky, YouTube, LastFM, Steam, Stream Deck, Loupedeck, game servers | Discord, Bluesky, Mastodon, X, Threads, Instagram, Stream Deck, OBS | | Platforms | Twitch | Twitch and Kick | | Price | Free | Free, with [Plus and Pro plans](https://bloopbot.com/pricing) | ## What WizeBot does well WizeBot has run since 2013 and says more than a million streamers use it. Its own list covers a lot: counters, a shop, rank and level boards, a decryption game, fishing, a bomb game, an emergency mode, Twitch extensions and hooks into games such as 7 Days To Die and Project Zomboid. If one of those is why you use it, look for it in Bloopbot before you move. ## Where Bloopbot differs - **Commands you can read.** Each command is a flow. A trigger, a check such as **Who can trigger** or **Cooldown**, then an action. Open any step to see what it does ([Build a flow on the canvas](https://bloopbot.com/docs/flow-basics)). - **Packs instead of menus.** Games, song requests and alerts arrive as packs from the [Marketplace](https://bloopbot.com/docs/the-marketplace), already wired, with every step open to change. [Points games](https://bloopbot.com/docs/points-minigames) are one pack. - **Kick as well as Twitch.** Sign in with either, or add Kick to a Twitch channel, and the same flows answer in both chats ([Use Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick)). - **OBS from flows.** A flow can start when you switch scenes or go live in OBS, and can switch scenes itself, with nothing to install ([Control OBS from flows](https://bloopbot.com/docs/control-obs-from-flows)). ## When WizeBot is the better fit If you want JavaScript in your commands, Twitch extensions or a game-server hookup, WizeBot does that and Bloopbot doesn’t. If you read commands better than you remember settings, or you stream on Kick too, try Bloopbot alongside it and keep one bot answering each command. --- # Make Twitch overlays with Claude or ChatGPT Connect Claude, ChatGPT or Claude Code to Bloopbot and describe the Twitch overlay you want. The assistant writes it into your Studio draft, shows you a rendered preview, makes small changes on request and leaves publishing to you. Video: [A Custom graphic in Bloopbot Studio: a raid card's JavaScript is typed beside the live preview and a simulated raid plays it, a connected AI assistant makes the card gold with confetti in the Studio draft, and Publish sends it to the OBS Browser Source](https://bloopbot.com/videos/custom-graphics-v1.mp4) ## Ask in plain words Once your assistant is connected, a request like this is enough: ``` Create a custom graphic in Studio: a transparent raid card with an editable accent colour. Use the graphics layer and bundled GSAP. Subscribe only to raid. Render a preview at 500 ms with a sample raid from PixelPal, then leave the source in the draft for me to review. ``` The assistant adds a **Custom graphic** layer to your overlay, writes its source, picks the events it needs and sets up the flow that sends each one. It then shows you a picture of the draft at the moment you asked for, with the sample raid playing. If the card isn't right, say what to change and it renders another. It works with any assistant that can add a custom connector, sometimes called an MCP server, including Claude, ChatGPT and Claude Code. ## Small changes stay small Asking for "the accent in gold instead of blue" doesn't make the assistant rewrite your graphic. It changes only the snippet or setting involved and leaves the rest of your source as it was, so a one-word change saves in moments. If you edit Studio while it works, its out-of-date change is refused rather than saved over yours. It reads your latest draft and tries again. A refused change saves nothing. ## You decide what goes live The assistant works in your Studio draft. Your OBS Browser Source keeps showing the published version until you press **Publish** in Studio and choose **Create and switch on** for the flows it set up. If you also tick **Publish your Studio draft** when you connect, the assistant can publish for you. Before it does, it lists every change that will go live, including any you made yourself, and waits for your go-ahead. ![Publish review names the changed overlay and shared alert design, with Create and switch on selected for the new Follow alert flow](https://bloopbot.com/docs/screenshots/studio-publish-review.jpg) _Publish review lists every overlay change and queued flow before anything reaches OBS._ ## What you allow You choose what the assistant can do on Bloopbot's consent screen, and overlay access starts unticked: | Permission | What it allows | | --- | --- | | See your overlays, themes and Studio drafts | Read your overlays, draft changes and media file names, and render draft previews | | Create overlays and themes, edit Studio drafts and organise your media | Add layers, write graphic source, upload files you give it, tidy the media library | | Publish your Studio draft | Press **Publish** for you, after you agree | It never sees your private Browser Source address. Every change it makes appears in your Audit log under the assistant's name. ## More than one card The same connection can build a matching set of scenes from Studio's ready-made layouts, such as gameplay, Starting soon, Be right back and Ending, or put a clock, an event list or a viewer count on an existing overlay. With flow permissions ticked, it can also create the flows that make your graphic play, such as a `!gg` command that sets off a celebration. [Connect an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant) lists everything it can do. ## Prefer to write the code? Everything the assistant writes is ordinary HTML, CSS and JavaScript in a [Custom graphic layer](https://bloopbot.com/features/custom-twitch-overlays). Open it in Studio to read it, change it beside the live preview, or share it in a pack. Custom graphics come with every plan, Free included. You can also paste a [custom HTML overlay](https://bloopbot.com/docs/custom-widgets)'s **AI brief** into a chat assistant. The brief describes the events and data that overlay may read, and you save the HTML it writes on your streaming computer. --- # AI checks in your flows Bloopbot’s AI steps read what a chat message or a viewer’s typed-in text means and pick a path in your flow. They never write replies of their own. ## Four ways to use it Each AI step is a node on the canvas, so you can see where it runs and what follows it. - **Wake a flow on meaning.** The **AI: chat means…** trigger starts a flow when chat means something, such as asking what game you’re playing, without an exact command or keyword. See [wake a flow when chat means something](https://bloopbot.com/docs/intent-trigger). - **Screen viewer text.** **AI: text OK to show?** checks a quote or a reward’s typed-in text for slurs, sexual content, doxxing and harassment before it’s saved or goes on screen. See [screen viewer text with AI](https://bloopbot.com/docs/text-screening). - **Moderate with context.** The AI moderation step looks for harassment, hate speech, sexual content, scams and a rule you write in a sentence, rather than a list of blocked words. See [set up AI moderation](https://bloopbot.com/docs/ai-moderation). - **Branch on a question.** **AI: yes or no** answers a plain-English question about a message, and **AI: route by meaning** picks one of up to eight branches you describe. See [ask the AI judge in a flow](https://bloopbot.com/docs/ai-conditions-and-routing). For song requests, AI steps can pick the track a viewer meant and screen out troll uploads — see [smarter song requests with AI](https://bloopbot.com/docs/song-requests-ai). ## An example: a reward that shows viewer text A viewer redeems a reward and types a message to show on stream. The flow checks it first: | Step | What it does | | --- | --- | | **On a reward redeemed** | Starts when someone redeems your reward, with the text they typed | | **AI: text OK to show?**, set to **Shown on stream** | Checks the text before anything shows it | | **Safe** | Shows your redemption alert with their name and their text | | **Flagged** | Keeps the text off screen and asks Twitch to refund the points | | **Unsure** | Goes the same way as **Safe**, so the reward still works when the check can’t answer | The **Check reward text before it goes on stream** template is this flow, ready-made. Twitch only refunds points for a reward Bloopbot created; the [guide](https://bloopbot.com/docs/text-screening#redemption) explains what happens otherwise. ## You stay in charge of what it does - It never writes a reply. An AI step answers with a path, and the messages chat sees are the ones in your flow. - The checks have an **Unsure** path for when the AI can’t answer. You decide where it goes. - Run AI moderation in watch mode for a stream first: the **AI chat moderation — watch only** template records what it would have done in the run log, and says and deletes nothing. - Write your channel’s own rule in a sentence, such as no discussing other streamers by name. - If the AI times out or can’t be reached, the step falls back to ordinary, non-AI behaviour, so chat is never held up and the flow doesn’t fail. ![The node library’s Groups topic showing Enforce chat rules and Screen reward text, each used by one flow.](https://bloopbot.com/docs/screenshots/node-library-groups.jpg) _The node library’s Groups topic, beside the AI topic: Enforce chat rules and Screen reward text are the groups inside the AI templates, so you can open and change what each finding does._ ## Check what your channel has Open **Flows** and press **Your plan**. The **AI judgments** group lists each AI feature and whether your channel includes it. A step your channel doesn’t include still shows in the node library with a lock, so you can see what it would do, and none of them is needed to run Bloopbot. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) explains the panel. --- # Post to Bluesky when you go live on Twitch Bloopbot posts to Bluesky when your Twitch or Kick stream starts, with your title, category, a picture of the stream and a clickable link to your channel, once per stream. Video: [Going live on Twitch: the go-live flow's four steps run and the post appears on Bluesky, once per stream](https://bloopbot.com/videos/go-live-bluesky-v1.mp4) ## What your followers see The starter text is your stream's title and category and your channel link: ``` Live now: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel ``` with a picture of your stream under it. The link is clickable, and the picture's description is your stream title, so it reads out for people using a screen reader. Change the text to anything you like; **Insert…** adds values such as your title, category and channel link. - **300 characters**, an emoji counting as one. The step's preview counts as you type, and longer text is cut with … rather than in the middle of a link. - **One attachment.** With a picture, your link stays clickable in the text. Choose no picture and Bloopbot shows a link card for your channel instead. - Links and `#hashtags` are clickable. An `@name` stays plain text and notifies no one. ## The flow The **Socials** pack's **Post to Bluesky when you go live** is four steps you can open and change: 1. **Stream starts or ends**, set to **Live**. 2. **Variable is**: this stream hasn't been announced on Bluesky yet. 3. **Post to Bluesky**, with the text, the picture and a live preview of the post. 4. **Set a variable**: remember this stream once Bluesky confirms the post. So a short disconnect doesn't post twice, and your next stream gets a fresh post. A **Post to Bluesky** step works after any trigger, so a milestone or a command can post too. ## Set it up 1. Open **Settings**, choose **Bluesky**, type your handle, for example `name.bsky.social`, and press **Connect Bluesky**. Approve Bloopbot on Bluesky's page. 2. On **Flows**, press **Marketplace** and add the **Socials** pack. Its flows install paused. 3. Open **Post to Bluesky when you go live** and press **Send test post** to see the real post on your profile. 4. Switch the flow on. The same pack posts to [Mastodon](https://bloopbot.com/features/announce-on-mastodon), [X](https://bloopbot.com/features/announce-on-x), [Threads](https://bloopbot.com/features/announce-on-threads), [Instagram](https://bloopbot.com/features/announce-on-instagram) and [Facebook](https://bloopbot.com/features/announce-on-facebook). See [every network at once](https://bloopbot.com/features/go-live-announcements). --- # Post to your Facebook Page when you go live on Twitch Bloopbot posts to your Facebook Page when your Twitch or Kick stream starts, with your title, category, a picture of the stream and a link to your channel, once per stream. Video: [Going live on Twitch: the go-live flow's four steps run and the post appears on Facebook, once per stream](https://bloopbot.com/videos/go-live-facebook-v1.mp4) ## What your followers see The starter text is: ``` Live now: Speedrunning Celeste until the PB falls - playing Celeste. Come hang out: https://www.twitch.tv/yourchannel ``` Change it to anything you like; **Insert…** adds values such as your title, category and channel link. - **A picture or a link preview.** Leave **Show a link card** on to add a link preview under a text post. On a post with a picture of your stream, Bloopbot puts the link in the photo's caption. - **Room to write.** A Facebook post can be very long, so the go-live post is never cut short. ## The flow The **Socials** pack's **Post to Facebook when you go live** is four steps you can open and change: 1. **Stream starts or ends**, set to **Live**. 2. **Variable is**: this stream hasn't been announced on Facebook yet. 3. **Post to Facebook**, with the text, the picture or link card, and a live preview of the post. 4. **Set a variable**: remember this stream once Facebook confirms the post. So a short disconnect doesn't post twice, and your next stream gets a fresh post. A **Post to Facebook** step works after any trigger, so a milestone or a command can post too. ## Set it up 1. Open **Settings**, choose **Facebook** and press **Connect Facebook**. On Facebook, choose the Pages you allow Bloopbot to use. You need a role on the Page that lets you create posts. 2. If you allowed more than one Page, pick the one to post to and press **Connect this Page**. One Page is connected at a time; **Reconnect Facebook** switches it. 3. On **Flows**, press **Marketplace** and add the **Socials** pack. Its flows install paused. 4. Open **Post to Facebook when you go live** and press **Send test post**. It is a real, public post on your Page, which you can delete in Facebook. 5. Switch the flow on. Posting to Facebook may not be available on your channel yet. **Connections** shows which networks your channel can connect. The same pack posts to [Bluesky](https://bloopbot.com/features/announce-on-bluesky), [Mastodon](https://bloopbot.com/features/announce-on-mastodon), [X](https://bloopbot.com/features/announce-on-x), [Threads](https://bloopbot.com/features/announce-on-threads) and [Instagram](https://bloopbot.com/features/announce-on-instagram). See [every network at once](https://bloopbot.com/features/go-live-announcements). --- # Post to Instagram when you go live on Twitch Bloopbot posts a picture of your Twitch or Kick stream to Instagram when it starts, with your title and category in the caption, once per stream. Needs a Business or Creator account. Video: [Going live on Twitch: the go-live flow's four steps run and the post appears on Instagram, once per stream](https://bloopbot.com/videos/go-live-instagram-v1.mp4) ## What your followers see Every Instagram post is a picture with a caption. The picture is your stream's Twitch live preview, or one from your Media library, and the starter caption is: ``` Live now on Twitch: Speedrunning Celeste until the PB falls - playing Celeste. Link in bio! ``` Change it to anything you like; **Insert…** adds values such as your title and category. - **Links.** Instagram doesn't make a link in a caption clickable, so put your Twitch link in your Instagram bio, as the starter caption says. - **Pictures.** Bloopbot turns the picture into a JPEG and sizes it. The Twitch live preview fits Instagram's shape; for your own picture, a square works. - **2,200 characters** and up to 30 hashtags in a caption. Longer text is cut with …. - Instagram allows 100 posts every 24 hours through apps, on top of Bloopbot's 10 an hour. ## The flow The **Socials** pack's **Post to Instagram when you go live** is four steps you can open and change: 1. **Stream starts or ends**, set to **Live**. 2. **Variable is**: this stream hasn't been announced on Instagram yet. 3. **Post to Instagram**, with the caption, the picture and a live preview of the post. 4. **Set a variable**: remember this stream once Instagram confirms the post. So a short disconnect doesn't post twice, and your next stream gets a fresh post. ## Set it up 1. Open **Settings**, choose **Instagram** and press **Connect Instagram**. Approve Bloopbot on Instagram. A personal account can't connect: switch it to a professional account in the Instagram app's **Settings** first. 2. On **Flows**, press **Marketplace** and add the **Socials** pack. Its flows install paused. 3. Open **Post to Instagram when you go live** and press **Send test post** to see the real post on your profile. Instagram takes a few seconds to process the picture. 4. Switch the flow on. Posting to Instagram may not be available on your channel yet. **Connections** shows which networks your channel can connect. The same pack posts to [Bluesky](https://bloopbot.com/features/announce-on-bluesky), [Mastodon](https://bloopbot.com/features/announce-on-mastodon), [X](https://bloopbot.com/features/announce-on-x), [Threads](https://bloopbot.com/features/announce-on-threads) and [Facebook](https://bloopbot.com/features/announce-on-facebook). See [every network at once](https://bloopbot.com/features/go-live-announcements). --- # Post to Mastodon when you go live on Twitch Bloopbot posts to your Mastodon account when your Twitch or Kick stream starts, with your title, category, a picture of the stream and your channel link, once per stream. Works with most public Mastodon servers. Video: [Going live on Twitch: the go-live flow's four steps run and the post appears on Mastodon, once per stream](https://bloopbot.com/videos/go-live-mastodon-v1.mp4) ## What your followers see The starter text is: ``` I am live: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel ``` with a picture of your stream, and Mastodon adds its own preview card for the link. Change the text to anything you like; **Insert…** adds values such as your title, category and channel link. - **Your server's limit.** Most allow 500 characters, some more; once you are connected, the step's preview uses your server's own number. Every link counts as 23 characters however long it is. - **One picture**, converted to a JPEG no larger than 1920 by 1080 pixels. If your server doesn't take pictures, set **Picture** to **None**. - **Public posts.** Every post is public, and Bloopbot posts without editing or deleting: do that on Mastodon. ## The flow The **Socials** pack's **Post to Mastodon when you go live** is four steps you can open and change: 1. **Stream starts or ends**, set to **Live**. 2. **Variable is**: this stream hasn't been announced on Mastodon yet. 3. **Post to Mastodon**, with the text, the picture and a live preview of the post. 4. **Set a variable**: remember this stream once your server confirms the post. So a short disconnect doesn't post twice, and your next stream gets a fresh post. A **Post to Mastodon** step works after any trigger, so a milestone or a command can post too. ## Set it up 1. Open **Settings**, choose **Mastodon**, type your server, for example `mastodon.social`, and press **Connect Mastodon**. Approve **Bloopbot** on your server. 2. On **Flows**, press **Marketplace** and add the **Socials** pack. Its flows install paused. 3. Open **Post to Mastodon when you go live** and press **Send test post** to see the real post on your profile. 4. Switch the flow on. Mastodon access doesn't run out. If you take it away on Mastodon, the card on **Connections** shows **Needs reconnecting**. The same pack posts to [Bluesky](https://bloopbot.com/features/announce-on-bluesky), [X](https://bloopbot.com/features/announce-on-x), [Threads](https://bloopbot.com/features/announce-on-threads), [Instagram](https://bloopbot.com/features/announce-on-instagram) and [Facebook](https://bloopbot.com/features/announce-on-facebook). See [every network at once](https://bloopbot.com/features/go-live-announcements). --- # Post to Threads when you go live on Twitch Bloopbot posts to your Threads profile when your Twitch or Kick stream starts, with your title, category and a link card or a picture of the stream, once per stream. Video: [Going live on Twitch: the go-live flow's four steps run and the post appears on Threads, once per stream](https://bloopbot.com/videos/go-live-threads-v1.mp4) ## What your followers see The starter text is: ``` Live now: Speedrunning Celeste until the PB falls - playing Celeste. Come hang out: https://www.twitch.tv/yourchannel ``` Change it to anything you like; **Insert…** adds values such as your title, category and channel link. - **500 characters.** Longer text is cut with … when it posts. - **A picture or a link card.** A post with a picture of your stream shows the picture; a text-only post shows a link card for your channel. - **Up to 5 links**, the link card counting as one unless the same link is already in your text. - Threads allows 250 posts every 24 hours on a profile, on top of Bloopbot's 10 an hour. ## The flow The **Socials** pack's **Post to Threads when you go live** is four steps you can open and change: 1. **Stream starts or ends**, set to **Live**. 2. **Variable is**: this stream hasn't been announced on Threads yet. 3. **Post to Threads**, with the text, the picture or link card, and a live preview of the post. 4. **Set a variable**: remember this stream once Threads confirms the post. So a short disconnect doesn't post twice, and your next stream gets a fresh post. A **Post to Threads** step works after any trigger, so a milestone or a command can post too. ## Set it up 1. Open **Settings**, choose **Threads** and press **Connect Threads**. Approve Bloopbot on Threads: it asks to read your profile name and publish posts for you. 2. On **Flows**, press **Marketplace** and add the **Socials** pack. Its flows install paused. 3. Open **Post to Threads when you go live** and press **Send test post** to see the real post on your profile. 4. Switch the flow on. Posting to Threads may not be available on your channel yet. **Connections** shows which networks your channel can connect. The same pack posts to [Bluesky](https://bloopbot.com/features/announce-on-bluesky), [Mastodon](https://bloopbot.com/features/announce-on-mastodon), [X](https://bloopbot.com/features/announce-on-x), [Instagram](https://bloopbot.com/features/announce-on-instagram) and [Facebook](https://bloopbot.com/features/announce-on-facebook). See [every network at once](https://bloopbot.com/features/go-live-announcements). --- # Post to X when you go live on Twitch Bloopbot posts to X when your Twitch or Kick stream starts, with your title, category, a picture of the stream and your channel link, once per stream. X charges per post; Bloopbot shows the cost first. Video: [Going live on Twitch: the go-live flow's four steps run and the post appears on X, once per stream](https://bloopbot.com/videos/go-live-x-v1.mp4) ## What your followers see The starter text is: ``` Live now: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel ``` with a picture of your stream, and X builds its own card for the link. Change the text to anything you like; **Insert…** adds values such as your title, category and channel link. Keep the title in it: X refuses text it has already published from the same account. - **280 characters, counted the way X counts.** A link counts as 23 however long it is, an emoji as 2. The step's preview counts the same way, and longer text is cut with … rather than in the middle of a link. ## What it costs X charges for every post an app makes on your behalf: $0.20 for a post with a link and $0.015 without. Bloopbot passes that on from an **X balance** on your channel. - Add X balance in $5.99 top-ups, plus VAT or sales tax where it applies. $5.00 of each goes to X; the rest covers card fees and changes in X's pricing. You need no subscription: a channel on Free can top up. - The X card on **Connections** shows the balance and about how many posts it covers, for example _X balance: $4.60 · about 23 posts with a link_. The balance never expires. - A post that fails costs nothing. **Send test post** shows the cost before anything goes out. - On any plan you can connect your own X developer app instead, and X bills you directly. ## The flow The **Socials** pack's **Post to X when you go live** is four steps you can open and change: 1. **Stream starts or ends**, set to **Live**. 2. **Variable is**: this stream hasn't been announced on X yet. 3. **Post to X**, with the text, the picture and a live preview of the post and its count. 4. **Set a variable**: remember this stream once X confirms the post. So a short disconnect doesn't post, or charge, twice. ## Set it up 1. Open **Settings**, choose **X** and press **Connect X**. Approve Bloopbot on X. 2. Press **Add X balance**, or connect your own X developer app. 3. On **Flows**, press **Marketplace** and add the **Socials** pack. Its flows install paused. 4. Open **Post to X when you go live**, press **Send test post** and check the post and its cost. 5. Switch the flow on. Posting to X may not be available on your channel yet. **Connections** shows which networks your channel can connect. The same pack posts to [Bluesky](https://bloopbot.com/features/announce-on-bluesky), [Mastodon](https://bloopbot.com/features/announce-on-mastodon), [Threads](https://bloopbot.com/features/announce-on-threads), [Instagram](https://bloopbot.com/features/announce-on-instagram) and [Facebook](https://bloopbot.com/features/announce-on-facebook). See [every network at once](https://bloopbot.com/features/go-live-announcements). --- # Collections for Twitch cards, inventories and achievements Build a Twitch collection that viewers fill from chat, such as trading cards from a !pack command, an inventory or a list of achievements, with a catalogue you fill from a spreadsheet. ## What a collection holds A collection keeps many items for each viewer, and each item has a count: Pixel Pup ×3. Use one for trading cards a viewer opens from packs, an inventory of potions, or achievements, where an item is held once. A variable holds one value; a collection holds a list of items that flows can add to, remove from, check and read back. ## Fill the catalogue The catalogue is the list of items a collection can give out. Add them one at a time or import a CSV, so the card opener draws only from cards you have listed. The guide shows the file layout and the import step. ## A card opener for chat Viewers type `!pack` to open a pack. A flow picks items from the catalogue and gives them to the viewer, and a `!cards` command shows what they own. Free is enough to run the opener from start to finish. [Collections for cards, inventories and achievements](https://bloopbot.com/docs/collections) has every step. ## Look up, give and take A flow can look up a viewer's items, give an item or take one away as they earn or spend something, and the guide shows how to build the lookup command yourself. A give to a viewer who is already full follows its error path, so your chat can say so instead of failing quietly. ## Share a collection in a pack Collections can travel with a pack. Whoever installs it gets the collection and its catalogue, and can change them from the Collections page. --- # Control panels for OBS and your phone Make a Twitch stream control panel with big buttons for your flows and boxes for your variables, then use it on your dashboard, your phone or as an OBS dock. ## A screen of your own A control panel is a screen of buttons and controls for your stream. Each button starts a flow, and each control changes a channel variable, so a scoreboard or a counter stays in step with your chat commands. You can keep up to 20 panels, with up to 64 tiles on each. ## Buttons and variables Add a button for any flow that starts from a Run button trigger, and a control for any variable you have declared. Change the button's label, image or inputs when a flow asks for them. The flows and variables are the ones you already use, so nothing is duplicated. ## Use it on your phone or in OBS Open a panel from the list to use it full screen. To use it on a phone or as an OBS dock without signing in there, create a secret link from the panel's share dialog. Anyone with the link can use that panel and no other, so treat it like a password and keep it off stream. ## Let moderators help Your moderators can use a panel you share with them, so they can run the next round while you stay on camera. What they can press is still limited by the flows behind each button. ## Keep panels and flows together Share a panel with its flows as a pack, and whoever installs it gets the buttons and the flows they start. The guide covers each step: [Control panels](https://bloopbot.com/docs/control-panels). --- # Custom Twitch overlays in your own code Write a custom Twitch overlay in HTML, CSS and JavaScript with a live preview, react to follows, subs and raids, and publish it to your OBS Browser Source. Video: [A Custom graphic in Bloopbot Studio: a raid card's JavaScript is typed beside the live preview and a simulated raid plays it, a connected AI assistant makes the card gold with confetti in the Studio draft, and Publish sends it to the OBS Browser Source](https://bloopbot.com/videos/custom-graphics-v1.mp4) ## Code beside the preview A **Custom graphic** is a layer like any other in Studio, so it can fill the whole overlay or sit beside your chat box and alerts. **Edit graphic code** opens a workspace with **HTML**, **CSS** and **JavaScript** tabs on one side and the preview on the other. **Auto-run** refreshes the preview a moment after you stop typing, and **Output** shows script and loading errors. The starter is a raid card with an **Accent colour** setting. This is its whole JavaScript: ``` document.documentElement.style.setProperty("--accent", bloop.settings.accent); bloop.onEvent("raid", (event) => { document.querySelector("#caption").textContent = "WELCOME, RAIDERS"; document.querySelector("#name").textContent = event.name || "A new party has arrived"; bloop.timeline() .fromTo("#card", { y: 40, opacity: 0 }, { y: 0, opacity: 1, duration: .6 }) .to("#card", { opacity: 0, y: -20, duration: .4 }, 5.6); }); ``` Completions, types and error checks cover the `bloop` SDK and any library you turn on. Find, format, line wrapping and full screen are in the toolbar. ![Studio’s expanded code workspace with TypeScript on the left, the Script language choice in the toolbar, and a raid card, playback and event simulation on the right.](https://bloopbot.com/docs/screenshots/studio-graphics-code.jpg) _JavaScript beside the graphic preview, with playback, a sample raid and Output._ ## What your code can use Under **Data & settings** you choose what the graphic receives. It gets only what you select: | You select | Your code reads it with | | --- | --- | | Events: follow, sub, resub, gift, cheer, raid | `bloop.onEvent("raid", handler)` | | Channel variables, such as a `wins` counter | `bloop.getVariables()` or `bloop.onVariables(handler)` | | Files from your media library | `bloop.assets.portrait` | | Text, colour, number, on/off or choice settings | `bloop.settings.accent` | | Named flow messages, such as `celebration` | `bloop.onEvent("custom", handler)` | **GSAP**, **PixiJS**, **Three.js** and **Phaser** are bundled at pinned versions; tick the ones you want. Google Fonts load from your CSS. Settings you expose show up in the normal Studio panel, so you can change a colour or a line of text later without opening the code. ![Studio's Data & settings tab with GSAP ticked, the SplitText plugin ticked under GSAP plugins, and Creepster listed under Fonts, beside the raid card preview.](https://bloopbot.com/docs/screenshots/studio-graphics-bindings.jpg) _Choose the bundled libraries, event subscriptions and channel variables in Data & settings._ ## Test a raid without going live Pick an event under **Simulate an event** and its sample fields fill in, such as `{"name":"Sample raider","viewers":42}` for a raid or a name, amount and tier for gifted subs. Edit them if you like, then press **Play preview** or **Send event**. Drag **Preview time** to look at any moment again: the graphic reruns and replays the events up to that point. GSAP timelines, `bloop.schedule()` and `bloop.onTick()` all follow that clock, so a paused frame stays paused. The main Studio canvas has the same **Simulate** controls, so you can check the graphic in place with your other layers. None of this reaches Twitch, a flow or OBS. ![Studio’s Simulate panel has gift selected and editable name, amount and tier sample JSON ready to send to the custom graphic on the canvas.](https://bloopbot.com/docs/screenshots/studio-graphics-simulation.jpg) _Choosing gift in the Studio canvas Simulate panel fills its editable sample name, amount and tier._ ## Flows decide when it plays When you tick an event, Bloopbot queues a flow to send it, or reuses one you already have. A raid card gets a **Raid → Send to overlay** flow. **Triggered by flows** in the layer's settings shows whether each one is queued, on or off. When you **Publish**, you choose **Create and switch on** for each one. For anything that isn't a Twitch event, add a named message. Its **Run → Send to overlay** flow can be rewired to a chat command, a channel point reward or a timer, and the values it sends reach your code as `event.data`. A `!gg` command could set off a celebration this way. ![Triggered by flows in a custom graphic’s main Content panel, with raid and celebration flows queued for Publish.](https://bloopbot.com/docs/screenshots/custom-widget-flows.jpg) _Check the flow behind each selected alert and named message before publishing._ ## Publish to the source you already have Changes save to your Studio draft and stay out of OBS until you press **Publish**. Then your existing overlay Browser Source shows the new graphic. There's no new URL to paste. Your code runs in its own sandbox. It can't read your dashboard, cookies or storage, and remote scripts, images and requests are blocked, apart from Google Fonts. Pictures, sounds and videos come from your media library instead, up to 8 MB a file and 32 MB a graphic. ## Share it in a pack Put the overlay in one of [your packs](https://bloopbot.com/docs/create-packs) and share it as a bundle file or on the Marketplace. The pack carries the source, its settings, the media it uses and the flows you add beside it. Whoever installs it can change those settings from the Studio panel without opening the code. ## If you'd rather not write it yourself A [connected AI assistant](https://bloopbot.com/features/ai-twitch-overlay-maker) can write the graphic into your Studio draft, show you a rendered preview and make small changes on request. You still review and publish it. You can also draw an overlay in a plain HTML file of your own and give it a private OBS address with [your own HTML overlay](https://bloopbot.com/docs/custom-widgets). Its **Copy AI brief** button gives any chat assistant the events and data that overlay can read. --- # Visual flows for Twitch and Kick Bloopbot commands, alerts and timers are flows you draw in your browser: a trigger, the checks you want and the actions that follow. ## Three parts | Part | Question it answers | Example | | --- | --- | --- | | Trigger | When should this start? | Someone types `!hello` | | Check | Should it carry on? | The viewer is a moderator | | Action | What should happen? | Send a chat message | A straight line of steps can stay in the **Simple** form. Switch to **Canvas** when you want branches, extra checks or loops. Both edit the same flow. ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _The canvas: a Chat command trigger for !hello connected to a Chat message action, with the values the trigger hands on in the tray underneath._ ## Start from something that works You don’t have to start from a blank canvas. **Marketplace** on the Flows page lists ready-made packs for everyday commands, alerts, moderation, music and more, and every flow on its own; each one you add is your own copy to change. Community packs from other streamers sit there too. - The **Starter** pack brings everyday commands and stream reactions, paused until you turn them on. - **Add → From another bot** brings your Nightbot or StreamElements commands across as flows. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: packs first, then every flow on its own._ ## Grow it one step at a time - **Values travel between steps.** Each step hands on what it knows, such as who typed a command or how long the song queue is, and a later step can use it. You can drag a value from one step into another. See [connect values with data wires](https://bloopbot.com/docs/data-wires). - **Checks branch.** A **Who can trigger**, **Cooldown** or **Check a value** step has a path for yes and a path for no, so mods and viewers can get different answers. - **Loops repeat.** **For each** runs its branch once per item, such as each viewer in a gift of subs. - **Groups tidy up.** A few steps you use in several flows become one card; change it once and every flow that uses it follows. See [reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes). - **Variables remember.** Declare a number or text once on **Variables**, change it from any flow, and show it in chat or on an overlay. See [keep a counter with variables](https://bloopbot.com/docs/variables). ## Test before it goes live Press **Test fire** and the flow runs as a dry run: the **Run log** shows which steps ran, which check stopped it and which actions would have happened, without posting to chat or changing a real value. A flow that starts on a Twitch event, such as a raid or a poll, test-fires with a realistic example of that event. When a flow is live, the **Run log** keeps showing what each real run did, so a command that didn’t answer tells you why. ## Where your flows run Flows run on Bloopbot’s servers, not on your computer. There is nothing to install, you build them in any browser, and your commands and filters keep answering chat when your PC is off. Overlays still show through OBS, as Browser Sources. The same flows run on Kick. Sign in with Kick, or add Kick to your Twitch channel, and Kick chat, commands, follows, subs and KICKs start them; a reply goes back to the chat the command came from. Steps that only exist on Twitch, such as **Shoutout** or a poll, are marked so you keep them in flows that start from Twitch. [Use Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick) lists what works where. --- # Game-specific chat commands for Twitch Build Twitch chat commands for the game you play as Bloopbot flows, such as an Old School RuneScape Grand Exchange price with !ge or a World of Warcraft Raider.IO score with !rio that answers only while you play WoW. Video: [Chat commands built as flows for the game on stream: !ge answers with an Old School RuneScape Grand Exchange price, and after a switch to World of Warcraft, !rio answers with a Raider.IO Mythic+ score](https://bloopbot.com/videos/game-commands-v1.mp4) ## Old School RuneScape: !ge A viewer types `!ge twisted bow` and the bot answers with the item's Grand Exchange price, from Weird Gloop's price API at `api.weirdgloop.org`, which needs no key. The flow is six steps: | Step | Set to | | --- | --- | | Chat command | `ge` | | Web request | GET `https://api.weirdgloop.org/exchange/history/osrs/latest?name=$(query)` | | Read JSON | Read `$(from.web.text)`, pick `item` ← `*` | | For each | `$(from.json.item)` | | Check a value | `$(item.price)` is not empty | | Chat message | `$(item.key): $(item.price) gp` | `$(query)` is everything the viewer typed after the command, and the API matches the item's name whatever its capitals, so `!ge twisted bow` answers `Twisted bow: 1356626084 gp`. A name the API doesn't know gets no answer, because **Check a value** stops it. Several names separated by `|`, such as `!ge abyssal whip|dragon claws`, get one line each. ![The !ge flow on the canvas in two rows: Chat command !ge, a Web request to api.weirdgloop.org with the viewer's words as the item name, Read JSON picking every entry as item, For each going through them, Check a value letting only entries with a price through, and a Chat message saying the item's name and price in gp. Dashed data wires run from the trigger's After the command to the Web request's URL, from Response text to Read JSON and from Read JSON's item to For each.](https://bloopbot.com/docs/screenshots/game-commands-ge-flow.jpg) _The !ge flow: Chat command, Web request, Read JSON, For each, Check a value and Chat message._ ## World of Warcraft: !rio `!rio` posts your character's Mythic+ score from Raider.IO, and only while your stream's category is World of Warcraft: | Step | Set to | | --- | --- | | Chat command | `rio` | | Check a value | `$(data.stream.category)` equals `World of Warcraft` | | Web request | GET `https://raider.io/api/v1/characters/profile?region=eu&realm=your-realm&name=YourCharacter&fields=mythic_plus_scores_by_season:current` | | Read JSON | Read `$(from.web.text)`, pick `score` ← `mythic_plus_scores_by_season.0.scores.all` | | Chat message | `YourCharacter: $(from.json.score) Mythic+ score on Raider.IO` | Put your own region, realm and character name in the address. The score comes out with one decimal, as Raider.IO gives it. ## Only while you play it `$(data.stream.category)` is the category your stream is set to on Twitch, or on Kick for a channel you signed up for with Kick, kept up to date as you change it. A **Check a value** step on it keeps a command quiet in any other game, so `!rio` says nothing while you're in RuneScape. Add the same step to `!ge`, set to `Old School RuneScape`, and each game's commands only answer in their own game. ## What you need - **The Pro plan.** The **Web request** step is part of Pro; the rest of these steps come with every plan. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) lists the plans. - **Web requests allowed.** On the **Flows** page, choose **Web requests: off** so it reads **Web requests: allowed**. It is one switch for your whole channel. - **A public https address that answers quickly.** A request must answer within 2 seconds, only the first 64 KB of an answer is read, and one run can make two requests. **Test fire** doesn't reach the game's website: the **Run log** shows the address it would call. Type the command in your own chat to see the real answer. --- # Go-live posts for Twitch and Kick streams When your Twitch or Kick stream starts, Bloopbot posts it to Bluesky, Mastodon, X, Threads, Instagram and your Facebook Page, with your title, category, a picture of the stream and your channel link, once per stream. Video: [Going live on Twitch: the Socials pack's six go-live flows switch on, and a post lands on Bluesky, Mastodon, X, Threads, Instagram and Facebook, once per stream](https://bloopbot.com/videos/go-live-combined-v1.mp4) ## Six networks, one pack The **Socials** pack installs a paused flow for each network, named **Post to Bluesky when you go live**, **Post to Mastodon when you go live** and so on. Switch on the ones you use; a paused flow does nothing and costs nothing. | Network | Text limit | Picture | Link | | --- | --- | --- | --- | | [Bluesky](https://bloopbot.com/features/announce-on-bluesky) | 300 characters | optional | a link card when there is no picture | | [Mastodon](https://bloopbot.com/features/announce-on-mastodon) | your server's limit, 500 on most | optional | Mastodon builds its own card | | [X](https://bloopbot.com/features/announce-on-x) | 280, counted the way X counts | optional | X builds its own card | | [Threads](https://bloopbot.com/features/announce-on-threads) | 500 characters | optional | a link card | | [Instagram](https://bloopbot.com/features/announce-on-instagram) | 2,200 characters | required | not clickable in a caption | | [Facebook](https://bloopbot.com/features/announce-on-facebook) | very long | optional | a link card, or in the photo's caption | Posting to Threads, Instagram, Facebook and X may not be available on your channel yet. The **Connections** page shows which networks your channel can connect. ## What each flow does Every go-live flow in the pack is the same four steps, so you can open one and change any of them. 1. **Stream starts or ends**, set to **Live**, starts it when your stream goes online. 2. **Variable is** checks that this stream hasn't already been announced on that network. 3. **Post to** the network sends the post. The starter text is your stream's title, category and channel link, for example `Live now: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel`, with a picture of the stream. 4. **Set a variable** remembers the stream, once the network confirms the post. Anything a flow can trigger can post, too. Put a **Post to** step after a milestone or a command, not only at the start of a stream. ## Once per stream Twitch and Kick sometimes report a stream going online twice, for example after a short disconnect. Each network's flow remembers the last stream it announced, so a reconnect doesn't post again, your next stream gets a fresh post, and a post that fails is tried again on the next go-live event. Each network keeps its own memory, so one network being down never stops the others. On a channel you signed up for with Kick, the flow starts when your Kick stream goes live. On a Twitch channel with Kick added it follows Twitch unless you set the trigger to Kick, so going live on both never posts twice. [Going live on Kick](https://bloopbot.com/docs/bloopbot-on-kick#stream) explains the choice. Bloopbot also sends at most 10 posts an hour to each network for your channel, so a flow that loops by mistake can't flood your account. ## What it costs Bluesky, Mastodon, Threads, Instagram and Facebook cost nothing to post to. X charges for every post an app makes: $0.20 for a post with a link and $0.015 without, and Bloopbot passes that on. You add X balance in $5.99 top-ups, $5.00 of which goes to X, and a post that fails costs nothing. On any plan you can connect your own X developer app instead, and X bills you directly. ## Set it up 1. Open **Settings** and connect a network. You approve Bloopbot on the network's own page; Bloopbot never sees your password. 2. On **Flows**, press **Marketplace** and add the **Socials** pack. 3. Open the flow for that network, change the post text if you like, and press **Send test post** to see the real post on your profile. 4. Switch the flow on. It posts when your next stream starts. --- # Kick bot for Kick and Twitch chat Bloopbot is a free Kick bot and Kick chat bot. Sign in with Kick, or add Kick to your Twitch channel, and one bot runs both chats: commands, follows, subs, gifted subs, KICKs, moderation, rewards and loyalty points. ## What Bloopbot does on Kick Bloopbot is a free Kick bot where every command, alert and timer is a flow: a trigger, the checks you want and the actions that follow, drawn in your browser. These start your flows from Kick: | On Kick | What your flows can do | | --- | --- | | Chat, commands and keywords | Answer `!hello`, count `!deaths`, reply in Kick chat | | Follows, subs, resubs and gifted subs | Play an alert, thank the viewer, give loyalty points | | KICKs | Start the **Cheer** trigger, with their own **Last KICKs** and a **Top KICKs** step for a leaderboard | | Channel rewards | Start **On a reward redeemed**, then accept or reject the redemption | | Going live, title and category | Post to your socials, set your title, category and Kick tags, check whether you're live | | Ads | **Run a commercial** starts a Kick ad break of up to 90 seconds | Your [moderation filters](https://bloopbot.com/features/moderation) screen Kick chat too, your Kick moderators can use `!permit` and `!filters`, and the **Time out** and **Delete message** steps act on Kick messages. Kick viewers earn and spend [loyalty points](https://bloopbot.com/docs/loyalty-and-regulars), and on a Kick channel your [public page](https://bloopbot.com/features/link-in-bio) shows your Kick bio and a **Watch on Kick** button. ## Two ways to use it | You stream on | What to do | | --- | --- | | Kick only | Choose **Sign in with Kick**. Your Bloopbot channel is your Kick channel, and your Starter flows are waiting, paused. | | Twitch and Kick | Keep signing in with Twitch, open **Settings** and choose **Connect Kick**. Both chats run the same flows. | ![The Kick card on Connections, showing the Kick channel local\_streamer as Connected, with Reconnect Kick and Disconnect Kick buttons.](https://bloopbot.com/docs/screenshots/kick-connection-card.jpg) _A Twitch channel's Kick card on Connections, once its Kick channel is added._ On a channel with both, each trigger can start on **Twitch and Kick**, **Twitch only** or **Kick only**, and a reply goes back to the chat the command came from. Going live still follows Twitch unless you choose Kick, so your go-live post never goes out twice. [Use Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick) walks through both. ## One chat box for both chats Your [chat box](https://bloopbot.com/docs/chat-box) shows Kick chat beside Twitch's, each line marked with its platform. **Show chat from** keeps it to **Twitch and Kick**, **Twitch only** or **Kick only**. Bloopbot's own Kick replies show too, and **Hide known bots** hides them. ## What stays on Twitch Kick lacks some of what Twitch has, or doesn't let a bot do it, so these stay on Twitch: raids, shoutouts, clips, stream markers, polls, predictions, hype trains, Power-ups, Shield mode, chat settings, announcements, adding VIPs and moderators, and snoozing an ad. The flow editor marks those steps **Needs Twitch** on a Kick channel, so you can see what exists and why you can't add it. ## Common questions **Is it free?** Yes. Bloopbot is free to start on Kick, as on Twitch. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). **Do I need a bot account on Kick?** No. Bloopbot replies and moderates from your own Kick account, with the permissions you approve when you sign in. There is no bot to make a moderator. **Is there one bot for Twitch and Kick?** Yes. Add Kick to your Twitch channel and every chat, command, follow, sub and cheer trigger starts on both unless you choose one. A Kick viewer and a Twitch viewer are separate viewers with their own points, even with the same name. **Are KICKs counted as bits?** No. KICKs start the **Cheer** trigger, so a cheer alert plays for them, but your channel data keeps them apart, with their own totals and leaderboards. [Kick in channel data](https://bloopbot.com/docs/variables#kick) lists them. **Can I add Kick later?** Yes. Open **Settings**, choose **Kick** and **Connect Kick**. **Disconnect Kick** removes only Kick: your channel, flows and Twitch connection stay. --- # Free link in bio page for Twitch streamers A free link-in-bio page for Twitch and Kick: live status, your links with each site's icon, schedule, clips and a chat commands list, kept current by your bot. ## Your links, under your live status Add up to 25 links: YouTube, Discord, TikTok, merch, a tip page or anything with a web address. They sit as big buttons right under your live status, so a viewer who taps the link in your bio sees whether you're live first and everything else one tap away. Each button shows the site's own icon, such as YouTube's red play button, fetched for you when you save. You can reorder links with the arrows, and hide one between events without deleting it, such as a giveaway's rules. ![The Public page editor on Links: the menu on the left, and five links — YouTube: speedrun VODs, Join the Discord, Clips on X, Merch store and a hidden Hat giveaway rules — each with Title and Address fields and move, hide and remove icons, then Add link and the save bar.](https://bloopbot.com/docs/screenshots/public-page-links-editor.jpg) _The Links panel: five links with a title and address each, arrows to reorder them and an eye to hide one._ ## More than a list of links A link-in-bio page normally holds only what you type into it. Your public page also reads from Twitch and from your bot, so these parts update themselves: | Part of your page | Where it comes from | | --- | --- | | Live status and a **Watch on Twitch** button | Your Twitch channel, as it goes live | | Your bio | Your Twitch profile, within a few minutes of a change | | Schedule for the next 7 days | Your Twitch schedule | | Recent broadcasts and top clips | Your saved broadcasts and the most viewed clips of the last 30 days | | Latest on YouTube | Your YouTube channel's newest uploads | | Commands | The chat commands in your flows, grouped by who can use them | | Giveaways, Store, Quotes | Your open giveaways, your points store and your quote book | Each of those is a section or a tab you can switch off. A Twitch section with nothing to show hides itself, so a week with no schedule doesn't leave an empty box. ## A commands page your viewers can find The **Commands** tab lists the chat commands viewers can type, grouped as **Everyone**, **Subscribers** and **VIPs**, with a command's other names beside it and its description under it. It builds itself from your flows, so a command you add, rename or switch off shows up there within a minute. Moderators who sign in with Twitch also see the commands for their level. Add the **Commands link** flow from the **Starter** pack and `!commands` answers in chat with the page's address. ![A channel's Commands page after sign-in: Your level in this channel is Moderator, then Everyone with !commands, !discord, !hello (also !hi) and !lurk, Subscribers with !hype, VIPs with !pick, and Moderators with !giveaway open/start, !so (also !shoutout) and !title, each group saying who can use its commands.](https://bloopbot.com/docs/screenshots/public-commands-page.jpg) _The Commands page after a moderator signs in: Everyone, Subscribers, VIPs and Moderators, each with its commands._ ## A streamer website without building one Turn on the Home sections you want and drag them into order: - **About**, for who you are and what you stream. - **Work with me**, for brands and sponsors, with an email or web address button. - **Gear**, your camera, mic and desk grouped with optional links. - **Latest on YouTube**, **Schedule**, **Recent broadcasts** and **Top clips**. Pick a Google Font for headings and another for body text, and every page and section uses them. On Pro, the page can open at your own domain, such as `live.yoursite.com`. ![The channel home's Latest on YouTube uploads as thumbnail cards, the Work with me section with an Email button, and the Gear list grouped into Camera, Audio and Desk.](https://bloopbot.com/docs/screenshots/public-page-home-sections-more.jpg) _Latest on YouTube uploads, a Work with me section with an Email button, and gear grouped into Camera, Audio and Desk._ ## Where to put your link - **Your Twitch bio and panels.** Twitch lets you add social links and panel links; one of them can be your page. - **TikTok, Instagram, X and YouTube profiles.** Put it in the website field, so one link leads to everything you do. - **Chat.** `!commands` and any chat message can carry the address; `$(commandsurl)` is your Commands page. - **Discord.** Pin it in your server's welcome channel. Viewers don't need to sign in to see your page or use your links. Copy the address from the top of **Public page** with **Copy the page link**. ## Common questions **Is it free?** Yes. The page, links, Home sections and page fonts are on every plan, Free included. On the Free plan, the bottom of each page has a short **Stream on Twitch?** box telling viewers they can get a page like yours; on Plus and Pro it is gone. A custom domain needs Pro. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). **Is it a Linktree alternative?** It covers the same job, one address for all your links, and adds what your bot already knows: whether you're live, your schedule, clips, commands and giveaways. Linktree can embed your live stream and chat on its page; Bloopbot's page shows that you're live with a button to watch on Twitch instead. **Do I need a separate account?** No. It comes with your Bloopbot channel; you sign in with Twitch or Kick and edit it under **Public page**. **Does it work for a Kick channel?** Yes. A channel you signed up for with Kick shows your Kick bio and banner, your stream’s title, category and viewer count while you’re live, and a **Watch on Kick** button. The schedule and clips come from Twitch, so they show on Twitch channels. See [your public page](https://bloopbot.com/docs/public-page). **Can I hide the parts I don't use?** Yes. Switch Giveaways, Store, Quotes, Commands or Home off under **Pages**, and choose which Home sections show. **Your prizes** always stays on so winners can claim what they won. **Can an AI assistant set it up?** If you have [connected an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant), you can ask it to arrange your sections, edit your links and gear, or set your fonts. --- # Twitch and Kick chat moderation Bloopbot’s moderation filters, the commands your mods run from chat, and flows that react when a filter acts, with optional AI moderation. ## The filters The filters are settings on the **Moderation** page, not flows, so they apply to every message. Each has its own thresholds, exemptions and response: warn, delete or time out. The six filters are the blacklist, links, caps, symbols, emotes and repetition. Switch each one on when you want it, and watch chat for a while before turning on several at once. The link filter and the blacklist see through disguises: a link spaced or spelled out (`example dot com`), written in look-alike or fancy letters, or broken up with invisible characters. Whatever a filter does, the message it caught is deleted; a first-offence warning only spares the viewer the timeout. ## Your mods, from chat A moderator on Twitch is a moderator to Bloopbot straight away, with nothing to sign in to. | Command | What it does | | --- | --- | | `!permit ` | Lets a viewer post a link past the link filter for a short time | | `!filters enable ` | Switches a filter on; `disable` switches it off | | `!blacklist add ` | Adds a blacklist entry; `-regex` makes it a pattern | | `!nuke` | Runs a bulk moderation job on chat, from the **Mod commands** pack; the **Nukes** page holds its settings | The **Mod commands** pack also brings `!title` and `!game` for your stream information, and controls for the alert queue. `!permit`, `!filters` and `!blacklist` are built in and work without a flow. Anyone below moderator who types `!permit`, `!filters` or `!blacklist` gets no reply at all. Nukes may not be available on your channel yet. ## Flows for the rest - **React when a filter acts.** The **Moderation acted** trigger starts a flow when a filter warns, deletes or times out, and can wait for a number of strikes: tell your mods in chat when a viewer reaches their third. - **React to any ban or timeout.** The **Ban, timeout or unban** trigger fires whoever issued it, including from the Twitch dashboard or on Kick. - **Read what a message means.** An optional AI moderation step looks for harassment, hate speech, sexual content, scams and a rule you write in a sentence. Run it in watch mode for a stream first, and let it act once you trust it. It may not be available on your channel yet — see [set up AI moderation](https://bloopbot.com/docs/ai-moderation). ![The node library’s Groups topic showing Enforce chat rules and Screen reward text, each used by one flow.](https://bloopbot.com/docs/screenshots/node-library-groups.jpg) _The node library’s Groups topic: Enforce chat rules is the group inside the AI moderation template, where you decide what each finding does._ ## Kick chat too The same filters screen Kick chat, on a Kick channel or a Twitch channel with Kick added, with the same thresholds and exemptions. Kick’s moderator, VIP, subscriber, OG and founder badges count like their Twitch equivalents, your Kick moderators can type `!permit`, `!filters`, `!blacklist` and `!whitelist`, and the **Time out** and **Delete message** steps work on Kick messages. Kick times out in whole minutes. **Nukes** and the **Moderation acted** trigger stay on Twitch for now. [Moderate Kick chat](https://bloopbot.com/docs/moderation#kick) has the details. ## Check what happened A flow’s **Run log** shows each path it took. The **Audit log** shows who changed your channel’s settings, and the **Nukes** page lists bulk moderation jobs with their details. **Test fire** simulates a flow’s actions without timing out or banning a real viewer. Moderators you tick on **Team** get their own dashboard to run the stream, and editors you add there can change the filters and flows from their own sign-in, with every editor change recorded under their name — see [share the work with mods and editors](https://bloopbot.com/docs/editors). Editors may not be included on your plan. --- # Control OBS from Twitch flows Run a Twitch chat command or a flow when you switch scenes, go live or start a recording in OBS, and let flows switch scenes, save replays and start or stop recording, with nothing to install. ## Start a flow from what OBS does Flows can start the moment OBS changes: when you switch scenes, start or stop streaming, start or stop recording, pause a recording, or show or hide an overlay. Name a scene to run a flow only when you switch to that scene. Use these to post a chat message when you change scene, or to tidy up when you go live. Your overlay has to be open in OBS as a Browser Source, the same one you already use for alerts or chat. You don't need anything else for these triggers. ## Let flows control OBS To make OBS act, raise the overlay's page permissions in OBS first. Then a flow can switch scenes, set the transition, save a replay, start or stop the replay buffer, start, pause, resume or stop a recording, start or stop streaming, and start or stop the virtual camera. A scene switch usually shows in OBS within about half a second. OBS doesn't confirm every action, so check OBS the first time you use one. ## A BRB command for mods Give your moderators a `!brb` command that switches OBS to your BRB scene. Add a Who can trigger check set to Moderators and up, then a Switch OBS scene step. If the switch fails, the flow can say why in chat. The guide has the full steps: [Control OBS from flows](https://bloopbot.com/docs/control-obs-from-flows#brb). ## Keep the stream in your hands A viewer must never be able to end your stream or turn your camera off. Start and stop steps for streaming, recording and the virtual camera are refused in any flow a viewer can set off, and the editor warns you on the step when that happens. Start your stream from a mods-only command, a Stream Deck button or a control panel instead. --- # Spotify song requests for Twitch Let Twitch chat request songs with !sr or channel points, play them through your own Spotify Premium account, set the limits in one place and show what’s playing in OBS. ## What chat can do The **Song requests** pack installs the commands as flows, so you can rename any of them or change what they say. | Command | What it does | | --- | --- | | `!sr song name` | Requests a song, or a Spotify link. A refused request is answered with the reason | | `!song` | Shows the current track | | `!queue` | Shows the songs coming up | | `!srstatus` | Tells a viewer how full the queue is and what they have in it, or why `!sr` would turn them down | | `!wrongsong` | Takes back the viewer’s last request | | `!skip`, `!remove` | Moderators skip the current song or remove a request | | `!sron`, `!sroff` | Moderators open or close requests for the whole channel | | `!srblock`, `!srunblock` | Moderators keep a track, an artist or a viewer out of the queue, or let them back in | | A channel points reward | Viewers spend points on a song, with the same replies as `!sr` ([set it up](https://bloopbot.com/docs/song-requests#channel-points)) | Requests join your Spotify queue behind whatever you’re playing. Bloopbot never presses play for you, so nothing cuts off the song you and chat are listening to. ## Limits are steps you can see Every request runs through a flow, and the limits live in five variables you change on one page: whether requests are open, how many songs can wait, how many one viewer can hold, how long they wait between requests, and whether the same song can be requested twice. The **Can they request a song?** step checks a request against all five before anything is searched for. A refusal comes with a sentence you can send straight to the viewer, such as `Queue is full (20 songs max). Try again later.` Want a rule of your own, such as a different line for each refusal? The **Check song request limits** step hands each fact to the next step — songs in the queue, songs this viewer has queued, seconds until they may ask again — so you can compare it with a number of your own. See [gate a flow on the limits](https://bloopbot.com/docs/song-requests#check). ![A flow’s Do this step holding a Check song request limits action: its The song to look up field reads $(from.find.uri) with an Insert… menu beside it and help text explaining that only “already in the queue” needs the link, and and, under the opened More options fold, its Wait between requests field reads $(var.song\_wait\_seconds).](https://bloopbot.com/docs/screenshots/song-queue-check-step.jpg) _The Check song request limits step: The song to look up reads the song Find a song settled on, and Wait between requests follows your wait variable._ ## On stream Add a **Now playing** layer to one of your overlays and OBS shows the track that’s playing, the requests coming up next and who asked for each one. It reads the same queue as chat, so a request confirmed in chat appears on screen too. See [put now-playing on stream](https://bloopbot.com/docs/now-playing-in-obs). The screenshot shows the optional **Now playing 2** look. ![Now playing 2 showing Sandstorm by Darude, requested by PixelPal, with the queue hidden.](https://bloopbot.com/docs/screenshots/home-now-playing-panel-v2.jpg) _The Now playing widget on stream: Sandstorm by Darude, requested by PixelPal._ ## Help from AI, if you want it Optional AI steps sit inside the same flows: - **Smart !sr** lets the AI pick the track the viewer meant out of several Spotify results, and screen out troll uploads. - `!findsong` suggests a track from an artist and a clue, such as that Bowie astronaut song, without queuing it. - **Plain-English song requests** lets viewers ask for a song in a sentence, with no `!sr`. - A smarter `!wrongsong` swaps a mistaken request for the runner-up the search found. These may not be available on your channel yet. [Smarter song requests with AI](https://bloopbot.com/docs/song-requests-ai) shows what each one needs. ## Before you start - Spotify Premium on the account you play music from. - Your own Spotify app, which you create for free in Spotify’s developer dashboard; the [guide](https://bloopbot.com/docs/song-requests#connect) walks through it step by step. - Spotify open and playing on the device you stream from. Song requests, channel points requests and your own Spotify app are on every plan, Free included — see [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). The AI helpers above are the part that may not be. ## Common questions **Do viewers need Spotify?** No. A viewer types a song name or pastes a Spotify link; only the account that plays the music needs Spotify Premium. **Can viewers use channel points?** Yes. A reward that asks for text can queue the song the viewer typed, with the same replies as `!sr` and, if you add the check, the same limits; [take requests with channel points](https://bloopbot.com/docs/song-requests#channel-points) shows the flow. **Does it work on a Mac?** Yes. You set it up in a browser and it runs on Bloopbot, so it works the same on Windows, Mac or Linux, with nothing to keep open except Spotify itself. **Does a request interrupt the song that’s on?** No. Requests join your Spotify queue behind the current track, and Bloopbot never presses play. --- # Twitch alerts for OBS: follows, subs, cheers and raids Free custom Twitch alerts for OBS: follows, subs, gift subs, cheers and raids, designed in your browser, played from one queue, and tested in OBS without going live. ## Twitch alerts in OBS Your alerts live on an overlay that Bloopbot hosts. Add that overlay to OBS once, as a Browser Source, and every alert you publish plays there. To test one, press **Test on stream…**. It plays in your OBS scene, so you can try it before you go live, and it posts nothing to chat. [Show alerts on stream](https://bloopbot.com/docs/alerts) covers the design, and [Test alerts and check OBS delivery](https://bloopbot.com/docs/alerts-in-obs) covers the Browser Source. ## Every Twitch alert, one look | Alert | Plays when | | --- | --- | | Follow | Someone follows your channel | | Sub and resub | Someone subscribes, or shares a resub message | | Gift sub | Someone gifts subs, one or many | | Cheer | Someone cheers Bits | | Raid | Another streamer raids you, with their party size | A design is the look, words, picture and sound of an alert. It belongs to your channel, so you can place it on as many overlays as you like and change it once. Make a variation for some events, such as a different look for Tier 3 subs. Sub, gift and cheer alerts need those features on your Twitch channel; every preview and test works without them. On [Kick](https://bloopbot.com/docs/bloopbot-on-kick), follows, subs, resubs and gifted subs play the same alerts, and KICKs play the Cheer alert. Raids are Twitch only. ## Make it look like your stream - Arrange the picture and the words, or place each part of the card freely. - Show the viewer's avatar, or a picture or GIF from your media library. - Choose how it comes in, holds and goes out, and put a frame from your theme around it. - Play a sound, or a short video. Every channel can upload 200 MB of media; paid plans hold more. ![Layout & timing · Shared design in the alert inspector: Picture layout Beside and Image size 128 pixels above On screen 6 seconds, an In 1.5 s / Hold 3 s / Out 1.5 s bar with words at 2 s, and Coming in set to Bounce, direction down, duration 1.5 s and Smooth easing.](https://bloopbot.com/docs/screenshots/alerts-motion.jpg) _An alert's Motion tab: how long it stays on screen, and how it comes in and goes out._ ## One queue, nothing talks over anything Every alert, and every sound or video your flows play, waits in one queue and plays one at a time. While you're live, the **Live** page shows what's playing and what's next, with **Skip**, **Pause**, **Replay** and **Clear**. Your moderators can have the same controls from chat, such as a `!skipalert` command. An alert that waited ten minutes is dropped rather than shown late. ## Test your alerts before anyone follows Preview an alert on the editor's canvas, or press **Test on stream…** to play it in OBS for real, in your queue, without posting anything to chat. You see whether it played or how many alerts are ahead of it. [Test it](https://bloopbot.com/docs/alerts#test) explains each test. ## Common questions **Are the alerts free?** Yes. Alerts, the alert queue and the steps that drive them come with every channel. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). **Do I need to keep an app open?** Only OBS. Alerts are part of an overlay Bloopbot hosts, added to OBS as one Browser Source: [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs). **Can an alert do more than show a card?** Yes. Alerts are played by flows, so a raid can also post a shoutout, a follow can bump a goal bar, and a sub can play a sound only for Tier 3. See [Twitch overlays](https://bloopbot.com/features/twitch-overlays) for what else can react on screen. --- # Twitch chat games with loyalty points Let Twitch chat play slots, roulette, duels, heists and bets with the loyalty points they earn by watching, with every game played out on stream. ## Five games, one pack | Command | The game | | --- | --- | | `!slots 100` | Three reels; a jackpot, bars, cherries or a pair pays out | | `!roulette red 50` | Bet on red, black, odd, even or a number from 0 to 36 | | `!duel @name 100` | Challenge a viewer; they `!accept` and the winner takes both stakes | | `!heist 200` | Chat joins a crew, then the vault opens or the alarm goes off | | `!bets` | Your moderators open a bet, chat picks a side, and winners share the pot | Viewers type `!minigames` for the full list with examples. Each game takes the points it's played for, decides a result nobody can predict, and pays a win straight back to the viewer's balance. ## Played out on stream A **Minigames** layer on your overlay shows each game: a slot cabinet spinning, the roulette ball landing, a duel or a heist in the corner or, if you choose, across the whole screen, and an open bet's odds while it runs. Each moment has its own sound, and the cards take your overlay's theme. The pack adds a ready-made Minigames overlay, so you can paste its address into OBS and go. ![A slots card on the overlay: ArcadeAda’s avatar and a 100-point wager chip above a gold slot cabinet showing three sevens on the payline, JACKPOT ×25, and the payout counting up.](https://bloopbot.com/docs/screenshots/minigames-slots-corner.jpg) _A slots card on stream: the viewer's avatar and wager above a gold slot cabinet._ ## Your rules The games are flows, so you can open any of them and change how much a viewer may bet, how often they may play and how much the house keeps. [Change the limits and the house edge](https://bloopbot.com/docs/points-minigames#limits) shows where. ## Common questions **What do viewers need?** Loyalty points, which they earn by watching once you switch them on. [Reward your regulars with points](https://bloopbot.com/docs/loyalty-and-regulars) covers it. **Is it real money?** No. The games only use your channel's loyalty points. **Can Kick chat play?** Yes. On Kick, or on a Twitch channel with [Kick added](https://bloopbot.com/docs/bloopbot-on-kick), Kick viewers play with their own points. A Kick viewer and a Twitch viewer are separate players, even with the same name. **Can I test it without anyone playing?** Yes. **Simulate** in the overlay editor plays each game on your preview and in OBS without moving points or posting in chat. [Show the games on your overlay](https://bloopbot.com/docs/points-minigames#layer). **What else can chat play with?** [Giveaways](https://bloopbot.com/features/twitch-giveaway-bot), [song requests](https://bloopbot.com/features/song-requests) and a [spin wheel](https://bloopbot.com/docs/spin-wheel). --- # Twitch giveaway bot with chat entry and a panel on stream Free Twitch giveaways: chat enters with a keyword or on the web, mods draw from chat, winners confirm in time, and a panel shows it all on stream. ## Set it up in four steps A giveaway takes four steps, **Prize**, **Entering**, **Winner** and **Review**, and nothing reaches chat until you open it. - **Prize:** name it, add cover art, and choose how many winners. Hand it over in chat, or on a claim page where the winner signs in and collects a key or a gift link. - **Entering:** a keyword such as `lucky`, the giveaway's own web page, or both. Keep it to followers, chosen roles or a watch-time minimum, charge loyalty points per ticket, and give subs, VIPs or regulars better odds. - **Winner:** the winner types a confirm word, `!claim` to start with, within the time you set, or someone else is drawn. Or skip the confirmation. - **When:** open and close it yourself, or on a schedule. ## Your mods run it from chat | Command | What it does | | --- | --- | | `!giveaway open` | Opens a giveaway | | `!giveaway close` | Stops entries | | `!giveaway draw` | Draws the winners | | `!giveaway reroll` | Redraws a winner | | `!giveaway confirm name` | Confirms a winner for them | | `!giveaway` | Says where the giveaway stands | Each command is its own flow, so you can change one, or let VIPs draw too, without touching the rest. Only you can cancel a giveaway, which refunds the points. [Run it from chat](https://bloopbot.com/docs/giveaways#chat) lists every option. ## On stream A **Giveaway** layer on your overlay shows the prize and its cover art, the keyword, the entries as they come in, and the winners waiting to confirm. It can draw with a spinning wheel of entrants. [Put the giveaway panel on stream](https://bloopbot.com/docs/giveaways#panel) shows how. ![The giveaway panel just after the draw: the same prize and cover art, then two winner slots, each with the winner’s name and “55s to confirm” beside it, above the list of the five entrants.](https://bloopbot.com/docs/screenshots/giveaway-panel-overlay.jpg) _The giveaway panel just after the draw: the prize and cover art, then two winners waiting to confirm._ ## Common questions **Is it free?** Yes. Giveaways are included on every plan, including several winners and entering from the web. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). **Can viewers enter without typing in chat?** Yes. Tick **Web** and the giveaway gets its own public page where viewers sign in with Twitch and enter. [Let viewers enter from the web](https://bloopbot.com/docs/giveaways#web). **Can I give away a list of keys one at a time?** Yes, with a [prize pool](https://bloopbot.com/docs/prize-pools): a moderator command hands out the next key, no draw needed. --- # Free Twitch overlay and chat overlay for OBS A free Twitch overlay for gameplay, just chatting, starting soon and BRB, with a Twitch chat overlay, alerts, goals and music built in. Hosted for OBS as one Browser Source. ## A whole layout, not just a frame Each ready-made overlay is a complete scene drawn in your theme. Add one, then move, restyle or remove any part of it. | Overlay | What's on it | | --- | --- | | Gameplay | A camera frame with your name, a goal, polls and predictions, chat and alerts, around your game | | Just chatting | A big camera frame with a topic line, supporters, a goal, chat and alerts, on its own backdrop | | Starting soon | A welcome line, a five-minute countdown, what is playing, chat and alerts | | Be right back | A five-minute countdown, a status line, top gifters, chat and alerts | | Stream ending | A thank-you, when you are next live, top gifters and rolling end credits | Switch your theme and every overlay changes with it: text, panels, camera frame and backdrop. [Start from a ready-made overlay](https://bloopbot.com/docs/widgets-in-obs#templates) shows how to add one. ## Overlays that know what's happening A static PNG can't tell anyone who just followed. Bloopbot's overlays are connected to your channel, so they show it as it happens: - [Alerts](https://bloopbot.com/features/twitch-alerts) for follows, subs, gifts, cheers and raids, playing one at a time from one queue. - A Twitch chat overlay: the [chat box](https://bloopbot.com/docs/chat-box) shows your live chat with emotes and badges, and can show Twitch and Kick chat together. Plus [goal bars](https://bloopbot.com/docs/widgets-in-obs#drive-from-flows), an event list, a countdown and a supporter ticker. - [Now playing](https://bloopbot.com/docs/now-playing-in-obs) for song requests, a [giveaway panel](https://bloopbot.com/features/twitch-giveaway-bot) and [chat games](https://bloopbot.com/features/twitch-chat-games) on stream. Your flows can drive them too: a `!deaths` command can bump a counter on screen, and a raid can show a layer and hide it again. ![The canvas of an overlay drawn over a sample game backdrop: a follow alert reading “Ada just followed” inside its layer at the top right, and the selected chat layer at the bottom left with a chat line from PixelPal, carrying its name as a filled blue pill, its outline and corner handles, and a toolbar under it with Duplicate, Hide and Remove…; nothing else on the canvas has a box around it.](https://bloopbot.com/docs/screenshots/widget-surface-canvas.jpg) _An overlay in the editor over a sample game: a follow alert, a chat box and the layers that make it up._ ## Add it to OBS once Every overlay has its own address. Add it to OBS as a Browser Source at 1920 × 1080, and every change you publish appears there by itself, with nothing to re-import. [Add the Browser Source](https://bloopbot.com/docs/widgets-in-obs#obs) walks through it. ## Make your own Twitch overlay The overlay maker is in your browser. Start from an empty overlay and add layers from the **Add** tab, or [write your own in HTML, CSS and JavaScript](https://bloopbot.com/features/custom-twitch-overlays) beside a live preview. On Pro, you can also [describe one to Claude or ChatGPT](https://bloopbot.com/features/ai-twitch-overlay-maker) and let it build the draft for you to publish. ## Common questions **Are the overlays free?** Yes. Overlays, alerts and themes work on every plan, and no plan limits how many overlays you build. Paid plans hold more themes and more media storage. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). **Does it show my camera?** An overlay frames your camera but never shows it. Put your camera source above the overlay in OBS and size it to the frame. **Do I need to keep a program open?** Only OBS. Bloopbot hosts the overlay and your alerts and commands run on its servers. --- # Viewer questions for Twitch streams Keep the questions viewers ask in Twitch chat, answer them from one page, show the one you are answering on your stream overlay, and let a FAQ answer the ones you have already covered. ## Keep the questions that matter Viewers ask good questions in chat, and most of them scroll away before you see them. **Catch viewer questions** watches chat for genuine questions to you, such as "what game is this?" or "how long have you been streaming?", and saves each one to your **Questions** page. Chatter like "lol why", or a reply to someone else, is left alone, and nothing is posted back to chat. It uses the **AI: chat means…** trigger, so it needs that feature on your channel. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows whether it is there. ## Answer from one page The Questions page lists every waiting question in order. Press **Answered** to take one off the list, or **Dismiss** for a question you will skip. Your moderators can run the page too, so they can pick the next question while you keep talking. ## Show the question on your overlay Put one question on your overlay while you answer it, so viewers can see what you are talking about. Mark it answered when you are done and it leaves the overlay, with the next one still waiting on the page. The guide covers the full set of steps and the overlay setup in OBS: [Catch viewer questions](https://bloopbot.com/docs/catch-viewer-questions). ## Let a FAQ answer the repeat questions Many questions come back every stream: when do you stream, what is your Discord? **AI: answer from your FAQ** lets chat get those answers without a command. The AI chooses which of your own FAQ entries answers the question and checks that the entry really covers it. The reply is the text you wrote, and when no entry is a clear match, nothing is posted. It needs Judge and route nodes on your channel. [AI conditions and routing](https://bloopbot.com/docs/ai-conditions-and-routing#faq) explains the setup. ## Build your own question command Prefer a command viewers type on purpose? A `!q` command can save a question to the same page. Flows are the way to build it, and the guide walks through a worked Q&A stream. --- # Get started with Bloopbot Connect your channel, choose the tools you want, and learn as you use them. Includes guided setup and the earlier Pebble setup course. Updated 21 October 2026 ## 1. Connect your channel Open [the dashboard](https://bloopbot.com/admin) and sign in with the Twitch account that owns your channel. Review Twitch’s permissions and complete sign-in. Your channel opens on **Home**. If you see **What would you like your stream to do?**, [choose your own starting point](https://bloopbot.com/docs/getting-started#guided-setup). A channel using the earlier setup starts **Set up your bot** with Pebble, Bloopbot’s robot. Stream on Kick? Choose **Sign in with Kick** instead, or add Kick to your Twitch channel later. [Use Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick) covers both and what works where. If an AI assistant is helping you join, ask it to read [Bloopbot’s signup guide for agents](https://bloopbot.com/auth.md). It guides you to the same sign-in; you review permissions and sign in yourself. Your sign-in stays in your browser, and joining does not give the assistant an API key. If you help with someone else’s stream, sign in with your own account after they add you as an editor or tick you as a moderator, using the helper link they send you. Choose their channel from **Channels**. To use a different Twitch account, [sign out and switch accounts](https://bloopbot.com/docs/troubleshooting#switch-account). In a short desktop window, scroll the middle of the sidebar to reach lower pages; the channel at the top and **Marketplace**, **Settings**, **Help**, **Account** and **Sign out** at the bottom stay where they are. **Docs and guides** is in the **Help** menu. To find a page, a setting or a guide without hunting, select **Find anything** under the channel, or press **⌘K** on a Mac or **Ctrl K** elsewhere, and type what you want, such as `alerts` or `twitch account`: [Find anything](https://bloopbot.com/docs/find-your-way#find) shows what it can do. > **If sign-ups are closed** > > New channels can’t always join. When the homepage button reads **Sign-ups are closed right now**, a channel that isn’t connected yet can’t be added, and **Link Channel** in the dashboard says the same. Check back later. If your channel is already connected, use **Sign in** at the top of the homepage as usual; editors sign in the same way to reach the channels they help with. ## Choose your own starting point Guided setup starts with the tools you choose. If Home already asks **What would you like your stream to do?**, choose a starting point below. If Home shows **Use guided setup**, the channel owner can choose it to switch experiences. During the earlier required course, choose **Choose my own setup** on Pebble’s card instead. Your existing commands, widgets, settings, progress and earned stickers stay yours. Channels keeping the earlier setup continue with [Set up your bot](https://bloopbot.com/docs/getting-started#setup) below. ![The older required setup course offers Choose my own setup while preserving existing tools and tutorial progress](https://bloopbot.com/docs/screenshots/onboarding-switch-setup.jpg) _Choose my own setup leaves the earlier required course without marking it complete._ 1. Choose a tool directly, such as **Make a chat command** or **Set up song requests**. Bloopbot saves that goal and opens its normal page. It does not create or enable the tool for you. 2. Or describe what you want under **Tell Jev what you have in mind**. For example: “Song requests first, a follower alert, and keep points on my other bot.” Press **Find my starting point**. This assistance does not use your plan’s AI credits. 3. Review **Make this setup yours**. Remove anything you do not want, choose **Add another tool**, and check **Leave out of this setup**. Choose **Do this first** beside one task, then press **Save setup goals**. Jev’s suggestions stay suggestions until you save. 4. Choose **Continue** on Home. Setup opens the normal feature page, where optional [task help](https://bloopbot.com/docs/tutorials#task-help) explains the trigger, action, prerequisites and how to make a small change. Use the feature’s own controls to save, preview, enable or pause it. ![Guided setup on Home with an optional description for Jev and direct choices for commands, loyalty, alerts, songs, giveaways and timers](https://bloopbot.com/docs/screenshots/onboarding-entry.jpg) _Choose a tool directly or tell Jev what you want to set up. Your normal dashboard remains available._ If you are unsure, choose **Not sure? Show examples**, then **Try sample**. Samples explain what a viewer does and what the bot does next; they do not send messages or change your channel. **Set up** opens the real tool when you are ready. **Browse every tool** includes all available feature families, optional packs and supporting pages. Search for a familiar word such as `Spotify`. You can also use **Find anything** and search `guided setup` to return to Home, or go straight to a feature page and choose **Open setup help**. There is no required chat with Jev. If assistance is unavailable, direct choices and the guides still work. Your setup can have up to 12 goals with one next task. **Your other goals** lets you switch tasks; **Edit setup goals** changes the list. These choices do not remove your feature records. **Done for now** quiets setup without pausing tools; **Resume guided setup** brings it back. Under **How would you like help?**, choose short explanations, guided help or help only when you ask. For a new channel using guided setup, Bloopbot does not add Starter flows or My alerts for you. Loyalty starts off when you first open it; enable earning only if you want it. Existing channels keep their current settings. After unlinking and returning, Bloopbot remembers this setup experience, while your member goals and preferences start fresh. A saved goal, an enabled tool, a preview and an observed real run mean different things. Home reports what the tool can currently confirm. A test is not proof of delivery to viewers, and completing an explanation is not proof of live use. ## 2. Set up your bot **Set up your bot** is the earlier setup experience for channels using the required course. It takes about five minutes and ends with your alert playing on your own stream. Pebble runs it over your real dashboard: Pebble rings the control you need and says what to do. Everything is already made for you. You switch it on and connect it. 1. **Your commands.** Turn on the Starter commands, and bring over what you had on Nightbot or StreamElements. 2. **Your alerts.** Meet _My alerts_, an overlay that is already made and published. 3. **Put it on stream.** Add it to OBS Studio, Streamlabs or Meld as a Browser source. 4. **Make your bot a mod.** Type one line in your Twitch chat. 5. **Test it.** Press one button and watch your alert play. Set up your bot is required, so it has no pause and no **Never show again**. Pebble keeps your place, so you can close the tab, reload or carry on from another device and land on the same step. Only the channel’s owner sees it: editors, helpers and moderators go straight to the dashboard. Pebble counts your steps (“3 of 5”) and says about how long is left. ![Set up your bot, step 1 of 5, on the Flows page: the sidebar at the left, Starter's card with its Turn all on button ringed, and Pebble's card saying 1 of 5, about 5 min left, Press Turn all on to switch them on, with a track of the five steps (Commands, Alerts, On stream, Mod, Test) and a Do it for me button.](https://bloopbot.com/docs/screenshots/setup-step.jpg) _Set up your bot, step 1: Pebble rings Starter’s card and asks you to press Turn all on._ Two steps need your streaming computer and your Twitch chat, which might not be the device in front of you. Steps 3 and 4 have an **I’ll do this on my streaming PC** button. Choose it and Pebble moves on; those steps wait for you under [Next steps](https://bloopbot.com/docs/getting-started#next-steps). On a phone Pebble shows that button first, because OBS and your Twitch chat are on another device. On Kick the bot isn’t made a moderator, so there is no step 4 (“1 of 4”), and there are no commands to bring over. > **Channels linked before Set up your bot** > > If your channel was linked before this arrived, Pebble offers **Your first flow** and then **Your first overlay** instead, as [the tutorials guide](https://bloopbot.com/docs/tutorials#first-run) describes. Overview shows the same Next steps card. ## Setup step 1: Your commands Your channel arrives with the **Starter** pack installed but paused: greetings for new followers and first-time chatters, `!so`, `!clip`, quotes, a death counter and more. Pebble takes you to **Flows** and lights up Starter’s card. Press **Turn all on** (or **Do it for me**) and they start answering in your chat. The step finishes when they are on. If you used Nightbot or StreamElements before, Pebble looks your channel up there. When it finds commands that aren’t here yet it asks, “You had 12 commands on Nightbot. Want them here too?” Press **Do it for me** to bring them over, so what your chat already types keeps working, or **Not now** to leave them. You can bring them over later from **Tutorials**. See [Coming from Nightbot](https://bloopbot.com/docs/coming-from-nightbot#import) or [Coming from StreamElements](https://bloopbot.com/docs/coming-from-streamelements#import). Change any words you like afterwards: the flows are yours, and Pebble’s **Edit a starter flow** tutorial shows how. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: packs first, then every flow on its own._ ## Setup step 2 and 3: Your alerts, on stream Pebble opens **My alerts** in Studio. It is an overlay with alerts ready for new followers and subs, already published, and the follow alert plays on the canvas. Look at it, then press **Next**. (If it couldn’t be made when you signed in, Pebble offers **Do it for me**.) Then put it on stream: 1. Tell Pebble what you stream with: **OBS Studio**, **Streamlabs** or **Meld**. 2. Press **Copy** on the **Browser source URL** in Pebble’s card. 3. In your streaming app, add a **Browser** source, paste the address and set it to **1920 × 1080**. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) has the click-by-click for each app. Pebble notices the moment your app opens the overlay and moves on. If it doesn’t, it says what it can see: nothing open yet, or something open that isn’t this overlay. The address is private to your channel, so keep it off stream, and do not post it. If your streaming app is on another computer, choose **I’ll do this on my streaming PC**. ## Setup step 4: Make your bot a moderator Copy the `/mod` command Pebble shows and send it in your own Twitch chat. Use the account name shown, especially if you linked [your own bot account](https://bloopbot.com/docs/bot-account). Pebble notices when Twitch lists the bot as a moderator. ``` /mod your_bot_username ``` Until the bot is a moderator, flows that need one are paused and loyalty payouts wait ([what pauses](https://bloopbot.com/docs/flow-basics#bot-mod)), so every page of your dashboard shows a **Not a mod** bar with the same command and a copy button. Refresh your dashboard after sending it. Everything resumes by itself once Twitch lists the bot. You can choose **I’ll do this on my streaming PC** and send it later. If you go live without doing it, or a moderation action fails because the bot is not a moderator, Bloopbot reminds you in Twitch chat with your bot’s exact command. Both reminders share one 24-hour cooldown for your channel. ## Setup step 5: Test it Pebble takes you back to Studio and asks you to press **Test published output…**. Confirm the test, then watch and listen in your streaming app. If you put step 3 off, the step uses **Test in editor** instead, which plays the draft on the canvas only. Pebble says “You’re live-ready.” and your **Overview** shows Next steps. ## 3. Go on with Next steps **Next steps** is a card at the top of **Overview**, for owners and editors, that leads from the easy things to the advanced ones. Each item starts one of Pebble’s tutorials, and you can skip any step of it. A tick means you have finished that tutorial. The first group with something left is open, and the rest are folded up with a short summary. An item that waits for another tutorial, or for something your channel doesn’t have yet, shows what it needs in place of its **Start** button. ![The Next steps card on Overview: a count and meter, Finish setup open with Put your alerts on stream (a filled Start button) and Make your bot a mod, then Make it yours (with its starter flows already switched on), Build your own and Go further folded up with a summary and a count.](https://bloopbot.com/docs/screenshots/next-steps.jpg) _The Next steps card on Overview: Finish setup first with its two put-off steps, then groups for making it yours, building your own and going further._ - **Finish setup** appears only if you put a setup step off, and an item leaves it by itself once the step is done another way (the bot made a mod from the **Not a mod** bar, your alerts opened in your streaming app). It holds **Put your alerts on stream** and **Make your bot a mod**, with the first as the one filled button. - **Make it yours** has **Switch on your starter flows** (ticked for you once you finish Set up your bot, whose first step does the same), **Edit a starter flow**, **Give an alert its own sound** and **Add a sub alert**. The sub alert is listed for Twitch Affiliate and Partner channels, because subscriptions come with those. - **Build your own** has **Your first flow**, **Your first timer** and **Channel points alert**. - **Go further** has **Add a goal bar**, **Your first control panel**, **Share your public page** and **Invite a helper**. The header counts what you have done (such as “3 of 11 done”) and folds the card away. When everything is done it shrinks to one line, “All done.” Pebble may offer an item you haven’t done, at most once a day and only when it fits where your channel is, and doesn’t repeat an offer you dismissed. While there is something left, the marketplace, Discord and plan cards sit below it. Every tutorial is also on **Tutorials** in the sidebar’s **Help** menu: [Learn Bloopbot with Pebble’s tutorials](https://bloopbot.com/docs/tutorials). ## 4. Build your first flow Everything Bloopbot does is a flow: a trigger that starts it, optional checks, and actions. **Your first flow**, under **Build your own**, builds a chat command from nothing, on the real pages: 1. Press **Start** next to **Your first flow**. Pebble takes you to **Flows** and shows the three parts of a flow. 2. Press **New flow**, then **Start blank**. 3. On the canvas, click **Chat command** under **Suggested next** and type `lurk` in the **Command** box. Pebble suggests `brb` or `hug` instead if your channel already has `!lurk`. Press **Save**. 4. With the trigger selected, click **Chat message**, write a reply such as `Thanks for hanging out, $(user)!`, and press **Save**. 5. Press **Test fire** for a dry run and look at the Run log, then press the **Live** switch. 6. Type your command in your own Twitch chat and watch the bot answer. You can skip this step and try it later. ## 5. Make it yours To start a command from a template instead: 1. Open **Flows** and choose **Marketplace** to install **Simple command**. 2. Set the command to `hello` with prefix `!`. Change its message to something that sounds like you. 3. Press **Save**. Use **Test fire** to inspect a dry run in the Run log. 4. Make sure the flow is live, then type `!hello` in Twitch chat to check the real reply. Follow [the full command guide](https://bloopbot.com/docs/first-command) for aliases and personalised replies. For more, use **Flows → Marketplace** to add packs or single flows. To choose how viewers earn points, open [Loyalty](https://bloopbot.com/docs/loyalty-and-regulars#points); earning starts off for new guided-setup channels; channels using the earlier setup start with points on. ## 6. Go live Before your first stream, Pebble offers **Ready to go live**: it checks your overlay has an alert open in your streaming app, tests an alert, checks the bot is a moderator and no flow is stuck, then shows you **Live**, your page for during a stream. Start your stream in OBS, switch on the flows you want and watch **Live**. The **Overview** shows the same state at a glance: whether the stream is online, how many flows are on and anything that needs attention. ## Before you go live - Open **Home**. It shows whether the stream is online, how many flows are on and anything that needs attention, and links to the page that fixes it. - Check that the right channel is selected. - Keep only the flows you want enabled. Two flows listening for the same command can both reply. - If you use OBS, open the scene with your widgets and check delivery before streaming. - If something does not run, start with **Flows → Needs attention**. - Add a backup sign-in email under **Account**, in case you ever can’t sign in with Twitch. [Keep a backup way to sign in](https://bloopbot.com/docs/backup-sign-in-email) shows how. - Stuck, or want to see what others have built? Join the [Bloopbot Discord](https://discord.gg/CANzH5SVpN) and ask in **#help**. [Ask in the Bloopbot Discord](https://bloopbot.com/docs/troubleshooting#ask) covers what to include. --- # Moderate Twitch chat with no mods Let Bloopbot cover chat when nobody else is watching it: spam filters that are on from the start, timeouts that grow on their own, and a flow that handles follow-bot raids. Updated 14 October 2026 ## The short answer Bloopbot moderates your Twitch chat when you have no moderators. Its spam filters are on from the start, it warns a viewer the first time and times them out for longer each time after that, and a ready-made flow switches on Twitch Shield mode when a follow-bot raid hits. It runs on Bloopbot's servers, so it keeps working while you are busy playing, and there is nothing to install. Setting it up takes about ten minutes, and it works on every plan. You need: - Your Twitch channel connected to Bloopbot ([Get started](https://bloopbot.com/docs/getting-started)). - The bot made a moderator in your chat ([step 1](https://bloopbot.com/docs/moderate-without-mods#bot-mod)). Without it, Bloopbot can't delete a message or time anyone out. ## 1. Make the bot a moderator Until the bot is a moderator, the dashboard shows a **Not a mod** bar, and the flows that need it are paused. 1. Copy the `/mod` command from the bar. It includes your bot’s account name. 2. Send it in your own Twitch chat, signed in as the channel owner. 3. Refresh your dashboard. The bar goes away once Twitch lists the bot as a moderator. ![The Flows page bar: 2 flows are paused until the bot is a moderator in your chat, with the /mod command and its copy button](https://bloopbot.com/docs/screenshots/flows-paused-bot-mod.jpg) _The bar across your dashboard until the bot is a moderator, with the /mod command and its copy button._ ## 2. Check the filters Open **Moderation**. On a new channel every filter is already on, with settings that suit most small channels. If you saved this page before, your own choices stay as you left them. | Filter | What it catches to start with | | --- | --- | | Links | Any link except Twitch's own, including links disguised as `example dot com`, written in look-alike letters or broken up with invisible characters | | Blocked words | Words and phrases you add. It starts empty, so it does nothing until you add some | | Caps | A message with 8 letters or more, over 70% of them capitals | | Symbols | A message of 8 characters or more that is over 50% symbols | | Emotes | More than 15 emotes in one message | | Repetition | A character repeated 10 times, a word repeated 5 times, or a long message that mostly repeats itself | 1. In **Blocked words** at the top, type the words your chat should never see and press **Block**. Separate several with commas to add them at once. 2. Under **Link Whitelist**, add any website your viewers may share, such as your Discord's domain. 3. Switch off any filter your chat doesn't need. An emote-heavy community might switch off **Emotes**. 4. Press **Save**. What happens when a filter catches a message: the message is deleted and, the first time, the viewer gets a warning in chat. After that, each catch times them out for longer: 5 seconds, then 1 minute, 10 minutes and 1 hour. A viewer's strikes fade after an hour. **Escalation Settings** on the same page changes the steps. Subscribers skip every filter except **Blocked words**, and moderators skip them all; each filter's **Exempt Level** changes that. A link in a command one of your flows answers, such as `!sr` with a Spotify link, gets past the link filter, because that command's own checks decide what it takes. ## 3. Stop follow-bot raids A follow-bot raid is dozens of brand-new accounts following you within a minute, often before a wave of abuse in chat. No filter can see it coming, so a flow does it. 1. Set up Shield mode on Twitch first: in your Twitch moderator view, open **Shield Mode** settings and choose what it restricts. Bloopbot only switches it on and off. 2. Open **Flows**, press **Marketplace** and choose **Follow-bot protection**. 3. Press **Add 1 flow — paused**, open the **Follow-bot lockdown** flow, read it once and switch it on. When at least 20 accounts follow within 60 seconds and most of them are under a week old, the flow turns Shield mode on, posts a calm announcement and turns it off again 10 minutes later. [Stop a follow-bot raid](https://bloopbot.com/docs/moderation#follow-bots) covers every setting. ## 4. Let AI read chat for you Filters catch patterns. They can't tell that a polite-looking message is harassment or a scam. The **AI moderation filter**, on Pro, is a step you put in a flow that reads each message for harassment, hate speech, sexual content, scams and spam, and a rule of your own. Start with the watch-only flow, which acts on nothing, read its run log after a stream, then let it delete and warn. [Set up AI moderation](https://bloopbot.com/docs/ai-moderation) walks through it. ## When someone can help When a regular you trust offers to help, make them a moderator on Twitch. Bloopbot treats them as one straight away: they can `!permit` a viewer to post a link, switch filters on and off with `!filters` and edit the blacklist from chat, with no sign-in. Tick them on **Team** to let them into your dashboard as well. [Share the work with mods and editors](https://bloopbot.com/docs/editors) lists what they can do. ## Check it's working 1. Ask a friend who isn't a subscriber or a moderator to post a link such as `example.com` in your chat. 2. The message disappears and the bot replies _Links are not permitted without permission._ 3. Ask a moderator, or type yourself, `!filters`. The bot lists each filter and whether it is on. ## Troubleshooting - **Nothing gets deleted.** Check the bot is a moderator ([step 1](https://bloopbot.com/docs/moderate-without-mods#bot-mod)) and the filter is on. The viewer may be exempt: subscribers skip every filter except the blacklist. - **A link you're happy with keeps getting deleted.** Add its website under **Link Whitelist**, or have a moderator `!permit` the viewer for a minute. - **The warnings are too noisy.** Turn on a filter's **Silent Mode (no warning message)**: the message is still deleted, without a reply. - **Shield mode stayed on after a raid.** Turn it off in Twitch. [Stop a follow-bot raid](https://bloopbot.com/docs/moderation#follow-bots) explains why that can happen. - **You want to see what happened.** Every flow's **Run log** shows its path, and **Audit log** shows who changed your settings. --- # Make a custom Twitch overlay with HTML and JavaScript Write your own Twitch overlay in HTML, CSS and JavaScript beside a live preview, make it react to raids, follows and subs, and put it in OBS without hosting anything. Updated 22 October 2026 ## The short answer In Bloopbot you write a custom Twitch overlay in HTML, CSS and JavaScript (or TypeScript) beside a live preview, connect it to raids, follows, subs, cheers and your own channel variables, and show it in OBS through one Browser Source. Bloopbot hosts it and sends it the events, so there is no server to run, no build step and no Twitch API key to manage. This guide builds a raid card that shows the raider's name and party size. You need: - Your Twitch channel connected to Bloopbot ([Get started](https://bloopbot.com/docs/getting-started)). - An overlay to put it in. Make one on **Overlays** if you have none ([Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs#choose)). - OBS on the computer you stream from. - Some HTML and CSS, or a [connected AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant) to write it with you. ## 1. Open the code beside the preview 1. Open **Overlays**, then **Open in Studio** on your overlay. 2. Choose **Add**, then press **New widget** at the foot of **Add**. Your widget is kept on the **Widgets** page, so you can put it on other overlays later ([Reuse your widgets in every overlay](https://bloopbot.com/docs/your-widgets)). 3. Select the new layer and press **Edit widget code** in the **Widget** section. The workspace has **HTML**, **CSS** and **TypeScript** tabs on one side and the preview on the other. Plain JavaScript is valid TypeScript, so you can write either. **Auto-run** refreshes the preview a moment after you stop typing. The starter is already a raid card; you can edit it or replace it. ![Studio’s expanded code workspace with TypeScript on the left, the Script language choice in the toolbar, and a raid card, playback and event simulation on the right.](https://bloopbot.com/docs/screenshots/studio-graphics-code.jpg) _The code workspace: the script on the left, the graphic's preview, playback and sample event on the right._ ## 2. Write the card In **HTML**: ```
Someone is raiding with 0 viewers!
``` In **CSS**, style it as you like, for example: ``` #card { font: 700 40px system-ui; color: white; background: #6441a5; padding: 24px 32px; border-radius: 16px; opacity: 0; } ``` In **TypeScript**, show the card when a raid arrives and hide it again after a few seconds: ``` bloop.onEvent("raid", (event) => { document.querySelector("#name").textContent = event.name; document.querySelector("#viewers").textContent = String(event.viewers); bloop.timeline() .to("#card", { opacity: 1, duration: 0.4 }) .to("#card", { opacity: 0, duration: 0.4 }, 5); }); ``` `bloop.timeline()` is a GSAP timeline that follows the preview's clock. The starter already ticks **GSAP** under **Data & settings → Libraries**; keep it ticked. CSS animations work without it. ## 3. Choose what it listens to Your code hears only the events you tick. 1. Open **Data & settings**. 2. Under **Events**, tick **raid**. The starter has it ticked already. **follow**, **sub**, **resub**, **gift** and **cheer** work the same way. 3. Choose **Back to Studio**. In the layer’s settings, **Triggered by flows** lists a flow for each event. If **raid** says **Needs a flow**, choose **Set up flow**. A flow is what delivers a Twitch event to your overlay, so you can add a check in it later, such as showing the card only for raids over 10 viewers. To show a number that changes, such as a death counter, tick it under **Variables** and read it with `bloop.onVariables()`; [connect data and expose settings](https://bloopbot.com/docs/author-custom-graphics#data) shows how. ## 4. Test it without going live 1. In the workspace, under **Simulate an event**, choose **raid**. The sample is `{"name":"Sample raider","viewers":42}`; change the name or the number if you like. 2. Press **Play preview**. The card should show _Sample raider is raiding with 42 viewers!_ and fade away after five seconds. 3. Check **Output** if nothing happens: it shows script errors and anything that failed to load. **Preview failed** means the code could not start; **Preview needs attention** means a callback failed while the preview was running. Correct the reported line and press **Run code** to try again. Simulated events stay in the preview. They don't reach Twitch, your flows or OBS. ## 5. Put it in OBS 1. Choose **Back to Studio**, place and size the layer on the canvas, and press **Publish**. Review the queued flow for **raid** and choose **Create and switch on**. 2. If this overlay isn't in OBS yet, copy its address from **Overlays** and add it to OBS as a **Browser Source** at 1920 × 1080, as [Add the Browser Source](https://bloopbot.com/docs/widgets-in-obs#obs) shows. An overlay already in OBS picks up the new layer by itself. 3. To see it in OBS before a real raid, open **Simulate** on the Studio canvas and, under **Test events**, tick **Also play on the live overlay in OBS — viewers will see it**, then play a raid. If you are live, your viewers see the test too. The card now plays on stream every time someone raids you. ## Prefer your own HTML file? To keep the file on your own computer and point OBS at it, use a custom overlay instead: Bloopbot gives you a starter file and a private address that sends it the events you choose. [Connect your own HTML overlay](https://bloopbot.com/docs/custom-widgets) walks through it. A custom graphic in Studio is easier to share, because it can go in a pack or on the Marketplace. ## Troubleshooting - **The preview stays blank.** Open **Output**. A script error or a library you use but haven't ticked under **Libraries** shows there. After fixing it, press **Run code**. On Studio's canvas, a failing layer shows its name, reason and line beside the canvas; press its **Restart** button to retry only that preview layer. Restarting a preview does not send anything to the live overlay in OBS. - **An animation jumps or a random layout changes when you seek.** Use `bloop.onTick()`, `bloop.schedule()` and `bloop.timeline()` so it follows the preview clock. For repeatable visual choices, use `bloop.random(key)` or `bloop.shuffle(items, key)` with a stable event or round key. The [Custom graphics API](https://bloopbot.com/developers/graphics#animate-on-the-clock) shows how. - **A hidden source uses too much drawing time.** `bloop.canvas()` pauses its drawing while hidden. For your own PixiJS or Three.js renderer, check `bloop.visibility.visible` before drawing and keep the event handling running. Untick OBS's **Shutdown source when not visible** if the page needs to keep working while hidden. - **A font, picture or script from another website doesn't load.** Graphics run in a sandbox that blocks remote scripts and media. Google Fonts load, pictures from other websites load through `bloop.loadImage()`, and your own files go in your [media library](https://bloopbot.com/docs/choose-and-upload-media). [Author a custom graphic in Studio](https://bloopbot.com/docs/author-custom-graphics#data) lists what is allowed. - **It works in the preview but not on stream.** Check you pressed **Publish** and switched on the raid flow, and that the scene with the Browser Source is showing. [If you cannot see anything](https://bloopbot.com/docs/widgets-in-obs#check) has more checks. - **Every method and limit:** the [Custom graphics API](https://bloopbot.com/developers/graphics). --- # Build a Twitch bot without code Make chat commands, alerts and timers by connecting steps on a visual canvas in your browser, with no scripts, no templates to memorise and nothing to install. Updated 7 October 2026 ## The short answer Bloopbot is a no-code Twitch chat bot: every command, alert and timer is a visual flow you draw in your browser, made of a trigger, optional checks and actions, instead of a script or a line of `$(variables)` to get exactly right. It runs on Bloopbot's servers, so it keeps answering chat when your PC is off, and it can bring over the commands you already have in Nightbot or StreamElements. The Free plan holds 15 flows you build or change yourself, and ready-made packs add more without counting. You need your Twitch channel connected to Bloopbot ([Get started](https://bloopbot.com/docs/getting-started)). ## How a flow works Every flow answers three questions, in order: | Part | Question it answers | Example | | --- | --- | --- | | Trigger | When should this start? | Someone types `!hug` | | Check | Should it carry on? | The command wasn't used in the last 30 seconds | | Action | What should happen? | Send a chat message | A flow in a straight line edits as a short form, the **Simple** view. Switch to **Canvas** to see the same flow as connected cards, when you want branches, more checks or several actions. ## 1. Make a command from a form 1. Open **Flows**, then **Packs → Starter**, and open **Simple command**. 2. Set **Command** to `hug`. Leave the prefix as `!`. 3. Under **Do this → Message**, enter `$(user) gives $(1) a big hug!`. `$(user)` is whoever typed the command and `$(1)` the first word after it. 4. Press **Save**. ![Simple command in Simple view with hello, Twitch and Kick selected, no conditions and a personalised greeting message.](https://bloopbot.com/docs/screenshots/simple-command.jpg) _A command in the Simple view: what starts it, any checks, and the reply._ [Create your first chat command](https://bloopbot.com/docs/first-command) covers aliases, replies and the words after a command. ## 2. Add a check on the canvas 1. In the same flow, choose **Canvas** in the top bar. The trigger and the reply are two connected cards. 2. Use **Add a node** and search for _cooldown_. Choose **Cooldown** and drop it on the line between the two cards. 3. Set it to 30 seconds and press **Save**. Now `!hug` answers at most once every 30 seconds. Other checks work the same way: **Who can trigger** makes a command moderators-only ([Make a command moderators-only](https://bloopbot.com/docs/permissions-and-cooldowns#permissions)), and a condition can send chat one way or another depending on what happened. ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _The same kind of flow on the canvas: a Chat command trigger connected to a Chat message action._ ## 3. Start from ready-made flows You don't have to draw everything. **Starter** arrives paused for channels using the earlier setup; a new [guided-setup channel](https://bloopbot.com/docs/getting-started#guided-setup) chooses the individual flows or pack it wants. Starter offers greetings for new followers and first-time chatters, `!so`, `!clip`, quotes, a death counter and more. **Marketplace** on the Flows page has packs for loyalty points, giveaways, song requests, moderation helpers and more, from Bloopbot and from other streamers. A built-in pack's flows don't count toward your plan until you change one. [Use templates and flow packs](https://bloopbot.com/docs/templates-and-packs) explains how to add and update them. ## 4. Bring your commands from another bot Coming from Nightbot or StreamElements? Bloopbot reads your public command list and turns each command into a flow, with its permissions and cooldown, without you signing in to the other bot. 1. Open **Flows → Marketplace → From another bot** and choose your old bot. 2. Untick anything you don't want to keep, and tick **Turn on now** for the commands that should answer straight away. 3. Each command arrives as its own flow; the rest stay paused until you switch them on. ![The Bring commands from another bot page listing four Nightbot commands, each ticked to bring over with a Turn on now box: !so with a choice between Use Bloopbot’s shoutout, selected, and Keep your reply, set to turn on; !uptime whose reply reads how long the stream has been live, with a note that it stays quiet offline; !lurk as a plain reply, set to turn on; and !discord.](https://bloopbot.com/docs/screenshots/bot-import-review.jpg) _The import review: each Nightbot command with what it becomes in Bloopbot._ [Coming from Nightbot](https://bloopbot.com/docs/coming-from-nightbot) and [Coming from StreamElements](https://bloopbot.com/docs/coming-from-streamelements) map everything else. ## 5. Test it, then switch it on 1. In the flow, press **Test fire** and expand the **Run log**. It shows each step that ran and each check that stopped it, without sending anything to Twitch. 2. Switch the flow on. 3. Type `!hug PixelPal` in your chat. The bot answers _YourName gives PixelPal a big hug!_ ## Troubleshooting - **The bot doesn't answer.** Check the flow is switched on and the bot is a moderator in your chat: until it is, the dashboard shows a **Not a mod** bar and some flows stay paused ([Flows paused until your bot is a moderator](https://bloopbot.com/docs/flow-basics#bot-mod)). - **A card on the canvas never runs.** A card with no line into it doesn't run. Connect it to the step before it. - **You hit the flow limit.** The count on the Flows bar shows how many of your plan's flows you've used. Remove one you don't need, or see [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). - **Something else.** [Troubleshooting](https://bloopbot.com/docs/troubleshooting) covers commands that stay silent and other common problems. --- # Take Spotify song requests from Twitch chat Let viewers request songs with !sr or a channel points reward, play them through your own Spotify Premium account, and manage the queue. Updated 12 November 2026 ## The short answer To take Spotify song requests on Twitch, link your Spotify account to Bloopbot and switch on its **Song requests** flows. Viewers type `!sr` and a song name or Spotify link in chat, or redeem a channel points reward, and the song joins your Spotify queue behind whatever is playing. Bloopbot never presses play for you, so nothing cuts off the song that is on. You need Spotify Premium and your own free Spotify app. Song requests are included on every plan, Free too, and run on Bloopbot: there is no desktop app or browser extension to keep open. From nothing to the first request: 1. Make a free app in Spotify's developer dashboard, paste its **Client ID** and **Client secret** into the **Spotify** card under **Settings** › **Connections**, and press **Link Spotify** ([step 1](https://bloopbot.com/docs/song-requests#connect)). 2. Open **Flows** and switch on the Song requests flows. If they are missing, install the **Song requests** pack ([step 2](https://bloopbot.com/docs/song-requests#flows)). 3. Start a track in Spotify on the device you stream from, then type `!sr` and a song name in your Twitch chat. 4. For channel points, make a reward on Twitch that asks the viewer to enter text, then make a flow with **On a reward redeemed** followed by a **Request a song** step ([Take requests with channel points](https://bloopbot.com/docs/song-requests#channel-points)). The rest of this guide covers limits on who can request and how often, moderating the queue and what to check when a request is refused. ## Before you start You need: - Spotify Premium on the account you play music from. - Your own Spotify app, made for free in Spotify’s developer dashboard in about five minutes ([step 1](https://bloopbot.com/docs/song-requests#connect)). - Spotify open and playing on the device you stream from. To show the current song and the queue on stream, add [a Now playing layer in OBS](https://bloopbot.com/docs/now-playing-in-obs) once requests work. ## Get help with your setup Optional **Help me** explains the saved request flow and Spotify connection. A connected account does not prove that a request was accepted, a playback device is active or music played. Review the existing flow before enabling it; setup does not request a sample song. ## 1. Set up your Spotify app and link your account Each Bloopbot channel uses its own Spotify app. It is free and takes about five minutes. Song requests require Spotify Premium on the account that owns the app. Only the channel owner can do this; editors see the status but cannot change it. 1. Sign in as the channel owner, open **Settings** › **Connections** and find the **Spotify** card. Keep it open: it shows the exact **Redirect URI** you need, with a copy icon (**Copy the redirect URI**). 2. In another tab, open [developer.spotify.com/dashboard](https://developer.spotify.com/dashboard), signed in with the Spotify account you play music from, and choose **Create app**. 3. Give the app any name and description. Under **Redirect URIs**, paste the Redirect URI copied from the Spotify card. It must match exactly. 4. Under **Which API/SDKs are you planning to use?** tick **Web API**, then save. 5. Open the new app’s **Settings**. Copy its **Client ID** and **Client secret** into the Spotify card and press **Save Spotify app**. The card then shows your Client ID and **Secret saved**. 6. Press **Link Spotify**. Spotify opens in a new tab: approve the permissions as the same Spotify account that owns the app, then close that tab. Back on Connections, the card refreshes and its status changes to **Connected**. 7. Open Spotify on the device you stream from and start a track before testing a request. > **Treat the Client secret like a password** > > Paste it only into the Spotify card. Bloopbot stores it encrypted and never shows it again. If it leaks, rotate it in the Spotify dashboard and save the new one under **Change app**; your link stays in place. Linked Spotify before this change? Your card shows **Needs reconnecting** and song requests are paused. Set up your own app with the steps above, then press **Re-link Spotify**. Your queue settings and blocks are kept. ## 2. Check the request flows Open **Flows** and look for the Song requests group. Linked Spotify channels may already have these flows. If they are missing, open **+ New flow** and install the **Song requests** pack — eleven command flows plus **Song request status**, which answers `!srstatus`. Installing it also declares the five song variables (step 4) with a sensible starting value each. Flows you already have are kept as they are, so nothing is duplicated: review their live switches and command names instead. When the pack gets a newer version, **Marketplace → Installed** offers it. A pack flow you have not edited is updated in place and keeps its on/off switch and history. A flow you have edited is asked about: **Keep mine** leaves your changes, and **Use the new one** takes the new version and keeps yours in the flow's History ([Update what you added](https://bloopbot.com/docs/the-marketplace#update)). If you also installed the AI helpers pack, **Smart !sr** is the request flow to run: it checks the same song variables before it spends anything, lets the AI pick the track, and skips a song that is already in the queue before it spends anything on screening it. Your copy picks the decisions up on its own: a request flow installed before they existed is brought up to date the next time it is checked, with the gate and the duplicate check spliced in ahead of its request step. [step 5](https://bloopbot.com/docs/song-requests) walks through how the pieces fit, so you can add them to a flow of your own. The **Song requests** page checks this for you. Once Spotify is linked, if no song request flow is on, a **Song request flows** row above the queue says _Viewers can’t request songs from chat yet._ Press **Add** to open the Song requests pack’s review on the right, then press its button to add the flows, paused. The row then offers **Switch on**, or **Open flow** to look first. If your request flow is only paused, the row names it instead, with **Open flow** and **Switch on**. ## 3. Try a request With the relevant flows enabled, type `!sr` followed by a song name in Twitch chat. Open **Song requests** to inspect the queue. | Default command | Purpose | | --- | --- | | `!sr song name` | Request a song. A refused request is answered with the reason; `!sr` on its own does nothing | | `!song` | Show the current track | | `!queue` | Show upcoming songs | | `!srstatus` | Where you stand: how full the queue is and what you already have in it — or, if `!sr` would turn you down right now, why | | `!wrongsong` | Take back your last request | | `!skip` | Moderators skip the current song | | `!remove 2` / `!remove @name` | Moderators remove the second queued song, or that viewer’s latest request | | `!sron` / `!sroff` | Moderators switch song requests back on or off for the whole channel | | `!srblock` / `!srunblock` | Moderators keep a track, an artist or a viewer out of the queue, or let them back in: `!srblock user @name`, `!srblock track` and a Spotify track link, or `!srblock artist` and a Spotify artist link | These are the pack’s defaults. If you rename a command in its flow, viewers must use your new name. After `!sr`, viewers can type a song name or paste any Spotify song link, just as Spotify hands it out: - a link from the share menu, such as `https://open.spotify.com/track/…?si=…`, including regional ones like `open.spotify.com/intl-de/track/…` - a short share link from the phone app, such as `https://spotify.link/…`, which Bloopbot opens to find the song - a Spotify URI, such as `spotify:track:…` - a Spotify search link, which is searched for as the words in it A link to an album, playlist, artist, podcast or audiobook is turned down with a line that says what it is, such as **“That's a Spotify playlist link, not a song. Paste the link to one song.”** A link Spotify cannot find gets **“That Spotify link doesn't lead to a song Spotify can find.”** Neither is searched for as words, so a pasted link never queues some other song. Blocking a viewer by name checks the name with Twitch first. A name Twitch does not know gets **“No Twitch user called … — check the spelling.”** and nothing is blocked; a name it knows is blocked for good, even if that viewer changes their name later. > **Requests queue behind what you are playing** > > A request waits in your Spotify queue for its turn, so it plays after the track you have on now. That means something needs to be playing: keep Spotify open on your streaming device with a track going, and requests line up behind it. Bloopbot never presses play for you — if nothing is playing, the request is declined with a line in chat, because starting a track would cut off whatever you and your viewers were listening to. To put the queue on screen rather than in chat, add a **Now playing** widget: [put now-playing on stream](https://bloopbot.com/docs/now-playing-in-obs) walks through it. The widget reads this same queue, so a request shown in chat appears on screen too. ## 4. Set limits and troubleshoot A limit is changed in one place: open **Variables**, edit the value and save. The five song variables that shape requests are channel variables, and installing the **Song requests** pack — or the **Song request** template on its own — declares them for you: | Variable | What it decides | Starts at | | --- | --- | --- | | `song_requests_on` | Whether requests are open at all | on | | `song_max_queue` | How many songs may be waiting | 20 | | `song_per_viewer` | How many songs one viewer may hold | 2 | | `song_wait_seconds` | How long a viewer waits between requests | 60 | | `song_block_dupes` | Whether the same song can be requested twice | on | What reads these values is a check, not the request step: the shipped request flows open with **Can they request a song?**, which measures the queue and the viewer against all five before anything is searched for, and step 5 shows how it works. A flow of your own obeys them only if it carries that check, or comparisons of its own. Your moderators can switch requests off and on from chat with `!sroff` and `!sron` — those two flows set `song_requests_on` for you, and the value on Variables follows. Blocked tracks, artists and viewers are a separate list. Moderators change it from chat with the pack’s `!srblock` and `!srunblock` commands, flows change it with **Block or unblock**, and you can change it on the **Song requests** page ([step 6](https://bloopbot.com/docs/song-requests#moderate)). No limit is listed on that page, because the variables are where the numbers live. If requests fail, check the Spotify card on Connections shows **Connected**, an active playback device, the flow’s enabled state and the Run log. A successful flow dry run does not prove Spotify can play on your device. When Spotify cannot be reached, `!sr` answers the same way as when nothing matches: **“Couldn’t find that song. Try being more specific, or paste a Spotify link.”** If every request gets that line, even for a song you know exists, check the Spotify card on Connections, then open the flow’s **Run log**: the **Find a song** step shows whether the search failed and why. The refusal you will see most often in chat is **“No active Spotify device. Open Spotify on the stream PC.”** It means Spotify is not playing on any device Bloopbot can reach. Open Spotify on the machine you stream from and start a track, then ask again — requests join the queue from that point on. The queue keeps itself up to date while you are playing. If you take a requested song out of your Spotify queue, or Spotify drops it, Bloopbot notices within about a minute: the song leaves **!queue**, and the viewer gets their slot back so they can request something else. The same works the other way — when a requested song finishes, or you skip it, it stops counting against the queue limit straight away, without anyone having to run a command. > **A removed song is skipped, because Spotify cannot take it back** > > Spotify has no way to take a song back out of its queue once it is there. So when a song is removed after it reached Spotify (with `!wrongsong`, `!remove`, a block, a clear, or the **Song requests** page), it leaves **!queue** straight away, and Spotify skips it when it starts playing. If it is playing right now, it is skipped on the spot. The reply says which: **“Skipped it on Spotify.”** or **“…it will be skipped when it comes up.”** Until it has been skipped, a removed song still counts against the viewer’s share and wait, so `!sr` then `!wrongsong` cannot slip extra songs into your Spotify queue. Skipping happens within about half a minute of the song starting, so the first seconds of it can still play. ## 5. Gate a flow on the limits The node library has a step called **Can they request a song?**, under **Music** beside the song request steps. It checks a request against your five song variables — requests on, the queue size, songs per viewer and the wait between requests — and goes on by **Allowed** or **Refused**. A refusal hands on _Why they were refused_, a sentence you can say straight to the viewer, such as `Queue is full (20 songs max). Try again later.` It queues nothing, says nothing and reaches Spotify for nothing. ![The inspector for a selected Can they request a song? condition: The song to look up, then Requests are on, Most songs in the queue, Most songs per viewer and Wait between requests stacked one under another, each with an Insert… menu on its label row and its help text, and Turn away repeats at the bottom reading “On refuses a song already in the queue. Only checked when a song link is given.”](https://bloopbot.com/docs/screenshots/song-request-check-step.jpg) _Can they request a song? selected: The song to look up, the four limit fields, each with Insert… on its label row, and Turn away repeats at the bottom._ Each rule is a field that reads its variable — **Most songs in the queue** reads `$(var.song_max_queue)`, and so on — so changing a number on Variables changes every flow that checks it. Clear a field to drop that rule from this one check, or type a number over it to use a different limit here only. **The song to look up** is left blank before the search; given the track link **Find a song** settled on, the step also turns away a song that is already in the queue while `song_block_dupes` is on. The shipped `!sr` flow is built from it, and makes two decisions: 1. **Only if** something was typed after `!sr`. A bare `!sr` stops here without a word. 2. **Can they request a song?**, with no song yet. **Refused** goes to one **Chat message** replying with `$(from.builtin_sr__rules.reason)`, so every refusal — requests off, not set up, blocked, the queue full, their share used, still waiting — is one line with the right reason in it, sent as a reply to their message. 3. **Find a song**, Spotify’s first match for what they typed. Nothing found, or Spotify not answering, goes to one **Chat message** replying with `Couldn’t find that song…` 4. A second **Can they request a song?**, with **The song to look up** pointed at the found track. **Requests are on**, **Most songs in the queue**, **Most songs per viewer** and **Wait between requests** are left blank here — those four were already checked by the first one — while **Turn away repeats** keeps reading `$(var.song_block_dupes)`, so this second check asks only whether the song is already queued, using the variable you set. Its **Refused** goes nowhere, so a repeat is skipped quietly. 5. **Request a song**, whose own reply says where the track landed in the queue. Expected result: set `song_max_queue` to `2` on Variables while two songs are waiting, and `!sr` answers _@you Queue is full (2 songs max). Try again later._ without searching; set it back and the same request is queued. **Song request status** (`!srstatus`) is the same check with nothing after it but two lines: the reason, or how full the queue is and how many of the songs are theirs. Two changes people often make to their copy: 1. **Answer a bare `!sr`.** Add a **Chat message** such as `@$(user) type a song name or a Spotify link after !sr, like !sr Mr. Brightside.` and wire the first **Only if** step’s **false** output to it. 2. **Say why a repeat was skipped.** Add a **Chat message**, set to reply, reading `$(from.builtin_sr__dupe.reason)` and wire the second check’s **Refused** output to it. The reason names who asked for the song first. For a rule of your own — a different line per refusal, or a limit that is not one of the five — use **Check song request limits** instead. It hands each fact on as a value, _Songs in the queue now_, _Songs this viewer has queued_, _Seconds until they may ask again_ and, given a track link, _This song is already in the queue_ and _Who asked for the queued copy_, and an **Only if** step compares one with a variable. **Wait between requests** is where its wait lives: left at `$(var.song_wait_seconds)` it follows your variable. ![A flow’s Do this step holding a Check song request limits action: its The song to look up field reads $(from.find.uri) with an Insert… menu beside it and help text explaining that only “already in the queue” needs the link, and and, under the opened More options fold, its Wait between requests field reads $(var.song\_wait\_seconds).](https://bloopbot.com/docs/screenshots/song-queue-check-step.jpg) _The Check song request limits step, with The song to look up already pointed at the song Find a song settled on._ A worked example, for a flow that should stop at ten songs with a line of its own: 1. Add **Check song request limits** in front of the step that requests the song. Leave **The song to look up** blank to read just the queue and this viewer. 2. Add an **Only if** step after it and fill both sides from **Insert…** — or [drag a data wire](https://bloopbot.com/docs/data-wires) from the check’s tray: _Songs in the queue now_ in the first box, **is at least** as the comparison, and `10` in the second. 3. Wire the **Only if** step’s **true** output to a **Chat message** reading `Queue is full — try again once something plays.`, and its **false** output to the request step. Expected result: with ten songs already waiting, the viewer gets your line and nothing is searched for or queued; with nine, the request goes through. > **Someone has to be asking** > > Two of the facts are about the viewer — how many songs they have, and how long until they may ask again. A flow started by a timer, a Stream Deck button or a reward with no viewer has nobody to ask about, and those two read as zero. > **One number, one place** > > Both steps answer with the queue and the viewer only. The limits are your variables, so there is one place a number lives and the Variables page is where you change it. The queue’s own length is remembered for you too, so a message can use it with no flow logic at all: **Insert…** lists it under **Channel data → Song queue** as _Songs in the queue_, with _minutes since the queue last changed_ beside it, which is where `$(data.song_queue.length)` comes from. That record carries the queue and nothing else — the limits are the variables — and it refreshes whenever the queue changes. The queue itself is on the same menu. **Channel data → Song queue → The songs in the queue** is the whole queue, in order, one entry per waiting song with its title, its artist and who asked for it. Put it on a **For each** step and the branch runs once per song — inside it `$(item.title)` is the song and `$(item.requester)` is whoever asked — which is how a flow reads out what is coming up next or thanks the viewer at the front. One pass covers up to 50 songs. **Smart !sr**, in the AI helpers pack, is the same shape with the AI picking the track and screening out troll uploads; [Smarter song requests with AI](https://bloopbot.com/docs/song-requests-ai) walks through it. ## 6. Moderate the queue from the dashboard Open **Song requests** to see what is playing and what is waiting, and to act on it without typing in chat. You and your editors can use every control here, and a moderator you have [let in on Team](https://bloopbot.com/docs/editors#tick) can skip, remove, block and clear songs, though not touch the Spotify connection. Nothing on this page is announced in chat: viewers only notice that a song has gone, or that a request is refused. ![The Song Requests page: a Queue card with Sandstorm playing and three waiting songs, each row with a status, a Block… button and a remove button, Skip song at the top and Clear queue… at the bottom; beside it the Blocked card listing Mr. Brightside — The Killers under Tracks, Nickelback under Artists and spam\_bot\_9000 under Viewers, each with an unblock button and a field to block another.](https://bloopbot.com/docs/screenshots/song-requests-moderation.jpg) _The queue, with Skip song at the top and Clear queue… at the bottom, beside the Blocked card._ - **Remove a song.** Press the bin icon on its row. The song leaves the queue. If Spotify already has it, the page tells you it will be skipped when it comes up ([why](https://bloopbot.com/docs/song-requests#limits)), and the viewer can request another once it has been. - **Skip the song that is playing.** Press **Skip song**. Spotify moves on to the next track, the same as `!skip`. This needs Spotify linked and something playing. - **Clear the queue.** Press **Clear queue…**, then **Clear the queue** to confirm, or **Keep them** to back out. Every waiting song is removed, and songs Spotify already had are skipped as they come up. - **Block from a row.** Press **Block…** on the row and choose **Block this song**, **Block** and the artist’s name, or **Block** and the viewer’s name. The block starts straight away and that song leaves the queue; if Spotify already has it, it is skipped when it comes up. Other songs already queued by the same artist or viewer stay until you remove them. ![A queued song, Never Gonna Give You Up by Rick Astley requested by LurkLord, with its Block… menu open: “Blocks future requests and removes this song.” above Block this song, Block Rick Astley and Block LurkLord.](https://bloopbot.com/docs/screenshots/song-requests-block-menu.jpg) _A row’s Block… menu names the song, its artist and the viewer who asked for it._ Blocking an artist blocks the track’s first artist, so Spotify has to be linked to look it up. For a song with several artists, block the others by link from the **Blocked** card. The **Blocked** card lists every blocked track, artist and viewer by name, including blocks made from chat with `!srblock`. Press the cross beside an entry to unblock it. To block something that is not in the queue: 1. Under **Tracks**, paste a Spotify track link, such as `https://open.spotify.com/track/…`, and press **Block track**. 2. Under **Artists**, paste a Spotify artist link and press **Block artist**. 3. Under **Viewers**, type a Twitch username and press **Block viewer**. The name is checked with Twitch first, and a name Twitch does not know is refused with nothing blocked. Expected result: the entry appears in its list, and the next `!sr` for that track, by that artist or from that viewer is refused with the reason in chat. A block made before names were saved shows as **Track with no saved name** or **Artist with no saved name**. It still works, and its link opens it in Spotify so you can see what it is. If an action is refused, the page says why above the queue. For example, **Skip song** and **Block** by artist are greyed out while Spotify is not linked, and a song another moderator already removed answers **That song is no longer in the queue.** ## Take requests with channel points A reward lets viewers spend Twitch channel points on a song instead of, or as well as, typing `!sr`. It needs Channel Points on your Twitch channel ([check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate)). 1. On Twitch, open **Channel Points → Manage Rewards** and make a reward, such as _Song request_. Turn on its option that asks the viewer to enter text, so they can type the song. 2. In Bloopbot, open **Flows**, choose **+ New flow**, then **Start blank**. Add **On a reward redeemed** and pick your reward in its **Reward** field. 3. Add a **Request a song** step after it. Its **Song** field already reads `$(query)`, the text the viewer typed, and **Reply in chat** answers them the way `!sr` does. 4. To hold reward requests to the same limits as `!sr`, add **Can they request a song?** between the two and connect its **Allowed** path to **Request a song**. 5. Save the flow and switch it on, then redeem the reward yourself with a song name. Expected result: the song joins your Spotify queue under the viewer’s name, the reply appears in chat, and the request shows on the **Song requests** page and on a Now playing layer. - **Test fire** uses the example reward _Hydrate!_ and its viewer, Thirstygamer. Temporarily choose **Any reward** in the trigger to test the wiring, then pick your reward again. **Request a song** reads _dry run_ and records a simulated request without contacting Spotify. Redeem your reward on Twitch to check the real connection. - Points are not given back on their own when a request is refused or the song is not found. Refunding from a flow only works for a reward Bloopbot created; see [keep or refund the points](https://bloopbot.com/docs/reward-redemptions#keep). - Playing a sound or showing an alert for a reward works the same way: [play a sound or show an alert](https://bloopbot.com/docs/reward-redemptions#sound). --- # Find your way around Find anything fast, learn the sidebar and pin the pages you use most. Updated 14 October 2026 ## Start on the Overview Signing in lands you on **Overview**, and **Home** in the sidebar brings you back to it. Catch up on what changed, check what needs attention and find something new for your stream. - **News from Bloopbot** appears at the top when the team has something to share. A card can include a picture and links; **Read more** opens a longer message. Its close icon (**Dismiss**) hides it for the channel, including everyone who manages it. - **Next steps** sits at the top for owners and editors until you have done everything on it: first any [Set up your bot](https://bloopbot.com/docs/getting-started#setup) step you put off, then tutorials from making your commands yours to going further. [Go on with Next steps](https://bloopbot.com/docs/getting-started#next-steps) describes it. - The compact status row shows whether your **stream** is online, your **Twitch** connection and how many **flows** are on. **Open Live** opens the full live feed. - **Since your last visit** shows up to two recent changes to your channel, with who made each change. **View all** opens the Audit log. Without a recorded previous sign-in, the heading is **Recent changes** instead. - **Needs attention** points to connection problems and flows that need checking. Follow its link to fix the item. - **New in the marketplace** shows up to five items first listed since your previous sign-in. Select a card to review it before adding anything; **Browse marketplace** opens the full catalogue. On a first visit, **Latest in the marketplace** shows recent listings instead. - Until your linked Discord account is in the Bloopbot server, a Discord card invites you: **Unlock Free+ with Discord** on a Free channel, **Join the Bloopbot Discord** on any other plan. **Join the Discord** starts the join; if you are already there, **Already a member? Link your Discord** connects your membership. See [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). ![The Overview briefing: Welcome back, the Next steps card (1 of 10 done, Make it yours open with Switch on your starter flows ticked Done, Edit a starter flow and Add a sub alert each with a Start button, Build your own and Go further folded), compact Offline/Twitch/flows status, recent channel changes beside Needs attention, five newly listed marketplace cards, news with Read more and two links, a Discord Free+ offer and collapsed Bot activity.](https://bloopbot.com/docs/screenshots/overview.jpg) _Catch up on channel changes, news and marketplace listings from the Overview._ Expand **Bot activity** below the briefing for the giveaway, song queue, enabled flows, their last runs and recent activity. A paused tutorial still offers **Continue** above the briefing. The page refreshes every half minute and whenever you return to its tab; select the refresh icon (**Refresh**) to update it now. Refreshing keeps the same previous-sign-in cutoff for this visit. An empty section says when there are no new changes or listings; a failed read asks you to refresh rather than showing an empty result. With no channel linked yet, choose **Link Channel**. If you edit more than one channel, use the **Channel** picker beside the refresh icon. It switches both the briefing and the sidebar to that channel. News and its dismissal belong to the chosen channel. ## The sidebar Once a channel is chosen (on **Channels**, or in the Overview's **Channel** picker), the sidebar is one list down the left edge. Every page you can open is on it under a plain-word heading, so there is no group to guess. From the top: - **The channel** at the top shows its picture and name. Select it to switch channels: the menu lists every channel you own, edit or moderate, and choosing one opens the same page on that channel, or its first page when your role there does not include this one. **All channels** at the bottom of the menu opens **Channels**. - **Find anything** sits under the channel. Type what you want and it finds the page, the setting, the guide or the flow; [Find anything](https://bloopbot.com/docs/find-your-way#find) shows how. - **Home** opens the Overview, and **Live** opens the live feed. Neither has a heading. - **Pinned** is your own shortlist of pages, flows and overlays. It starts with **Flows** and **Overlays**, and [Pin the pages you use most](https://bloopbot.com/docs/find-your-way#pins) shows how to change it. - **Bot**, **On stream**, **Viewers**, **Channel** and **Safety** hold the rest, as the table below lists them. - **Marketplace**, **Settings** and **Help** stay at the bottom, always in view. Below them, a button names your plan when there is a step up ([What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#upgrade)), then your Twitch picture (or your initial) and name open **Account**, and the icon beside them signs you out. | Section | Pages | What they are for | | --- | --- | --- | | **Bot** | **Flows**, **Variables**, **Collections**, **Control panels** | Make the bot do things, keep what it remembers and what viewers collect, and put big buttons on a screen of your own. The number beside **Flows** is how many flows the channel has. | | **On stream** | **Overlays**, **Media**, **Wheels** | Design what OBS shows, keep the pictures and sounds it uses, and manage your spin wheels. | | **Viewers** | **Song requests**, **Queue**, **Questions**, **Media share**, **Giveaways**, **Loyalty and store**, **Regulars** | What viewers ask for, enter and earn, mostly while you are live. | | **Channel** | **Public page**, **Quotes**, **Schedule**, **Highlights**, **Social images** | What your channel puts in front of viewers outside your overlays. | | **Safety** | **Moderation**, **Nukes** | Chat filters and bulk clean-up. | A page you pin moves up to **Pinned** and is not listed twice. A section with nothing you can open is left out, heading and all. ![The whole sidebar on the Overlays page, top to bottom: the bloopbot logo and the collapse button, the channel Local Streamer with its handle, the Find anything field with its ⌘K hint, Home and Live, Pinned with Flows (12) and Overlays lit, each with an unpin icon, Bot (Variables, Collections, Control panels), On stream (Media, Wheels), Viewers (Song requests, Queue, Questions, Media share, Giveaways, Loyalty and store, Regulars), Channel (Public page, Quotes, Schedule, Highlights, Social images) and Safety (Moderation, Nukes), then Marketplace, Settings and Help, a blue Free plan · Upgrade button and the account with its sign-out button.](https://bloopbot.com/docs/screenshots/sidebar.jpg) _The sidebar on the Overlays page, top to bottom: the channel and the Find anything field, Home and Live, Pinned with Flows and Overlays, the Bot, On stream, Viewers, Channel and Safety sections, and Marketplace, Settings and Help at the foot._ Two rows stand for more than one page, each with a row of tabs across the top of its pages: - **Settings** opens on **Connections** and stays highlighted on all six of its pages: **Connections**, **Connected apps**, **Downloads**, **Team**, **Plan & billing** and **Audit log**. **Team** and **Plan & billing** are the owner's, so an editor sees four tabs. On a wide screen the tabs wrap onto a second line when they must; on a narrow one the row scrolls sideways. - **Loyalty and store** opens on **Loyalty** and stays highlighted on **Loyalty** and **Store**. A moderator can open **Loyalty** but not **Store**, so for them the row reads **Loyalty** and has no tabs. **Help** opens a small menu: - **Tutorials** opens Pebble's tutorials and sticker book, with a dot while Pebble has something waiting. While a tutorial is running or paused, a **Continue:** row with the tutorial's name sits above it, and selecting that picks the tutorial up where you left off ([Learn Bloopbot with Pebble's tutorials](https://bloopbot.com/docs/tutorials#rail)). - **Docs and guides** opens these guides in a new tab. - **Bloopbot Discord** opens the community server in a new tab. - **News from Bloopbot** opens the Overview's news from the Bloopbot team, with a dot while there is news you have not seen. The **Help** button shows a dot whenever **Tutorials** or **News from Bloopbot** has one. **Marketplace** opens everything you can add to the channel. A number beside it counts the updates ready ([The Marketplace](https://bloopbot.com/docs/the-marketplace)). You do not have to go there to add something: **Flows** has a **Marketplace** button and **Overlays** a **Browse templates** button; each lists the same items for that page and opens the same review beside your list. Only the middle of the sidebar scrolls, so the channel at the top and the bottom rows stay where they are, and the page you are on is scrolled into view. To tidy a long list, select a section's heading to fold it; its pages hide and the arrow beside the name turns. Bloopbot remembers which sections you folded in this browser, but the section holding the page you are on always opens, so you never lose your place. To give a page more room, select the collapse button beside the logo (**Collapse the sidebar**) or press **\[**. The sidebar shrinks to a narrow strip of icons: the channel's picture, the magnifier for **Find anything**, **Home** and **Live**, your pins, then each section's pages with a thin line between sections, then the bottom rows. Rest the pointer on an icon, or tab to it, to see its name. Select the button again, or press **\[** again, to bring the names back. Bloopbot remembers your choice. The flow editor and the overlay editor always open with the sidebar collapsed, so the canvas gets the width. On a phone the sidebar is hidden: the menu button at the top opens the same list as a drawer, **Find anything** as its first row and the **Help** menu included, with your name and the sign-out button underneath. That list has no channel switcher at the top; a **Channels** row below **Home** opens your list of channels instead. Some pages are left out for some people. A moderator sees only the pages that run the stream, with no **Marketplace** or **Settings**, and an editor has no **Team** or **Plan & billing** tab. On a Kick channel **Schedule**, **Highlights** and **Nukes** are not listed, because they need Twitch. If you edit someone else's channel, **Tutorials** shows the ones about building. A moderator has none yet, so the row is not in their **Help** menu until there is one, and their menu has no **News from Bloopbot**. See [who sees which tutorials](https://bloopbot.com/docs/tutorials#who). ## Pin the pages you use most **Pinned** sits just under **Live**. It is a shortlist that is yours alone, kept for each channel, and it starts with **Flows** and **Overlays**. Pins are saved to your account, so they follow you to another browser or device, and an editor's pins never change the owner's sidebar. To pin a page: 1. Rest the pointer on its row in the sidebar, or tab to it. A pin icon appears on the row. 2. Select the pin icon (**Pin Song requests**, for example). The page moves up into **Pinned**, out of its section. ![The top of the sidebar on the Giveaways page: the channel Local Streamer, the Find anything field with its ⌘K hint, Home and Live, then Pinned holding Flows (13), Overlays, Giveaways (lit, the page that is open) and a flow called Lurk, each with an unpin icon, then Bot with Variables under the pointer and showing its pin icon, Collections and Control panels, and On stream with Media and Wheels.](https://bloopbot.com/docs/screenshots/sidebar-pins.jpg) _Pinned holds Flows, Overlays, Giveaways and a flow called Lurk, each with its unpin icon, while the pointer on Variables brings out that row's pin icon._ To pin a flow or an overlay itself, open it and select the pin icon in the flow editor's header (**Pin this flow**) or in Studio's (**Pin this overlay**). **Pinned** then lists it by name, and opens it straight away. Rename it and the pin shows the new name; delete it and its pin goes. To unpin, select the pin icon on the pinned row (**Unpin Song requests**, for example), or the same icon in the editor, which now reads **Unpin this flow** or **Unpin this overlay**. A pinned page returns to its section; a pinned flow or overlay just leaves the list. You can also pin and unpin from [Find anything](https://bloopbot.com/docs/find-your-way#find-more), which works for control panels and giveaways as well. To put your pins in order, drag a pinned row up or down, or focus it and press **Alt** with the **Up** or **Down** arrow key. Each move is saved straight away. You can pin up to 10 things; at 10, unpin one to make room. > **A pin only shows what you can open** > > A pin to a page your role cannot open is left out of **Pinned**, and dropped the next time you change your pins. If saving a pin fails, the sidebar stays as it was and says why. ## Find anything **Find anything** is one search box for the whole dashboard. Type a word for what you want, such as `alerts`, `twitch account` or `!lurk`, and it lists the page, the setting, the guide or the flow of yours that answers it, so you do not have to remember where something lives. It forgives typos, plurals and extra words: `giveawy` and `how do I add a quote` both find what you meant. Open it in any of these ways: - Select **Find anything** under the channel at the top of the sidebar. With the sidebar collapsed it is the magnifier at the top of the strip, and on a phone it is the first row of the menu. - Press **⌘K** (Cmd K) on a Mac, or **Ctrl K** on Windows and Linux. The hint in the sidebar's field shows the one that fits your computer. - Press **/** when you are not typing in a box. Find opens over the page, as a full-screen sheet on a phone or a narrow window, with the cursor already in its box. The first time on a page it takes a moment to load, and whatever you type meanwhile is kept. **Esc** closes it and puts you back where you were; on a phone, use the close icon (**Close Find**). Two cases are different: - **In a flow's Canvas view, ⌘K and Ctrl K search for a node to add.** Press **/** or select **Find anything** in the sidebar to open Find there, or switch to the **Simple** view, where the shortcut opens Find. - **Find does not open over another dialog.** Close the dialog first; the shortcuts do nothing while one is open. Results come in groups, with the closest match alone at the top. Each group shows five, and **Show all** with a number lists the rest in place. | Group | What it finds | Try typing | | --- | --- | --- | | **Best match** | The one result that fits best, of any kind, shown alone at the top | `alerts` puts **Overlays** first | | **Pages** | Every page you can open, by its name and by everyday words for it | `alerts` finds **Overlays**, `points` finds **Loyalty and store**, `spotify` finds **Song requests** | | **Inside pages** | A card or panel inside a page; the page opens at that spot | `twitch account` opens **Settings** › **Connections** at the Twitch card, `custom domain` opens **Public page** › **Domain** | | **Your things** | The channel's own flows (by name or by chat command), overlays, variables, collections, wheels, giveaways, quotes, control panels and media folders | `!lurk` finds the flow that answers it, or type any flow's or giveaway's name | | **Actions** | Things to do without opening a page first, such as making a new flow or clearing the queue ([Run an action from Find](https://bloopbot.com/docs/find-your-way#find-actions)) | `new flow`, `skip the song` | | **Guides** | These guides, and the sections inside them | `stream deck`, `custom domain` | ![Find anything with giveaway typed: Best match is the Giveaways page (Viewers); Your things lists Subscriber giveaway (Giveaway, draft) and Prize reminder (Flow); Actions lists New giveaway; Guides lists Run a giveaway in chat and its sections. A footer reads move, Enter open, the right arrow for options and Esc close.](https://bloopbot.com/docs/screenshots/find.jpg) _Find with giveaway typed: the Giveaways page is the best match, then the channel's own giveaway and the flow that answers !giveaway, the New giveaway action and the giveaway guides._ Find lists only what you can use. A moderator's **Your things** holds wheels, giveaways and quotes, plus control panels when the owner has turned them on, and an editor does not see **Team** or **Plan & billing**. On a Kick channel the pages that need Twitch (**Schedule**, **Highlights** and **Nukes**) are left out, as they are in the sidebar. [The sidebar](https://bloopbot.com/docs/find-your-way#sidebar) lists who sees what. With nothing typed, Find lists **Recent**, the last six results you opened from it on this channel in this browser; **Pinned**, the pages and things you pinned; and **Suggested**, three actions to try, starting with the ones that suit the page you are on. Move with the arrow keys and press **Enter** to open one. **Recent** keeps what you open, and any action that only opens a page or copies a link; an action that makes or changes something (such as **New flow** or **Open the queue**) is never in it, so pressing **Enter** on an empty Find cannot repeat it. ## Do more from a result **Enter** opens the highlighted result. To do something else with it, press the **Right arrow** key (with the cursor at the end of what you typed) or **Tab**, or select the arrow at the end of its row; on a phone each row that has actions shows that arrow. The list changes to that result's actions. **Enter** runs the highlighted one, and the **Left arrow** key or **Esc** goes back to the results. | Result | Its actions | | --- | --- | | A page | **Open**, **Open in a new tab**, and **Pin** or **Unpin** | | A flow | **Open**, **Turn on** or **Turn off**, **Test fire**, and **Pin** or **Unpin** | | An overlay | **Open in Studio**, **Copy OBS link**, and **Pin** or **Unpin** | | A giveaway | **Open**; **Open entries** on a draft; **Close entries** (a draw) or **End** (a prize pool) while it takes entries; and **Pin** or **Unpin** | | A control panel | **Open**, **Edit**, and **Pin** or **Unpin** | | A variable, collection, wheel, quote or media folder | **Open** | | A place inside a page, or a guide | **Open**, **Open in a new tab** | An action either changes your real channel or only shows you something: - **Test fire** is a dry run. It shows one line, such as how many steps ran and what the flow would have done, and sends nothing to chat. - **Turn on**, **Turn off**, **Open entries**, **Close entries** and **End** change the real flow or giveaway at once. - **Copy OBS link** puts the overlay's Browser Source link on your clipboard without showing it. The link includes the overlay's access key, so paste it into OBS and keep it private ([Put an overlay in OBS](https://bloopbot.com/docs/widgets-in-obs#choose)). Anything that turns something off or ends it asks first. The row becomes a question, such as **Press Enter again to turn off Lurk**, and a second **Enter** on that row does it. **Esc**, or moving to another row, takes the question back. Turning off a flow, closing a giveaway's entries and ending a giveaway ask this way, and so do the actions that end a giveaway, close or clear the queue, skip a song or turn song requests off. When an action finishes, Find stays open and shows one line, such as **Turned off Lurk.** or **OBS link copied**. If Bloopbot refuses, the line says why; a flow with a problem, for example, will not turn on. To turn a flow off without leaving your page, say a flow called Lurk that answers `!lurk`: 1. Press **⌘K** or **Ctrl K**. 2. Type `lurk`. The Lurk flow is the best match. 3. Press the **Right arrow** key. The list changes to the flow's actions. 4. Press **Down** to reach **Turn off**, then **Enter**. The row asks **Press Enter again to turn off Lurk**. 5. Press **Enter** again. ![Find with lurk typed, showing the actions of the Lurk flow under a back arrow: Open, a highlighted row in amber reading Press Enter again to turn off Lurk (Turn off, asking first), Test fire and Pin, with the same key hints below.](https://bloopbot.com/docs/screenshots/find-actions.jpg) _After step 4: Turn off asks first, so its row reads Press Enter again to turn off Lurk._ Expected result: Find shows **Turned off Lurk.** under the list, and the flow is off on **Flows**. Press **Esc** to go back to your page. Turning it on again takes the same steps without the question. To pin from Find, choose **Pin** in a result's actions, and **Unpin** to take it off. You can pin pages (all but Home, Channels and Account), flows, overlays, control panels and giveaways. A variable, collection, wheel, quote or media folder has no page of its own, so pin its page instead. Find and the sidebar share one list, so the rules in [Pin the pages you use most](https://bloopbot.com/docs/find-your-way#pins) apply: up to 10 pins, and at 10 you unpin one first. ## Run an action from Find The **Actions** group does a job without a trip through the pages. Type what you want to do, such as `new flow`, and press **Enter**. Each one uses the same feature as the matching button on its page. Find offers only the actions your role may use. | Kind | Actions | | --- | --- | | Create | **New flow**, **New overlay**, **New giveaway** and **New control panel** make a new one and open it. **Add a quote** saves what you type after it (`add quote that was close`, up to 500 characters), or opens **Quotes** when you type nothing more. **Declare a variable**, **New collection** and **Upload media** open their page. | | Run | **End the running giveaway** (it appears while one is taking entries), **Open the queue**, **Close the queue**, **Clear the queue**, **Skip the song**, and **Turn on song requests** or **Turn off song requests**. The queue actions work the [viewer queue](https://bloopbot.com/docs/viewer-queue), and the song requests switch appears when your channel has one ([Set limits](https://bloopbot.com/docs/song-requests#limits)). | | Go to | **Invite an editor** (**Settings** › **Team**), **Connect Spotify**, **Copy the public page link** (your custom domain, if you have one) and **Upgrade your plan** (owners, when there is a plan above theirs). | A moderator is offered **Add a quote**, **End the running giveaway**, the queue actions and **Skip the song**. Creating things, the song requests switch and **Copy the public page link** are for owners and editors, and **Invite an editor**, **Connect Spotify** and **Upgrade your plan** are the owner's. **End the running giveaway**, **Close the queue**, **Clear the queue**, **Skip the song** and **Turn off song requests** ask you to press **Enter** again, as described in [Do more from a result](https://bloopbot.com/docs/find-your-way#find-more). **Skip the song** needs Spotify linked; without it, the line says why. On the **Suggested** list of an empty Find, three of these are offered, the ones that suit the page you are on first: **New giveaway** on **Giveaways**, for example. ## Find shortcuts and fixes Everything in Find works from the keyboard. | Keys | What they do | | --- | --- | | **⌘K** or **Ctrl K** | Open Find, or close it again. In a flow's Canvas view this searches for a node instead | | **/** | Open Find when you are not typing in a box | | **Up** and **Down** | Move through the results, or the actions, and round again | | **Enter** | Open the highlighted result or run the highlighted action; press it again to answer a question | | **Right arrow** or **Tab** | Show the highlighted result's actions | | **Left arrow** | Go back from the actions to the results | | **Esc** | Take back a question, then go back to the results, then close Find | If Find is not doing what you expect: - The sidebar says **Find didn't load. Reload the page to try again.** Reload the page, then open Find again. If that keeps happening, check your connection. - Find says **Your things didn't load** or **Some of your things didn't load**. Pages, places and guides still work. Close Find and open it again in a minute. - The **Guides** group is missing. Guides arrive when you start typing, and Find leaves the group out if they cannot be fetched. Try again in a moment. - **⌘K** or **Ctrl K** searches for nodes instead of opening Find. You are on a flow's Canvas view. Press **/**, or switch to the **Simple** view. - Nothing happens when you press the shortcut. Another dialog is open. Close it first. - A page or flow you expected is missing. Find lists only what your role can open on this platform. Something you made in the last minute can take a moment to appear; close Find and open it again. ## Flows, Overlays and custom overlays | Page | Use it to | | --- | --- | | **Flows** | Choose what starts an automation, what must be true and what happens next. Commands, timers, reward responses and alerts live here. | | **Overlays** | Design a hosted overlay, place its alert layers and copy its Browser Source URL into OBS. | | **Overlays → Custom overlays** | Create a named HTML overlay, choose what it may read, download a starter file, see connected sources and copy an AI brief. | > **Start with the outcome** > > To change what the bot says, open Flows. To change how a widget or an alert looks, open Overlays. To connect a widget file of your own, open **Custom overlays** on Overlays. ## The rest of your channel - **Live** shows stream status, the alert queue and recent activity. A flow that runs on **Any chat message** gets one tally row instead of a line for every message; [Watch your stream on Live](https://bloopbot.com/docs/watch-your-stream) shows how to use the page. **Song requests** shows the queue — what is playing, what is waiting, and who asked for it; **Giveaways** manages giveaways during a stream. - **Loyalty and store** manages points and watch time on its **Loyalty** tab and what viewers spend them on, on **Store**. **Regulars** manages your channel’s regular-viewer list. - **Media** holds every picture, sound and video the channel uses; see [Choose and upload media](https://bloopbot.com/docs/choose-and-upload-media#organise). **Quotes**, **Variables** and **Schedule** hold content your flows can use — see [Keep a quote book](https://bloopbot.com/docs/quotes) and [Work with your stream schedule](https://bloopbot.com/docs/schedule). - **Moderation** configures filters. **Nukes** shows bulk moderation jobs. - **Settings** holds six pages as tabs. **Connections** manages Twitch, Spotify, [Discord](https://bloopbot.com/docs/discord-go-live#connect) and [your bot account](https://bloopbot.com/docs/bot-account). **Connected apps** lists the apps signed in to your channel ([See and remove connected apps](https://bloopbot.com/docs/connected-apps)) and **Downloads** has the [Stream Deck plugin](https://bloopbot.com/docs/stream-deck-plugin). **Team** holds your editors, the Twitch moderators you let into the dashboard and the link to send them: see [Share the work with mods and editors](https://bloopbot.com/docs/editors). **Plan & billing** shows your plan, how much of each limit you use, and where to upgrade or manage what you pay: see [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). **Audit log** records administrative changes. ## Working with more than one channel Choose a channel from **Channels**, or from the channel menu at the top of the sidebar, before changing flows or settings. Editors work in the same channel tools as the owner, but account connections, the **Team** page and **Plan & billing** remain owner controls. A moderator sees a shorter sidebar of the pages that run the stream, with no **Marketplace** or **Settings**, and a bar across the top naming the channel they are moderating. Check the channel name whenever you move between streams. ## Find your setup goals Search **Find anything** for `guided setup` to open Home. If your channel uses guided setup, Home keeps your selected goals and one next task. You can also open a feature directly and choose **Open setup help** to start its relevant task. [Choose your own starting point](https://bloopbot.com/docs/getting-started#guided-setup) shows direct choices, optional Jev suggestions and how to return later. --- # Learn Bloopbot with Pebble’s tutorials Pebble sets up your bot on the real pages, then walks you through commands, overlays and more, and gives you a sticker for each tutorial. Updated 21 October 2026 ## What a tutorial is A tutorial is Pebble, Bloopbot’s robot, showing you how to do one job on the real pages of your dashboard. The page dims except for the control you need, Pebble sits beside it and says what to do, and a ghost hand shows the move once before you try it. Nothing is a video or a mock-up: you press the real buttons, and your overlay, flow or setting is really made. Pebble notices when each step is done, so you never tick anything yourself. For the few steps Bloopbot can’t watch, such as opening your streaming app, the card shows **Next**. Some steps have **Do it for me**, which does the fiddly part for you. Finish a tutorial and Pebble gives you its sticker. A tutorial runs only for you: your progress is yours, and a helper on your channel keeps their own. Channels using the earlier setup may have the required **Set up your bot** tutorial. Goal-based setup uses the optional task help below; your manual Tutorials library stays available. ![Studio in the middle of Your first overlay, step 4 of 10: the page is dimmed except for the Follow alert tile, Pebble’s card beside it says Drag the Follow alert onto your canvas and shows the path Twitch, Flow, Overlay, OBS, and a ghost hand drags the tile toward the canvas.](https://bloopbot.com/docs/screenshots/tutorials-step.jpg) _A tutorial step: everything is dimmed except the Follow alert tile, Pebble’s card says what to do, and the ghost hand shows the drag._ ## Help with the task you chose Guided setup replaces the required course and the Next steps curriculum for enrolled channels. On the earlier required course, **Choose my own setup** switches to guided setup without marking the old course complete. Existing progress and stickers stay in **Tutorials**. An unfinished old course can be resumed manually or paused after switching. Optional task tutorials do not require unrelated courses first; the tool’s role, platform and feature requirements still apply. If you use the goal-based setup on Home, Pebble’s help follows the task you chose. You can keep your existing tools and work independently. Help is optional; closing it never pauses a live feature. 1. Open the feature you chose, such as **Flows** for a chat command. Beside that task, press **Help me**. 2. Choose the question that helps now, such as **What starts it?**, **Try it safely** or **Make a small change**. If several records match, choose yours under **Which existing record do you want to work on?** and press **Use this record**. The explanation names it and links back to it; your other records are kept. To switch later, open **Use a different existing record**. 3. Make the change on the feature’s own page and use its normal **Save**, **Publish**, **Live** or other control. The explanation tells you what to review before you act. 4. Press **Check status** to read the current feature state again. A saved record, a preview, an enabled feature and a recorded live result mean different things. 5. Open **Try it independently later** and press **Try with help closed**, or close the explanation yourself. Try finding or editing the same record independently. Reopen **Help me** whenever you need it. **Dismiss … help offer** hides the suggestion; the manual help button remains available after a reload. ![Optional Pebble task help beside the existing My welcome command, with Make a small change selected, the current flow status, direct guide link and a question field](https://bloopbot.com/docs/screenshots/onboarding-task-help.jpg) _Optional help for the selected welcome command: one explanation, the same saved record and a separate status check._ For example, choose your existing welcome command, open **Make a small change**, and change a few words in its reply. Save that same flow and preview it. Its **Live** switch pauses the actual command; **Done for now** on Home pauses guidance instead. You can also type a question under **Something else you’re stuck on?** and press **Ask for help**. This help uses a separate allowance from your plan’s AI credits. If it is unavailable or does not understand, use the explanation buttons or the written guide. Your saved goals and feature settings stay available. A proposed change of goals must be reviewed on Home before it is saved. **Build one with Pebble** starts the relevant full tutorial when you have not selected an existing record. That tutorial uses the real controls and keeps its normal permissions and checks. It can be closed or resumed through **Tutorials**. A tutorial sticker records guided progress; it does not certify that you can perform the task independently. **Extend this when you’re ready** suggests an optional next change on the same feature. Review and preview it before using it live. You can stop after the first useful result. ## Set up your bot, then Next steps Channels using the earlier required setup start with **Set up your bot**. Right after you sign in with Twitch you land on **Overview**, and Pebble begins it at once. It is required: it has no **Never show again** and no pause, and on a computer the page outside the current step is held still (a step on another page leaves the menu free to take you there, and a phone only dims). Pebble keeps your place, so a reload, another tab or another device carries on at the same step. Only the channel’s owner sees it. It has five steps, all on the real pages: **Your commands** (turn on Starter and bring over Nightbot or StreamElements commands if Pebble finds them), **Your alerts** (meet the ready-made _My alerts_ overlay), **Put it on stream** (copy the Browser source URL into OBS Studio, Streamlabs or Meld), **Make your bot a mod** (send `/mod` in your chat) and **Test it** (one button plays an alert). The two steps that need your streaming computer, **Put it on stream** and **Make your bot a mod**, have an **I’ll do this on my streaming PC** button that moves on and puts the step on your Next steps. On Kick there is no mod step. [Get started with Bloopbot](https://bloopbot.com/docs/getting-started#setup) walks through each step. ![Set up your bot, step 1 of 5, on the Flows page: the sidebar at the left, Starter's card with its Turn all on button ringed, and Pebble's card saying 1 of 5, about 5 min left, Press Turn all on to switch them on, with a track of the five steps (Commands, Alerts, On stream, Mod, Test) and a Do it for me button.](https://bloopbot.com/docs/screenshots/setup-step.jpg) _Set up your bot: Starter’s card is ringed, and Pebble’s card shows your place, 1 of 5, and how long is left._ When you finish, Pebble says “You’re live-ready.” and your **Overview** gets a **Next steps** card. It leads on to the tutorials below, from making your commands yours to building your own, and shows any step you put off first. [Go on with Next steps](https://bloopbot.com/docs/getting-started#next-steps) describes it. The card stays until you have done everything on it. **If your channel was linked earlier**, the start is different. A channel that linked before Set up your bot arrived keeps the older start: two optional tutorials, [Your first flow](https://bloopbot.com/docs/tutorials#list) and then [Your first overlay](https://bloopbot.com/docs/tutorials#list). Right after you sign in you land on **Overview**, where Pebble offers Your first flow. Press **Start** to begin; **Not now** leaves it waiting on the **Tutorials** page, and **Never show again** turns it off. Once you finish it or turn it off, Pebble offers Your first overlay straight away. If you haven’t made an overlay yet, Pebble offers them once; a channel that has already built a flow of its own goes straight to Your first overlay. Overview shows the same Next steps card throughout. **Set up your bot** isn’t offered to these channels, and its card on the Tutorials page says why. **Your first flow** builds a chat command from nothing: a trigger that starts it, then an action. Press **New flow** and **Start blank**, add a **Chat command** trigger named `lurk` (or `brb`, then `hug`, if you already have one) and a **Chat message** that answers it, and press **Save**. Then press **Test fire** for a dry run, press the **Live** switch, and type your command in your own chat. [Create your first chat command](https://bloopbot.com/docs/first-command) is the written version. **Your first overlay** builds one alert, start to finish, and watches it play: 1. Pebble says hello and shows the path an alert takes: Twitch, then a flow, then your overlay, then your streaming app. Each stage lights up as you complete it. 2. Choose a follower alert or a sub alert. For a sub alert, first enable subscriptions in your Twitch Creator Dashboard. 3. Make an overlay on **Overlays** (or let Pebble make one called “My alerts”), then drag the alert onto the canvas in Studio. 4. Change the alert’s message, or skip that step, and press **Publish**. Review the named changes, keep **Create and switch on** for the new alert flow, then confirm Publish; Pebble takes you to look at it. 5. Copy the overlay’s address and tell Pebble what you stream with: OBS Studio, Streamlabs Desktop, Meld Studio or something else. Pebble shows where the address goes in that app. 6. Press **Test published output…**. Confirm the test, then check its picture and sound in your streaming app. Pebble follows the overlay’s playback reports; a source that isn’t visible in your current scene, or one that isn’t this overlay, can keep the tutorial waiting. [Test alerts and check OBS delivery](https://bloopbot.com/docs/alerts-in-obs) covers the same checks. When the alert plays, Pebble celebrates and gives you the sticker. Your first overlay’s last card shows the `/mod` command for your bot. Copy it and send it in your Twitch chat so flows that need a moderator can run. The card also offers what to do next. Below them is an optional card to join the Bloopbot Discord. On the Free plan it reads **Join the Bloopbot Discord**: get help fast and unlock Free+ (web requests and five themes). Choosing it signs you in with Discord, adds you to the server and puts your channel on Free+ straight away; you land on **Overview**, which says so. [Unlock Free+ by joining the Discord](https://bloopbot.com/docs/unlock-free-plus) explains Free+. On other plans it is a link for help, support and updates that opens in a new tab. Skipping it changes nothing. While a tutorial is on screen, any Discord invite from your sign-up link steps aside and comes back when the tutorial hides. ![The celebration after Your first overlay: You did it!, Pebble’s new sticker, the Twitch, Flow, Overlay and OBS path all lit, the /mod bloopbottv command and its copy button, an offer to Switch on your starter flows with a Start button, and an optional Join the Bloopbot Discord card: get help fast and unlock Free+ (web requests and five themes).](https://bloopbot.com/docs/screenshots/tutorials-finish.jpg) _You did it! The new sticker, the whole path from Twitch to OBS lit, the /mod command for your bot, and the optional Discord card._ > **On a phone** > > Pebble says hello on a phone, but most building needs your computer. It says “Let’s build it on your computer” and remembers where you were; open the dashboard there and carry on. In Set up your bot, a phone shows **I’ll do this on my streaming PC** first on the stream and mod steps, because OBS and your Twitch chat are on another device. ## The Tutorials page and Pebble’s sticker book Open **Help** at the bottom of the sidebar and choose **Tutorials** (on a phone, **Help** is in the menu drawer too). The page has two parts: - **Pebble’s sticker book** shows one slot for every tutorial you can see. A finished tutorial’s sticker is in full colour; the others are silhouettes. The count, such as **3 of 12 collected**, sits at the top. - **Every tutorial** lists a card for each one, with what it teaches and where you stand: **Locked**, **New**, **In progress**, **Paused**, **Finished** or **Turned off**. A card’s button reads **Start**, **Resume** or **Start again**, and opens the page where that tutorial’s next step happens. A finished tutorial has no such button, because its sticker is already yours. A locked tutorial has no button either; [Locked tutorials](https://bloopbot.com/docs/tutorials#locked) says why. Once you’ve started a tutorial, its card also has a **Retake** button (the circular arrow) that starts it over from the first step. On a finished or turned-off tutorial it starts straight away; on one that’s running or paused, Pebble asks first, because you’ll lose the progress you’ve made. Retaking a finished tutorial doesn’t take its sticker back: it stays in the book while you go through it again. ![The Tutorials page: Pebble’s sticker book with 3 of 19 stickers collected and Your first overlay’s sticker shining, followed by the first cards of Every tutorial: Set up your bot, locked because this channel linked before it arrived. Put your alerts on stream and Make your bot a mod, which follow it, are not listed on this channel, so Your first flow and Your first overlay (finished and shiny) come next.](https://bloopbot.com/docs/screenshots/tutorials-page.jpg) _The Tutorials page: the sticker book with three stickers collected and Your first overlay’s sticker shining, then a card for each tutorial. On this channel, linked before Set up your bot arrived, that one is locked and says so, and Put your alerts on stream and Make your bot a mod are not listed at all._ **Your first social image** teaches you to choose a starter, customise it, check current stream details, publish it and save that same design in an existing social posting flow. It is offered after first run when you visit **Social images** and have a social posting flow. Build the image on a computer; a phone can preview and select saved designs. The tutorial never asks you to send a public post. ## Locked tutorials **Your first social image** needs an existing social posting flow. Add a flow from the **Socials** pack in the Marketplace to unlock it; you can complete the tutorial without connecting a social account or sending a post. Some tutorials aren’t ready for you yet. Their card is greyed out, with a lock, the word **Locked** and, in place of **Start**, the reason. The sticker book shows the same slot with a lock on it. - **Finish another tutorial first.** A tutorial that builds on another says **Finish Set up your bot first**, with the name as a link. Press it and the page scrolls to that tutorial’s card, ready to start. It unlocks as soon as you finish the one it waits for (a tutorial you finished once still counts while you retake it). Turning a tutorial off isn’t finishing it. - **Your channel isn’t ready for it.** The card says what is missing and how to get it, for example **Needs a built-in alert on one of your overlays. Add one in Studio to unlock it.** Once your channel has it, the tutorial unlocks by itself. A tutorial you’ve already started, finished or turned off is never locked, even if what it waited for changes later, so a sticker you’ve earned stays in the book and you can always pick up where you were. Pebble never offers a locked tutorial, and the **Next up** suggestion skips them. If a locked tutorial is somehow started, for example from a page you left open, Pebble says what is missing instead. | Tutorial | Unlocks when | | --- | --- | | Make it only for mods | You’ve finished Your first flow. | | Your first timer | You’ve finished Your first flow. | | Count with a variable | You’ve finished Your first flow. | | Edit a starter flow | You’ve finished Switch on your starter flows or Set up your bot. | | Put your alerts on stream | You’ve finished Set up your bot. Listed only on a channel that has Set up your bot. | | Make your bot a mod | You’ve finished Set up your bot. Listed only on a channel that has Set up your bot; Twitch only. | | Add a goal bar | You’ve finished Your first overlay or Set up your bot. | | Channel points alert | You’ve finished Your first overlay or Set up your bot. Enable Channel Points and create a reward in your Twitch Creator Dashboard before picking it in Studio. | | Give an alert its own sound | An alert is on one of your published overlays. | | Add a sub alert | Your channel is a Twitch Affiliate or Partner. | | Your first control panel | You have a flow to put on a panel. | Your first flow and Your first overlay are never locked, so a channel can start either. Set up your bot is not on this list: a channel linked after it arrived must do it, and a channel linked earlier has Your first flow and Your first overlay instead. ## Shiny stickers Some stickers turn **shiny** later. Your first overlay’s sticker shines when the first real alert plays on your stream, not a test, but a real new follower or sub. If your dashboard is open, Pebble tells you straight away (“Your first real follow alert just played on stream!”); otherwise you’ll see it on your next visit. Stickers are private to your channel’s team, and there are no points or levels. ## The Help menu and the Continue card You don’t have to remember to come back. **Tutorials** in the **Help** menu at the foot of the sidebar counts the stickers you have collected (such as 3 of 12) and shows a dot when something is waiting: a tutorial Pebble would like to offer, a new shiny sticker or a paused tutorial. The **Help** button repeats the dot, so you see it with the menu closed. While a tutorial is running or paused, a second row above it reads **Continue:** and the tutorial’s name. Select it and Pebble starts that tutorial again at the step you were on, on that step’s page. **Tutorials** itself always opens the Tutorials page, where the sticker book and every tutorial’s card are. ![The Help menu open at the foot of the sidebar: a Continue: Switch on your… row (the tutorial's name is cut to fit), Tutorials with 3 of 19 and a dot, Docs and guides, Bloopbot Discord and News from Bloopbot, above the Help button with its dot, the blue Free plan · Upgrade button and the account.](https://bloopbot.com/docs/screenshots/tutorials-rail.jpg) _The Help menu open: a Continue: row for Switch on your starter flows (its name cut to fit) above Tutorials, which shows its sticker count and a dot, then Docs and guides, Bloopbot Discord and News from Bloopbot._ While a tutorial is paused or running, **Overview** carries the same thing as a card: **Continue:** the tutorial’s name and the step, with a **Resume** button. ![Overview’s Continue card: Continue: Switch on your starter flows, step 1 of 3, with a Resume button.](https://bloopbot.com/docs/screenshots/tutorials-continue.jpg) _Overview’s Continue card for a paused tutorial._ ## While a tutorial runs Pebble’s card shows the tutorial’s name, a ring and a step count (“step 4 of 10”), then what to do. Along the bottom: - **Next** moves on from a step Bloopbot can’t watch. A step it can watch says **I’ll notice when it’s done** instead. - **Skip step** appears on steps you can pass over, such as changing an alert’s message. - **Show me again** replays the ghost hand’s demonstration. - **Do it for me** does the step for you where Pebble can, such as making your first overlay. - **Take me there** appears when the next step is on another page. Pebble also points at where that page lives in the sidebar, so you learn where things are. For a page under **Settings**, such as **Team**, Pebble points at **Settings** first. Icons at the top of the card: - The speaker turns Pebble’s chirps on or off. They’re off until you turn them on. - The pause icon (**Pause the tutorial**) asks “Pause the tutorial? I’ll keep your place.” Choose **Pause** and carry on with your day; the tutorial waits on the **Tutorials** page, in the **Help** menu as **Continue:** and on **Overview** until you press **Resume**. Pressing **Escape** from the card or the highlighted control asks the same question. - The close icon (**Never show this again**) asks “Turn this tutorial off?” Choose **Never show again** and it won’t pop up again. It stays on the Tutorials page as **Turned off**, and **Start again** brings it back with your progress kept. **Keep going** in either question changes your mind. If you use the keyboard, press **Alt+Shift+P** to jump to Pebble’s card from anywhere on the page, and again to return to where you were. **Tab** from the highlighted control goes straight into the card. If you leave a step alone for a little while, Pebble gives you a gentle nudge. With reduced motion turned on in your system, Pebble fades between places instead of flying, and the ghost hand doesn’t travel. ## The tutorials Tutorials appear in the order Bloopbot would suggest them. Pebble offers at most one a day, and only when it fits where your channel is; you can start any that isn’t [locked](https://bloopbot.com/docs/tutorials#locked) from the Tutorials page at any time. | Tutorial | What you do | | --- | --- | | Set up your bot | Required for a channel linked after it arrived, owner only. Turn on your commands, meet your alerts, put them on stream, make the bot a mod and test it. See [Get started with Bloopbot](https://bloopbot.com/docs/getting-started#setup). | | Your first flow | Build a `!lurk` command from nothing: a trigger, a reply, **Test fire** and the **Live** switch, then try it in your chat. See [Create your first chat command](https://bloopbot.com/docs/first-command). | | Your first overlay | Choose a follower or sub alert, then build, publish and test it so it really plays in your streaming app. | | Add a sub alert | Add a sub alert to an overlay you already have. Listed for Twitch Affiliate and Partner channels, because subscriptions come with those; locked on a channel without a level. | | Put your alerts on stream | Add your alerts overlay to your streaming app and watch an alert play on stream. Offered when you put that step off in Set up your bot; a channel linked before Set up your bot arrived doesn’t see it. | | Make your bot a mod | Send `/mod` in your Twitch chat so shoutouts and loyalty work. Offered when you put that step off in Set up your bot; Twitch only, and a channel linked before Set up your bot arrived doesn’t see it. | | Bring your commands over | Bring commands over from Nightbot or StreamElements, each as a flow you can change. Offered when Pebble finds them. [Coming from Nightbot](https://bloopbot.com/docs/coming-from-nightbot#import) and [Coming from StreamElements](https://bloopbot.com/docs/coming-from-streamelements#import) cover the importer. | | Switch on your starter flows | Turn on the greetings, shoutout, clips, quotes and more that are already on your channel, paused. | | Ready to go live | Before your first stream: check your overlay, an alert, your bot and your flows, then meet **Live**. | | Invite a helper | Bring in an editor who builds with you, or one of your moderators to run the stream. See [Share the work with mods and editors](https://bloopbot.com/docs/editors). | | Make it only for mods | Add a **Who can trigger** check so only moderators can use a command, and see where your Commands page lists it. | | Edit a starter flow | Open one of the flows that came with your channel and make its message sound like you. | | Add a goal bar | Put a bar on stream that fills as followers or subs come in. | | Give an alert its own sound | Pick which of your alerts gets a sound (any of the seven alert types), choose the file under **Sound**, hear it in Studio, **Publish** and test it on stream. Locked until an alert is on a published overlay. See [Show alerts on stream](https://bloopbot.com/docs/alerts#media). | | Channel points alert | Make a channel points reward pop up on stream every time a viewer redeems it. Enable Channel Points in your Twitch Creator Dashboard first; see [Trigger alerts, sounds and replies with channel points](https://bloopbot.com/docs/reward-redemptions). | | Set up loyalty points | Review earning defaults, prepare or reuse one balance-reading command and understand a valid zero balance. No sample payout is created. See [Loyalty](https://bloopbot.com/docs/loyalty-and-regulars). | | Your first timer | Make your bot speak up every few minutes, only while you’re live and chat is awake. See [Post a recurring chat message](https://bloopbot.com/docs/timers). | | Count with a variable | Declare a number your bot remembers, then build a `!death` command that adds one and says the count. See [Keep a counter with variables](https://bloopbot.com/docs/variables). | | Share your public page | Turn on your public page, then copy the one link for your Twitch bio. See [Make your public page your one link](https://bloopbot.com/docs/public-page). | | Your first control panel | Make a panel, put one of your flows on it as a button, switch the flow on, then open the panel and press the button. Locked until you have a flow. See [Control panels](https://bloopbot.com/docs/control-panels). | | Make your overlay vertical | Lay an overlay out for Twitch’s dual format: press **Vertical layout** in Studio, drag one layer on the tall canvas, and copy the **Vertical canvas** link from **OBS URL**. See [Vertical overlays for Twitch dual format](https://bloopbot.com/docs/vertical-overlays-twitch-dual-format). | ## Who sees which tutorials Each person sees the tutorials that fit what they can do on the channel. - **Owners** see all of them. Set up your bot, Put your alerts on stream, Make your bot a mod, Ready to go live and Invite a helper are for owners only, because they check the bot, the stream and the team. - **Editors** see the ones about building: overlays, alerts, flows, variables, control panels, the importer and the public page. They find Your first flow and Your first overlay on the Tutorials page rather than being offered them during the owner’s first run, because first run belongs to the owner. - **Moderators** you’ve let into the dashboard don’t have any tutorials yet. Their Tutorials page says so, and their **Help** menu has no **Tutorials** row. - **Give an alert its own sound** is locked until an alert is on one of your published overlays, and Pebble offers it when an alert is live in a streaming app and none of your alerts has a sound yet. Every channel can choose any of the seven alert types. Enable the matching Twitch feature before expecting real events. - **Add a sub alert** is listed for Twitch Affiliate and Partner channels, because subscriptions come with those; on a channel without a level its card is locked and says so. **Channel points alert** and **Add a goal bar** unlock after **Your first overlay** or **Set up your bot**. Enable Channel Points in your Twitch Creator Dashboard before using the channel points alert. Progress belongs to each person. An editor pausing, skipping or turning off a tutorial changes nothing for the owner. When an editor finishes Your first overlay, though, the channel counts as set up, so Pebble stops landing the owner on first run. ## If something looks wrong - **Pebble says a step isn’t done, but it is.** Pebble re-checks every few seconds and whenever you return to the tab. Give it a moment, or reload the page. - **Pebble says the control has gone.** Pebble scrolls it into view and says where it went if it can’t find it. Check you’re on the right channel and page, or press **Take me there**. - **The test alert never plays in OBS.** The tutorial waits for a real play. [Test alerts and check OBS delivery](https://bloopbot.com/docs/alerts-in-obs) and [OBS is blank or the test never arrives](https://bloopbot.com/docs/troubleshooting#obs) cover the usual causes: the source hidden in the current scene, or the wrong address. - **You turned a tutorial off by mistake.** Open **Help** › **Tutorials** and press **Start again** on its card. - **No Tutorials row in Help.** It’s shown to owners and editors. A moderator’s dashboard shows only the pages that run the stream. - **A card didn’t appear for a tutorial.** Pebble offers one a day at most. Open **Help** › **Tutorials** and press **Start** to begin any tutorial that isn’t locked. - **A tutorial is locked.** Read the line on its card: it names the tutorial to finish first, or what your channel needs. See [Locked tutorials](https://bloopbot.com/docs/tutorials#locked). --- # Use your own bot account Make Bloopbot speak in your chat under a Twitch account you made for it, instead of the shared bot. Updated 14 October 2026 ## What changes Out of the box, Bloopbot talks in your chat as a shared bot account. With your own bot account linked, every chat reply, announcement and moderation action from your flows comes from a name you chose instead — _MyChannelBot_, say. Your flows, commands and widgets stay exactly as they are; only the name in chat changes. > **Making the bot a moderator** > > Pebble’s **Set up your bot** tutorial has a **Make your bot a mod** step that shows the `/mod` command to copy and send in your Twitch chat, and **Ready to go live** checks the bot is one. If you put the step off, **Make your bot a mod** waits on your **Overview** under Next steps. Start any of them from [Tutorials](https://bloopbot.com/docs/tutorials). Your own bot account is not available on every channel yet. Open **Settings** › **Plan & billing** and look for **Your own bot account** under **Install resources** — [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) explains the page. When your channel does not include it, your **Connections** page has no **Bot account** section, and the shared bot keeps speaking for you. ## Before you start - A second Twitch account for the bot, made on Twitch itself. Bloopbot does not create one. Use an account you control and can sign in to; its name is the one viewers will see. - You must be the channel owner. Editors can see the **Bot account** section, but its buttons are only there for the owner. - Be ready to sign in to Twitch as the bot rather than as yourself. ## 1. Open the Bot account section Open **Settings** › **Connections** in the sidebar. In the list on the left, choose **Bot account**. The card shows which account joins your chat now, whether it is your channel’s own pick or the default, and a status: **Connected**, **Missing permissions**, **Needs reconnecting** or **Not connected**. ## 2. Link the bot account 1. Choose **Link a bot account** (it reads **Link a different bot account** once one is linked). 2. Twitch asks you to sign in and authorize Bloopbot. Sign in **as the bot account**, not your streaming account. If Twitch signs you straight in as yourself, sign out on twitch.tv first, then choose **Link a bot account** again. 3. Accept every permission Twitch lists. The bot needs all of them to read and send chat, make clips and act as a moderator. 4. You return to **Connections**. The card now says the bot joins your chat as your bot’s name, _picked for this channel_. ## 3. Make it a moderator The card reminds you to make the new account a moderator. Until Twitch lists it, every page of your dashboard shows a **Not a mod** bar: copy the command from it and send it in your own Twitch chat. The command uses your bot’s login: ``` /mod your_bot_username ``` > **Use your bot’s real name** > > `your_bot_username` is a placeholder. Copy the login from the card. Linking the account and making it a moderator are separate steps: until you run the command, flows that need a moderator are paused ([what pauses](https://bloopbot.com/docs/flow-basics#bot-mod)). ## Check it works 1. Make sure a simple command flow is on — [Create your first chat command](https://bloopbot.com/docs/first-command) sets one up. 2. Type the command, such as `!hello`, in your Twitch chat. 3. The reply comes from your bot’s name. This is a live check: it posts in your real chat. **Test fire** in the flow editor proves a flow’s wiring but posts nothing, so it cannot show which account speaks. ## Switch back or change accounts - **Use the default bot** returns your channel to the shared bot. Your account stays linked, so you can pick it again later. - **Switch to another linked account** lists the other bot accounts you have linked; choose one to move your chat to it. - To move to a brand-new bot, choose **Link a different bot account** and sign in as that account. Run `/mod` for the new name afterwards. ## Troubleshooting - **Missing Permissions** after signing in: a permission was not accepted on the Twitch page. Choose **Link a bot account** again and accept every one. - The Twitch account is _already linked as a bot account here_: someone else linked it first, and only they can re-link it. Nothing was changed; make a different account for your bot. - **Needs reconnecting**, or the card says your bot account needs re-linking: its sign-in has expired. Choose **Link a different bot account** and sign in as the same bot account to renew it. - The card lists missing newer permissions: choose **Re-link it** in that warning and sign in as the bot to grant them. - The bot replies but cannot time out, delete messages or run a nuke: it is not a moderator yet. Copy the `/mod` command from the **Not a mod** bar and send it in your Twitch chat. The Flows page lists what is paused. - The bot stopped reading chat, and Twitch says it is banned when you try `/mod`: your channel has banned the bot, and Twitch lets a banned account neither read chat nor become a moderator. Send `/unban your_bot_username` in your chat. Bloopbot notices and starts reading chat again within a few seconds; then make it a moderator. - There is no **Bot account** section on Connections: your channel does not include your own bot account yet, or you are an editor rather than the owner. The shared bot keeps working either way. - _This link was started from a different sign-in_: the Twitch round trip must finish in the same browser, signed in to the same dashboard, that started it. Start again from **Connections**. --- # Use Bloopbot on Kick Sign up with your Kick account, or add Kick to your Twitch channel, so Kick chat, follows, subs and KICKs run your flows and show in your chat box, and your flows can run Kick ads and read your top KICKs. Updated 30 October 2026 ## Two ways to use Kick Bloopbot works with Kick in two ways. Pick the one that matches how you stream. | You stream on | What to do | | --- | --- | | Kick only | [Sign up with Kick](https://bloopbot.com/docs/bloopbot-on-kick#sign-up). Your Bloopbot channel is your Kick channel. | | Twitch, and Kick at the same time | Keep signing in with Twitch and [add Kick to your channel](https://bloopbot.com/docs/bloopbot-on-kick#connect). Both chats run the same flows. | Either way, Kick chat messages, commands, follows, new subs, resubs, gifted subs and KICKs start your flows. Your chat box shows Kick chat beside Twitch's, [with each line marked and filterable by platform](https://bloopbot.com/docs/chat-box#platforms). ## Sign up with Kick 1. On the sign-in page, choose **Sign in with Kick**. 2. Kick lists what Bloopbot may do: read your channel, post in your chat and receive your channel's events, plus the permissions its other Kick features use. Choose **Allow**. 3. You land on your new channel's dashboard. Your Starter flows are already there, paused, like on any new channel. Flows that need Twitch, such as **Clip it** and **Shoutout**, are left out. ![The Bloopbot sign-in card with two buttons: Sign in with Twitch and Sign in with Kick.](https://bloopbot.com/docs/screenshots/kick-sign-in.jpg) _The sign-in page offers **Sign in with Kick** beside Twitch._ From then on, **Sign in with Kick** opens the same channel. Add a [backup sign-in email](https://bloopbot.com/docs/backup-sign-in-email) so you can still get in if Kick sign-in isn't working. > **Pages you won't see** > > Some pages need Twitch to work, such as the stream **Schedule**, **Highlights**, **Nukes**. Set up your bot has no moderator step on Kick. A Kick channel doesn't show them. Your public page's **Home sections** leaves out **Schedule**, **Recent broadcasts** and **Top clips** the same way ([Schedule, broadcasts and clips](https://bloopbot.com/docs/public-page#twitch)). The flow editor still lists the steps that need Twitch, such as **Shoutout**, but fades them and marks each **Needs Twitch**, so you can see what exists and why you can't add it. Ready-made flows and packs that need Twitch are shown faded the same way and are left out on a Kick channel. ## Add Kick to your Twitch channel 1. In your dashboard, open **Settings** › **Connections**. 2. Select **Kick** in the list, then choose **Connect Kick**. 3. Sign in to Kick if it asks, then choose **Allow**. 4. You're back on **Connections**, and the Kick card shows your Kick channel's name with **Connected**. ![The Kick card on Connections, showing the Kick channel local\_streamer as Connected, with Reconnect Kick and Disconnect Kick buttons.](https://bloopbot.com/docs/screenshots/kick-connection-card.jpg) _A Twitch channel's Kick card once its Kick channel is added._ Each Kick channel can be added to one Bloopbot channel. To stop, choose **Disconnect Kick** on the Kick card. Your flows stop hearing from Kick straight away. Disconnecting only removes Kick: your channel, its flows and its Twitch connection stay. While Kick is connected, **Unlink Twitch** doesn't work: it would delete the channel your Kick connection belongs to. Choose **Disconnect Kick** first, then **Unlink Twitch**. ## Reconnect for new features Bloopbot asks Kick for every permission its Kick features use when you sign in or add Kick. A connection made before a feature existed keeps working, but Kick won't let Bloopbot use that feature until you approve it. When that happens the Kick card says **Update available** and names what you'd get, for example "Reconnect Kick to allow rewards, moderation, channel info, KICKs and ads." 1. Open **Settings** › **Connections** and select **Kick**. 2. Choose **Reconnect Kick**, then choose **Allow** on Kick. 3. The card goes back to **Connected**. On a Kick channel, **Reconnect Kick** signs you in with Kick again. It's the same channel, with the new permissions. ## Delete a Kick channel A channel you signed up for with Kick has Kick as its only connection, so unlinking Kick deletes the channel. 1. In your dashboard, open **Settings** › **Connections** and select **Kick**. 2. Choose **Unlink Kick**. Only the channel's owner sees it. 3. Read the list of what goes, type your channel's name, then choose **Unlink and delete everything**. 4. You're taken to your channel list. Bloopbot has stopped listening to your Kick channel and given back its access to your Kick account. Unlinking deletes every flow, command, overlay and setting, the loyalty points, viewer data, quotes and giveaways, your custom domain, your backup sign-in email and your marketplace listings. It can't be undone. It doesn't cancel a paid plan, so cancel that on the **Billing** page first. [What Bloopbot measures and keeps](https://bloopbot.com/docs/privacy-and-analytics#after-unlinking) lists the short history kept afterwards. If you **Sign in with Kick** again later, Bloopbot makes you a new, empty channel, as on your first sign-up. ## Choose where a flow starts Chat, command, keyword, follow, sub, resub, gift sub, cheer, ban and reward triggers can start on Twitch, on Kick, or on both. They start on both unless you choose otherwise. (**Stream starts or ends** and **Stream info changes** are the exception: on a Twitch channel they start from Twitch unless you choose Kick. See [Going live and stream info on Kick](https://bloopbot.com/docs/bloopbot-on-kick#stream).) 1. Open the flow and select its trigger. 2. Open **More options**. 3. Set **Platform** to **Twitch and Kick**, **Twitch only** or **Kick only**. The **Platform** option appears once you [add Kick to your channel](https://bloopbot.com/docs/bloopbot-on-kick#connect). Until then the trigger shows no choice, because Twitch is the only place it can start. A trigger that already says **Kick only** or **Twitch only** keeps the option, and a trigger set to **Kick only** on a channel with no Kick added shows a warning that it never runs. Once Kick is added, steps that only work on Twitch carry a **Twitch only** badge in the node list and on the flow. They stay fully usable. Kick can't run them, so in a run that a Kick message started, a step like **Shoutout** fails when it acts on the Kick viewer. Keep those steps in flows that start from Twitch, or put a trigger's **Platform** on **Twitch only**. For example, a `!hello` command that replies "hi $(user)" answers on Kick when someone types it in Kick chat, and on Twitch when someone types it there. ## Going live and stream info on Kick **Stream starts or ends** and **Stream info changes** follow the platform your channel is on: - On a Kick channel they start when your Kick stream goes live or offline, or when you change its title or category on Kick. - On a Twitch channel with Kick added they start from Twitch only. Going live on both never posts your announcement twice. To start from Kick as well, open the trigger's **More options** and set **Platform** to **Kick only** or **Twitch and Kick**. Kick going live on a Twitch channel never changes your Twitch stream's live state, title or category, your stream counters, or your highlights. Only the flows you opted in to Kick run. **Set title or category** changes your Kick stream too. Give it a title, a category and, for Kick, **Kick tags** (up to 10, separated by commas, replacing the current ones). Type the category exactly as Kick spells it, such as "Just Chatting". If Kick has no category with that name, the step says so and changes nothing. On a Kick channel the step always acts on Kick. In a flow that a Twitch or Kick message started, it acts on that message's platform. In a timer, a control panel button or a webhook flow on a Twitch channel with Kick added, set the step's **Platform** (under **More options**) to **Twitch** (the default), **Kick** or **Twitch and Kick**. If you added Kick before this step existed, [reconnect Kick](https://bloopbot.com/docs/bloopbot-on-kick#reconnect) first. **Stream status** checks whether you are live. On a Kick channel it checks Kick. On a Twitch channel it checks Twitch unless you set its **Platform** to **Kick**, or to **Twitch and Kick** to pass when either stream is live. ## Moderating from Kick Bloopbot's moderation filters, `!filters` and `!permit` style commands, and the **Time out** and **Delete message** steps work in Kick chat, using the permission you approve when you sign in with Kick or add Kick. If a step reports "Reconnect Kick to allow moderation.", follow [Reconnect for new features](https://bloopbot.com/docs/bloopbot-on-kick#reconnect). The [moderation guide](https://bloopbot.com/docs/moderation#kick) has the details. ## Where replies go A chat reply goes back to the chat its trigger came from: a Kick command answers in Kick chat. A flow that no chat started, such as a timer, a control panel button or a webhook, posts in every chat your channel has. When a flow posts to both chats, Bloopbot tries each independently. If one fails, the Run log keeps the result for both; a successful post is not sent again. An **uncertain** result means the platform did not confirm whether it posted. Bloopbot does not automatically retry it, because that could post twice. The step follows its **Error** connection when any selected chat fails or cannot confirm delivery. Check the Run log before manually running the flow again. Use `$(platform)` in any text to get `twitch` or `kick`, the place the trigger came from. It's empty for a timer or a button press. KICKs start the **Cheer** trigger. The number of KICKs is the amount, so `$(bits)` reads it like bits. ## Kick in channel data The bot's own memory, under **Variables → Channel data**, keeps Kick apart where it matters: - KICKs aren't counted as bits. They have their own **Last KICKs**, **This stream so far → KICKs** and **Top KICKs giver this stream**, and **KICKs leaders** shows your all-time, monthly and weekly KICKs leaderboards. - The last follow, sub, gift, cheer and reward each have a **Platform** of `twitch` or `kick`. - On a Kick channel, **Stream** is your Kick stream and **Channel → Subscribers** is your Kick subscriber count. Kick doesn't publish a follower count, so **Followers** counts only the follows Bloopbot sees. - With Kick added to a Twitch channel, **Stream** stays Twitch's, and **Kick stream** shows your Kick stream beside it. [Kick in channel data](https://bloopbot.com/docs/variables#kick) lists the values to insert. Kick channel rewards start **On a reward redeemed**, and **Fulfil or refund reward** accepts or rejects the redemption on Kick. [Rewards on Kick](https://bloopbot.com/docs/reward-redemptions#kick) has the details, including why Kick can't refund points. ## Ads on Kick **Run a commercial** starts a Kick ad break as well as a Twitch one. Where it runs depends on what started the flow: - A flow started from Kick, such as a `!ad` command typed in Kick chat, runs a Kick ad break. - A flow started from Twitch runs a Twitch commercial. - On a channel you signed up for with Kick, it always runs on Kick. A flow that nothing on Kick or Twitch started, such as a timer or a control panel button, uses the step's **Platform** setting. To choose it: 1. Open the flow and select the **Run a commercial** step. 2. Open **More options**. 3. Set **Platform** to **Twitch**, **Kick** or **Twitch and Kick**. It starts on **Twitch**. The **Platform** setting appears once you [add Kick to your channel](https://bloopbot.com/docs/bloopbot-on-kick#connect). A Kick ad break lasts up to 90 seconds, so a step set to 2 or 3 minutes runs a 90-second break on Kick. Kick only runs an ad break while you're live and your Kick channel has opted in to ads. If Kick says no, the step fails, and the flow's **Run log** gives Kick's reason, for example that you're not live or a break is already running. If it reports "Reconnect Kick to allow ads.", follow [Reconnect for new features](https://bloopbot.com/docs/bloopbot-on-kick#reconnect). ## Show your top KICKs givers The **Top KICKs** step reads your Kick KICKs leaderboard for this week, this month or all time. It says nothing by itself. Add a **Chat message** step after it to post the list. For example, a `!topkicks` command: 1. Add a flow that starts with a **Chat command** trigger named `topkicks`. 2. Add a **Top KICKs** step. Set **Period** to **This week** and **Places to read** to `3`. 3. Add a **Chat message** step after it. Type `Top KICKs this week: `, then pick the step’s **The list, written out** from the **Insert…** menu. 4. Turn the flow on and type `!topkicks` in chat. Bloopbot answers with something like "Top KICKs this week: #1 Ada: 500 | #2 Grace: 120". The step also hands on the top giver's name and KICKs, how many places it read, and whether anyone gave KICKs at all, so the flow can say something different when nobody has. **Top KICKs** needs Kick. On a Twitch channel with no Kick added, the editor warns that it fails until you [add Kick](https://bloopbot.com/docs/bloopbot-on-kick#connect). ## Kick viewers A Kick viewer and a Twitch viewer are different viewers, even when they're the same person. Each has their own points, roles and viewer variables. When a command names a viewer, such as `!addpoints @bob 100`, and both Twitch and Kick have a `bob`, Bloopbot picks the `bob` on the platform the command came from. A name Bloopbot hasn't seen yet is found on that platform too, so `!addpoints newface 100` from Kick chat gives points to the Kick viewer `newface`. On the dashboard, the **Loyalty** page's viewer search finds Kick viewers. When both platforms have a viewer by the name you type, it shows both, each with its Twitch or Kick mark, and **Adjust** changes the one you pick. [Look up a viewer](https://bloopbot.com/docs/loyalty-and-regulars#viewer) has the details. **VIP**, **Moderator** and **Warn** are Twitch only. In a run a Kick message started, leaving **Who** blank (the Kick viewer who typed the command) fails with "VIP, moderator and warnings are Twitch only: name a Twitch viewer." Type a Twitch username instead. **Shoutout** and **Start a raid** always look the name up on Twitch. ## What Kick can't do yet - [Moderation](https://bloopbot.com/docs/moderation#kick) works on Kick chat: the filters, the moderation commands, and the **Time out** and **Delete message** steps. **Nukes** and the **Moderation acted** trigger are Twitch only, and Kick has no warning message or unban event. - Raids, shoutouts, clips, polls, predictions, Shield Mode, chat settings, announcements and VIP or moderator changes are Twitch only: Kick has no way for Bloopbot to do them. - On a Kick channel, going live on Kick starts your going-live flows and live-only timers. When you add Kick to a Twitch channel, going live still follows Twitch unless you [choose Kick](https://bloopbot.com/docs/bloopbot-on-kick#stream) on the trigger. - Kick doesn't publish badge pictures, so Kick badges don't show in the chat box. - **Snooze the next ad** is Twitch only: Kick has no snooze. ## Troubleshooting - **Kick commands don't answer.** Check the flow is turned on and its **Platform** isn't **Twitch only**. On **Connections**, the Kick card should say **Connected**. - **Kick says Needs reconnecting.** Choose **Reconnect Kick** and allow Bloopbot again. Kick asks for this when access has expired or was removed in your Kick settings. - **"That Kick account is already connected to another Bloopbot channel".** Each Kick channel can belong to one Bloopbot channel. Disconnect it from the other channel first. - **"This Kick account is already connected to a Twitch channel on Bloopbot".** That Kick channel was added to a Twitch channel, so it can't also be its own channel. Sign in with Twitch to use it, or disconnect it there and then sign in with Kick. --- # Keep a backup way to sign in Add a backup sign-in email, so you can still open your dashboard if Twitch sign-in isn’t working, and choose whether you get product news and tips from Ryan. Updated 15 October 2026 ## What a backup email is for If you ever can’t sign in with Twitch, a backup sign-in email gets you back into your dashboard. It’s optional, and only an address you’ve confirmed can sign you in. It doesn’t create a new account: it signs you in to the one you already have. It’s also how we reach you about your account. Product news, such as launch updates and new features, goes to it only if you ask for it: see [Product news](https://bloopbot.com/docs/backup-sign-in-email#news). A few short tips and check-ins from Ryan come unless you switch them off: see [Tips and check-ins from Ryan](https://bloopbot.com/docs/backup-sign-in-email#tips). ## Before you start - You need to be able to sign in with Twitch once, to add the address. - Use an inbox you’ll still have if something happens to your Twitch account. It doesn’t have to be the address Twitch uses. - Each address can be the backup for one account only. ## Add it from the bar at the top Until you add an address, your channel’s pages show a bar across the top: **Add an email so we can reach you.** 1. Type your address. If Twitch shared your email when you signed in, the field may already hold it. 2. If you want product news and launch updates, tick the box beside the address. It starts unticked. 3. Choose **Send link**. The bar now says **Check your inbox** and names the address. Choose **Resend** for a new link, or **Change** to fix a typo. 4. Open the email and confirm the address, as in step 5 below. The bar goes away. ![The bar across the top of a channel's dashboard pages: Add an email so we can reach you, an email field holding streamer@example.com, an unticked box reading Send me Bloopbot product news and launch updates. Unsubscribe any time., a Privacy link, a Send link button, and Not now at the far right.](https://bloopbot.com/docs/screenshots/contact-bar.jpg) _The bar at the top of your channel’s pages, with an address typed in and the product news box unticked._ **Not now** hides the bar for a week, on every device. On a narrow window the bar shows **Add email**, which opens **Account**. ## Add a backup email 1. In your dashboard, choose **Account** at the bottom of the sidebar, under your name. 2. Under **Backup sign-in email**, type the address. If Twitch shared your email when you signed in, the field may already hold it; change it if you like. 3. If you want product news, tick the box under the address. Leave it unticked if not. 4. Choose **Save and send confirmation**. The card now shows the address as **Waiting for you to confirm**. 5. Open the email we send. It names the Twitch account the address will sign in to, such as _@yourname_. Choose **Confirm this address**, then **Confirm** on the page that opens. The link expires in 24 hours. The page says **Backup email confirmed**, and **Account** now shows the address as **Confirmed**. From now on the save button reads **Change address**. ![The Backup sign-in email card on the Account page: streamer@example.com marked Confirmed, the same address in the Backup sign-in email field, Change address, Remove backup email and Send me a sign-in link buttons; below a divider, Product news: Off, with a Turn on button; and below another, Tips and check-ins from Ryan: On, with a Turn off button.](https://bloopbot.com/docs/screenshots/backup-email-account.jpg) _A confirmed backup sign-in email on the Account page._ ## Check it works You can test your confirmed address while keeping this dashboard signed in. 1. Open **Account** and choose **Send me a sign-in link**. For example, if your confirmed address is `streamer@example.com`, the page says the link was sent there. A replacement address waiting for confirmation is not used. 2. Open the email in a private window or on another device. Choose **Sign in**, then **Continue**. 3. Check that your own dashboard opens there. Your original window stays signed in. Each link works once and expires in 15 minutes. Asking for another replaces the earlier link. Tests share the usual limit of three sign-in links an hour for one address; if the page says the email could not be sent, wait a minute and try again. ## Sign in with email 1. On the sign-in page, choose **Can’t use Twitch? Sign in with email instead**. 2. Enter your backup email and choose **Email me a sign-in link**. The next page says **Check your inbox**. 3. Open the email and choose **Sign in**, then **Continue** on the page that opens. You land on your dashboard, the same as a Twitch sign-in. Each link works once and expires in 15 minutes. ![The Sign in with email page: a line asking for your backup sign-in email, the Backup sign-in email field holding streamer@example.com, an Email me a sign-in link button, and a note that only an address you have already confirmed under Account can sign you in.](https://bloopbot.com/docs/screenshots/backup-email-signin.jpg) _The Sign in with email page, reached from the sign-in page._ ![The page a sign-in link opens, headed Sign in to your dashboard, with the line Press Continue to finish signing in above a Continue button.](https://bloopbot.com/docs/screenshots/backup-email-continue.jpg) _The page a sign-in link opens. Nothing happens until you press Continue._ > **The same page for every address** > > For your safety, **Check your inbox** appears whatever address you type, so the page never reveals which addresses have an account. Only a confirmed backup email actually receives a link. ## What works while Twitch is unavailable Signing in by email opens your dashboard, so you can change flows, widgets and settings. It doesn’t reconnect Twitch. Anything that needs your Twitch connection — chat messages, alerts for Twitch events, channel point rewards — waits until that connection works again. When Twitch is back, open **Settings** › **Connections**, review your Twitch status and follow a re-authorisation prompt if one is shown. ## Product news Product news is off unless you turn it on. If you ticked the box when you added your address, it starts once you confirm that address; the confirmation email says so. - **Turn it on or off:** on **Account**, under **Product news**, choose **Turn on** or **Turn off**. Turning it on needs a confirmed address. - **If you confirmed an address before this existed:** a bar asks once, **Want Bloopbot product news at** your address. Choose **Yes please** or **No thanks**; it doesn’t ask again. - **Unsubscribe from an email:** every product news email has an unsubscribe link. Open it and choose **Unsubscribe**. You don’t need to sign in. Sign-in links and important account emails still arrive with product news off. ## Tips and check-ins from Ryan Ryan, who builds Bloopbot, sends a few short emails about your own channel: a welcome when you link it, a nudge if setup seems stuck, a note after the bot’s first stream, one question after your first week, and a check-in if you haven’t been around for a while. They’re about using Bloopbot, never offers or adverts, and a reply goes straight to him. Until your Discord account is linked and in Bloopbot’s Discord, the welcome and the setup nudge also invite you to join it. The link signs you in with Discord and adds you to the server. When there is community news, the invitation also includes a **What’s new in Discord** section. Where joining unlocks Free+, the email says so: Free+ adds web requests and room for five themes to your channel at no cost. They go to your confirmed backup email or, if you haven’t added one, to the email on your Twitch account. They’re separate from product news: switching one off never changes the other. If you’ve separately asked us to stop contacting that address, we respect that request for these tips too. Turning the tips switch on in Account does not undo that request. Sign-in links and important account emails still arrive. - **Turn them off or on:** on **Account**, under **Tips and check-ins from Ryan**, choose **Turn off** or **Turn on**. - **Stop them from an email:** each one ends with a link. Open it and choose **Stop these emails**. You don’t need to sign in. ## Change or remove the address On **Account**, type a different address and choose **Change address**. We send a confirmation email to the new address, and the card shows **Waiting to confirm** with the new address under your current one. Your current address keeps signing you in until you choose **Confirm this address** in the new email. Once you do, the new address takes over, the old one stops working and gets a notice saying so, and any sign-in link sent to the old address stops working. To keep your current address instead, save it again. To stop using a backup email, choose **Remove backup email**. A confirmed address gets a notice that it was removed, and product news stops. Either way, any sign-in link you already had stops working. Choosing **Unlink Twitch**, or **Unlink Kick** on a Kick channel, on your channel’s **Connections** page also removes your channel’s backup sign-in email. ## If something goes wrong - **No email arrived.** Check your spam folder, wait a minute and ask again. For your safety you can request three sign-in links an hour for one address. - **“This link has expired or was already used.”** Choose **Send a new link**. Links work once, for a short time, and asking for a new one replaces the old one. - **The link opened on another device.** That’s fine: press **Continue** there, or ask for a new link on the device you want to use. - **“That address is already used for another account.”** Each address can be the backup for one account. Use a different one. - **“You’ve changed this a few times already.”** You can save a backup email five times an hour. Try again later. - **“Confirm your backup email first, then switch product news on.”** Product news goes only to a confirmed address. Confirm it from the email we sent, or save it again for a new link. - **“We couldn’t read this link” after choosing Unsubscribe.** Sign in and choose **Turn off** under **Product news** on **Account** instead. - **“We couldn’t read this link” after choosing Stop these emails.** Sign in and choose **Turn off** under **Tips and check-ins from Ryan** on **Account** instead. - **Account says “Backup sign-in isn’t available on your channel yet”, or the sign-in page has no email option.** Backup sign-in may not be available on your channel yet. Sign in with Twitch as usual. --- # Coming from Nightbot Import your Nightbot commands as Bloopbot flows, map the rest of Nightbot onto Bloopbot, and switch over without duplicate replies. Updated 14 October 2026 ## Before you start In guided setup, **Bring commands over** is optional. Review the commands you want before importing; your other bot can stay in place. Help recognises current imported flows, including your renamed or edited commands, and keeps the same records. A normal command alone is not evidence of an import. This guide maps what you already built in Nightbot onto the closest thing in Bloopbot, so you are not starting from a blank page. Your commands can come across automatically: see [Import your commands](https://bloopbot.com/docs/coming-from-nightbot#import). Everything in Bloopbot is a flow — a trigger, optional checks and one or more actions you draw on a canvas — so “add a command” and “add a filter” both mean building or installing a small flow rather than typing one line into a settings box. > **New channels** > > If the sign-in button on the Bloopbot homepage reads “Sign-ups are closed right now”, new channels can’t join yet. If you already have a Bloopbot channel, everything below works today; if you don’t, this guide will still be here once sign-ups reopen. ## Commands and permissions Nightbot’s `!commands add`, its `-ul=` userlevel and its `-cd=` cooldown become a trigger and, where you need one, a check node in front of your reply: | In Nightbot | In Bloopbot | Notes | | --- | --- | --- | | A custom command (`!commands add !name reply`) | A flow with a **Chat command** trigger ([create your first chat command](https://bloopbot.com/docs/first-command)) | The trigger’s **Command** field holds the word without the prefix, **Prefix** holds the character before it (`!` by default), and **Also responds to** is a comma-separated alias list — the same job as Nightbot’s `-a=`. | | `-ul=owner` / `-ul=moderator` / `-ul=twitch_vip` / `-ul=everyone` | A **Who can trigger** check between the trigger and the action, with **At least** set to broadcaster, moderator, VIP or everyone | That is Bloopbot’s full ladder for this check — broadcaster, moderator, VIP, subscriber, everyone. There is no separate follower level. | | `-ul=regular` (Nightbot’s Regulars list) | A **Has a role** check, **Roles** left at its default `Regulars` | A different check node from **Who can trigger**: **Has a role** reads **Viewers** › **Regulars** (or any other role you name), and the broadcaster and moderators pass it by default too. The **Regulars-only command** template wires this up for you — see [recognise regular viewers](https://bloopbot.com/docs/loyalty-and-regulars). | | `-cd=` | A **Cooldown** check, with a duration set on **Whole channel**, **Per viewer**, or both | Nightbot’s one number is closest to a channel-wide cooldown. A per-viewer cooldown, and letting moderators or yourself skip it, are Bloopbot additions — see [add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns). | | Spam filters (links, caps, symbols, blacklist) | The channel-wide filters on **Moderation**, each with its own thresholds, exemptions and response | These are settings that apply to every message, not something you draw — see [set up moderation helpers](https://bloopbot.com/docs/moderation). | | Timers (`!commands` posted on an interval, with an interval and a chat-lines setting) | A flow with an **On a timer** trigger | Set the interval in minutes, or specific days and a time of day, and optionally require that chat has moved since the last fire — see [post a recurring chat message](https://bloopbot.com/docs/timers). | | Song requests (`!songrequest`, `!sr`, played from Nightbot’s own YouTube/SoundCloud dashboard player) | The **Song requests** flow pack, playing through your own linked Spotify account | Different service and a different source library: Nightbot plays YouTube and SoundCloud links from its dashboard player; Bloopbot plays Spotify tracks through your own Spotify Premium account — see [let chat request songs](https://bloopbot.com/docs/song-requests). Song requests may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). | ## Variables Nightbot’s `$(…)` tokens and Bloopbot’s `$(…)` tokens look alike on purpose, but they don’t all come from the same place — Bloopbot’s come from the specific step that hands them on, mostly the trigger: | Nightbot | Bloopbot | Notes | | --- | --- | --- | | `$(user)` | `$(user)` — a **Chat command** trigger’s “Who typed it” | Same syntax, same meaning: whoever ran the command. | | `$(touser)` | `$(touser)` — “First word, or the viewer” | Also literally named `touser` in Bloopbot. Falls back to the person who typed the command when there is no first word, and drops a leading `@`. | | `$(query)` | `$(query)` — “Everything after the command” | Same job: the whole rest of the message after the command word. | | `$(1)` … `$(9)` (positional arguments) | `$(1)` … `$(9)` work the same way in any flow text field | All nine work, the same as Nightbot — the Starter pack’s own `!deaths +5` counter reads the amount as `$(3)`. Only `$(1)` (“First word after the command”) and `$(2)` (“Second word”) appear in the trigger’s own tray and **Insert…** menu; `$(3)` onward you type by hand. | | `$(channel)` | `$(channel)` — your channel’s name | Your channel’s login name, in any flow started by chat or a Twitch event. A timer has no chat line behind it, so there it’s empty. | | `$(userid)` | `$(userid)` | The ID of whoever ran the command. | | `$(command)`, `$(provider)` | Plain text | The importer writes them out: `$(command)` becomes the command itself, such as `!discord`, and `$(provider)` becomes `twitch`. | | `$(count)` (auto-incrementing per-command counter) | A declared **variable** plus a **Set a variable** action, read back as `$(var.name)` | Not automatic: you declare the variable once on **Variables**, then a **Set a variable** step adds to it. The Starter pack’s own `!deaths` counter is built exactly this way — see [keep a counter with variables](https://bloopbot.com/docs/variables). | | `$(twitch $(channel) "{{game}}")` | `$(data.stream.category)` — the **Stream** group’s **Category** in the **Insert…** menu | Your current category, kept up to date whether you’re live or offline. | | `$(twitch $(channel) "{{title}}")` | `$(data.stream.title)` | Your current stream title. | | `"{{viewers}}"`, `"{{followers}}"`, `"{{subscriberCount}}"` | `$(data.stream.viewers)`, `$(data.channel.followers)`, `$(data.channel.subscribers)` | Viewers is `0` while you’re offline. The follower count has no thousands separator. | | `"{{name}}"`, `"{{displayName}}"`, `"{{url}}"` | `$(channel)`, and `https://twitch.tv/$(channel)` for the link | Your channel’s login name, which Twitch shows in lowercase. | | `$(twitch $(channel) "{{uptimeLength}}")` | `$(data.stream.started_at_ago)` — **how long ago** in the **Stream** group | A human string like “3 hours”. It keeps counting after the stream ends, so pair it with a **Stream status** check if you only want it while live. The importer adds that check for you. | | `$(urlfetch url)` | A **Web request** action, whose answer becomes a value later steps can use | Not an inline token — it’s a step on the canvas, and the channel has to switch **Web requests** on before it can run. Web requests may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). The importer does this for you when a reply has one `$(urlfetch https://…)`, including `$(urlfetch json https://…)`. | | `$(eval …)` picking a random line | A **Pick at random** step, set to **One from a list** | Type one option per line; the reply reads the pick. There is no way to run your own JavaScript. | | `$(time timezone "format")`, `$(countdown …)`, `$(countup …)` | No direct equivalent | Bloopbot has no live clock or timezone-formatting token. An **On a timer** trigger firing at a set time of day covers most of what a scheduled `$(time)` announcement was doing. | | `$(twitch $(touser) …)` about someone else, `$(userlevel)`, `$(querystring)`, `$(weather)`, `$(lastfm)`, `$(steam)` and the game-rank lookups | No direct equivalent | A shoutout that reads another channel’s game becomes Bloopbot’s own shoutout: the importer offers it on the review. | A field that says it accepts variables shows an **Insert…** menu listing exactly what that step can read, so you don’t have to remember the exact token by hand. ## Import your commands Bloopbot can read the commands on your channel’s public Nightbot command list and turn each one into a flow for you. You don’t sign in to Nightbot, and nothing changes in Nightbot. 1. Open the importer. Set up your bot asks about them in its first step when it finds your Nightbot commands, and **Bring your commands over** is on **Tutorials** any time from **Tutorials** (it then asks which bot you used). Or go to **Flows → Marketplace → From another bot**. Or follow [bring my Nightbot commands](https://bloopbot.com/admin/import/nightbot) straight from here. 2. Choose **Nightbot**. Bloopbot lists every command Nightbot has for the Twitch account you signed in with. 3. Read each row. It shows the command, who could use it, its cooldown, and its reply as Bloopbot will send it. A warning line means something didn’t carry over exactly. Some rows offer **Use Bloopbot’s shoutout** (or clip, quote, giveaway entry) beside **Keep your reply**. Bloopbot picks one for you when it’s sure the command does that job; you can switch either way before you bring it over. 4. Untick anything you don’t want. Tick **Turn on now** for a command you want answering chat straight away. Everything else arrives paused. 5. Press **Bring these over**. Each command becomes its own flow called `!command (from Nightbot)` on your **Flows** page. ![Pebble on the Bring commands from another bot page at step 1 of 4 of Bring your commands over: I found your Nightbot commands, with a Next button, and the importer dimmed behind.](https://bloopbot.com/docs/screenshots/tutorials-import.jpg) _Pebble’s Bring your commands over tutorial on the import page, having found your Nightbot commands._ ![The Bring commands from another bot page listing four Nightbot commands, each ticked to bring over with a Turn on now box: !so with a choice between Use Bloopbot’s shoutout, selected, and Keep your reply, set to turn on; !uptime whose reply reads how long the stream has been live, with a note that it stays quiet offline; !lurk as a plain reply, set to turn on; and !discord.](https://bloopbot.com/docs/screenshots/bot-import-review.jpg) _The review: !so arrives as Bloopbot’s shoutout, !uptime reads how long you’ve been live, and !lurk stays your own reply._ What each command becomes: - The user level becomes a **Who can trigger** check, or a **Has a role** check for regulars. The cooldown becomes a **Cooldown** check on **Whole channel**. - `$(user)`, `$(touser)`, `$(query)`, `$(channel)`, `$(userid)` and `$(1)` to `$(9)` stay as they are. `$(command)` and `$(provider)` are written out. `$(count)` becomes a counter variable named after the command. It starts at Nightbot’s current count, so a death counter at 37 carries on from 37. - `$(twitch $(channel) "…")` is rewritten field by field: `{{game}}` becomes your current category, `{{title}}` your title, `{{viewers}}`, `{{followers}}` and `{{subscriberCount}}` the counts, and `{{name}}`, `{{displayName}}` and `{{url}}` your channel. So `Now playing $(twitch $(channel) "{{game}}")` says `Now playing Minecraft`. - `{{uptimeLength}}` becomes how long the stream has been live. While you’re offline, the command stays quiet instead of saying so. - A reply with a single `$(urlfetch https://…)` or `$(customapi https://…)` gets a **Web request** step that fetches the address first, and the **Chat message** puts the answer where the token was. Check the address before you turn it on. - A Nightbot alias, such as `!dc` running `!discord`, becomes an extra word on `!discord`’s **Also responds to** instead of a flow of its own. Some rows can’t go live straight away. Their **Turn on now** box is greyed out, and the command is brought over paused, as written, for you to finish in the editor: - a token Bloopbot doesn’t have, such as `$(time)` or `$(eval)` (see [Variables](https://bloopbot.com/docs/coming-from-nightbot#variables-map) for what to use instead); - a `$(urlfetch)`, which now arrives as a **Web request** step: check the address it calls before you turn it on; - a command Nightbot answered with no prefix, which in Bloopbot answers to `!` plus the word; - a reply that starts with a chat command such as `/announce`. The importer doesn’t bring over timers, spam filters, your Regulars list or song requests. Rebuild those as below. A regulars-only command still arrives with its **Has a role** check, so add your regulars on **Viewers** › **Regulars**. > **Your plan** > > Imported commands are flows like any you make, so they count towards your plan’s flow limit. Your first import is never refused for the limit, however many commands you bring. After that, the review shows how many more your plan has room for. If you tick more than that, nothing is brought over until you untick some. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). You can run the importer again after you add commands in Nightbot. A command you already brought over shows **Already brought over**, and one a flow here already answers shows **You already have**. Neither is ticked. If you tick a **You already have** row, it arrives paused beside your existing flow, so you can pick which one to keep on. ## Recreate your top commands Use this for anything the importer couldn’t bring over, or to start from Bloopbot’s own ready-made flows. Do it once your channel is signed in. 1. Open **Flows**, press **Marketplace**, and add the **Starter** pack. It brings ready-made command and event flows you can review, rename or leave paused — nothing goes live until you turn it on. Its own counter (`!deaths`, with mods adding to it via `!deaths +`) is a working example of a Nightbot-style tally, built from a declared variable and a **Set a variable** action. 2. For a command Starter doesn’t cover, press **+ New flow → Start blank**, add a **Chat command** trigger, and connect a **Chat message** action with your reply text. 3. Add a **Who can trigger**, **Has a role** or **Cooldown** check in front of the action for anything that was moderator-only, regulars-only or rate-limited in Nightbot. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: add the Starter pack, then anything it doesn’t already cover._ A worked example — a public `!discord` command with a moderator-only `!setdiscord` to update the link, the way many channels run it in Nightbot: 1. On **Variables**, declare a text variable named `discord_url` with your current invite link as its starting value. 2. Build a flow: **Chat command** (`discord`) → **Chat message** reading `Join us: $(var.discord_url)`. 3. Build a second flow: **Chat command** (`setdiscord`) → **Who can trigger** (**At least**: moderator) → **Set a variable** (`discord_url`, set to `$(query)`) → **Chat message** reading `Discord link updated.` 4. Save both, then test as below before you rely on them live. ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _The canvas view of a command flow: a Chat command trigger feeding a Chat message action, with the values the trigger hands on — Who typed it, After the command, Word 1, Word 2 — in the tray underneath._ ## Recreate timers and filters For a Nightbot timer, add an **On a timer** trigger to a new flow and connect it to a **Chat message**; set the interval, or specific days and a time. Nightbot’s timers fire on an interval, optionally gated by a minimum number of chat lines since the last fire — Bloopbot’s closest match is **Only if chat has moved**, a simpler yes/no version of the same idea, not a lines-per-interval count. See [post a recurring chat message](https://bloopbot.com/docs/timers). For Nightbot’s spam filters, open **Moderation** and configure the equivalent filter directly — links, caps, symbols, emotes and the blacklist are channel-wide settings in Bloopbot too, not something you build as a flow. Give each one the thresholds and exemptions you had in Nightbot, save, and watch chat before turning on several at once. See [set up moderation helpers](https://bloopbot.com/docs/moderation). ## Turn off the old bot Once a Bloopbot flow or filter is live and doing the same job, turn off the matching Nightbot command, timer or filter — in the Nightbot dashboard, not here. Two bots answering the same command, posting the same timer, or filtering the same message both duplicate the reply and can make moderation logs confusing about which bot acted. When you’re ready to retire Nightbot entirely, use its dashboard’s **Part Channel** button (or the `!part`/`!leave` chat command) to remove it from your Twitch chat, and consider `/unmod`-ing its account in Twitch chat once it has left. If Nightbot ever posted an overlay-style alert (song request now-playing, follow shout-outs) through a browser source in OBS, also remove that source once Bloopbot’s [own overlay](https://bloopbot.com/docs/widgets-in-obs) is doing the job, so the two don’t draw over each other. ## Check it before you rely on it Bloopbot draws a clear line between a simulated check and something that actually reaches Twitch: - **Test fire**, in the flow editor’s top bar, runs the flow as a dry run and records what would have happened — it does not post to real chat and does not touch a real viewer’s cooldown or points. - A real check means typing the command in your own Twitch chat (or triggering the real event) and watching for the actual reply, exactly once. Do both: Test fire to check the wiring, then one real message in chat to confirm nothing else is still answering the same command. ## Troubleshooting - **The importer says Nightbot has no channel for you.** Bloopbot looks for the Nightbot channel of the Twitch account you signed in with. If you used Nightbot on a different Twitch account, its commands can’t be imported here, so rebuild them as above. - **The importer says the Nightbot channel belongs to a different Twitch account.** A channel with your name on Nightbot is linked to another Twitch account, so Bloopbot won’t read it. - **An imported command shows `$(time …)` or another token in chat.** It was one of the rows with a warning. Open its flow and replace the token, using [Variables](https://bloopbot.com/docs/coming-from-nightbot#variables-map). - **You get two replies.** Nightbot and Bloopbot are both still answering the same command or timer. Turn off the one you’re retiring — see “Turn off the old bot” above. - **The command does nothing.** Check the flow is live rather than paused, and that a **Who can trigger**, **Has a role** or **Cooldown** check isn’t quietly stopping it for the account you’re testing with. [Fix a flow or connection](https://bloopbot.com/docs/troubleshooting) walks through the rest. - **The reply shows `$(var.discord_url)` or `$(user)` literally, instead of the value.** The variable was never declared on **Variables**, or the token is misspelled — check it against the **Insert…** menu on that field rather than retyping it from memory. - **The reply shows `[count: use $(var.…) — see docs/flows.md §3b]`.** That’s Bloopbot’s deliberate placeholder for a literal `$(count)` left over from Nightbot — there is nothing to count without a declared variable. Replace it with a variable and a **Set a variable** step, as in “Recreate your top commands” above. - **A moderator-only or regulars-only command answers for everyone, or nobody.** Confirm the **Who can trigger** or **Has a role** check sits on the wired path between the trigger and the action, and that its passing output — not its failing one — leads to your reply. --- # Coming from StreamElements Import your StreamElements commands as Bloopbot flows, map loyalty, timers and overlays onto Bloopbot, and switch over cleanly. Updated 21 October 2026 ## Before you start This guide maps what you already built in StreamElements onto the closest thing in Bloopbot. Your commands can come across automatically: see [Import your commands](https://bloopbot.com/docs/coming-from-streamelements#import). A command is a flow, and what you see in OBS is an overlay you build on its own page — **Overlays**, separate from the flow canvas, in the same Bloopbot dashboard. > **New channels** > > If the sign-in button on the Bloopbot homepage reads “Sign-ups are closed right now”, new channels can’t join yet. If you already have a Bloopbot channel, everything below works today; if you don’t, this guide will still be here once sign-ups reopen. ## Commands and permissions StreamElements’ own default commands, such as `!points`, `!raffle` and `!songrequest`, are matched one by one in [StreamElements commands and their Bloopbot equivalents](https://bloopbot.com/docs/streamelements-commands). StreamElements’ Custom Commands panel, its user level and its cooldowns become a flow with a trigger and, where you need one, a check node: | In StreamElements | In Bloopbot | Notes | | --- | --- | --- | | A custom command | A flow with a **Chat command** trigger ([create your first chat command](https://bloopbot.com/docs/first-command)) | The trigger’s **Command** field is the word without the prefix; **Also responds to** is the alias list. | | Permission level: Everyone / Subscriber / VIP / Moderator / Broadcaster | A **Who can trigger** check, **At least** set to the matching level | That is Bloopbot’s full ladder for this check. Every level above the one you pick passes too, so the broadcaster always does; **Broadcaster only** keeps moderators out as well. | | Permission level: Regular | A **Has a role** check, **Roles** left at its default `Regulars` | A different check node from **Who can trigger**: **Has a role** reads **Viewers** › **Regulars** (or any other role you name), and the broadcaster and moderators pass it by default too — see [reward viewers and recognise regulars](https://bloopbot.com/docs/loyalty-and-regulars). | | Global cooldown / user cooldown | A **Cooldown** check with **Whole channel** and/or **Per viewer** durations | Both bots let you set a channel-wide and a per-viewer cooldown on the same command; Bloopbot also lets moderators or you skip it. See [add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns). | | Timers | A flow with an **On a timer** trigger | See [post a recurring chat message](https://bloopbot.com/docs/timers). | | Spam filters (links, caps, symbols, blacklist/whitelist) | The channel-wide filters on **Moderation** | Settings applied to every message, not a flow you draw — see [set up moderation helpers](https://bloopbot.com/docs/moderation). | | Loyalty points, earned by watching | Bloopbot loyalty points, configured on **Loyalty**, read with `!points`/`!watchtime`/`!top` | Separate systems and separate balances — a viewer’s StreamElements points do not carry over. See [reward viewers and recognise regulars](https://bloopbot.com/docs/loyalty-and-regulars). | | The Stream Store (spend loyalty points on a streamer-defined reward) | No catalogue equivalent — build the same shape as a flow, the way Bloopbot’s own `!give` does | Bloopbot has no store record listing redeemable items. What it does have is the same underlying move: a **Read points & watch time** step, a check that the balance covers the cost, then a **Set a variable** step that subtracts `loyalty_balance` — exactly how the built-in `!give` flow spends points. A **Giveaway** with a ticket cost is the closest ready-made version of “spend points for something” — see [run a giveaway in chat](https://bloopbot.com/docs/giveaways). | | Overlays and alerts | Bloopbot **overlays** — each one you design once and add to OBS as its own Browser Source | Alerts are layers on an overlay you build; see [add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) and [show alerts on stream](https://bloopbot.com/docs/alerts). | | Song requests | The **Song requests** flow pack, playing through your own linked Spotify account | See [let chat request songs](https://bloopbot.com/docs/song-requests). Song requests and overlays may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). | ## Variables StreamElements documents `$()` and `${}` as interchangeable — `$(uptime shroud)` and `${uptime shroud}` are the same call — while Bloopbot only ever uses `$(…)`: | StreamElements | Bloopbot | Notes | | --- | --- | --- | | `${user}`, `${sender}`, `${source}` | `$(user)` — a **Chat command** trigger’s “Who typed it” | Whoever ran the command, by display name. | | `${user.name}`, `${sender.name}` | `$(userlogin)` | Their login name, in lowercase. | | `${touser}` | `$(touser)` — “First word, or the viewer” | Also literally named `touser` in Bloopbot. It drops a leading `@`, which StreamElements keeps. | | `${1}` … `${9}` (positional arguments) | `$(1)` … `$(9)` work the same way in any flow text field; the full remainder, `${1:}`, is `$(query)` | All nine work — the Starter pack’s own `!deaths +5` counter reads the amount as `$(3)`. Only `$(1)` and `$(2)` appear in the trigger’s own tray and **Insert…** menu; further words you type by hand. | | `${count}` (the command’s own counter) | A declared **variable** plus a **Set a variable** action, read back as `$(var.name)` | Declare the variable once on **Variables**, then a **Set a variable** step adds to it — the Starter pack’s own `!deaths` counter is built exactly this way. See [keep a counter with variables](https://bloopbot.com/docs/variables). | | `${count deaths}`, `${getcount deaths}` (a named counter) | One variable, `deaths_count`, shared by every command that names the counter | `${count deaths}` adds 1 and shows the new total, `${count deaths -1}` takes one off, `${count deaths 0}` resets it, and `${getcount deaths}` only reads it. | | `${random}`, `${random.1-6}`, `${random.pick 'a' 'b' 'c'}`, `${random.chatter}` | A **Pick at random** step: **A number** for a range, **One from a list** for a pick, **Someone in chat** for a chatter | The reply reads what was picked. The importer adds the step for you. | | `${user.points bob}`, `${user.points_rank ${1}}`, `${user.time_online ${1}}`, `${user.name ${1}}` | A **Read points & watch time** step set to **A named viewer** | The reply reads that viewer’s points, rank, watch time or name from Bloopbot’s own loyalty points. The importer adds one step per viewer named. | | `${math ${user.points} * 2}` | A **Do some maths** step | One operation on two numbers: add, subtract, multiply or divide. Anything math.js does beyond that, such as `round()`, has no direct equivalent. | | `${if ${random.pick 1,0} Heads Tails}` | A **Switch on a word** step with one **Chat message** for each answer | The first message is sent when the check is `1`, `t` or `true`, the other otherwise. With no second answer, nothing is sent, as in StreamElements. One `${if}` per reply comes across. | | `${uptime}`, `${channel.uptime}` | `$(data.stream.started_at_ago)` — **how long ago** in the **Stream** group | A human string like “3 hours”. It keeps counting after the stream ends, so pair it with a **Stream status** check if you only want it while live. The importer does this for you. | | `${game}`, `${channel.game}` | `$(data.stream.category)` — the **Stream** group’s **Category** in the **Insert…** menu | Your current category, kept up to date whether you’re live or offline. | | `${title}`, `${status}`, `${channel.title}` | `$(data.stream.title)` | Your current stream title. | | `${channel.viewers}` | `$(data.stream.viewers)` | `0` while you’re offline, where StreamElements said ``. | | `${channel.followers}`, `${channel.subs}`, `${channel.subpoints}`, `${channel.chatters}` | `$(data.channel.followers)`, `$(data.channel.subscribers)`, `$(data.channel.subscriber_points)`, `$(data.chat.chatters)` | Your channel’s counts, from the **Channel** and **Chat** groups of the **Insert…** menu. | | `${channel}`, `${channel.display_name}`, `${provider}` | `$(channel)`, and `twitch` | Your channel’s login name. | | `${user.points}`, `${user.points_rank}`, `${user.time_online}`, `${pointsname}` | `$(points)`, `$(rank)`, `$(watchtime)`, `$(currencies)` | Bloopbot’s own loyalty points, set up on **Loyalty** — a viewer’s StreamElements balance doesn’t carry over. `$(rank)` is a place such as `5`, not `5/283`. | | `${settitle …}`, `${setgame …}` | A **Set title or category** step | The reply reads the new title or category. Changing them may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). | | `$(customapi url)` / `${customapi.url}` | A **Web request** action, whose answer becomes a value later steps can use | Not an inline token — it’s a step on the canvas. Web requests may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). The importer does this for you when a reply has one `${customapi.https://…}`. | | `${time}`, `${repeat}`, `${random.emote}`, `${user.lastseen}`, `${user.lastmessage}`, `${quote}`, `${weather}`, and another channel’s info such as `${game shroud}` | No direct equivalent | A shoutout that reads another channel’s game becomes Bloopbot’s own shoutout: the importer offers it on the review. For quotes, the importer offers Bloopbot’s **Quotes** instead. | A field that accepts variables shows an **Insert…** menu listing exactly what that step can read, so you don’t have to remember the exact token. ## Import your commands Bloopbot can read the commands on your channel’s public StreamElements command list and turn each one into a flow for you. You don’t sign in to StreamElements, and nothing changes in StreamElements. 1. Open the importer. Set up your bot asks about them in its first step when it finds your StreamElements commands, and **Bring your commands over** is on **Tutorials** any time from **Tutorials** (it then asks which bot you used). Or go to **Flows → Marketplace → From another bot**. Or follow [bring my StreamElements commands](https://bloopbot.com/admin/import/streamelements) straight from here. 2. Choose **StreamElements**. Bloopbot lists the commands StreamElements shows publicly for the Twitch account you signed in with. 3. Read each row. It shows the command, who could use it, its cooldowns, and its reply as Bloopbot will send it. A warning line means something didn’t carry over exactly. Some rows offer **Use Bloopbot’s shoutout** (or clip, quote, giveaway entry) beside **Keep your reply**. Bloopbot picks one for you when it’s sure the command does that job; you can switch either way before you bring it over. 4. Untick anything you don’t want. Tick **Turn on now** for a command you want answering chat straight away. Everything else arrives paused. 5. Press **Bring these over**. Each command becomes its own flow called `!command (from StreamElements)` on your **Flows** page. ![Pebble on the Bring commands from another bot page at step 1 of 4 of Bring your commands over: I found your Nightbot commands, with a Next button, and the importer dimmed behind.](https://bloopbot.com/docs/screenshots/tutorials-import.jpg) _Pebble’s Bring your commands over tutorial on the import page. It names the bot it found, or asks which one you used._ ![The Bring commands from another bot page listing four Nightbot commands, each ticked to bring over with a Turn on now box: !so with a choice between Use Bloopbot’s shoutout, selected, and Keep your reply, set to turn on; !uptime whose reply reads how long the stream has been live, with a note that it stays quiet offline; !lurk as a plain reply, set to turn on; and !discord.](https://bloopbot.com/docs/screenshots/bot-import-review.jpg) _The review: !so arrives as Bloopbot’s shoutout, !uptime reads how long you’ve been live, and !lurk stays your own reply._ What each command becomes: - The permission level becomes a **Who can trigger** check, or a **Has a role** check for Regular. The global and user cooldowns become a **Cooldown** check on **Whole channel** and **Per viewer**. - A command set to work only while you’re live, or only while you’re offline, gets a **Stream status** check. - The aliases carry over as **Also responds to**. A reply sent as a reply or a mention keeps that style in **Chat message**. - Every token in [Variables](https://bloopbot.com/docs/coming-from-streamelements#variables-map) with a Bloopbot equivalent becomes it, so `Now playing ${game}` says `Now playing Minecraft`. - `${count}` becomes a counter variable named after the command. A named counter, such as `${count deaths}` in `!death` and `${getcount deaths}` in `!deaths`, becomes one variable both commands share. StreamElements doesn’t publish its counts, so every counter starts at 0. Set the old number on **Variables** if you want to keep it. - `${random…}` gets a **Pick at random** step before the reply, `${user.points bob}` a **Read points & watch time** step, `${math}` a **Do some maths** step, and `${settitle}` or `${setgame}` a **Set title or category** step. - `${if}` ends the flow in a **Switch on a word** step with one **Chat message** per answer, so `${user} flips: ${if ${random.pick 1,0} Heads Tails}` says `Heads` or `Tails` just as before. - `${uptime}` becomes how long the stream has been live. While you’re offline, the command stays quiet instead of saying so. - A reply with a single `${customapi.https://…}` gets a **Web request** step that fetches the address first, and the **Chat message** puts the answer where the token was. Check the address before you turn it on. - A command switched off in StreamElements is listed as **Switched off there** and isn’t ticked. Some rows can’t go live straight away. Their **Turn on now** box is greyed out, and the command is brought over paused, as written, for you to finish in the editor: - a token Bloopbot doesn’t have, such as `${time}` or `${random.emote}` (see [Variables](https://bloopbot.com/docs/coming-from-streamelements#variables-map) for what to use instead); - a `${settitle}` or `${setgame}`, which changes your stream when it runs: check who can use it before you turn it on; - a `${customapi}`, which now arrives as a **Web request** step: check the address it calls before you turn it on; - a command that cost loyalty points, because Bloopbot doesn’t charge for it; - a command that also answered keywords or a pattern, because Bloopbot answers the command word only; - a whisper, which Bloopbot posts in chat instead. The importer doesn’t bring over commands you hid from your public command list, or your timers, spam filters, Regulars list, quotes or loyalty points. Rebuild those as below. A Regular-level command still arrives with its **Has a role** check, so add your regulars on **Viewers** › **Regulars**. > **Your plan** > > Imported commands are flows like any you make, so they count towards your plan’s flow limit. Your first import is never refused for the limit, however many commands you bring. After that, the review shows how many more your plan has room for. If you tick more than that, nothing is brought over until you untick some. See [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). You can run the importer again after you add commands in StreamElements. A command you already brought over shows **Already brought over**, and one a flow here already answers shows **You already have**. Neither is ticked. If you tick a **You already have** row, it arrives paused beside your existing flow, so you can pick which one to keep on. ## Recreate your top commands Use this for anything the importer couldn’t bring over, or to start from Bloopbot’s own ready-made flows. Do it once your channel is signed in. 1. Open **Flows**, press **Marketplace**, and add the **Starter** pack for the everyday commands and stream reactions it covers, including its own `!deaths` counter (mods add to it with `!deaths +`) as a working example of a StreamElements-style tally. 2. For anything Starter doesn’t cover, press **+ New flow → Start blank**, add a **Chat command** trigger, and connect a **Chat message** action with your reply text. 3. Add a **Who can trigger**, **Has a role** or **Cooldown** check in front of the action for anything that had a permission level or a cooldown in StreamElements. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: add the Starter pack, then anything it doesn’t already cover._ A worked example — a public `!discord` command with a moderator-only `!setdiscord` to update the link: 1. On **Variables**, declare a text variable named `discord_url` with your current invite link as its starting value. 2. Build a flow: **Chat command** (`discord`) → **Chat message** reading `Join us: $(var.discord_url)`. 3. Build a second flow: **Chat command** (`setdiscord`) → **Who can trigger** (**At least**: moderator) → **Set a variable** (`discord_url`, set to `$(query)`) → **Chat message** reading `Discord link updated.` 4. Save both, then test as below before you rely on them live. ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _The canvas view of a command flow: a Chat command trigger feeding a Chat message action, with the values the trigger hands on — Who typed it, After the command, Word 1, Word 2 — in the tray underneath._ ## Recreate timers and filters For a StreamElements timer, add an **On a timer** trigger to a new flow and connect it to a **Chat message**; set the interval, or specific days and a time. See [post a recurring chat message](https://bloopbot.com/docs/timers). For StreamElements’ spam filters, open **Moderation** and configure the equivalent filter directly — it applies to every message and isn’t something you build as a flow. See [set up moderation helpers](https://bloopbot.com/docs/moderation). ## Move your overlay and alerts StreamElements plays alerts through the same single browser source as the rest of its overlay. In Bloopbot, build an overlay with the alert layers you need on **Overlays**, then add its own Browser Source in OBS — [add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) and [show alerts on stream](https://bloopbot.com/docs/alerts) walk through both. Overlays may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). 1. Build the new widget in Bloopbot first, with its alert layers configured the way you want them to look. 2. Use **Simulate → Test events** in the editor’s top bar to check an alert plays and looks right, with its “Also play on the live overlay in OBS” box left unticked so nothing reaches a real viewer. 3. Press **Publish**. OBS only ever shows a widget’s last published version — nothing you build reaches OBS until you publish it. 4. Add the widget’s OBS URL as a new Browser Source, sized to your canvas, alongside your existing StreamElements source — don’t replace it yet. An alert layer’s own **Test published output…** button sends one real test to OBS so you can confirm it, without waiting for a real event. 5. Once you’re happy, remove the StreamElements Browser Source from your scene so only one overlay is answering the same alert. ## Turn off the old bot For each command, timer or filter you’ve rebuilt, switch off the StreamElements original — in the StreamElements dashboard, not here — once its Bloopbot flow is live and doing the same job. Leaving both running is what causes duplicate replies and, for alerts, two overlays drawing the same event at once. When you’re ready to retire the StreamElements chatbot entirely, use **Part** in its dashboard’s Chatbot section (or the `!bot part` chat command) to remove it from your Twitch chat, and consider `/unmod`-ing its account in Twitch chat once it has left. ## Check it before you rely on it Bloopbot draws a clear line between a simulated check and something that actually reaches Twitch or OBS: - **Test fire**, in the flow editor’s top bar, runs the flow as a dry run and records what would have happened — it does not post to real chat and does not touch a real viewer’s cooldown or points. - In the widget editor, **Simulate → Test events** plays in the preview only, until you tick “Also play on the live overlay in OBS”; an alert layer’s own **Test published output…** sends one real test to OBS — either way, OBS only ever shows what you last **Published**. - A real check means typing the command in your own Twitch chat, or triggering the real event, and watching for the actual reply or alert, exactly once. ## Troubleshooting - **The importer says StreamElements has no channel for you.** Bloopbot looks for the StreamElements channel of the Twitch account you signed in with. If you used StreamElements on a different Twitch account, its commands can’t be imported here, so rebuild them as above. - **The importer says the StreamElements channel belongs to a different Twitch account.** A channel with your name on StreamElements is linked to another Twitch account, so Bloopbot won’t read it. - **A command you had isn’t in the list.** It’s hidden from your public command list in StreamElements. Rebuild it as above, or make it visible in StreamElements and run the importer again. - **You get two replies, or two alerts.** StreamElements and Bloopbot are both still answering the same command, timer or event. Turn off the one you’re retiring, and for alerts remove the matching OBS Browser Source — see “Turn off the old bot” and “Move your overlay and alerts” above. - **The command does nothing.** Check the flow is live rather than paused, and that a **Who can trigger**, **Has a role** or **Cooldown** check isn’t quietly stopping it for the account you’re testing with. [Fix a flow or connection](https://bloopbot.com/docs/troubleshooting) walks through the rest. - **The reply shows `$(var.discord_url)` or `$(user)` literally, instead of the value.** The variable was never declared on **Variables**, or the token is misspelled — check it against the **Insert…** menu on that field rather than retyping it from memory. - **The reply shows `[count: use $(var.…) — see docs/flows.md §3b]`.** That’s Bloopbot’s deliberate placeholder for a literal `$(count)` or `${count}` left over from StreamElements — there is nothing to count without a declared variable. Replace it with a variable and a **Set a variable** step, as in “Recreate your top commands” above. - **The overlay is blank in OBS.** An alert layer stays blank until an alert plays on it — use **Simulate → Test events** or an alert layer’s own **Test published output…**, and confirm you’ve pressed **Publish** and the Browser Source points at the current widget URL. [Fix a flow or connection](https://bloopbot.com/docs/troubleshooting) covers the rest of the OBS checks. --- # StreamElements commands and their Bloopbot equivalents Every default StreamElements command, from !points and !songrequest to !raffle, !nuke and !uptime, with what it does and how to do the same in Bloopbot. Updated 15 October 2026 ## The short answer The StreamElements chatbot ships 69 default commands. They cover points (`!points`, `!watchtime`, `!top`), games (`!slots`, `!roulette`, `!duel`), raffles (`!raffle`, `!join`), song requests (`!songrequest`, `!skip`), the store (`!items`, `!redeem`), moderation (`!nuke`, `!permit`) and small extras such as `!8ball`, `!quote` and `!uptime`. Your own StreamElements chat commands are the ones you made in the Custom Commands panel. Bloopbot can bring those over for you, and it has an equivalent for most of the defaults, either built in or as a ready-made flow pack you switch on. The table below lists each StreamElements command, and says plainly where Bloopbot has nothing. To move your own commands, use the importer. It reads your public StreamElements command list and turns each command into a flow, with its permission level, cooldowns and `${...}` variables, and you don’t sign in to StreamElements. [Import your commands](https://bloopbot.com/docs/coming-from-streamelements#import) walks through it. ## StreamElements’ default commands in Bloopbot Every StreamElements command below comes from its [default commands list](https://docs.streamelements.com/chatbot/commands/default). In Bloopbot, a pack is a set of ready-made flows you add from **Flows** › **Marketplace**. Packs arrive paused, so switch on the ones you want. | StreamElements command | What it does in StreamElements | In Bloopbot | | --- | --- | --- | | `!points`, `!watchtime`, `!top`, `!leaderboard` | Show a viewer’s points and rank, their watch time, the top users, and a link to the leaderboard | `!points`, `!watchtime` and `!top` from the **Loyalty** pack ([check points from chat](https://bloopbot.com/docs/loyalty-and-regulars#commands)). To show a leaderboard on stream, use the Leaderboard layer ([show a leaderboard on stream](https://bloopbot.com/docs/leaderboard-widget)) | | `!givepoints` | Gives your points to another viewer | `!give name amount` in the **Loyalty** pack | | `!addpoints`, `!setpoints` | Add points to a viewer, or set their balance | `!addpoints`, `!setpoints` and `!removepoints` for moderators, in the **Loyalty** pack | | `!slots`, `!roulette`, `!duel`, `!accept` | Points games and duels | The same four commands in the **Minigames** pack, plus `!heist` ([play points games with chat](https://bloopbot.com/docs/points-minigames)) | | `!deny`, `!cancelduel` | Turn down a duel, or cancel one you sent | No equivalent. A duel nobody accepts within a minute ends and the points go back ([how duels work](https://bloopbot.com/docs/points-minigames#duels)) | | `!bet`, `!contest` | Bet points on a contest, and show its status | Moderators open a bet with `!bets` and viewers place theirs with `!bet`, from the **Minigames** pack. An open bet’s odds show on the games card on stream | | `!bingo` | Emote bingo for points | No equivalent | | `!raffle`, `!sraffle`, `!cancelraffle` | Start a multi-winner or single-winner raffle, or cancel one | `!giveaway open`, `close`, `draw` and `cancel` from the **Giveaway** pack, with one or more winners ([run a giveaway in chat](https://bloopbot.com/docs/giveaways)) | | `!join`, `!ticket`, `!giveaway` | Enter a raffle, buy tickets, see the giveaway’s status | Viewers type `!enter`, or `!enter 3` for several tickets, or the giveaway’s keyword. In Bloopbot `!join` belongs to the viewer queue | | `!songrequest`, `!song`, `!wrongsong` | Request a song, show the current one, remove your last request | `!sr song name`, `!song` and `!wrongsong` from the **Song requests** pack ([take Spotify song requests](https://bloopbot.com/docs/song-requests)) | | `!next`, `!songqueue`, `!when` | Show the next song, link the queue, show your place | `!queue` shows upcoming songs, and `!srstatus` shows where you stand | | `!skip`, `!removesong`, `!srclear` | Skip the song, remove one, clear the queue | `!skip` and `!remove 2` or `!remove @name` for moderators. Clear the queue with **Clear queue…** on the **Song requests** page | | `!pause`, `!play`, `!volume`, `!voteskip` | Control the player and vote to skip | No equivalent. Bloopbot requests play through your own Spotify Premium account, so playback is controlled in Spotify | | `!queue` | Manage a viewer queue for playing with the streamer | The **Viewer queue** pack: `!join`, `!leave`, `!waitlist`, and `!next` for moderators ([run a viewer queue](https://bloopbot.com/docs/viewer-queue)). In Bloopbot `!queue` shows the song queue | | `!items`, `!redeem` | Link the store, redeem an item with points | `!store` lists what is for sale and `!buy name` buys it, from the **Points store** pack ([let viewers spend points](https://bloopbot.com/docs/points-store)) | | `!openstore`, `!closestore`, `!enablesfx`, `!disablesfx` | Switch store items on or off | No single switch, and no separate sound-effect group. Untick **For sale** on an item, or switch the store flows off | | `!alerts` | Mute, skip or pause overlay alerts | `!skip`, `!pause`, `!resume` and `!replay` for moderators, from the **Mod commands** pack ([control the queue while you are live](https://bloopbot.com/docs/alerts#live-controls)). Both that pack and the song pack use `!skip`, so rename one if you add both | | `!editcounter` | Set, add to or take from a counter | `!deaths` and `!deaths +` (moderators) in the **Starter** pack, and you can copy the flow for `-` and `set` ([start from the Counter templates](https://bloopbot.com/docs/variables#counter-template)) | | `!hypecup` | Clear the HypeCup list | No equivalent | | `!setgame`, `!settitle` | Change the game category or stream title | `!game` and `!title` in the **Mod commands** pack ([add a helper flow](https://bloopbot.com/docs/moderation#helpers)) | | `!timer` | Turn chat timers on or off | A moderators-only command flow with a **Turn flows on or off** step, pointed at your timer flows ([post a recurring chat message](https://bloopbot.com/docs/timers)) | | `!permit` | Lets a viewer post a link for a short time | Built in for moderators: `!permit username`, 60 seconds unless you change it on **Moderation** | | `!nuke` | Times out, bans or deletes messages that match text or a regex | `!nuke` in the **Mod commands** pack, with a phrase or `/regex/`, how far back to look, and timeout, delete or ban. Nukes can be rolled back from the **Nukes** page ([what moderators can do from chat](https://bloopbot.com/docs/editors#moderators)) | | `!nukeusername`, `!votekick`, `!filesay`, `!level` | Nuke by username, vote to kick, send lines from a URL, override a permission level | No equivalent | | `!vanish` | Times you out for a second to clear your messages | No ready-made flow. Build it as a command flow with a **Time out** step that acts on the viewer who typed it | | `!bot`, `!module` | Mute or remove the bot, switch chatbot modules on or off | Nothing to type. Switch filters on **Moderation** and flows on **Flows**, and the bot joins when you connect your channel | | `!command` | Add, remove or edit commands from chat | You make and change commands on **Flows**, in a form or on the canvas ([create your first chat command](https://bloopbot.com/docs/first-command)). There is no chat command for it | | `!commands` | Links to your public command list | `!commands` replies with your public **Commands** page, from the **Commands link** flow in the **Starter** pack ([point viewers at your Commands page](https://bloopbot.com/docs/first-command#commands-link)) | | `!8ball` | A random magic 8-ball answer | A command flow with a **Pick at random** step set to **One from a list** ([pick something at random](https://bloopbot.com/docs/variables#random)) | | `!quote` | Show random quotes or manage the list | `!quote`, `!quote 2` and `!quote add` from the **Quotes** step ([save and share quotes](https://bloopbot.com/docs/quotes#command)) | | `!emotecount`, `!emotes` | Count an emote’s use, list your emotes | No equivalent | | `!kappagen` | An emote explosion on stream | The Emote Wall layer, with a **Rain emotes** step in any flow ([rain emotes from a flow](https://bloopbot.com/docs/emote-wall#rain)) | | `!uptime` | How long the stream has been live | A command flow that replies with `$(data.stream.started_at_ago)`. The importer builds this one for you | | `!accountage`, `!followage`, `!chatstats` | A viewer’s account age or follow time, and chat statistics | No equivalent | | `!tip` | Links to your tipping page | A command flow with your link as its reply ([create your first chat command](https://bloopbot.com/docs/first-command)) | ## Your own commands and their variables A command you made in StreamElements becomes a flow: a **Chat command** trigger, a check for its permission level or cooldowns, and a **Chat message** with the reply. StreamElements writes variables as `$(...)` or `${...}` and says the two are interchangeable. Bloopbot uses `$(...)`, and the importer rewrites each one it can answer. | StreamElements variable | In Bloopbot | | --- | --- | | `${user}`, `${sender}`, `${source}` | `$(user)`, the viewer who typed the command | | `${touser}` | `$(touser)`, the first word or the viewer | | `${1}` to `${9}` | `$(1)` to `$(9)`. The rest of the message, `${1:}`, is `$(query)` | | `${count}`, `${count deaths}`, `${getcount deaths}` | A declared variable that a **Set a variable** step changes, read back as `$(var.name)` ([keep a counter with variables](https://bloopbot.com/docs/variables)) | | `${random.1-6}`, `${random.pick 'a' 'b'}`, `${random.chatter}` | A **Pick at random** step: **A number**, **One from a list** or **Someone in chat** | | `${uptime}` | `$(data.stream.started_at_ago)` | | `${game}` | `$(data.stream.category)` | | `${title}`, `${status}` | `$(data.stream.title)` | | `${channel}` | `$(channel)`, your channel’s login name | | `${pointsname}`, `${user.points}` | `$(currencies)` and `$(points)`, from Bloopbot’s own loyalty points | | `${math ...}` | A **Do some maths** step: add, subtract, multiply or divide | | `${if ...}` | A **Switch on a word** step with a **Chat message** for each answer | | `${customapi.https://...}` | A **Web request** step whose answer the reply reads | | `${settitle ...}`, `${setgame ...}` | A **Set title or category** step | | `${time}`, `${weather}`, `${repeat}`, `${ai}`, `${stockprice}`, `${queryescape}` and the emote lists | No equivalent. The importer keeps the reply as written and brings the command in paused | [Variables](https://bloopbot.com/docs/coming-from-streamelements#variables-map) in the migration guide has the full list, including `${user.name}`, `${channel.followers}` and the viewer lookups. A field that takes variables also shows an **Insert…** menu with exactly what that step can read. ## What works differently - **Loyalty points start fresh.** Bloopbot keeps its own balances, so a viewer’s StreamElements points don’t carry over. The importer brings commands over, but not points, timers, spam filters or quotes. - **Commands live on a page, not in chat.** You build and edit them on **Flows**, where each one can do more than reply: add a check, keep a count, show an alert or start a poll. - **Moderators still run the stream from chat.** `!permit`, `!filters`, `!blacklist` and `!whitelist` are built in for moderators, and packs add the rest. - **Song requests use Spotify.** StreamElements’ queue plays YouTube links. Bloopbot’s plays through your own Spotify Premium account. - **Overlays are separate.** StreamElements’ alerts and overlay widgets become Bloopbot overlays, each added to OBS as its own Browser Source ([move your overlay and alerts](https://bloopbot.com/docs/coming-from-streamelements#overlays)). - **Only one bot should answer.** Once a Bloopbot flow does a command’s job, switch that command off in StreamElements, so chat doesn’t get two replies ([turn off the old bot](https://bloopbot.com/docs/coming-from-streamelements#switch-off)). ## Troubleshooting - **A command gets two replies.** StreamElements is still answering it. Switch the command off in the StreamElements dashboard. - **The importer doesn’t list a command.** It reads your public command list, so a command you hid there isn’t shown. Rebuild it by hand, or make it visible in StreamElements and run the importer again. - **A moderator command does nothing.** Check the person has the moderator badge in your chat, and that the bot is a moderator too. - **A reply shows `$(...)` text.** The variable isn’t declared on **Variables**, or the token is misspelled. Pick it from the **Insert…** menu instead of typing it. - **The bot doesn’t answer at all.** Check the flow is switched on. [Troubleshooting](https://bloopbot.com/docs/troubleshooting) covers commands that stay silent. ## Find timers and commands from chat For commands whose settings cannot be imported, open **Flows** → **Suggested commands**. Bloopbot looks for repeated bot replies and regular timer messages, then lets you review and edit a paused flow. [Review a suggestion and switch off the original](https://bloopbot.com/docs/nightbot-commands#suggestions). --- # Coming from Streamer.bot Map Streamer.bot actions, triggers, sub-actions and variables onto Bloopbot flows, see what stays on your PC, and rebuild your top actions. Updated 12 October 2026 ## Before you start This guide maps what you built in Streamer.bot onto the closest thing in Bloopbot. Both tools start something when a trigger fires; the difference is where they run and how you build them. - Streamer.bot is an app on your Windows PC. Its actions run there, so the app has to be open for them to work. - Bloopbot runs your flows on its own servers. There is nothing to install: you build flows in a browser, on any computer, and your chat commands and moderation filters keep answering chat when your PC is off. Your overlays are still Browser Sources, so they show only while OBS is open. There is no importer for Streamer.bot. Streamer.bot keeps its actions on your PC, so Bloopbot has nothing to read them from: you rebuild the actions you use most as flows, using the tables below. Bloopbot works with Twitch and [Kick](https://bloopbot.com/docs/bloopbot-on-kick); if you also use Streamer.bot for YouTube or Trovo, keep it for those. > **New channels** > > If the sign-in button on the Bloopbot homepage reads “Sign-ups are closed right now”, new channels can’t join yet. If you already have a Bloopbot channel, everything below works today; if you don’t, this guide will still be here once sign-ups reopen. ## Actions and triggers A Streamer.bot action is a list of sub-actions that one or more triggers start. In Bloopbot the same job is one **flow**: a trigger, optional checks and one or more actions, drawn as connected steps on a canvas ([build a flow on the canvas](https://bloopbot.com/docs/flow-basics)). | In Streamer.bot | In Bloopbot | Notes | | --- | --- | --- | | An action and its sub-actions | A flow | Each sub-action becomes a step you connect on the canvas. A straight line of steps can use the **Simple** form instead. | | A chat command trigger | A flow with a **Chat command** trigger | **Command** is the word without the prefix, and **Also responds to** holds aliases — see [create your first chat command](https://bloopbot.com/docs/first-command). | | Twitch event triggers (follow, sub, cheer, raid and the rest) | The Twitch event triggers in the node library, such as those under **Subs, raids & follows** | The **Stream events** and **Alerts** packs start from them — see [use templates and flow packs](https://bloopbot.com/docs/templates-and-packs). | | A channel point reward trigger | A flow with an **On a reward redeemed** trigger | Pick the reward from the **Reward** field — see [respond when a viewer redeems a reward](https://bloopbot.com/docs/reward-redemptions). | | A timed action | A flow with an **On a timer** trigger | Set an interval, or days and a time, and keep **Only while live** on for a reminder that should post only during a stream — see [post a recurring chat message](https://bloopbot.com/docs/timers). | | A Stream Deck button that runs an action | A flow with a **Stream Deck button** trigger | The trigger gives the flow its own private URL; a Stream Deck action that calls a web address runs the flow — see [start a flow from a URL](https://bloopbot.com/docs/webhooks). | | OBS scene change trigger and the OBS Set Current Scene sub-action | A flow with an **OBS changed scene** trigger, and the **Switch OBS scene** action | Both work through your overlay's Browser Source, once you raise its Page permissions in OBS — see [control OBS from flows](https://bloopbot.com/docs/control-obs-from-flows). Recording, replay buffer, virtual camera and stream actions work the same way. | | Imported actions from the extensions site | Flow packs, the Community packs in **Flows → Add** and the Marketplace, and shared flow files | See [browse packs](https://bloopbot.com/docs/browse-flow-packs) and [share, import and restore flows](https://bloopbot.com/docs/sharing-flows). Bloopbot can’t read Streamer.bot’s own imports. | ## Logic and variables | In Streamer.bot | In Bloopbot | Notes | | --- | --- | --- | | If / Else sub-actions | A check step with its own exits, such as **Check a value**, **Who can trigger** or **Cooldown** | Each check has a path for when it passes and one for when it doesn’t; connect each to what should happen next. | | Switch sub-action | Several checks in a row, or **AI: route by meaning** for a message that could mean one of several things | Bloopbot has no single step that compares one value against a list of cases. **AI: route by meaning** may not be available on your channel yet — see [ask the AI judge in a flow](https://bloopbot.com/docs/ai-conditions-and-routing). | | While sub-action | **For each** | **For each** repeats its item branch once per item in a list, such as each gifted-sub recipient or each song in the queue. There is no loop that repeats until a condition changes. | | Global variables | A channel **variable**, declared on **Variables** | Declare it once, change it with **Set a variable**, read it as `$(var.name)` — see [keep a counter with variables](https://bloopbot.com/docs/variables). | | Per-user variables | A **variable** with viewer scope | Viewer scope keeps a separate value for each viewer. | | Arguments a trigger passes to its action | `$(...)` values such as `$(user)`, listed in each field’s **Insert…** menu | Each step hands on its own values; the **Insert…** menu shows exactly what a field can read. | ## What doesn’t map Some of what Streamer.bot does depends on running on your PC. Bloopbot doesn’t, so these have no equivalent: - **Your own C# code.** Bloopbot flows are built from steps, with no place to type code. If you need your own logic, run it as a service of your own at a public `https://` address and call it with a **Web request** step, or have your script start a flow through its **On a web request** URL — see [start a flow from a URL, or call one](https://bloopbot.com/docs/webhooks). Web requests and webhook triggers may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). - **Apps and hardware on your PC.** Bloopbot can’t reach Streamlabs Desktop, Meld, VTube Studio, Voicemod or anything else on your computer, and a **Web request** step never calls a local or private network address. A Stream Deck key can still start a flow by calling its URL, as above. - **Controlling OBS sources, filters and audio.** Bloopbot shows things in OBS through hosted overlays you add as Browser Sources, and a flow can also switch scenes, set the transition, start and stop recording, the replay buffer, the virtual camera and the stream, and save a replay, through that same overlay with no WebSocket and nothing to install ([Control OBS from flows](https://bloopbot.com/docs/control-obs-from-flows)). It cannot show or hide a source, change a filter or set an audio level, which need OBS’s WebSocket. - **Other platforms.** Bloopbot works with Twitch and Kick. YouTube and Trovo are not connected. If you rely on these, keep Streamer.bot running for them and move the chat side to Bloopbot, making sure the two never answer the same command. ## Rebuild your top actions 1. Sign in, then open **Flows**, press **Marketplace**, and add the **Starter** pack. It brings everyday commands and stream reactions, paused, so you can read how each one is built before you turn it on. 2. List the Streamer.bot actions you use every stream. For each one, start from the closest pack flow, or press **+ New flow → Start blank** and add the trigger from the tables above. 3. Add a step for each sub-action that did something visible: a **Chat message**, a **Set a variable**, a check in front of an action that was limited to mods or rate-limited. 4. Press **Save**, then **Test fire** to see which steps ran in the **Run log**. A worked example — a `!deaths` counter that mods add to, which in Streamer.bot is usually a global variable and two actions: 1. On **Variables**, declare a number variable `deaths`, channel scope, starting at `0`. Or install the **Counter** templates from the **Starter** pack, which do all of this for you. 2. Build a flow: **Chat command** (`deaths`) → **Chat message** reading `Deaths: $(var.deaths)`. 3. Build a second flow: **Chat command** (`deaths`, subcommand `+`) → **Who can trigger** (**At least**: moderator) → **Set a variable** (`deaths`, add `1`) → **Chat message** reading `Deaths: $(var.deaths)`. ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _A flow on the canvas: a Chat command trigger connected to a Chat message action, with the values the trigger hands on in the tray underneath._ Expected result: a moderator types `!deaths +` and the bot answers with the new count; anyone typing `!deaths` sees it; your PC being off changes nothing. ## Move your overlays Streamer.bot overlays are pages you build yourself against its local server. In Bloopbot, an overlay is one you design on **Overlays** and add to OBS as its own Browser Source, with alerts, a chat box, a goal bar, now playing and more as layers — see [add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) and [show alerts on stream](https://bloopbot.com/docs/alerts). A goal bar or label can show one of your variables, so a flow that changes the variable changes what’s on screen. Overlays may not be available on your channel yet — check [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). If you have an HTML overlay of your own you want to keep, [connect your own HTML widget](https://bloopbot.com/docs/custom-widgets) explains how to add it. ## Turn off the old action Once a Bloopbot flow does the same job, turn off or delete the matching action in Streamer.bot. If both are running, both answer the same command or event, and chat sees two replies. When nothing you still need is left in Streamer.bot, you can close it. ## Check it before you rely on it - **Test fire**, in the flow editor’s top bar, runs the flow as a dry run and records what would have happened. It does not post to real chat or change a real value. - A real check means typing the command in your own Twitch chat, or triggering the real event, and watching for the reply exactly once. - To prove the bot doesn’t need your PC, turn the flow on, shut your streaming PC down, and type the command from your phone. ## Troubleshooting - **You get two replies.** Streamer.bot and Bloopbot are both answering. Turn off the Streamer.bot action — see [Turn off the old action](https://bloopbot.com/docs/coming-from-streamer-bot#switch-off). - **The command does nothing.** Check the flow is live rather than paused, and that a **Who can trigger** or **Cooldown** check isn’t stopping it for the account you test with. [Fix a flow or connection](https://bloopbot.com/docs/troubleshooting) covers the rest. - **A Stream Deck key does nothing.** The flow is paused, or the URL was rotated. Copy the current URL from the **Stream Deck button** trigger again — see [start a flow from a URL](https://bloopbot.com/docs/webhooks#troubleshoot). - **A node shows a lock.** Your channel doesn’t include that step yet. Nothing else about the flow changes — see [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). - **The reply shows `$(var.deaths)` literally.** The variable isn’t declared on **Variables**, or the name is misspelled. Pick it from the **Insert…** menu instead of typing it. --- # Coming from Fossabot Map Fossabot commands, timers, keywords, counters and moderation onto Bloopbot flows and filters, and rebuild your top commands. Updated 14 October 2026 ## Before you start This guide maps what you set up in Fossabot onto the closest thing in Bloopbot. Both run in the cloud, so neither needs anything installed on your PC. The difference is how you build: a Fossabot command is a line of text with `$(variables)` in it, and a Bloopbot command is a **flow** — a trigger, optional checks and one or more actions you connect on a canvas, where each step can hand values to the next. There is no importer for Fossabot. You rebuild the commands you use most as flows, using the tables below. Bloopbot works with Twitch and [Kick](https://bloopbot.com/docs/bloopbot-on-kick); if you also use Fossabot on YouTube, keep it there. > **New channels** > > If the sign-in button on the Bloopbot homepage reads “Sign-ups are closed right now”, new channels can’t join yet. If you already have a Bloopbot channel, everything below works today; if you don’t, this guide will still be here once sign-ups reopen. ## Commands, timers and keywords | In Fossabot | In Bloopbot | Notes | | --- | --- | --- | | A custom command | A flow with a **Chat command** trigger and a **Chat message** action | **Command** is the word without the prefix, and **Also responds to** holds aliases — see [create your first chat command](https://bloopbot.com/docs/first-command). | | A command’s permission | A **Who can trigger** check, with **At least** set to broadcaster, moderator, VIP, subscriber or everyone | For a list of people of your own, use a **Has a role** check and add them on **Viewers** › **Regulars** — see [add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns). | | A command’s cooldown | A **Cooldown** check, on **Whole channel**, **Per viewer** or both | Moderators or you can skip it. | | A timer | A flow with an **On a timer** trigger | Set an interval, or days and a time, and optionally **Only if chat has moved** — see [post a recurring chat message](https://bloopbot.com/docs/timers). | | A keyword | A flow with a **When chat mentions** trigger | It fires on an exact phrase. To fire on what a message means instead, see [wake a flow when chat means something](https://bloopbot.com/docs/intent-trigger), which may not be available on your channel yet. | | A counter | A declared **variable** plus a **Set a variable** step, read as `$(var.name)` | The **Counter** templates in the **Starter** pack build a `!deaths` counter this way — see [keep a counter with variables](https://bloopbot.com/docs/variables). | | Media requests (YouTube and SoundCloud) | The **Song requests** flow pack, playing through your own Spotify account | A different service: Bloopbot plays Spotify tracks and needs Spotify Premium — see [let chat request songs](https://bloopbot.com/docs/song-requests). Song requests may not be available on your channel yet. | ## Variables Fossabot puts its variables straight into the reply text. Bloopbot’s `$(…)` values come from the step that hands them on, mostly the trigger, and every field that takes them has an **Insert…** menu listing exactly what it can read. | What the variable gives you | In Bloopbot | Notes | | --- | --- | --- | | The viewer who typed the command | `$(user)` | Handed on by the **Chat command** trigger. | | The first word, or the viewer when there isn’t one | `$(touser)` | | | Everything after the command | `$(query)` | | | One word after the command | `$(1)` to `$(9)` | `$(1)` and `$(2)` are in the **Insert…** menu; type the rest by hand. | | A number that goes up | `$(var.name)` from a declared variable | See the counter row above. | | How long you’ve been live | **how long ago** under **Stream** in the **Insert…** menu | It keeps counting after the stream ends, so pair it with a **Stream status** check. | | `$(customapi)`, the answer from your own address | A **Web request** step, whose answer later steps read | It’s a step on the canvas, not a token, and the channel switches **Web requests: allowed** on first. Web requests may not be available on your channel yet — see [call a service from a flow](https://bloopbot.com/docs/webhooks#web-request). | A variable with no match here — anything Bloopbot doesn’t hand on — needs a different approach. Check the **Insert…** menu of the field first; it lists everything that step can read. ## Moderation Fossabot is known for its moderation, so compare this part carefully before you switch it off. | In Fossabot | In Bloopbot | Notes | | --- | --- | --- | | Blocked terms | The blacklist filter on **Moderation** | Add entries on the page or with `!blacklist add` from chat; `-regex` makes an entry a pattern — see [what moderators can do from chat](https://bloopbot.com/docs/editors#moderators). | | Lookalike detection | Built into the link filter and the blacklist | Both see through spaced-out, spelled-out and look-alike letters and invisible characters — see [set up moderation helpers](https://bloopbot.com/docs/moderation#helpers). | | Links, caps, symbols, emotes and repeated messages | The links, caps, symbols, emotes and repetition filters on **Moderation** | Each has its own thresholds, exemptions and response. | | Message-height filter | No equivalent | Bloopbot has no filter for tall messages. | | Nukes | `!nuke` from the **Mod commands** pack, with the **Nukes** page | See [set up moderation helpers](https://bloopbot.com/docs/moderation#helpers). | | Mod team access and audit logs | **Team**, and **Audit log** | Tick your Twitch moderators for a dashboard that runs the stream, and invite editors who can change your channel’s pages; every editor change is recorded under their name. There are no roles within editors — see [share the work with mods and editors](https://bloopbot.com/docs/editors). | Bloopbot also offers an AI moderation step you put in a flow, which reads what a message means rather than which words it contains. It may not be available on your channel yet — see [set up AI moderation](https://bloopbot.com/docs/ai-moderation). ## Rebuild your top commands 1. Sign in, then open **Flows**, press **Marketplace**, and add the **Starter** pack. It brings everyday commands and stream reactions, paused, so you can review them before you turn them on. 2. For each Fossabot command you still need, press **+ New flow → Start blank**, add a **Chat command** trigger, and connect a **Chat message** action with your reply. 3. Add a **Who can trigger** or **Cooldown** check in front of the action for anything that had a permission or a cooldown in Fossabot. 4. On **Moderation**, set up the filters you had in Fossabot, one at a time, and watch chat before turning on several at once. A worked example — a `!discord` command anyone can use, and a moderator-only `!setdiscord` that changes the link: 1. On **Variables**, declare a text variable named `discord_url` with your invite link as its starting value. 2. Build a flow: **Chat command** (`discord`) → **Chat message** reading `Join us: $(var.discord_url)`. 3. Build a second flow: **Chat command** (`setdiscord`) → **Who can trigger** (**At least**: moderator) → **Set a variable** (`discord_url`, set to `$(query)`) → **Chat message** reading `Discord link updated.` ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _A command flow on the canvas: a Chat command trigger feeding a Chat message action, with the values the trigger hands on in the tray underneath._ Expected result: a moderator types `!setdiscord discord.gg/example`, the bot says `Discord link updated.`, and the next `!discord` posts the new link. ## Turn off the old bot Once a Bloopbot flow or filter does the same job, turn off the matching Fossabot command, timer or filter in Fossabot’s dashboard. If both bots answer the same command, chat sees two replies, and two bots filtering the same message make it hard to tell which one acted. When nothing is left in Fossabot you still need, remove it from your channel from its dashboard, and take its moderator role away in Twitch chat. ## Check it before you rely on it - **Test fire**, in the flow editor’s top bar, runs the flow as a dry run and records what would have happened. It does not post to real chat or touch a real viewer’s cooldown. - A real check means typing the command in your own Twitch chat and watching for the reply exactly once. - For a filter, send a test message from a second account the filter doesn’t exempt. ## Troubleshooting - **You get two replies.** Fossabot and Bloopbot are both answering the same command or timer. Turn off the one you’re retiring. - **The command does nothing.** Check the flow is live rather than paused, and that a **Who can trigger** or **Cooldown** check isn’t stopping it for the account you test with. [Fix a flow or connection](https://bloopbot.com/docs/troubleshooting) covers the rest. - **The reply shows `$(var.discord_url)` or `$(user)` literally.** The variable isn’t declared on **Variables**, or the token is misspelled. Pick it from the **Insert…** menu instead of typing it. - **A filter doesn’t act.** The bot account isn’t a moderator in your chat yet, or the viewer is exempt. See [set up moderation helpers](https://bloopbot.com/docs/moderation#access). - **A node shows a lock.** Your channel doesn’t include that step yet. Nothing else about the flow changes — see [what your plan includes](https://bloopbot.com/docs/what-your-plan-includes). --- # Create your first chat command Make !hello reply in chat, add aliases and personalise the message. Updated 31 October 2026 ## 1. Start from Simple command **Build your first flow** in the footer of the public site opens this guide. To follow along, [connect your Twitch channel first](https://bloopbot.com/docs/getting-started#connect), then choose the channel you want to build for in the dashboard. 1. Open your channel’s **Flows** page, then **Packs → Starter**. Starter is added automatically once for channels using the earlier setup, with new flows paused. A new guided-setup channel chooses its tools: if Starter is absent, use **Marketplace** to add just **Simple command**, or choose **Starter** if you want the pack. 2. Open **Simple command**. If you removed it, press **Add** and choose the **Simple command** template to add it again. 3. Give the flow a recognisable name, such as “Hello command”. The flow name is for you; the Command field controls what viewers type. > **Pebble can build one with you** > > Pebble’s **Your first flow** tutorial, under **Build your own** in Next steps on **Overview**, builds a `!lurk` command on the canvas (`!brb`, then `!hug`, when you already have one), tries it with **Test fire**, switches it on and watches for a real run in your chat. **Make it only for mods** goes on from there. Start either from [Tutorials](https://bloopbot.com/docs/tutorials). ## 2. Set the command and reply In the **Simple** view, set **Command** to `hello`. **Prefix**, under **More options** in the same step, already reads `!`; leave it, and do not type the exclamation mark into **Command** as well. In **Do this → Message**, enter: ``` Hey $(user)! Thanks for stopping by. ``` The bot replaces `$(user)` with the person who triggered the command. Leave **Send as** set to **A normal message**, or choose a mention or **A reply in the original chat**. For YouTube, follow [Make a YouTube command reply](https://bloopbot.com/docs/connect-youtube#commands): choose its platform on the trigger, and replies appear as ordinary messages in the original YouTube live chat. ![Simple command in Simple view with hello, Twitch and Kick selected, no conditions and a personalised greeting message.](https://bloopbot.com/docs/screenshots/simple-command.jpg) _A command’s trigger, optional conditions and response in Simple view._ ## 3. Add another way to trigger it In **Also responds to**, enter `hi, hey`. Viewers can now use `!hello`, `!hi` or `!hey`. Enter the words without the prefix, separated by commas. ## 4. Split one command into several flows **Subcommand**, under **More options** on the trigger, makes a command trigger only when a specific word comes right after it, so several flows can share one command name without stepping on each other. For example, one flow could handle `!lurk` on its own and a different flow could handle `!lurk back` — each with its own message and its own conditions. 1. Set **Command** to `lurk` on both flows. 2. On the first flow, leave **Subcommand** blank. It answers a bare `!lurk` and any word after it that no other flow claims — a useful fallback for a general lurk message. 3. On the second flow, enter `back` in **Subcommand**. It now answers only `!lurk back`, never a bare `!lurk`. 4. Save both. Type `!lurk` alone and only the first flow replies; type `!lurk back` and only the second one does. To match more than one word, separate them with commas or spaces — `open start` and `open, start` both give a flow two subcommand words. The subcommand word does not change how the rest of the message is read: it is still `$(1)`, and whatever follows it is `$(2)` and onward, exactly as if **Subcommand** were empty. Word matching ignores case, so `!lurk BACK` matches a subcommand of `back`. > **Two flows claiming the same word** > > If two live flows both answer the same command and subcommand — or both leave **Subcommand** blank — chat gets a reply from each of them. Saving or turning on the second one shows a warning naming the other flow, and the Flows page lists both under **Needs attention**; change one flow’s command or subcommand, or pause one of them, to fix it. ## 5. Name the words after a command `$(1)`, `$(2)` and so on are the words typed after the command, by position. When a command takes several, give them names so the message reads clearly and a [control panel button](https://bloopbot.com/docs/control-panels#inputs) can fill them too. This suits a command such as `!goal home Saka 23`. 1. Select the command trigger. In its settings, under **Arguments**, select **Add an argument** three times and name them `team`, `scorer` and `minute`. Set `minute`’s type to **Number**. 2. In **Do this → Message**, enter: ``` GOAL for $(input.team)! $(input.scorer) scores in minute $(input.minute). ``` 1. Save. Typing `!goal home Saka 23` now fills **team** with `home`, **scorer** with `Saka` and **minute** with `23`. The words fill the arguments in the order you list them, and **the last argument takes the rest of the line**. So keep the one that holds a name or a sentence last: with `team` and `scorer`, `!goal home Bukayo Saka` fills **scorer** with `Bukayo Saka`. - **A word you leave out** uses the argument’s **default**, and is empty when it has none. Fill in the default under the argument, for example `home` for **team**. - **Number** arguments only accept a plain number such as `12`, `-3` or `2.5`. Anything else, such as `soon`, comes out empty rather than as `0` or the default. - **Yes/no** arguments accept `on`, `off`, `yes`, `no`, `true`, `false`, `1`, `0`, `y` and `n`, in any case. Anything else comes out empty. - **A subcommand word is not an argument.** If you set a **Subcommand** (section 4) such as `open`, the arguments start after it: `!giveaway open 5` fills the first argument with `5`, and `$(1)` is still `open`. - **`$(1)`, `$(2)` and the rest keep working** exactly as before, so a flow you already have is unchanged until you add an argument. Pick an argument from the **Insert…** menu under **Inputs · Chat command**, or type `$(input.team)`. On the canvas, each argument also has its own port on the command’s card: drag it onto a step to put `$(input.team)` there. If you use `$(input.…)` with a name no argument has, **Save** refuses the flow and names the step. If the flow also has a **Run button** trigger, give it the same names as **inputs**. Without them, pressing **Run** starts the flow with those values empty, and saving warns you. [Adding a Run button from a control panel](https://bloopbot.com/docs/control-panels#run-trigger) copies the arguments across for you. > **A command with no arguments** > > A command that lists no arguments reads exactly as it always has. `$(input.…)` only means something once the command, or a **Run button** next to it, declares it. The time is available to any flow too. `$(now)` is the current time as a number of milliseconds, the same from every trigger. See [Keep a counter with variables](https://bloopbot.com/docs/variables#read) for what to do with it. ## 6. Point viewers at your Commands page Your channel has a public **Commands** page that lists the commands viewers can use, grouped by who can use them ([show your chat commands](https://bloopbot.com/docs/public-page#commands) covers which groups it lists). To have chat share it, open **Flows → Packs → Starter**, open **Commands link** and turn it on. If you removed it, press **Add** and add **Commands link** again. Its command is `!commands` and its reply is: ``` Here are my commands: $(commandsurl) ``` `$(commandsurl)` is the address of your Commands page, filled in when the flow runs. It uses your own domain once one is serving your public page, and you can put it in any text your flows send, from any trigger: a timed message, a follow greeting or your own command. **Test fire** fills it in as well, so you can see the address before you go live. If the address can’t be found, the token comes out empty. To change what viewers see when they use `!commands`, edit the reply like any other message. ## 7. Save and check the result 1. Press **Save** after editing. 2. Press **Test fire** and expand the **Run log** to inspect the simulated result. This does not send a Twitch message. 3. Enable the flow if it is paused. 4. Type `!hello` in your Twitch chat. You should see your personalised reply. No reply? Check [the troubleshooting guide](https://bloopbot.com/docs/troubleshooting). For a moderators-only command, add [a permission condition](https://bloopbot.com/docs/permissions-and-cooldowns). Chat events have reserved capacity while timer work is busy, so a timer backlog can keep draining without making your command wait behind every reminder. Twitch rate limits and slow actions can still delay the reply. --- # Build a flow on the canvas Connect triggers, conditions and actions, then inspect a test run. Updated 16 October 2026 ## The three parts of a flow | Part | Question it answers | Example | | --- | --- | --- | | Trigger | When should this start? | Someone types !hello | | Condition | Should it continue? | The viewer is a moderator | | Action | What should happen? | Send a chat message | > **Pebble can walk you through the canvas** > > Pebble’s **Your first flow** tutorial builds a trigger and a reply, tests them and switches the flow on. Start it from [Tutorials](https://bloopbot.com/docs/tutorials). A straight line of nodes can use the **Simple** form. Switch to **Canvas** when you need branches, extra checks or loops. Both views edit the same flow. Flows run on Bloopbot’s servers, not on your computer. There is nothing to install: you build them in a browser, and your commands and moderation filters keep answering chat when your PC is off. Overlays still need OBS open, because they are Browser Sources. ## Open and read the canvas On **Flows**, select a flow’s name to open it. The name is a link, so you can open it in another tab; its checkbox, live switch and **More** menu act independently. With **Flows** or **Groups** focused, use the left or right arrow to switch tabs, or Home and End to go to the first or last tab. To start an empty flow, open **Flows**, choose **+ New flow**, then **Start blank**. It opens as **New flow**, paused. You can create several before renaming them: Bloopbot gives each an available identifier, such as `new-flow`, `new-flow-2` and `new-flow-3`. Give each flow a useful name in the editor so you can tell them apart. Open a flow and choose **Canvas** in the top bar. Lines show how execution moves between nodes. Click a node to edit its fields in the side panel. Use the **Fit to view** icon in the toolbar at the bottom right of the canvas to bring the whole graph back into view. On a short desktop window, the top bar becomes more compact. **Add a node** search and **Browse the library** stay visible while the suggestions scroll between them. Scroll inside the side panel to reach a node’s remaining fields. Opening **Run log** leaves room for the canvas; close it when you want more drawing space. Resizing the window keeps the same part of the graph centred at your chosen zoom, and **Fit to view** places the nodes above the canvas toolbar. ![Hello chat flow in a short desktop window with Chat command selected, compact toolbar and visible node search and Browse the library controls.](https://bloopbot.com/docs/screenshots/flow-short-window.jpg) _The canvas in a short desktop window, with Chat command settings open and node search and Browse the library still in reach._ ![The flow canvas with a Chat command trigger connected to a Chat message action. Under the trigger, a tray of the values it hands on — Who typed it, After the command, Word 1, Word 2 and a +1 more button; under the Chat message, its Message field with a user badge, with a dashed data wire into it from Who typed it. The node palette is on the left, Test fire and Save are in the top bar, and the Tidy up button is in the canvas toolbar.](https://bloopbot.com/docs/screenshots/flow-canvas.jpg) _A Chat command trigger connected to a Chat message action._ ## Describe what a flow is for A flow can have a short description under its name, such as “Thanks a raider and shouts them out”. It helps you and your editors tell similar flows apart. It is optional. Flows you add from a pack already have one, which you can change or clear like any other. 1. Open the flow. 2. In the top bar, click **Add a description** under the flow's name. 3. Type one sentence, up to 240 characters. 4. Click **Save**. The description then shows under the flow's name on **Flows**. When the flow answers a chat command, your public [Commands page](https://bloopbot.com/docs/public-page#commands) shows it under that command too, so write it for your viewers. To remove it, clear the text and save. Changing the description is like renaming: an installed flow is not marked **Edited**. An exported flow keeps its description when someone imports it. ## The settings panel Click a node and its settings open in the panel on the right, with the node's name at the top and the duplicate icon (**Duplicate**) and the bin icon (**Delete**) at the bottom. Point at an icon and its name appears. Only the settings between them scroll, so those two stay in reach however long the list is. On a phone the same settings open as an **Edit node** drawer. - **Make it wider or narrower.** Drag the panel's left edge to resize it between 300 and 560 pixels. Double-click the edge to go back to the default width. With the edge focused, the left and right arrow keys move it too. Bloopbot remembers the width in this browser. - **Settings that appear once you choose.** A setting that only matters for one choice shows up only after you make that choice. For example, on **Pin, badge or hide chat**, **Pin it** appears once **Do** is set to pin a message, and **Badge** appears once it is set to badge one. What you typed is kept if you switch away and back. If a hidden setting has an error, it is shown anyway so you can fix it. - **More options.** Settings most flows never change sit together under **More options** near the end of the panel, just above the **Note** box, with a count of how many there are. It opens by itself when one of them differs from its default or needs attention. Otherwise it stays as you left it while the page is open. - **More on long help.** A long explanation under a setting shows its first sentence and a **More** link that opens the rest. - **Insert….** The **Insert…** button sits on the same line as a setting's name. Use it to put a viewer value, such as the viewer's name, into a message; it lists the same values that used to appear as small buttons under the box. ## Leave a note on a node When a step does something clever, leave a note so future you (or a mod) knows why. 1. Click the node to open its settings panel. 2. Type in the **Note** box at the bottom, after the step's other settings and **More options**. Notes are plain text, up to 500 characters, and keep your line breaks. For example, on a **Cooldown** step: "30 s for the whole channel so a raid can't fill chat with clip links." and, on a second line, "Mods and the broadcaster skip it." 3. Save the flow. The node now shows a small note icon in its card header. Point at it and the note appears in a popover, as in the picture. A note never changes what the flow does. Notes travel with a flow you share or export, so write them for whoever opens it next. ![The Clip it flow's Cooldown step selected on the canvas, with a two-line note typed in the Note box of its settings panel and the same note showing in a popover over the small note icon on the node's card.](https://bloopbot.com/docs/screenshots/flow-node-note.jpg) _A Cooldown step with its note: the popover over the note icon on the card, and the Note box in the settings panel._ ## Tidy up the layout A flow that has grown a few branches can end up with lines crossing and nodes on top of each other. **Tidy up** lays the nodes out again from left to right: the trigger on the left, each step to the right of the one before it, and the branches of a check in the order they appear on the node (**true** above **false**, a switch's cases from top to bottom). 1. Open the flow and choose **Canvas**. 2. To tidy only part of the flow, select two or more nodes: hold Shift and drag a box around them, or Ctrl-click each one. 3. Select **Tidy up** (the grid icon beside **Fit to view**), or press **Shift+L** while the canvas is focused. The nodes move and the view fits to show them. Wiring and settings stay exactly as they were, and so does what the flow does: steps wired to the same output run from top to bottom (left to right when two sit level), and Tidy up keeps them in that order, so it never changes which one runs first. When you tidy a selection and its nodes would land on other cards, they move down together until they are clear. If a selected step has no room to keep its place in that order among the cards you didn't select, it stays where it was, and the selected steps around it may not stay in one row. **Undo** puts every node back in one step. When nothing needed to move you see "Already tidy". Tidy up is not available while you preview an older version. A flow an AI assistant builds for you opens laid out the same way. ## Find and connect a step 1. Use the search button in **Add a node**, or open **Browse the library**. Search in plain words, such as “timer”, “points” or “shoutout”. 2. Choose a node and fill in its fields. A node sitting on the canvas without a connection will not run. 3. Connect the output of the previous step to the new node. You can also drop a palette item onto a connection to insert it. 4. Read the output labels. A condition can take different paths; actions may have separate **next** and **error** outputs. ![The node library reading 132 nodes, grouping Chat and commands into When triggers, Only if conditions and Then actions, with every topic — including Music, Moderation, AI and Groups — across the top, and, along the bottom, Ready-made snippets such as Announce the winner (Giveaway changes → Chat message) and Nuke command (Chat command → Who can trigger → Nuke chat), each with a Details button, and an Add button for all of them.](https://bloopbot.com/docs/screenshots/node-library.jpg) _The library groups triggers, conditions and actions by what you want to do._ Under the columns, **Ready-made** shows small connected flows that use the topic’s nodes. Press **Details** on one, or **Add** beside **Ready-made** to see them all: the **Add to this flow** panel opens on the right with the snippet’s review, which says what it adds and lists its **When**, **Only if** and **Then** steps. Press **Add**: its nodes land below what is already on the canvas, selected, as one step that **Undo** takes back. Nothing is saved until you save the flow. In **Add a node** search, a ready-made result opens the same review. ![The Add to this flow panel open on the ready-made snippet Announce the winner, Built in · Bloopbot: Adds 2 connected nodes to this flow, below what is already on the canvas, an Add button, the note that nothing is saved until you save the flow, What you get Giveaway changes → Chat message, and a What’s inside fold of 2 nodes.](https://bloopbot.com/docs/screenshots/flow-snippet-review.jpg) _Add to this flow: a ready-made snippet’s review, docked beside the canvas._ Steps also pass values to each other. The small dots in the tray under a card are the values it hands on and the fields that read one: [connect values with data wires](https://bloopbot.com/docs/data-wires) shows how to drag one step’s value into another. A few steps you want in several flows can become one card — [reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes). ## Start one flow in more than one way Use multiple triggers when different events should run the same steps. For example, a **Chat command** for `!welcome` and a **New follower** can both lead to one **Chat message** saying “Welcome in!” You need a flow with at least one trigger and a step you want to share. 1. Open the flow in **Canvas** view and add another trigger from **Add a node** or **Browse the library**. 2. Set up the new trigger, then connect its **next** output to the first step the triggers should share. Leave the existing trigger connected there too. 3. Save the flow. The **Simple** view is available for straight lines with one trigger; flows with several triggers stay on the canvas. 4. Choose a trigger beside **Test fire**, then run the test. Repeat for the other triggers and check the **Run log** for the path each one took. 5. Turn the flow on when both test paths do what you expect. Test fire simulates events and actions; a real chat or Twitch event is still needed to confirm live permissions and delivery. ![A flow canvas with a Chat command trigger and a New follower trigger both connected to the same Chat message action; the top bar lets the streamer choose which trigger to test.](https://bloopbot.com/docs/screenshots/flow-multiple-triggers.jpg) _A Chat command and a New follower trigger joined to one Chat message, with a trigger choice beside Test fire._ A flow can have one trigger of each kind. A **Chat command** and a **New follower** can share steps, but two **Chat command** triggers can't: saving the flow is refused with “This flow already has a Chat command trigger”. To answer more than one command word, list the others under **Also responds to** on the one **Chat command**. For a command that should do something different, make a flow of its own. Each matching trigger starts its own run. If two triggers match the same event, the shared action can run twice. Values such as `$(user)` come from the trigger that started that run; a value available only on one trigger may be empty on the other path. If a path does not run, check that its trigger is connected to the shared step and that its own filters match the event. ## Check a value from the event Most conditions check who is talking or how often something has run. **Check a value** instead looks at a detail carried by whatever just triggered the flow — a poll’s choices, a goal’s current amount — using the same `$(...)` tokens the **Insert…** menu offers. A Twitch prediction ends the same way whether it resolved or was cancelled, and a poll can end because it ran its course, was stopped early, or was archived — a prediction or poll trigger’s own **Outcome** field tells those apart without a condition at all, and a Twitch goal’s **When it** field offers **Ends without reaching it** alongside **Is reached**. The **Stream events** pack’s Prediction, Poll and Twitch goal flows are all set this way already. Reach for **Check a value** when you want a cutoff none of those fields offer — for example, only reacting once a goal’s `$(current)` passes a number of your own, or a poll’s `$(choices)` containing a particular word. ## Wait before the next step A **Wait** node pauses its path for a while, then carries on with the next step. Use it for anything that should happen later in the same flow: thank a raider now and post a reminder in two minutes, or turn a mode on and back off again ten minutes later. 1. In **Add a node**, search for “wait” and add **Wait**. 2. Set **Wait for**: type an amount and pick **seconds**, **minutes** or **hours** beside it, from 1 second up to an hour. For ten minutes, type 10 and pick **minutes**. 3. Connect the step before it to the **Wait**, and the **Wait**’s **next** output to what should happen afterwards. 4. Save the flow and turn it on. For example, a **Chat command** for `!stretch` connected to a **Chat message** saying “Stretch break!” and to a **Wait** of 5 minutes, with the **Wait** connected to a second **Chat message** saying “Break’s over, welcome back!”, posts the first message at once and the second five minutes later. What to expect: - **Timing.** The next step starts up to 5 seconds after the time you set, never before. Waits keep going even if Bloopbot restarts in the meantime. - **Other paths keep going.** Only the steps after the **Wait** are held back. If the step before it also connects to other nodes, those run straight away. - **Editing cancels.** If you save a change to the flow’s canvas while a wait is pending (adding, removing, moving or changing a node, or changing a connection), that wait is dropped and the rest of its path doesn’t run. Renaming the flow doesn’t cancel it. Switching the flow off cancels a wait too, but only if the flow is still off when the wait ends: switch it back on before then and the wait carries on as normal. - **Up to 20 at once.** A channel can have at most 20 waits pending across all its flows. While 20 are pending, a **Wait** fails, with “Too many waits are pending on this channel (20).” in the run log. Connect its **error** output to say what happens then; with nothing connected, the run ends there. Steps that already ran in that run are not undone. - **Not inside loops or groups.** A **Wait** can’t sit on a **For each** node’s item branch or inside a group, and the flow won’t save with one there. Put it before the **For each**, or after its completion branch. **In the run log**, a waiting flow shows up twice. The first run lists the **Wait** step as **waiting**, with the time it resumes (in UTC). When the wait ends, a second run starts with the same **Wait** step, marked **resumed** (for example, “waited 5 min (from the run at 14:22 UTC)”) and followed by the steps after it. If the wait was cancelled, the second run shows **abandoned** and says why. **Test fire** doesn’t wait. The test run lists the **Wait** step as “would wait 5 min” and goes straight on to the next step, so you can check the whole path at once. ## Duplicate a flow Duplicate copies a flow you want several of, such as eight Stream Deck keys that differ only in their picture and what they say, so you change what's different instead of building each one from scratch. 1. Open **Flows**, select the three-dot icon (**More**) on the flow's row and choose **Duplicate**. In the editor, select the duplicate icon (**Duplicate**) in the top bar; save your changes first, because the copy is made from the saved flow. 2. The copy opens in the editor, named after the original with “(copy)” on the end, for example “Death +1 (copy)”. A second copy is “(copy 2)”. 3. Rename it, change what makes it different, save it, and turn it on when it's ready. What to expect: - **It starts paused**, so a copied command never answers twice. The original keeps running as it was. - **It is your own flow.** It counts toward your plan's flows, even when the original came from a pack. Pack updates never change it, and it has no **Reset to built-in**. When your plan's flows are full, Duplicate says so and makes nothing. - **It uses the same things as the original**: the same variables, alert designs, rewards, groups and files. Nothing is copied twice, so changing an alert design changes it for both flows. - **Keys and webhooks stay with the original.** To press the copy from your deck, point a key at it: in the Stream Deck plugin, pick the copy under **My flows** ([put a Bloop Flow key on your deck](https://bloopbot.com/docs/stream-deck-plugin#assign)). A copied webhook gets its own private URL, so the original's URL keeps running the original. ![The paused Death +1 flow in its pack, with its More menu open showing Export, Duplicate and Delete.](https://bloopbot.com/docs/screenshots/flow-duplicate.jpg) _Duplicate in the menu of a flow row's three-dot icon (**More**), beside Export._ ## Test before enabling Save your changes, then use **Test fire**. Expand the **Run log** to see which nodes ran, which checks stopped the path and which actions were simulated. A dry run helps check wiring; a real Twitch event is still needed to confirm the live connection and permissions. The **dry run** marker identifies a Test fire result. A run from a real event or **Run** has no dry-run marker and can change your channel. **Live** beside **Run log** shows whether updates are connected. A flow that starts on a Twitch event — a goal, a poll, a raid, a sub and the rest — test-fires with a realistic made-up example of that event, so conditions that check its details (such as whether a goal was reached, or which choice a poll picked) take a real path instead of failing on empty values. The result shows which example was used. When a trigger can fire at more than one moment — a poll starting, getting votes or ending; a goal in progress or reached — a small picker next to **Test fire** lets you choose which one to simulate. > **Loops have two jobs** > > A For each node repeats its item branch for each item. Put work that should happen once after the loop on its completion branch, such as opening one giveaway after rewarding all gift recipients. ## Run a flow on demand Some flows shouldn’t wait for a chat command, a timer or a Twitch event — you just want to set them off yourself, whenever you like, with whatever details apply that time. Start one of these with the **Run button** trigger instead of any of the usual ones. 1. In **Add a node**, search for “run” and add **Run button** as the flow’s trigger. 2. Give it any inputs the rest of the flow needs — a song name, a number, an on/off switch. Each one gets a name, a type and an optional default, and the flow reads it as `$(input.)` anywhere after the trigger. 3. Connect the **Run button** to the rest of the flow and save it. 4. Turn the flow on, then select **Run** (the play icon and the word) in the top bar. 5. Fill in the prompt — it starts from each input’s default — and select **Run** again. ![The Run prompt for a flow that starts with a Run button trigger, showing a text field for its declared "song" input filled in with Bohemian Rhapsody, a Cancel button and a Run button.](https://bloopbot.com/docs/screenshots/flow-run-prompt.jpg) _The Run prompt for a flow with a Run button trigger, showing its "song" input filled in._ **This is not a simulation.** Unlike Test fire, a Run really sends chat messages, awards points and does anything else the flow does — the same as a real trigger firing. The prompt shows the run’s result once it finishes, or its run id while it is still going. Running the same flow again while it is still going is limited the same way a Stream Deck key press is: the new run queues and starts as soon as the first one finishes, but a third one arriving before either is done is turned away, so a flow’s own side effects — like a chat message or a point award — never run twice at once for the same button mashed too fast. ## Check which Twitch features your channel can use Your channel can have subscriptions, Bits and Channel Points before it becomes Affiliate. Twitch makes these features, along with polls, predictions and hype trains, available to eligible streamers who complete monetization onboarding. Affiliate or Partner status is still needed for cash payouts. [Twitch’s monetization announcement](https://blog.twitch.tv/en/2026/05/13/monetization-for-all/) explains the change. Before setting up a flow that uses one of these features: 1. Open Twitch’s **Creator Dashboard** and check your monetization onboarding. Complete any remaining steps, then check that the feature you want is available there. 2. Open Bloopbot’s **Connections**. If Twitch shows **Update available**, choose **Re-authorize** to grant missing permissions. Reconnecting does not unlock a feature Twitch has not made available to your channel. 3. Build and **Test fire** your flow, then check it with a real Twitch event or action. Test fire checks the wiring with made-up events; it does not prove Twitch will deliver a real event or accept an action. For example, a channel with subscriptions available can set up a **New subscriber** flow without being Affiliate. Bloopbot asks Twitch for the events it has permission to receive. Some features available in Twitch’s own dashboard may still be unavailable to other apps; if Twitch refuses an action, the **Run log** carries its answer. Check the feature’s availability separately from permissions. **Needs Twitch Affiliate** applies to Twitch ads: **Run a commercial**, **Snooze the next ad** and the **Ad break starts** trigger. You can still add these steps before becoming Affiliate. On Kick, **Run a commercial** follows Kick’s own ad rules instead ([ads on Kick](https://bloopbot.com/docs/bloopbot-on-kick#ads)). Bloopbot checks your channel’s Affiliate or Partner status again about once an hour while your dashboard is open, and **Needs attention** lists switched-on flows waiting for that status. ![Run a commercial in the node library with a Needs Twitch Affiliate badge on a non-Affiliate channel.](https://bloopbot.com/docs/screenshots/flow-node-affiliate-badge.jpg) _The node library marks Run a commercial as needing Twitch Affiliate._ Follows, raids and chat do not need monetization onboarding. Follower goals are available to every channel; other goal types depend on what Twitch offers your channel. Cards that a flow draws on your overlay — polls, predictions, hype trains and ad breaks — need no Twitch status, because the flow can supply their content itself. ## Flows paused until your bot is a moderator Some steps only work when your bot is a moderator in your Twitch chat: **Time out**, **Delete the message**, **Announcement**, **Warn a viewer**, **Chat settings**, **Shout out a streamer** with Twitch's shoutout on, **Pick at random** when it picks someone in chat, and **Set a variable** for everyone in chat. When Twitch says your bot is not a moderator, every flow that uses one of these steps is paused. It stays switched on, and nothing about it changes. The **Flows** page shows a bar like this, and the flow's row under **Needs attention** names the step: ![The Flows page bar: 2 flows are paused until the bot is a moderator in your chat, with the /mod command and its copy button](https://bloopbot.com/docs/screenshots/flows-paused-bot-mod.jpg) _Two flows paused until the bot is a moderator, with the /mod command and its copy button_ If you are the channel owner, the command is on that bar, on the **Not a mod** bar across the top of every dashboard page, on the **Loyalty** page's notice and on a paused flow's own page: 1. Copy the command from the bar. It is `/mod` followed by your bot's account name. 2. Send it in your own Twitch chat, signed in as the channel owner. 3. Refresh your dashboard so Bloopbot checks the bot's moderator status again. If you go live before making your bot a moderator, Bloopbot posts a reminder in your Twitch chat with the exact command to send. It also reminds you if a moderation action fails and Twitch confirms the bot is not a moderator. These reminders share a limit of one every 24 hours for your channel, including stream restarts. If chat blocks the reminder, use the command in your dashboard instead. Editors see the paused line without the command, because the channel owner needs to make the bot a moderator. The paused flows start running again by themselves as soon as Twitch lists the bot as a moderator. While the bot is not a moderator, loyalty payouts for watching are paused too, and the **Loyalty** page says so. ## Chat replies during a busy stream Twitch limits how quickly your bot can post. When several commands or timers reply at once, Bloopbot waits for room before sending the next message, so replies can arrive later during a burst. If channels share the same bot account, their replies share its Twitch allowance too. Use a **Cooldown** on a frequently used command and keep timer messages spaced out. Making the bot a moderator lets Twitch allow more replies; authorizing it to join your chat alone does not. **Test fire** simulates chat messages, so it does not show a live Twitch delay. If a message still fails, expand that run in the **Run log** to read the reason Twitch gave. ## Switch other flows Add **Turn flows on or off** to pause or resume several selected flows in one step, or **Turn a pack on or off** for a pack whose membership can change. Test fire simulates both without changing anything. [Switch packs and selected flows](https://bloopbot.com/docs/create-packs#switch) explains the pickers, the limits and how to keep a mode’s resume button available. --- # Nightbot commands and their Bloopbot equivalents Every built-in Nightbot command, from !commands and !permit to !songs and !winner, with what it does and how to do the same in Bloopbot. Updated 15 October 2026 ## The short answer Nightbot's built-in commands are `!commands`, `!filters`, `!permit`, `!game`, `!title`, `!tags`, `!marker`, `!commercial`, `!poll`, `!regulars`, `!songs`, `!winner` and `!nightbot`. Your own commands are the ones you made with `!commands add`. Bloopbot can bring your own commands over for you, and it has an equivalent for nearly every built-in one, either built in or as a ready-made flow you switch on. The table below lists each one. To move your own commands, use the importer: it reads your public Nightbot command list and turns each command into a flow, with its userlevel and cooldown, and you don't sign in to Nightbot. [Coming from Nightbot](https://bloopbot.com/docs/coming-from-nightbot#import) walks through it. ## Nightbot's built-in commands in Bloopbot | Nightbot command | What it does in Nightbot | In Bloopbot | | --- | --- | --- | | `!commands` | Links to your channel's command list | `!commands` replies with your public **Commands** page, from the **Commands link** flow in the **Starter** pack ([point viewers at your Commands page](https://bloopbot.com/docs/first-command#commands-link)) | | `!commands add`, `edit`, `delete` | Makes, changes or removes a command from chat | You make and change commands on **Flows**, in a form or on the canvas ([create your first chat command](https://bloopbot.com/docs/first-command)). There is no chat command for it | | `!filters` | Manages the spam filters | Built in for moderators: `!filters`, `!filters enable links`, `!filters disable caps` ([what moderators can do from chat](https://bloopbot.com/docs/editors#moderators)) | | `!permit` | Lets a viewer post a link for a short time | Built in for moderators: `!permit username`, 60 seconds unless you change it on **Moderation** | | `!game`, `!title` | Shows or changes your category or title | `!game` and `!title` in the **Mod commands** pack ([add a helper flow](https://bloopbot.com/docs/moderation#helpers)) | | `!tags` | Shows your stream tags | No equivalent yet. Change tags on Twitch | | `!marker` | Drops a stream marker | A command flow with a **Stream marker** step, such as a moderators-only `!mark` ([mark a moment for your highlights](https://bloopbot.com/docs/polls-and-predictions#markers)) | | `!commercial` | Runs an ad | A command flow with a **Run a commercial** step. It needs Twitch Affiliate or Partner ([check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate)) | | `!poll` | Makes a Strawpoll | A command flow with a **Run a Twitch poll** step, which runs a real Twitch poll ([start a poll or prediction from a flow](https://bloopbot.com/docs/polls-and-predictions#start)) | | `!regulars add`, `delete` | Manages your Regulars list | `!regulars add name`, `!regulars remove name` and `!regulars`, three flows for moderators ([recognise regular viewers](https://bloopbot.com/docs/loyalty-and-regulars)) | | `!songs` (`!songs request` and the rest) | YouTube and SoundCloud song requests | `!sr`, `!song` and `!srstatus` from the **Song requests** pack, playing through your own Spotify Premium account ([take Spotify song requests](https://bloopbot.com/docs/song-requests)) | | `!winner` | Picks a random chatter | A command flow with a **Pick at random** step set to **Someone in chat**, or a full [giveaway](https://bloopbot.com/docs/giveaways) with a keyword to enter | | `!nightbot join`, `part` | Brings the bot into your chat or out of it | Nothing to type: the bot joins when you connect your channel. Make it a moderator so it can act ([make the bot a moderator](https://bloopbot.com/docs/moderate-without-mods#bot-mod)) | ## Your own commands and their variables A command you made with `!commands add !name reply` becomes a flow: a **Chat command** trigger, a check for its userlevel or cooldown where it had one, and a **Chat message** with the reply. `$(user)`, `$(touser)`, `$(query)` and `$(1)` to `$(9)` mean the same in Bloopbot, and the importer rewrites most of the rest, such as `$(count)` and `$(twitch …)` lookups, into their Bloopbot form. [Variables](https://bloopbot.com/docs/coming-from-nightbot#variables-map) lists every one, including the few with no equivalent, such as `$(eval)` and `$(weather)`. ## What works differently - **Commands live on a page, not in chat.** You build and edit them on **Flows**, where each one can do more than reply: add a check, keep a count, show an alert or start a poll. - **Moderators still run the stream from chat.** `!permit`, `!filters`, `!blacklist` and `!whitelist` are built in for moderators, and packs add the rest. - **It runs in the cloud.** Like Nightbot, there is nothing to install, and your commands keep answering when your PC is off. - **Only one bot should answer.** Once a Bloopbot flow does a command's job, switch that command off in Nightbot, so chat doesn't get two replies ([turn off the old bot](https://bloopbot.com/docs/coming-from-nightbot#switch-off)). ## Troubleshooting - **A command gets two replies.** Nightbot is still answering it. Switch the command off in Nightbot's dashboard. - **A moderator command does nothing.** Check the person has the moderator badge in your chat, and that the bot is a moderator too. - **The bot doesn't answer at all.** Check the flow is switched on. [Troubleshooting](https://bloopbot.com/docs/troubleshooting) covers commands that stay silent. ## Find commands and timers from chat Open **Flows**, then **Suggested commands**. Bloopbot looks at recent chat for commands and timers from Nightbot, StreamElements, Streamlabs, Moobot, Fossabot, Wizebot and Sery\_bot, including bots whose command lists cannot be imported. 1. Keep Bloopbot connected while you stream. A possible command needs the same reply after the same `!command` at least twice. A possible timer needs the same bot message at least three times at similar intervals. 2. Open **Observed message** to see the words Bloopbot saw. Check the bot, platform and observation count. Permissions, cooldowns, changing values and hidden actions cannot be worked out from a reply. Commands with arguments or changing replies are left out. 3. Edit **Command** and **Reply**, or **Minutes between posts** and **Reply** for a timer. The suggested interval is an estimate. Timer flows run only while live and post to every connected chat; set any chat activity rule in the flow editor afterwards. 4. Press **Create paused flow**, then **Review flow**. The new flow is paused and counts towards your flow allowance. Check its settings, add any permissions or cooldowns you need, and use **Test fire** to try it. 5. Turn off that command or timer in the original bot, then make the Bloopbot flow live. Bloopbot cannot turn off the other bot for you. ![Suggested commands on Flows, showing an observed community command from Fossabot and a possible fifteen-minute reminder from Moobot, with editable replies and Create paused flow buttons](https://bloopbot.com/docs/screenshots/command-suggestions.jpg) _Review the observed reply and edit it before creating a paused flow._ Use a suggestion's **Dismiss** button to hide it for 30 days. **Refresh suggestions** reads the latest evidence. An empty list means Bloopbot has not seen enough stable evidence yet; it cannot recover messages sent before it joined. Evidence uses at most 2,000 relevant lines from the last seven days. Bloopbot's own messages and messages from another shared-chat channel are excluded. Custom bot accounts are not recognised yet. Already have the command in Bloopbot, even paused or as an alias? It is left out to avoid a second copy. For Nightbot or StreamElements, the [command importer](https://bloopbot.com/docs/coming-from-nightbot#import) can preserve settings their public command list exposes. Pebble's **Your first flow** and **Your first timer** tutorials cover editing a command or timer. --- # Twitch shoutout command and !so for your chat How the Twitch /shoutout command works, its limits, and how to run a !so shoutout command or an auto shoutout for raiders with Bloopbot. Updated 15 October 2026 ## The short answer The Twitch shoutout command is `/shoutout name`. You or a moderator type it in your chat, and Twitch tells your viewers to visit that streamer, with a Follow button for anyone who doesn’t follow them yet. It only works while you are live, and Twitch limits how often you can use it. Bloopbot adds a `!so` shoutout command on top. When you or a moderator type `!so name` (or `!shoutout name`), Bloopbot posts a shoutout message in chat and sends Twitch’s own `/shoutout` for you. If your overlay has a Clip player, it also plays one of that streamer’s clips. It is the **Shoutout** flow in the **Starter** pack, and you can change its message, who can use it, and when it runs, including an auto shoutout whenever someone raids you. ## What Twitch’s /shoutout does Twitch sends a shoutout to the channel you name. Viewers who don’t follow that channel see a pop-up Follow button in your chat. The Twitch rules, from [Twitch’s Send a Shoutout reference](https://dev.twitch.tv/docs/api/reference/#send-a-shoutout): - **Who can send one.** The broadcaster, or a moderator of the channel. - **How often.** Your channel can send one shoutout every 2 minutes, and a shoutout to the same streamer once every 60 minutes. Past either limit, Twitch refuses it. - **When.** Your channel must be live. Twitch also refuses a shoutout to yourself. These limits belong to Twitch. They hold whether you type `/shoutout` yourself or a bot sends it. ## How !so works in Bloopbot Type `!so pixelpal` in your chat. The **Shoutout** flow then does these things in order: 1. Checks that you are the broadcaster or a moderator. Anyone else is ignored, with no reply. 2. Looks up the streamer on Twitch. If the name isn’t a Twitch account, chat gets “Could not find user: name”. 3. Sends Twitch’s own `/shoutout` while you are live. Offline, it skips this step and the flow’s **Run log** says so. 4. Posts the shoutout message in chat. By default it tells chat to check out PixelPal at their Twitch link and names the game they last streamed. When they have no game, the line leaves that part out. 5. Shows your **Clip player** layer, plays one of the streamer’s clips on it, and hides it again afterwards. With no Clip player on your overlay, this step plays nothing and the rest still works. [Play a streamer’s clip when you shout them out](https://bloopbot.com/docs/shoutout-clips) sets the player up. `!so` with no name replies with its usage line. The command has no cooldown of its own, so Twitch’s limits above are the only ones until you add one. ![The Starter pack’s Shoutout flow on the flow canvas: the !so command, a Who can trigger check set to moderators and up, Shout out a streamer, Show a layer for Clip player with its next and error both leading to Play a shoutout clip, then from Played and No clip a second Show a layer for Clip player, with dashed data wires from the trigger’s Who typed it and Word 1 into Shout out a streamer’s fields and Word 1 into Play a shoutout clip’s Whose clip, and one from the clip step’s Busy for to its Hide again after.](https://bloopbot.com/docs/screenshots/shoutout-clips-flow.jpg) _Starter’s Shoutout: the !so command, the moderator check, Shout out a streamer, Show a layer for Clip player, Play a shoutout clip, then Show a layer again with Hide again after wired to how long the Clip player is busy._ If you don’t have it yet, open **Flows**, press **Marketplace**, add **Shoutout** (it is in the **Starter** pack) and switch it on. It arrives paused. Bring your Nightbot `!so` over with the importer if you are moving; it offers **Use Bloopbot’s shoutout** ([Coming from Nightbot](https://bloopbot.com/docs/coming-from-nightbot#import)). ## Shout out raiders automatically An auto shoutout is a second flow that starts on a raid instead of a command. Bloopbot has no ready-made one, but it takes four steps: 1. On **Flows**, make a new flow and start it with **Incoming raid**. Set **Minimum raiders** to skip small raids, or leave it at 0 for every raid. 2. Add **Shout out a streamer** after it. 3. Set **Who** to `$(raiderlogin)`, the channel that raided you. Leave **Twitch shoutout too** on. 4. Save and switch the flow on. Each raid now gets a chat shoutout and Twitch’s own shoutout. To play a clip as well, add **Play a shoutout clip** with **Whose clip** set to `$(raiderlogin)` and the **Show a layer** steps from [Use the step in your own flow](https://bloopbot.com/docs/shoutout-clips#your-own-flow). [Polls and predictions](https://bloopbot.com/docs/polls-and-predictions#markers) has the same raid flow with a stream marker added. ## Change the message Open the **Shoutout** flow and select **Shout out a streamer**. - **Message** is sent when the streamer was last playing a game, and **Message (no game)** when they weren’t. Write what you like. - Three details about the streamer fill in by name: `$(user)` is their display name, `$(login)` their channel name for the link, and `$(game)` their last game. `$(title)` is their last stream title and `$(description)` their Twitch bio. - **Who** is `$(1)`, the first word after the command. Change it to `$(raiderlogin)` in a raid flow, as above. [Name the words after a command](https://bloopbot.com/docs/first-command#arguments) explains `$(1)`. - **Twitch shoutout too** switches Twitch’s own shoutout off if you only want the chat message. ## Change who can use !so The flow checks **Who can trigger** for moderators and up. Change that check to **Broadcaster only**, or delete it to let everyone use the command. Add a **Cooldown** step before **Shout out a streamer** if you want chat to wait between shoutouts. [Add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns) shows both. A command with no **Who can trigger** step is listed under **Everyone** on your public Commands page. ## On Kick Shoutouts are Twitch only. Bloopbot leaves **Shoutout** out of a Kick channel’s Starter flows, and the **Shout out a streamer** step is marked **Needs Twitch** on Kick. [Bloopbot on Kick](https://bloopbot.com/docs/bloopbot-on-kick) lists what works there. ## Troubleshooting - **The chat message appears but Twitch’s shoutout doesn’t.** Open the **Run log**. “Twitch shoutout skipped: channel offline” means you weren’t live. “Twitch shoutout failed” followed by Twitch’s reason usually means a limit: one shoutout every 2 minutes, or the same streamer within 60 minutes. The chat message goes out either way. - **Nothing happens at all.** Check the flow is switched on and that the person typing `!so` is a moderator or you. A viewer’s `!so` gets no reply. - **Twitch’s shoutout fails and the Run log shows a Twitch error.** The bot sends Twitch’s shoutout as a moderator, so it must be one in your chat. The dashboard shows a **Not a mod** bar until it is, and [Make the bot a moderator](https://bloopbot.com/docs/moderate-without-mods#bot-mod) walks through it. - **“Could not find user”.** The name isn’t a Twitch account. Check the spelling; a leading `@` is fine. - **No clip plays.** The streamer may have no public clips, or your overlay has no Clip player. [The clip guide](https://bloopbot.com/docs/shoutout-clips#troubleshoot) covers each case. --- # Post a recurring chat message Use a timed promo for reminders, social links or chat rules. Updated 26 October 2026 ## 1. Start with Timed promo Open **Flows**, press **Marketplace** and add **Timed promo**. Give it a name such as “Discord reminder”. This template starts with an **On a timer** trigger set to fire every so many minutes, and is intended for messages in Twitch chat while you are live. To [post your go-live announcement into a Discord channel](https://bloopbot.com/docs/discord-go-live#set-up), use the Discord flow instead. > **Pebble can build a timer with you** > > Pebble’s **Your first timer** tutorial makes your bot speak up every few minutes, only while you’re live and chat is awake. Start it from [Tutorials](https://bloopbot.com/docs/tutorials), or choose **Timed messages** in guided setup. You can start directly without completing the command tutorial. If you already have a timer, help reuses it and explains its saved interval, live-only check and chat-activity minimum. ## 2. Set the timing and message 1. Set the timer interval in minutes. For an occasional reminder, start with 30 minutes. 2. Review the minimum chat activity setting, if used. A quiet chat may not meet this threshold. 3. Keep **Only while live** enabled in the timer if the reminder should only post during a broadcast. 4. Edit the **Chat message** action with your reminder and the correct link, then save. ``` Enjoying the stream? Find our community links on the channel page. ``` ## 3. Check the schedule Use **Test fire** to check the message and conditions without posting to chat. Enable the flow and allow the configured interval to pass during a stream. A timer with a live-only check will stop while the channel is offline. > **A test is not the timer clock** > > A manual dry run checks the graph. It does not prove that the interval has elapsed or that the live chat activity threshold has been met. After trying it, change a few words in the same reminder, save and preview again with help closed. Use the Live switch to pause its actual effect; **Done for now** only pauses setup guidance. Timer work keeps its own capacity while chat is busy. During a large burst, reminders may run after their due time; a timer is not an exact-second clock. Chat commands have separate capacity so they can respond while reminders drain. ## Post on set days at a set time In the timer, change **Fires** to **On set days at a set time**, tick the **Days** and type the time as **At (HH:MM, 24-hour)**, for example `20:00`. The time is read in your channel’s time zone. Bloopbot learns that zone from your browser the first time you open your dashboard, so a channel that has never set one still fires at your local time. To use a different zone, pick it in **Timezone** when you add or edit a segment on the [Schedule](https://bloopbot.com/docs/schedule) page; a zone you choose there is never replaced by your browser’s. A browser that reports UTC is not saved, so a channel on UTC stays on UTC until you pick a zone. The same zone sets the times in **Format a time** and the clock a **To a time of day** countdown counts to. After the zone is saved, the timer moves to it within a minute, with no need to save the flow again. > **Changing days or time** > > Editing the days, the time or the timer itself re-arms it on save, so the next post follows what the flow now says, not what it said before. ## For a weekly or stream-schedule reminder Use the **Timed promo** template for a message that repeats while you are live, and **Going-live countdown** for a reminder tied to your Twitch schedule — it posts half an hour before a scheduled stream. For another moment, such as a note after the stream ends or a different number of minutes, start a flow from the **From your schedule** trigger and set its **When** field. Make sure the schedule on the **Schedule** page is up to date; the scheduled start and the actual moment you go live can differ. [Work with your stream schedule](https://bloopbot.com/docs/schedule) covers both. --- # Add permissions and cooldowns Limit who can run a command and how often it can respond. Updated 5 October 2026 ## Make a command moderators-only 1. Open the command flow and switch to **Canvas**. 2. Search the node library for **Who can trigger**. Insert it between the command trigger and the action. 3. Choose the required role in its fields, then connect the passing path to the action. 4. Save, inspect a dry run, and verify live behaviour with the intended roles. > **Pebble can show you the check** > > Pebble’s **Make it only for mods** tutorial adds a **Who can trigger** check to a command and shows where your Commands page lists it. Start it from [Tutorials](https://bloopbot.com/docs/tutorials). Everyone at the chosen level and above passes: **Moderators and up** lets your moderators and you through, and **Broadcaster only** keeps the command to you alone. The check reads each viewer’s Twitch badges, so a moderator needs no dashboard access to use a moderators-only command; [Share the work with mods and editors](https://bloopbot.com/docs/editors#moderators) explains the difference. This is useful for [clip commands](https://bloopbot.com/docs/clips), changes to stream information, point adjustments and other moderator tools. A condition must be on the connected execution path to protect the action. The level you pick here is also where the command appears on your public **Commands** page: a **Moderators and up** command is listed under **Moderators**, and a command with no **Who can trigger** step under **Everyone**. [Show your chat commands](https://bloopbot.com/docs/public-page#commands) covers which groups viewers see. ## Stop a command from being spammed Search for **Cooldown** and place the condition before the response. Choose how long the cooldown lasts and whether it is shared by the whole channel or tracked per viewer. A channel cooldown limits total chat noise; a per-viewer cooldown gives each viewer their own turn. > **Check the failing path** > > If a permission or cooldown check does not pass, keep its failing branch away from the protected action. A second direct connection from the trigger could bypass your check. ## Let a failed attempt try again A cooldown normally counts every attempt it lets through, including the ones that then go wrong. If the step after it fails — a lookup that finds nothing, a request that times out, a channel-point reward that could not be fulfilled — the viewer still waits out the full cooldown before they can try again. The **Cooldown** step has a second connection point on its left, labelled **Reset**. Anything connected there frees the cooldown: both the whole-channel window and the individual viewer’s, so the very next attempt goes through as if nobody had triggered it. 1. Open the flow and switch to **Canvas**. 2. Find the step that can fail and connect its **error** branch — the red connection on its right — to the **Reset** connection on the left of your **Cooldown** step. 3. Save, then use **Test fire** and expand the **Run log** to check the paths you built. 4. Go live and try the command twice in a row: the first attempt that fails should not make the next one wait. > **What counts as a failure** > > Only a step that fails reaches an **error** branch. A viewer the cooldown or a permission check turns away is the flow working as you set it up, not a failure, so it does not free anything. If you never connect **Reset**, the cooldown behaves exactly as before. ## Allow your regulars The **Regulars-only command** template includes an **Is a regular** condition. Manage the list on **Regulars**. This is Bloopbot’s regular-viewer list, separate from Twitch’s subscriber, VIP and moderator roles. --- # Keep a counter with variables Store a death count, update it from a flow or the ready-made !deaths counter, use a variable as the setting a feature reads, and remember each viewer to welcome first-time chatters. Plus rolling dice and picking at random. Updated 14 November 2026 ## The short answer To keep a counter in Twitch chat, such as a death count, declare a number variable in Bloopbot and change it from a flow. The variable holds the number between streams or resets each stream, whichever you choose, and any chat message, overlay label or other flow can show it as `$(var.deaths)`. A variable can also be the setting a feature reads, or hold a separate value for each viewer. The quickest counter: 1. Open **Flows → Add** and add the **Counter** and **Counter: add one (!deaths +)** templates from the **Starter** pack. Let the review declare `deaths`. 2. Switch both flows on. 3. Type `!deaths` in chat to hear the count. A moderator types `!deaths +` to add one. To build it yourself, declare `deaths` on **Variables** ([step 1](https://bloopbot.com/docs/variables#declare)), then add **Set a variable** to a command flow ([step 2](https://bloopbot.com/docs/variables#update)). ## 1. Declare what you want to remember Open **Variables** and declare a variable with key `deaths`, a number type, channel scope and a starting value of `0`. Choose its reset policy deliberately: keep it across streams for a running total, or use a stream reset for a session count. > **Pebble can build a counter with you** > > Pebble’s **Count with a variable** tutorial declares a number and builds a `!death` command that adds one and says the count. Start it from [Tutorials](https://bloopbot.com/docs/tutorials). Channel scope stores one value for the stream. Viewer scope stores a separate value for each viewer. Use channel scope for a shared death counter. A text variable holds up to 10,000 characters. Anything past that is cut off when it is saved, including text added with **append**. > **Some rows are reserved** > > A row marked **reserved** is a value Bloopbot keeps for itself — the five that hold a viewer’s loyalty points, watch time and last payout are the ones you will see. It is shown on Variables, but it cannot be set, reset or deleted here: the page that owns it is where you change it, and for loyalty that is the [Loyalty](https://bloopbot.com/docs/loyalty-and-regulars) page. A flow still reads a reserved value like any other. ## Get help with your setup Optional **Help me** uses your existing declarations. Review a variable’s type, scope, initial value and reset policy before editing; declaring a value is separate from running a flow that changes it. Guidance never increments, resets or changes a current value for practice. ## 2. Change it from a flow Build a command flow, add a permission check if only moderators should change the number, and add **Set a variable** from the node library. Choose `deaths`, use the add operation and set **Value** to `1`. Follow it with a **Chat message** action: ``` Death count: $(var.deaths) ``` Save the flow and inspect a test run. The dry run does not persist changes to your real counter. Trigger the enabled command in chat, then check its value on Variables. Put a variable token in the flow's own message field to show its value. Text a viewer supplies stays as they typed it: if a flow repeats their message or reward input and they type `$(var.deaths)`, the bot repeats those characters rather than reading your counter. Test runs follow the same rule. ## Or start from the Counter templates If a death counter is all you need, the **Counter** and **Counter: add one (!deaths +)** templates in the **Starter** pack build steps 1 and 2 for you as two small flows. Add them from **Flows → Add**, with **Starter** or each on its own, and let the review declare `deaths`. | Type in chat | Who | What the bot does | | --- | --- | --- | | `!deaths` | Anyone | Says `Deaths: 12` | | `!deaths +` | Mods | Adds one and says `Deaths: 13` | | `!deaths add` | Mods | The same, either word works | | `!deaths +` | Viewers | Nothing — mods only, and it says nothing to anyone else | The two flows are told apart by the command’s **Subcommand** field, not a step inside either graph: the add flow answers only `+` and `add`, and the show flow is the fallback that runs for everything else typed after `!deaths`, including nothing at all. To count something else, open both installed flows and change the command word on their triggers, the variable on the add flow’s **Set variable** step, and the words in both chat lines. Want `!deaths -` to take one away, or `!deaths set 0` to start over? Duplicate the add flow, change its trigger’s **Subcommand** to `-` (or `set`) and its **Set variable** step’s operation to subtract (or set). A copy that reads the typed amount instead of always adding one needs a **Read a number** step reading `$(2)` in front of **Set variable**, with its **If it’s blank, use** set to `1`. > **Had the older Counter?** > > The Counter used to be one flow answering `!deaths`, `!deaths +`, `!deaths - 2` and `!deaths set 0` together — and before that, `!count count +` and `count count: 12`. That flow keeps working exactly as it is: installing Starter again does not touch it, and its command still does everything it always did. What you get is two new, paused flows beside it — the show flow above and the add flow — so nothing changes in chat until you switch them on. To move over, turn your old Counter off (or delete it) before you turn the new ones on, so `!deaths` is not answered twice. An old `count` variable stays on **Variables** until you delete it. ## Keeping a list? Convert it to a collection A text variable works as a makeshift list, such as one entry per card a viewer owns, but a flow cannot remove one entry, count them or check for a single item. On a text variable's row, the **Convert to a collection** icon splits each value into items, counts repeats ("A, A, B" becomes A ×2 and B) and makes a [collection](https://bloopbot.com/docs/collections#convert) from it. The variable stays as it is, so no flow breaks; delete it yourself once your flows use the collection's steps. ## Change several variables at once 1. On **Variables**, press **Select** above the list. A box appears on each row except the reserved ones, and **Select** becomes **Done**. 2. Tick the variables you want. Hold **Shift** and tick another row to take every row between the two; the box at the start of the toolbar ticks every variable the filter shows, on every page. 3. In the bar at the bottom, choose **Set value**, **Reset** or the bin icon (**Delete selected variables**). **Set value** gives every ticked variable the same value, so it needs channel variables of one type: all numbers, all text or all on/off. Type the value and press **Set all**. **Reset** puts each one back to its own starting value. Delete asks first and names any that flows still use. Press **Done** to hide the boxes again. For example, tick `deaths` and `wins`, choose **Set value**, type `0` and press **Set all** to start both counts again in one go. ## 3. Reuse the value | Value | Use | | --- | --- | | `$(var.deaths)` | A channel variable you declared | | `$(var.user.streak)` | A viewer variable named streak, in a viewer context | | `$(data.last_raid.viewers)` | Channel data recorded by the bot | | `$(now)` | The current time as a number of milliseconds, from any trigger | | `$(platform)` | `twitch` or `kick`: where the trigger came from. Empty for a timer or a button press | Use the editor’s **Insert…** menu to pick data available in the current flow. A viewer variable needs a viewer context; a timer does not inherently identify a viewer. `$(now)` is the same kind of number from every trigger, so it works anywhere you can type a token, with no viewer or event needed. It is a number of milliseconds (`1800000000123`), meant to be stored rather than read: set a variable to `$(now)` when something happens, then later give that variable to a **Format a time** step, which says how long ago it was (“2 minutes ago”) or what clock time it was. **Test fire** fills `$(now)` with the real current time, since reading the clock changes nothing. To see what the bot is keeping right now, open **Variables** and switch to the **Channel data** tab. Type in **Find a value or token** to narrow it down (`raid`, say), or open a group such as **Stream** to see each value beside its token. The list starts with what changed most recently, with how long ago on the right; choose **A–Z** to list it by name instead. Click a token to copy it, ready to paste into a message. The **Your variables** tab lists what you declared: its filter appears once you have more than eight, and a long list splits into pages of twenty. A value can also start a flow. Choose the **Variable changes** trigger, pick the variable under **Watch**, and set **Runs when it**: **Crosses a threshold** runs once as the value passes it — **At least** `100`, say — and not again until it drops back; **Changes at all** runs on every write; **Lands on a value** runs when it becomes exactly the value you give. The **Goal: reached!** flow in the **On-screen numbers** pack works this way, celebrating in chat the moment `goal` reaches 100. **Watch** is not limited to your own variables: it lists everything the bot remembers on its own too, grouped the way **Insert…** groups it. Click the box and type to search — `followers`, `bits`, `raid` — and each entry shows its value right now, once the bot has recorded one. So a flow can run when **Channel → Followers** crosses `1000`, when **This stream so far → Bits** reaches `500`, or whenever **Last raid → When** changes. A time such as **When** can only be watched with **Changes at all**. ![A Variable changes step with Channel → Followers picked under Watch, the box opened and searched for follow: matching entries from This stream so far, Channel, Chat and Last follow, each with its stored name, the picked one checked, and Declare a new variable under the list.](https://bloopbot.com/docs/screenshots/variable-changes-channel-data.jpg) _Type into **Watch** to search. Each entry shows its group and the name it is stored as; the picked one is checked._ **Time online in minutes** and the "minutes since" values are not offered here, because they move with the clock rather than with anything that happened; compare them with a **Variable is** check instead, which offers every value **Insert…** does. **Channel data → This stream so far** keeps count of what has happened since you went live — follows, subs (new and resubs, also listed on their own), subs gifted, unsubs, bits, raids, rewards redeemed, chat messages, distinct chatters, and hype trains — plus who has supported you most: | Insert… entry | Value | Example | | --- | --- | --- | | **Top cheerer this stream** | `$(data.this_stream.top_cheerer)` | `PixelPal` | | **Top cheerer’s bits** | `$(data.this_stream.top_cheerer_amount)` | `200` | | **Top gifter this stream** | `$(data.this_stream.top_gifter)` | `Anonymous` | | **Top gifter’s subs gifted** | `$(data.this_stream.top_gifter_amount)` | `5` | Each viewer’s cheers and gifts are added up over the stream, so a viewer who cheers 100 bits twice (200) is ahead of one who cheered 150 once. A gifter who gifted anonymously is shown as `Anonymous`. A **Chat message** on a `!top` command, or on a **Stream starts or ends** trigger set to when the stream goes offline, could say: ``` Thank you all! Top cheerer tonight: $(data.this_stream.top_cheerer) with $(data.this_stream.top_cheerer_amount) bits. ``` **Channel data → Channel** is the size of the channel itself, not this stream: `$(data.channel.followers)` and `$(data.channel.subscribers)`. A goal bar can track either number. **Channel data → Chat → People in chat** is who is in chat right now, including people who have not typed. **Channel data → Stream → Viewers** is the live viewer count, and it is `0` while you are offline. All four start empty (a blank name and `0`) each time you go live. A cheer or gift while you are offline does not count toward any stream. So a message that runs before anyone has cheered this stream shows a blank name; if you would rather say nothing then, put a **Channel data is** check in front of the message: **This stream so far · top cheerer’s bits**, **At least** `1`. One entry on the **Insert…** menu is a list rather than a single value: **Channel data → Song queue → The songs in the queue**, which is every song waiting in your queue. A list goes on a **For each** step rather than into a message — the branch under it runs once per entry, with the current one as `$(item)` — which is how a flow thanks each viewer, or reads the queue out in order. [The song requests guide](https://bloopbot.com/docs/song-requests) shows it in place. ## Social accounts in channel data **Variables → Channel data** includes **Bluesky account**, **Mastodon account**, **X account**, **Threads account**, **Instagram account**, **Facebook Page** and **TikTok account**. Each group has its connection status, account name, username or handle and profile link. Connect or remove an account on **Connections**. Read the values in a message, a comparison, a widget or a flow's **Variable changes** trigger. For example, `$(data.social_tiktok.followers)` is your TikTok follower count, and `$(data.social_bluesky.posts)` is your Bluesky post count. You don't need to declare a variable for these values, and flows cannot write them. | Account | Counts available when the connection permits them | | --- | --- | | TikTok | Followers, following, total likes received and public videos | | Bluesky | Followers, following and posts | | Mastodon | Followers, following and posts | | Instagram | Followers, following and published media (shown as posts) | | Facebook Page | Followers and the Page's like count supplied by Facebook | | Threads | Followers, only with statistics permission; existing posting connections may lack it | | X | Account details only; paid statistics reads are disabled | Counts update about every five minutes. **Statistics updated** is the time of the reading; **Connection checked** is the time Bloopbot checked the connection. These are snapshots, not notifications of individual followers. Facebook can report its follower count in the Page like-count field for some Page types. Check **Follower count is available** before comparing or showing **Followers**; its token is `$(data.social_tiktok.followers_available)` for TikTok. The other counts have matching availability flags. An unavailable count is unset and expands to blank; a real zero stays **0**. **Statistics status** says `ready`, `unavailable`, `permission_required`, `disabled`, `needs_reconnect` or `not_connected`. If a reading fails or you disconnect, old counts are removed. Reconnect when the account's permissions have expired. Threads statistics may need permission Bloopbot's app doesn't have yet; reconnecting only helps once that permission is available. [Connect TikTok](https://bloopbot.com/docs/connect-tiktok) explains its connection and the stats card. ## Kick in channel data If you stream on Kick, Bloopbot keeps KICKs apart from bits. **Channel data → Last KICKs** is the last KICKs gift (`$(data.last_kicks.user)`, `$(data.last_kicks.amount)`), and **This stream so far** counts **KICKs** and keeps the **Top KICKs giver this stream** (`$(data.this_stream.top_kicks_giver)`) and their KICKs. A KICKs gift still starts your **Cheer** flows, but it never counts as bits or as the top cheerer. **Channel data → KICKs leaders** is your Kick KICKs leaderboard: the top giver of all time, this month and this week, and each top 10. The last follow, sub, resub, gift, cheer, KICKs and reward each say where they came from, as **Platform**: `twitch` or `kick`. A message such as `Thanks $(data.last_follow.user) for the follow on $(data.last_follow.platform)!` works on both. On a Kick channel, **Stream** is your Kick stream and **Channel → Subscribers** is your Kick subscriber count, both refreshed about once a minute. Kick doesn't publish a follower count, so **Channel → Followers** only counts the follows Bloopbot sees. On a Twitch channel with Kick added, **Stream** and **Channel** stay Twitch's, and **Channel data → Kick stream** is your Kick stream: whether it's live, its title, category, viewers and when it went live. ## 4. The other kind of variable: one that configures a feature A counter moves as things happen. The other kind does not move on its own: it holds a value a feature reads, and you change it when you want that feature to behave differently. The song limits are five of those, and they are the worked example here — install the **Song requests** pack, or the **Song request** template on its own, and it declares all five for you: | Variable | What it decides | Starts at | | --- | --- | --- | | `song_max_queue` | How many songs may be waiting | 20 | | `song_per_viewer` | How many songs one viewer may hold | 2 | | `song_wait_seconds` | How long a viewer waits between requests | 60 | | `song_block_dupes` | Whether the same song can be requested twice | on | | `song_requests_on` | Whether requests are open at all | on | 1. Open **Variables** and find `song_max_queue`, labelled _Most songs in the queue_. 2. Change its value from `20` to `10` and save. 3. In chat, fill the queue with `!sr` ten times, then ask for one more. Expected result: the eleventh request is turned down in chat with the queue-is-full line, while the first ten went through. Set the variable back to `20` and the same request is accepted — no flow was edited at all, because the shipped steps read `$(var.song_max_queue)` rather than keeping a copy of the number. [The song requests guide](https://bloopbot.com/docs/song-requests) shows the **Can they request a song?** step that reads it, and a flow can write the variable too: the pack’s `!sron` and `!sroff` commands set `song_requests_on` from chat. > **Why a limit lives here** > > A limit is not a node and not a page of its own: it is one value per channel, which is exactly what a channel variable is. Keeping the number here is what stops the value and the step that enforces it from drifting apart — and the usage information on the variable’s row names every flow and step that reads it. ## 5. Show it in OBS Open **Overlays**, open an overlay (or make one with **New overlay**), and add a **Label** layer from **Add**. In its **Text**, write `Deaths: $(var.deaths)`, or put the caret where the number goes and pick `deaths` from **Insert…**. Press **Publish**, then follow [the overlay guide](https://bloopbot.com/docs/widgets-in-obs) to add the overlay’s URL to OBS. Updating the saved value gives chat and your overlay the same count. An alert title can show a channel variable too: a Follow alert that says `Follow number $(var.follows)` reads the current `follows` value when it plays. This also works when the alert text comes from your overlay’s theme. Publish a theme edit before checking the new title in OBS; changing the variable’s value then reaches an already open overlay. Under the text, the label names every variable it reads and what changes it: | The line says | What it means | | --- | --- | | `deaths` · Changed by 1 flow · **Open** | One flow that is switched on changes `deaths`. **Open** lists every flow that changes it, each a link to that flow; a paused one is listed and marked _paused_, but not counted. | | No flow changes `deaths` yet, so it stays at 0. | Nothing will move the number yet. Its **Flows** link is where you make a flow with **Set a variable**, as in step 2. | | `deaths` isn’t declared yet · **Declare** | The text reads a variable you have not declared, so nothing fills that spot in yet. **Declare** opens a small form with the name filled in. | You do not have to leave the editor to declare one. **Insert… → New variable…** opens the same small form — a **Name**, a **Type** (number, text or on/off) and when it **Starts over** (never, every stream or every day) — and **Create** declares it on your channel and puts its `$(var.…)` at the caret. It follows the same rules as **Variables**: channel scope, starting at 0, empty text or off, and a name that is 1–32 lowercase letters, digits or underscores. The variable exists as soon as you press **Create**, before you publish the overlay; if the name is taken, or your channel already has as many variables as its plan allows, the form says so and nothing is declared. The lines refresh when you come back to the editor, so a flow you turned on or paused in another tab shows the next time the editor has focus. > **Before deleting a variable** > > Check the usage information on Variables. Flows and widgets may still depend on its key. Reset its value if you only want to start counting again. ## 6. Show a layer only when a value is set You can make one layer appear when a channel variable has a value, while every other layer in the same overlay stays on screen. For a quest overlay, declare a **text** variable named `quest` on **Bot** › **Variables**. Leave its starting value empty. Create or open an overlay on **Overlays**, add a **Label** layer, and set its text to `$(var.quest)`. 1. Select that Label layer in Studio. Open **Visibility · Layer** below its settings. 2. Under **Show this layer when**, choose **Is set**, then choose `quest` under **Variable or channel data**. The status line shows the current value and whether this rule hides the layer. 3. If you want a transition, choose effects under **When it appears** and **When it disappears**. With **No animation**, it shows or hides immediately. 4. Press **Publish** and use the overlay URL in OBS. Set `quest` to `Find the key` on **Variables**, or use a flow's **Set a variable** action. Clear it again when the quest ends. ![The selected Quest value layer's Visibility settings: show when quest is set, its current value is unset, and slide in and fade out motion are selected.](https://bloopbot.com/docs/screenshots/widget-layer-visibility.jpg) _A quest Label's Visibility settings, set to appear while the quest variable has a value, with entrance and exit motion chosen._ Expected result: the quest Label is absent while `quest` is empty, appears when it has text, and plays its exit animation before leaving when you clear it. Other layers keep drawing throughout. A fresh OBS page waits for the current value before drawing that Label, so an empty quest does not flash on screen. Use **Equals** or **Does not equal** to compare against one typed text, number or on/off value instead. For example, a number layer can appear when `quest_stage` **Equals** `0`; zero and off count as set values, while empty text does not. **Is not set** is useful for a “No quest active” layer. Each layer has one rule. The visibility picker offers your channel variables and the built-in channel data shown by **Insert…**. To show a layer only while you are live, choose **Stream → Is live** and compare it with **On**. To show it for an Art stream, choose **Stream → Category** and compare it with `Art`. **Stream → Time online in minutes** is a number you can compare with a minute count. Title and category reflect your current Twitch channel settings, including while offline, and refresh about once a minute. The time online value advances while you are live and is unset when you go offline. A viewer variable is specific to one person and cannot control a shared overlay. ![The Visibility settings with Stream category selected as the channel data source.](https://bloopbot.com/docs/screenshots/widget-layer-channel-data.jpg) _The Visibility settings with Stream → Category selected as the channel data source._ The same channel data is available in a goal bar's **Number to track** picker when it is numeric. For example, choose **Stream → Time online in minutes**, set the target to `60`, and publish to show progress toward one hour online. A text field such as Category does not appear there. Label and alert text can use the corresponding **Insert…** tokens, such as `$(data.stream.category)`. If it stays hidden, check that a chosen variable is declared with **channel** scope, that the current value satisfies the rule, and that the layer's separate manual **Hidden** control is off. A manually hidden layer remains hidden even when its source matches, unless a flow’s **Show a layer** step has shown it ([Show or hide layers from a flow](https://bloopbot.com/docs/arrange-your-overlay#flow-show-hide)). Studio's preview follows the current value unless you enter a Sample value; its status line says when a sample is controlling the preview. Publish to update OBS after changing the rule, while value changes on an already published overlay appear live. ## 7. Remember each viewer: welcome first-time chatters A viewer variable keeps one value per person, which is all a first-time greeting needs: a yes/no that says “we have said hello to this viewer”. The **Welcome new chatters** flow in the **Starter** pack is built exactly that way, and it declares its variable for you: `welcomed`, a yes/no, viewer scope, starting at no, never reset. 1. Open **Flows**, press **Marketplace**, and add the **Starter** pack, or just **Welcome new chatters** on its own. 2. Open the flow. It reads left to right: **Any chat message** → **Set a variable** (`welcomed` set to yes for this viewer) → **Check a value** (the value before the write equals `false`) → **Chat message**. 3. Change the welcome line to sound like you — `$(user)` is the viewer’s name — save, and switch the flow on. 4. Ask a friend who has never chatted in your channel to say hello, then say something again. Expected result: the bot welcomes them once, after their first line, and stays quiet after their second. On **Variables**, the `welcomed` row counts one more viewer with a value. > **Why it sets first and checks second** > > The flow writes `welcomed` before it checks, and checks the value _before_ that write. If a new viewer sends two lines at once, only one of them can find the value still at no, so they are welcomed once. Checking first and setting afterwards could let both lines through and greet them twice. - **New means new since you switched it on.** Bloopbot has not remembered anyone yet when you install the flow, so each regular is welcomed once the first time they chat afterwards. - You and your moderators are chatters too: each of you is welcomed once, the first time you chat after switching the flow on. - To start over and welcome everyone again, select the reset icon (**Reset**) on the `welcomed` row on **Variables**. That forgets every viewer at once. - **Test fire** is a dry run: it shows which path the flow would take for you, but it never stores `welcomed`, so testing does not use up anyone’s welcome. ## 8. Pick something at random **Pick at random** rolls a random whole number in a range, picks one entry from a list you type — weighted if you want — or picks someone who is in chat right now. Like **Read a number**, it only reads and hands a result forward: nothing is said and nothing changes, so it always sits in front of the steps that use its result. **A magic 8-ball command** 1. Build a command flow for `!8ball` and add **Pick at random** from the node library. 2. Set **Pick** to **One from a list**, and in **Options** write one answer per line, such as `It is certain`, `Ask again later`, `Outlook not so good`, `Definitely`, `Very doubtful` and `Yes, without a doubt`. 3. Add a **Chat message** step after it, write `@$(user) 🎱 `, then open its **Insert…** menu and choose **the number written out, the picked option’s text, or who was picked**, under **From Pick at random**, to add the value at the end — don't type a `$(from...)` token by hand, since the step's own id in it is one the editor makes up. 4. Save, switch the flow on, and type `!8ball` in chat. Expected result: chat answers with one of the six lines, a different one on different calls. Test fire rolls for real too, so trying it twice in the editor can show two different answers — that is not a bug. Give some answers better odds by adding a weight after a `|`: `Yes, without a doubt | 3` comes up three times as often as a line with no weight (worth 1 by default). Weights are whole numbers from 1 to 1000, a list holds at most 100 lines, blank lines are ignored, and `|` is only ever read as the weight separator — leave it out of an answer's own words. **A d20 roll** 1. Add **Pick at random**, leave **Pick** on **A number**, and set **Lowest number** to `1` and **Highest number** to `20`. 2. Add a **Chat message** step, write `@$(user) rolled `, then use **Insert…** to add **the number rolled, or the picked option's position**, under **From Pick at random**, followed by ` (d20)`. Expected result: a whole number from 1 to 20, both ends included — rolling `1` and `20` come up exactly as often as everything between them. **Lowest number** and **Highest number** both take `$(...)`, so a `!roll ` command can read the top end from what the viewer typed instead of a fixed 20. Each must still be a plain whole number between -1,000,000,000 and 1,000,000,000 once expanded. **A random hug** 1. Build a command flow for `!hug`, add **Pick at random**, and set **Pick** to **Someone in chat**. 2. Add a **Chat message** step, write `$(user) hugs `, then use **Insert…** to add **the number written out, the picked option’s text, or who was picked**, under **From Pick at random**. Expected result: the reply names one of the people in your chat right now, never Bloopbot itself. Test fire doesn’t read your chat, so there it names “someone in chat” instead. **If the roll can't happen** The step takes its **error** output instead of inventing an answer when: **Options** is empty, **Lowest number** is above **Highest number**, either bound isn't a whole number (including one outside ±1,000,000,000), or nobody but Bloopbot is in chat to pick. Wire **error** to a **Chat message** if you want to say something back, such as “nobody set up that list yet”. --- # Share, import and restore flows Move a flow between channels and recover an earlier version. Updated 26 October 2026 ## Export a flow Open the flow and select the download icon (**Export**) in the top bar to download its JSON. Review messages, links and configured values before sharing it. Exported flows describe the graph; they do not make another channel’s variables, Twitch rewards or permissions appear automatically. Notes on nodes come along, so whoever installs the flow can read them. An export names each channel point reward by its title, never by your reward’s Twitch ID. If a reward’s title can’t be read when you export, the file says **A channel point reward** instead, and whoever imports it picks their own reward. A flow with a **Play media** step, a **Stream Deck button** key graphic, or a **Show alert** step that shows one of your alert designs, downloads as a bundle file instead, named like `cosy-follow.bloop.zip`. It holds the flow, the alert designs it shows and the images, sounds or videos they use, so the flow still works in the channel that imports it. A picture or a sound in it can be up to 5 MB and a WebM video up to 25 MB, and the whole file holds up to 95 MB; if the files add up to more, export fewer flows or widgets together. Share the whole `.bloop.zip`; the JSON inside it can’t bring the files on its own. A **Show alert** step whose design is a variable, such as `$(var.which)`, carries no design: the channel that imports it uses its own. ## Download a picture of a flow To show a flow in a blog post, a Discord message or a tutorial, save a picture of it. Open the flow and select the picture icon (**Download image**) in the top bar, then choose **PNG image** or **WebP image**. The picture shows every step and connection exactly as the canvas draws them, sized to fit the whole flow, whatever you have zoomed to or selected. It is named after the flow, such as `clip-it.png`. The picture shows the flow as it is on the canvas when you choose, including changes you have not saved yet. It does not hold the flow itself: to let someone install it, [export it](https://bloopbot.com/docs/sharing-flows#export) or share a link. WebP files are smaller; if your browser cannot make one, Bloopbot says so and you can choose PNG instead. ## Export several flows as one bundle A bundle file carries several flows together, with everything they need, so someone can set up the same thing in one import. 1. On the Flows page, tick the flows you want to share. Hold **Shift** while ticking to take every flow in between; see [Select several flows at once](https://bloopbot.com/docs/browse-flow-packs#select). 2. Choose **Export bundle** in the bar that appears at the bottom of the list. 3. Give the bundle a **Name**, and optionally say **What it does**. 4. Read **Comes along**: every group, alert design, file, variable and reward the flows need, and which flow needs each one. These always come with the flows, because the flows break without them. 5. Under **Add widgets**, tick any widget you want to share too. A widget brings the alert designs its layers show, and the images, videos and sounds it uses: backgrounds, frames round its panels, chat lines and alert cards, and the files its image, slideshow, boss and sound layers play. 6. Press **Download .bloop.zip**, and share that file as it is. A pack of only overlays exports them on their own: open the pack under **Packs → Mine** and choose **Bundle file (.bloop.zip)**. ![The Export bundle dialog for three flows named Cosy set: under Comes along, the variable sips and the reward Hydrate! because Hydrate uses them, the alert design follow because Cosy follow and the Cosy alerts widget use it, and the file chime.wav because Soft chime uses it; Cosy alerts is ticked under Add widgets, and the button reads Download .bloop.zip.](https://bloopbot.com/docs/screenshots/flows-export-bundle.jpg) _Export bundle lists what comes along with the flows, and why._ For example, exporting a **Cosy follow** flow that shows your _follow_ alert design, together with your **Cosy alerts** widget, gives one file that sets up the flow, the design and the widget on another channel. Those files come along in the `.bloop.zip`, listed under **Comes along** once you tick the widget, and land in the media library of whoever imports it, in a folder named after the bundle under **Imported**. Your widgets' links stay yours: whoever imports the bundle gets new links for them. Channel point rewards travel by name and cost only: whoever imports the bundle picks one of their own, or has Bloopbot create it, switched off. You can do the same from **Marketplace → Made by you**: press **Share…**, then **Export bundle…**, and pick the flows. ## Import someone else’s flow You can bring in a flow someone exported, or a pack or bundle holding several flows. It opens as a Marketplace item, with its review, and nothing is added until you press its button. 1. On the Flows page, open **+ New flow** and choose **Paste a link or drop a file**. The Marketplace opens with the box ready. (On the Marketplace itself, press **Paste a link** at the top.) 2. Paste a Bloopbot link, or drop the `.json` or `.bloop.zip` file onto the box. 3. Check the review. It says what adding does, and **What you get** lists its flows, overlays and alert designs. **What’s inside**, folded underneath, names each one, and the files it carries and how much they add to your file storage. A design, widget or file you already have is reused, never changed or copied twice. Files that are new to you land in your media library, in a folder named after the item under **Marketplace**, or after a dropped file's bundle under **Imported**. 4. If it uses a channel point reward, the review asks which of your rewards it is, or offers **Make it for me**, which creates the reward on your channel at the cost it gives, hidden from viewers until you turn it on in your Twitch reward settings. 5. Press **Add … — paused**, for example **Add 3 flows — paused**. Everything arrives paused. 6. Open each new flow, check each node and run a dry test before turning it on. For example, a “Hydration” pack whose **Sip** flow uses a reward called _Hydrate!_ can use your own _Drink water_ reward instead: pick **Drink water** in the review’s reward question, and the flow runs when _Drink water_ is redeemed. If the review says there isn’t room for its alert designs or widgets, remove some you no longer use under **Overlays**, then try again. If it says a bundle uses files that only travel in its `.bloop.zip` file, ask for the `.bloop.zip` rather than the text inside it. More on the box is in [Paste a link or drop a file](https://bloopbot.com/docs/the-marketplace#paste). > **Web requests need another look** > > A shared flow arrives with its **Web request** steps, paused. Before you turn it on, look at where each one sends and what it sends; it can only call out once your channel allows web requests and your plan includes them — [Start a flow from a URL, or call one](https://bloopbot.com/docs/webhooks#web-request) covers the step. A flow started by a URL gets a new URL of its own. ## Share an install link Use the share icon (**Share**) in a flow’s editor top bar to publish a reusable template through the sharing controls. Review its contents and visibility first. Whoever opens the link sees it as a Marketplace item with its review, adds a paused copy to their channel, and can adapt it independently. Share links and link-based packs cannot carry media files. For a flow with a **Stream Deck button** key graphic or a **Play media** step, use **Export** or **Export bundle** and share the `.bloop.zip` file instead. To share several flows by one link, or to start from the Marketplace, open **Made by you**, press **Share…**, then **Share a link…**. Pick one flow to share it on its own, or two or more to share them as a pack. If you have already [grouped the flows into your own pack](https://bloopbot.com/docs/create-packs#make), open it under **Flows → Packs → Mine** and choose **Share a link**. The pack's flows are selected for you. ## Share with every streamer A file or a link reaches the people you give it to. To offer your flows or a theme to every streamer, list it in the marketplace: in **Marketplace → Made by you**, press **Share…**, then **Submit for review…**. It is reviewed, then anyone can add it, paused. See [List your flows and themes in the marketplace](https://bloopbot.com/docs/publish-to-the-marketplace), and [Add from the Community group](https://bloopbot.com/docs/browse-flow-packs#community) for the other side. ## Recover an earlier version Open **History** (the clock icon in the top bar) in the flow editor, inspect a previous version and use the restore control when you want to bring it back. Verify the restored graph and its live state. Deleted flows can be restored from **Flows → Trash** during the 30-day retention period. --- # Use templates and flow packs Start with a ready-made flow or install a set of related automations. Updated 5 October 2026 ## Choose a template or a pack A template gives you one editable flow. A pack groups related flows, such as Starter, Alerts, Loyalty, Song requests, Stream events or On-screen numbers. Open **Flows** and press **Marketplace** to browse both: **Add to Flows** lists the packs first, then every flow on its own. > **Pebble can switch Starter on for you** > > Pebble’s **Switch on your starter flows** tutorial turns the Starter pack on in one go, and **Edit a starter flow** shows you how to change one message. Start either from [Tutorials](https://bloopbot.com/docs/tutorials). **Starter** is added automatically once for channels using the earlier setup, with new flows paused. A new [guided-setup channel](https://bloopbot.com/docs/getting-started#guided-setup) starts without it; choose the individual flows or pack you want in **Marketplace**. Open **Flows → Packs → Starter** and turn on the flows you want. You can remove any of them; they stay removed until you choose to add them again. The Starter pack includes **Clip it**. [Create a clip with your own title](https://bloopbot.com/docs/clips) shows how to name the clip from the flow or from the `!clip` command. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows: every pack, then every flow on its own, each added through its review._ [Add packs and flows, and manage what you added](https://bloopbot.com/docs/browse-flow-packs) walks through the search, the review and the installed list. ## React to what happens on Twitch The **Stream events** pack turns a Twitch event straight into a chat line, gated by a cooldown where the event fires too often to say every one. [React to polls, predictions and hype trains](https://bloopbot.com/docs/polls-and-predictions) walks through those flows. It covers: - **Twitch goals** — a follower or sub goal run from your Twitch dashboard: it starts, makes progress, is reached, or ends without reaching the target. These flows use the **Creator goal** trigger. - **Predictions** — one opens, then resolves with the winning outcome and totals, or is cancelled with everyone’s points refunded. - **Polls** — the result lands in chat when a poll finishes, whether it ran its full course or you ended it early, with a nudge partway through while it is still running. A poll you archive from Twitch stays quiet. - **Hype trains** — a cheer as one starts, and a line as it levels up. - **An ad break** — how long it lasts, the moment it starts. - **Shield mode turning on, a new VIP, a new moderator, bans and timeouts, and stream title or category changes** — each as a plain, neutral line, not a callout. For the other half — shield mode turning off, or someone losing VIP or moderator — open that flow and change its trigger’s **When it** or **When someone is** field, and reword the line to match. The shield mode, VIP, moderator, ban and stream info flows each start on a trigger you can also use in a flow of your own, under the same name in the node library: **Ad break starts**, **Shield mode on or off**, **VIP added or removed**, **Mod added or removed**, **Ban, timeout or unban** and **Stream info changes** (a new title, category or language). The **Follow-bot protection** pack holds one flow, **Follow-bot lockdown**: when a burst of follows comes mostly from brand-new accounts, it turns Shield mode on, posts an announcement and turns Shield mode off again 10 minutes later. [Stop a follow-bot raid](https://bloopbot.com/docs/moderation#follow-bots) walks through it and how to tune it. ## Install and review 1. Open **Flows**, press **Marketplace**, and choose the pack or flow that matches your goal. 2. Read its review: what it adds, anything it needs, and the flows a pack holds. Answer any question it asks, then press **Add … — paused**. 3. Open the flows you added, read their commands and messages, and customise them. 4. Check each flow’s live or paused state before using it. Use **Test fire** to inspect a dry run. ## Your copy belongs to your channel An installed flow is a copy that you can change. Editing it does not edit the original template or someone else’s channel. When a pack has a newer version, **Marketplace → Installed** offers it: a member you have not changed updates in place with the same name and on/off state, and a member you changed asks “Keep your version?”. **Keep mine** leaves it as it is; **Use the new one** replaces it in one step and keeps your version in its History ([Update what you added](https://bloopbot.com/docs/the-marketplace#update)). Some members use a group, such as **Screen reward text**. When an update brings a newer version of that group, the updated flow moves to the new copy, and the old copy is deleted from **Groups** once nothing uses it — the new copy then takes the plain name back. An old copy you edited, or one another flow still uses (including a flow in the Trash), is kept, and the new copy appears next to it with a number, such as _Screen reward text (2)_. > **Avoid duplicate responses** > > Adding a pack again does not make a second copy of a member your channel already has. Two different flows can still answer the same command, though — Bloopbot tells you when that happens: you see a warning when you save or turn on a flow, in the review before you add one, and both flows are marked in the list. When you see it, change the command on one flow, or keep one of them paused. Channels with Spotify linked may already have the song-request flows. ## Manage a pack together **Packs** is the first Flows tab. It shows the packs you made ([group flows you already have into a pack](https://bloopbot.com/docs/create-packs#make)) and the packs you added from the Marketplace as cards in one grid; the **All**, **Mine** and **Marketplace** toggle picks which. A bar on each card shows which of its flows are live, paused, need attention or are not in your channel yet ([Read a pack at a glance](https://bloopbot.com/docs/browse-flow-packs#glance)). Click a card, or press **Manage**, to open the pack, inspect its flows and add any you left out. Flows that belong to no pack are together under **Not in a pack**. Each flow has its own live switch. **All flows** is the second tab and shows every flow once, with search, selection and Trash. Read the confirmation before removing a pack; Trash can restore its flows. --- # Add packs and flows, and manage what you added Add a pack or one flow from the Marketplace panel on Flows, then manage the paused copies in your channel. Updated 5 October 2026 ## What a pack is A pack offers several ready-made flows for one part of your channel. **Starter** covers everyday reactions and commands; **Alerts** covers stream events. Every flow in a pack is also offered on its own, so you can add the whole pack or just the one flow you want. Every flow you add is a separate flow with its own live switch and graph. > **Pebble can switch Starter on for you** > > Pebble’s **Switch on your starter flows** tutorial turns the Starter pack on in one go, and **Edit a starter flow** shows you how to change one message. Start either from [Tutorials](https://bloopbot.com/docs/tutorials). **Starter** is added to channels using the earlier setup automatically once. A new [guided-setup channel](https://bloopbot.com/docs/getting-started#guided-setup) chooses its own tools, so Starter is added only if you choose it. New flows arrive paused: open **Flows → Packs → Starter**, review each flow, and turn on the ones you want. Existing Starter flows keep their edits and live state. You can remove flows or the whole pack; Bloopbot will not add them back automatically. To restore one later, add it from the Marketplace. ![The Flows page with Add to Flows docked on its right, the list and its + New flow and + Add buttons beside it: Search flows and packs, the All, Packs and Flows filters, then Packs, with Starter, Pack · 12 flows marked Installed and Alerts, Pack · 8 flows with Add, and more packs below.](https://bloopbot.com/docs/screenshots/flows-add-door.jpg) _Add to Flows, docked beside your list: packs first, each with Add or Installed._ ## Before you start Choose your channel in the dashboard, then open **Flows**. **Packs** opens first, with **All flows** beside it. Press **Marketplace** at the top right, beside **New flow**: **Add to Flows** opens on the right of your list. It lists **Packs**, then single **Flows**, with anything that has a newer version under **Update ready** first. It ends with **From another bot**, which opens the importer for your Nightbot or StreamElements commands, and **See everything in Marketplace**, which opens the [Marketplace](https://bloopbot.com/docs/the-marketplace) with the same packs beside themes and overlays. **+ New flow** is for a flow of your own: **Start blank** or **Paste a link or drop a file**, which opens the Marketplace to bring in a saved flow file. Adding untouched built-in flows does not use your flow allowance. Flows from a pack shared by a channel do count when added. Check [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) for your channel’s count. ![The New flow menu on the Flows page: Start blank, to build from a trigger, and Paste a link or drop a file, which opens the Marketplace.](https://bloopbot.com/docs/screenshots/flow-new-menu.jpg) _The New flow menu: a flow of your own, started blank or imported from a file._ ## Read a row Each row shows the item’s picture, its name and what it is: **Pack · 12 flows**, or **Flow · 1 flow**. A Community pack also names its creator. On the right, **Add** opens its review, **Installed** means it is already in your channel, and **Update** means a newer version is ready. Pressing a row’s name opens the same review. Nothing is added until you press the review’s own button. ## Find what you need Use **Search flows and packs** to look across built-in packs, single flows and Community packs by name, summary or creator. **All**, **Packs** and **Flows** narrow the list. If nothing matches, clear the search, or start your own from **+ New flow**. ## Add a pack or a flow 1. Open **Flows** and press **Marketplace**. 2. Press **Add** on a pack, such as **Starter**, or on a single flow, such as **Timed promo**. Its review opens in the panel. 3. Read it: one sentence says what happens — for one flow, “Adds 1 flow to your channel. It starts paused — nothing runs until you switch it on.” — then **What you get**, with details such as **What’s inside** folded below. Answer any question it asks, such as which channel point reward a flow listens for. 4. Press **Add 1 flow — paused** (for a pack, **Add 12 flows — paused**). The review turns into **Added — paused** with a short **Set it up** list. 5. Close the panel. A pack is a card on **Packs** with a **Marketplace** chip, and a single flow sits in the pack it comes from; a flow that belongs to no pack is under **Not in a pack**. Open each flow to read its message and command before switching it on. ![Add to Flows showing one flow’s review, Timed promo, with its cover, a clock with a chat bubble, and Built in · Bloopbot: Adds 1 flow to your channel. It starts paused — nothing runs until you switch it on. Then the Add 1 flow — paused button, It stays off until you switch it on, What you get: 1 flow, paused until you switch it on, and What’s inside folded.](https://bloopbot.com/docs/screenshots/flows-add-review.jpg) _One flow’s review in Add to Flows: what happens, then Add 1 flow — paused._ Adding the same flow again does not make a second copy: its review says it is already in your channel. A pack you already have adds only the flows you left out, and its overlay if you do not have it ([Packs that bring an overlay](https://bloopbot.com/docs/browse-flow-packs#overlay)). To add only some of a pack’s flows, add each one on its own from **Flows** in the panel. When a pack or flow has a newer version, it moves to **Update ready**: a flow you have not changed updates in place, keeping its name and whether it is on. A flow you changed stays as it is until you choose: the review asks **Keep mine** or **Use the new one**. A group the old version used is tidied away once nothing uses it, unless you edited it. If two different flows claim the same command, the review warns you so you can keep one paused or change a command. ## Packs that bring an overlay Some packs show something on stream, so they come with a small overlay of their own, holding only the layers their flows use, in your Active theme: | Pack | Its overlay | What it shows | | --- | --- | --- | | **Giveaway** | **Giveaway alerts** | An alert when a giveaway opens, when a winner is drawn and when the prize is claimed | | **Media share** | **Media share** | The YouTube videos your viewers share, once you, an editor or a mod approve them | | **Minigames** | **Minigames** | Every game as a card in the corner | | **On-screen numbers** | **On-screen numbers** | Your sub goal, the `!win` tally and the Support Jar | | **Stream Boss** | **Stream Boss** | The boss, its portrait and its HP | 1. Open **Flows**, press **Marketplace**, then **Add** on one of these packs. Its review counts the overlay under **What you get**, and **What’s inside** names it under **Look**. 2. Press the review’s button. The flows arrive paused, and the overlay is ready at once. 3. In **Set it up**, **Add the OBS source** comes first: press **Copy URL** and paste it into a Browser source in OBS ([Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs)). 4. Switch on the flows you want. For example, add **Minigames**, paste the **Minigames** overlay’s URL into OBS, switch on **Slots (!slots)** and type `!slots 10` in chat: the slot card plays in the bottom-right corner. The overlay shows nothing until one of the pack’s flows plays something, so it can sit on top of any scene. ![Add to Flows showing the Minigames pack’s review: Adds 12 flows and 1 overlay to your channel, What you get with 12 flows and 1 overlay, and What’s inside open with Look: 1 overlay, Overlays: Minigames.](https://bloopbot.com/docs/screenshots/pack-review-overlay.jpg) _The Minigames pack’s review: 12 flows and 1 overlay, with the overlay named under Look._ - **No second copy.** Adding the pack again never makes a second overlay. If you delete it, the pack’s review offers it again. - **Already placed the layer yourself?** If an overlay you already use in OBS has a Minigames or Stream Boss layer, you do not need the new one in OBS. Leave it out, or delete it from **Overlays**. - **Giveaway’s alert designs** (`giveaway-open`, `giveaway-winner` and `giveaway-claimed`) arrive in your draft. Publish in Studio so they show. A design of yours with the same name is kept. - **Updates.** When a new version of a pack changes its overlay, an overlay you have not changed takes the new layout in your draft: nothing on stream changes until you publish. If you changed it, the review asks **Keep mine** or **Use the new one**. - **Your overlay allowance.** If your plan’s overlays are all in use, the pack adds its flows and says the overlay did not fit. Remove an overlay you do not use, then add the pack again. - **One flow, or a feature page’s row,** adds flows only. Add the whole pack from **Flows → Add** to get its overlay. ## Add from the Community group Community packs are bundles other streamers made and listed in the marketplace. Each one was reviewed before it was listed. They sit in **Add to Flows** beside Bloopbot’s own, each row naming its creator, and in the [Marketplace](https://bloopbot.com/docs/the-marketplace), where their cards also show how many channels use them and their rating. 1. Open **Flows**, press **Marketplace**, and search for the bundle or its creator. 2. Press **Add** on its row. The review lists what it brings — flows, overlays, alert designs, rewards, variables and files, with their sizes — says which you already have, and what it adds to your file storage. 3. Answer its reward questions: one of your channel point rewards, or **Make it for me**, which makes it on Twitch switched off, so nothing appears to viewers until you turn it on. 4. Press **Add N flows — paused**. The flows arrive paused in a pack named after the bundle. Adding it again adds only what you do not have yet. If its files do not fit in your file storage, nothing is added: free some space on the **Media** page and try again. When its creator publishes a new version and it passes review, the bundle moves to **Update ready**, and its card on **Packs** offers **Review N updates**. The review shows what changed, in the creator’s words. A flow you have not changed updates in place, keeping its name and whether it is on; a flow you changed is asked about, with **Keep mine** chosen. Nothing updates until you press **Update**. You can update it under **Marketplace → Installed** too ([Update what you added](https://bloopbot.com/docs/the-marketplace#update)). **Reviews.** Once you have had a Community bundle for 3 days, with at least one of its flows switched on, you can review it: 1. On **Packs**, choose **Marketplace** in the toggle, press **Manage** on the bundle’s card, then **Reviews** in the side panel. 2. Under **Your review**, pick a number of stars from 1 to 5 and, if you like, write what you think. 3. Press **Post review**. The same dialog shows the bundle’s rating, once 3 streamers have reviewed it, and the latest reviews. Your words are checked before they show, so a review can take a little while to appear. Come back to change it with **Update review** or remove it with the bin icon (**Delete your review**), and select the flag icon (**Report**) under someone else’s review if it breaks the rules. ![Reviews of Cosy Alerts: not rated yet, since a rating shows once 3 streamers have reviewed it; under Your review, 4 stars picked and the words The chime is lovely and quiet, with a Post review button.](https://bloopbot.com/docs/screenshots/flows-listing-review.jpg) _Reviewing a Community bundle you have used: stars, and a few words if you like._ You can also browse every listed bundle without signing in, on the public [marketplace](https://bloopbot.com/marketplace) — handy for a link someone shared with you. Something wrong with a bundle — it breaks Twitch’s rules, uses someone else’s work, or does not do what it says? Press **Report** in its pack’s side panel, or **Report this bundle** on its public page. The people who review the marketplace read every report. To list your own flows, see [List your flows in the marketplace](https://bloopbot.com/docs/publish-to-the-marketplace). ## Read a pack at a glance **Packs** is one grid of cards: the packs you made and the packs you added from the Marketplace, side by side. The toggle above it switches between **All**, **Mine** and **Marketplace**, each with a count. **Marketplace** lists only packs you have already added; to find and add more, press **Add** or open the [Marketplace](https://bloopbot.com/docs/the-marketplace). A chip on each card says where the pack came from: **Marketplace · Built in** for one of Bloopbot’s own packs, **Marketplace** followed by the creator’s name for a Community pack, and **Mine · Only you** for a pack you made ([Group flows and overlays into a pack](https://bloopbot.com/docs/create-packs)). ![The Packs page: a toggle for All, Mine and Marketplace with filter chips, cards for Starter (Marketplace · Built in) and Solo Adventure (Mine · Only you) each with a bar of live, paused and not added segments, then a Not in a pack section listing Discord live ping, Hydrate reminder and Raffle draw, each with an Add to pack button.](https://bloopbot.com/docs/screenshots/packs-landing.jpg) _The Packs page: one grid of pack cards with a bar on each, and the Not in a pack section under it._ Each card has a cover, the pack’s name and how many flows it holds, and a bar with one segment for every flow: | Segment | What it means | | --- | --- | | Solid blue | **Live**: the flow is in your channel and switched on. | | A raised outline | **Paused**: the flow is in your channel and switched off. | | Yellow, with a warning mark | **Needs attention**: the flow is in your channel but cannot run yet. Open it to see why. | | A dashed outline | **Not added**: the pack holds this flow, but it is not in your channel. | A solid shape means the flow is in your channel and a dashed one means it is not; blue means it is running. Every state also has its word in the line under the bar, such as _2 live_, _2 paused_, _1 needs attention_, _7 not added_ or _2 updates ready_. A pack you made counts only the flows in it, so it never shows **not added**. The card offers one action, the first of these that applies: **Fix N flows**, which opens the pack with only the flows that need attention; **Review N updates**; **Turn all on**; **Add N more**; or a plain **All live**. Click the card’s title or press **Manage** to open the pack’s page. Beside the toggle, the chips **Needs attention**, **Not fully added** (packs from the Marketplace only) and **Nothing live** narrow the grid. Click a chip again to clear it. **New pack** starts an empty pack of your own. When any flow cannot run yet, a banner at the top of the page says how many. **Not in a pack** sits under the grid on **All** and **Mine**, and is hidden on **Marketplace**. It holds every flow that belongs to no pack, whether you built it or added it on its own. It has its own bar and counts, shows the first four flows with a live switch and an **Add to pack** button each, and offers **Show all N** and **Show fewer**. **Make a pack from these** groups them into a pack of your own. ## Open a pack’s page A pack’s page has the same layout for a pack you added and a pack you made. The top shows the cover, the name, the provenance chip and a large bar with its counts. The chips **All**, **Live**, **Paused**, **Needs attention** and **Not added** filter the list; on a pack you made the last one reads **Not in this pack**. Under the chips are the flows you have in the pack, as the ordinary Flows rows with a switch, a tick box and a menu. Below them a dashed line reads _Still in the pack_ and how many are not in your channel (on a pack you made, _Your other flows_ and how many are not in the pack), followed by dashed rows for the flows you do not have. On a pack from the Marketplace, **Add** on a dashed row opens the pack’s review so you can add that flow. On a pack you made, **Add to pack** adds the flow at once; it shows five rows with _and N more_, and a search box to find the rest. The side panel for a pack from the Marketplace has: - **About this pack**: the source, how many flows are in your channel (_4 of 11_), whether you edited any, and the version. - An update card, _N updates ready_, with **Review N updates**. - **Add N more**, and **Turn all on** (or **Pause all** when nothing is paused). - **Reviews** and **Report**, for Community packs only. - **Remove pack**: its flows go to Trash, where you can restore them. ## Manage what you added Each flow stays editable on its own. **Turn all on** and **Add N more** work on a whole pack from its card or its page. If only some flows can be turned on, the result names the ones that failed so you can open and fix them. A flow you edited stays in its pack, and it is the same flow wherever it shows: **Not in a pack** holds only flows that belong to no pack. **All flows** shows each flow once, with search and Trash, and a small chip on each row names its pack (_+2_ when it is in several); open the chip to open that pack. ![The Starter pack's page: a bar reading 2 paused and 10 not added, filter chips, the Welcome new followers and Welcome new chatters rows with their switches, then dashed rows for the flows not added yet, each with an Add button.](https://bloopbot.com/docs/screenshots/flow-pack-installed.jpg) _The Starter pack’s page: the flows you have, each with its own live switch, then dashed rows for the ones you have not added._ A pack's card also counts any overlays it brought, and removing a pack leaves its overlays on **Overlays**. Removing a pack moves its installed members to Trash, including any you edited. The confirmation marks edited members. Undo restores those same flows and their history. The pack group disappears if its last member is in Trash, and returns when a member is restored. If the original shared pack is no longer available, installed members remain usable, though adding or updating from it is unavailable. ## Select several flows at once **All flows** and a pack’s page let you act on several flows together, and **Packs** lets you act on several whole packs. 1. Press **Select** beside the filters. A box appears at the start of each flow's row, and **Select** becomes **Done**. 2. Tick the box on a flow's row. 3. Hold **Shift** and tick another row. Every flow between the two takes the same state, so a Shift-click on a ticked row unticks the whole range. 4. To tick every flow in the list, use the box beside the section heading. Use it again to untick them all. 5. In the bar that appears at the bottom of the list, choose what to do with the selection. 6. Press **Done** to hide the boxes again. It clears anything still ticked. On **Packs**, press **Select** in the toolbar, then click the cards you want: a picked card is outlined and marked with a tick, and clicking it again unpicks it. Cards have no boxes, and while you are selecting a click picks the card instead of opening it. **Select all** picks every card shown. The bar counts the packs and their flows, such as _2 packs · 9 flows_, and its buttons act on every flow in them. | Button | What it does | | --- | --- | | **Turn on** | Makes the paused ones live. If some cannot go live, the message names them; open each one to fix it. | | **Pause** | Stops the live ones. | | The bin icon (**Delete selected flows**) | Moves them to Trash. Several flows at once ask first; you can restore them from Trash for 30 days. | | **Add to pack**, **Export bundle**, **Share as pack** | Group the selected flows into [your own pack](https://bloopbot.com/docs/create-packs#make), or share them as described in [Share flows](https://bloopbot.com/docs/sharing-flows#export-bundle). | | The cross icon (**Clear selection**) | Unticks everything. | When the selection mixes live and paused flows, the buttons show how many each one affects, such as **Turn on 2** and **Pause 3**. ## Example: start with two greetings Suppose you want a follow greeting and a welcome for first-time chatters, but no commands yet. If Starter is already in your channel, open it and turn on just those two flows. The steps below show how to add them after you have removed Starter. 1. Open **Flows**, press **Marketplace** and search **welcome**. 2. Press **Add** on **Welcome new followers**, read its review and press **Add 1 flow — paused**. Press **Back to the list**. 3. Do the same for **Welcome new chatters**, then close the panel. 4. On **Packs**, the **Starter** card’s bar shows two paused segments and ten dashed ones, and its counts read _2 paused · 10 not added_. 5. Open each flow, make the message sound like your channel, save, and switch on only the one you are ready to use. The edited member stays in the Starter pack. The other member remains free under the allowance until you change its behaviour. ## What you should see - **Packs** first, with **All flows** beside it; the Starter card shows a partial bar with independent live or paused segments and the rest dashed. - An edited member still in its pack, with one row in **All flows** that names its pack. - New copies paused until you switch them on. A Test fire dry run does not post to Twitch. ## If something looks wrong - A flow you expected is missing: press **Marketplace** on **Flows** and add it on its own, or open its pack’s page and press **Add** on its dashed row. - A command replies twice: two different live flows may claim it. Pause one or change its command. - A shared pack source is gone: installed copies stay in your channel, but adding or updating from that source is unavailable. - A Community bundle says it is no longer in the marketplace: its creator unlisted it, or it was taken down. The flows you added stay yours. If it was taken down after a copyright claim, a notice at the top of the Flows page names each file that was removed and what used it: those widgets and alerts now show without it. - Own the copyright in something a bundle uses? Send a [copyright claim](https://bloopbot.com/marketplace/copyright). - A bundle's overlays did not change after an update: an overlay update waits in your draft. Publish in Studio to make it live. - The allowance number is lower than the number of rows you added: untouched built-in copies are free. Changing what one does makes it one of your flows. --- # Group flows and overlays into a pack Keep related flows and overlays together, arrange Stream Deck keys, and share a copy when you are ready. Updated 9 October 2026 ## Make a pack A pack is a group of flows you choose from your channel. You can use it privately before sharing anything. Have the flows you want ready on **Flows**; they can be paused while you set up the pack. 1. Open **Flows → All flows**, press **Select**, and tick the flows you want together. This tab includes both live and paused flows. 2. Choose **Add to pack**, enter a name under **New pack name**, then choose **New pack from these**. You can also open **Packs**, choose **Mine** in the toggle and press **New pack** to start empty. 3. Open **Packs → Mine** to find the new pack, shown with a **Mine · Only you** chip. A flow can belong to several packs, so adding it here does not remove it from another. For example, group _Set goal_, _Death +1_ and _Clip moment_ into a _Solo Adventure_ pack. All three flows still appear in **All flows**. ![The Solo Adventure pack card on the Packs page, under Mine, showing its three Stream Deck keys, a bar of its flows and their counts.](https://bloopbot.com/docs/screenshots/owned-packs-list.jpg) _The Solo Adventure pack on the Packs page, under Mine, shows its three Stream Deck keys._ ## Arrange and manage it Click the pack’s card, or press **Manage**, to open its page. In the side panel, **Details** changes the name and description. Under **On your Stream Deck**, each flow has a **Key N** label and icon buttons: **Move up**, **Move down** and **Remove from this pack**. The flow order sets the order of Stream Deck keys. The preview uses each trigger's own key graphic from your media library; a key without one shows the Bloopbot mark. A flow without a **Stream Deck button** trigger can still belong to the pack; it has no key in the preview. The flows in your channel that are not in this pack show as dashed rows under _Your other flows_. Press **Add to pack** on one to add it at once; the list shows five with _and N more_ and a search box to find the rest. The filter chip **Not in this pack** shows only those. **What travels with this pack** lists the things the pack’s flows need, and **Delete pack** removes the pack and leaves every flow in **All flows**. If you connect an AI assistant to your channel and allow it to edit flows, you can ask it to make a pack from flows you already have or arrange the members. Review the ordered list it proposes before it saves: changing the pack replaces its whole member list. The assistant can also rename or delete a pack. Deleting the pack leaves every flow in your channel. Use the switch or the pause and play icons beside a flow to change that flow's live state. A paused flow stays in the pack. If you move a flow to the Trash, the pack remembers its place until you restore it. Deleting the pack leaves its flows in **All flows**. ![Solo Adventure pack with one live flow, two paused flows, and separate controls for selection, opening, menus and key order.](https://bloopbot.com/docs/screenshots/owned-pack-detail.jpg) _The pack shows the keys and flows in their saved order._ ## Switch a pack from a flow Use **Turn a pack on or off** when a command, a Run button or another event should pause or resume a set of flows together. Have the pack ready on **Flows → Packs** first; it can be a pack you made or one you added from the Marketplace. 1. Create or open the flow that controls the mode. Keep it outside the pack if you want to use it to turn the pack back on later. 2. Add **Turn a pack on or off** from **Actions → Flows** in the node library, and connect it after the trigger or any checks. 3. In **Which pack**, choose the pack. Leave **Turn it on** off to pause its flows, or switch it on to resume them. 4. Press **Test fire**. The Run log describes the switch, but no flow changes. Save, then switch on the controlling flow when you are ready. 5. Use the real trigger to perform the switch. For a **Run button** trigger, press **Run**; this changes the target flows for real. For example, a _Pause party mode_ Run button can pause a _Party mode_ pack containing six chat commands in one step. A separate _Resume party mode_ flow uses the same pack with **Turn it on** on. The target flows do not run just because you resume them: they wait for their next matching event. ![The Turn a pack on or off step with Party mode selected and Turn it on off.](https://bloopbot.com/docs/screenshots/flow-pack-switch.jpg) _The Turn a pack on or off step pauses the Party mode pack with one switch._ The step uses the pack's members when it runs, so a flow you add later joins the next switch. It leaves out Trash and does not change overlays. Resuming turns on every current member, including a member you had paused by hand. A pack shared with another pack still contains the same flows: switching one changes their state everywhere they appear. A switch step can affect up to **25 flows**, and one run can execute up to **five switch steps** across pack and selection switches. An empty pack makes no changes. A removed pack or an installed pack with more than 25 present flows makes the step fail before switching anything; choose another pack or split its members into smaller packs. ## Switch selected flows together Use **Turn flows on or off** when the set belongs only to this step and does not need a pack. 1. Add **Turn flows on or off** from **Actions → Flows** and connect it after your trigger or checks. 2. Under **Which flows**, search and tick the flows you want — from **1 to 25**. Search changes what is shown and keeps earlier selections. 3. Leave **Turn them on** off to pause the selection, or switch it on to resume it. 4. **Test fire**, check the Run log, and save. Test fire simulates the switch; a real trigger changes the selected flows. ![The Turn flows on or off step with six Party command flows selected in a searchable checkbox list.](https://bloopbot.com/docs/screenshots/flow-multi-switch.jpg) _Search and select several flows in one Turn flows on or off step._ Existing **Turn a flow on or off** steps keep their original flow selected. The renamed step lets you add more targets. If a selected flow is missing or in Trash, the step fails before changing any of them; untick the missing target or restore it first. A paused member is still a valid target. A flow can pause itself and still finish its current run. It then needs another live flow or a manual switch to resume it. The target's row shows which flow paused it; resuming clears that reason. ## Add overlays to a pack A pack you made can hold up to 10 overlays beside its flows, so a stream's look stays with the flows that drive it. 1. Open **Overlays**. On an overlay's card, select the **Add to pack…** icon. 2. Choose one of your packs, or type a name under **New pack name** and choose **New pack from this overlay**. 3. The card now shows a chip with the pack's name. Open **Overlays → Packs**, then select the pack to inspect its overlays beside the library. Search by name, or filter by Mine and Marketplace, to find a pack. On a phone, use Back to library to return. On the pack's page on **Overlays**, your other overlays show as dashed rows under _Your other overlays_; **Add to pack** adds one at once, and the minus icon (**Remove from this pack**) takes one out. Removing an overlay from a pack, or deleting the pack, never deletes the overlay; deleting an overlay takes it out of every pack. Rename the pack, arrange its Stream Deck keys or delete it from its page on **Flows**. For example, add _Starting soon_ and _Gameplay_ to the _Solo Adventure_ pack. Its card on **Flows → Packs** then reads **2 flows · 2 overlays**, and **Overlays → Packs** shows the same pack with its two overlays. ![The Solo Adventure inspector beside the pack library: Gameplay and Starting soon with live thumbnails, Copy OBS URL, Open in Studio and Remove actions, other overlays available to add, and a link to its two flows.](https://bloopbot.com/docs/screenshots/overlay-pack-detail.jpg) _The Solo Adventure pack on Overlays: its two overlays with Copy URL, Open in Studio and Remove from this pack, your other overlays to add, and a link to its two flows._ A layer that shows one of your [widgets](https://bloopbot.com/docs/your-widgets) brings the widget along with its overlay: HTML, CSS, JavaScript, exposed controls, declared channel variables, its icon and bound media. Include any supporting flows. Missing scalar variables are declared for the recipient, while existing compatible values stay intact. Source and control edits count as local changes during pack updates. See [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics#share). ## Add control panels to a pack A pack you made can hold up to 5 [control panels](https://bloopbot.com/docs/control-panels) beside its flows and overlays, so the buttons you press during a stream travel with the flows they start. 1. Open **Flows → Packs** and open the pack. 2. Under **Control panels**, your other panels show as dashed rows. Press **Add to pack** on the one you want. 3. Use the arrow icons (**Move up**, **Move down**) to put them in order, and the minus icon (**Remove from this pack**) to take one out. Select a panel's name to open it. For example, a _Match day_ pack holds a _Score a goal_ flow. Add your _Match control_ panel, whose **Goal** button starts that flow and whose **Goals** tile shows the goal count: the pack's page lists **Match control** under **Control panels** with **2 tiles** beside it, and your other panel, _Stream tools_, stays a dashed row you can add. ![A pack's Control panels section: Match control with 2 tiles is in the pack, with move and remove icons, and Stream tools with 1 tile shows as a dashed row with Add to pack.](https://bloopbot.com/docs/screenshots/pack-control-panels.jpg) _A pack's page with its control panel listed under Control panels, and another panel to add._ Removing a panel from a pack, or deleting the pack, never deletes the panel; deleting a panel takes it out of every pack. When you share the pack, its panels go with it, and a panel's buttons may only start flows in the pack: see [Share or publish](https://bloopbot.com/docs/create-packs#share). ## Read your packs at a glance On **Packs**, each pack you made is a card with a bar of one segment per flow: solid blue for live, a raised outline for paused, yellow with a warning mark for needs attention. A pack you made counts only the flows in it, so it never shows dashed **not added** segments. The card’s one action is the first that applies: **Fix N flows**, **Turn all on**, or a plain **All live**. Flows that are in no pack of any kind are under **Not in a pack** below the grid, where **Make a pack from these** starts a pack from them. [Add packs and flows, and manage what you added](https://bloopbot.com/docs/browse-flow-packs#glance) explains every state. A pack can also hold overlays. When it does, its card counts them beside its flows, for example **2 flows · 1 overlay**, and its page says **Also in this pack** with a link to them on **Overlays**. [Add overlays to a pack](https://bloopbot.com/docs/create-packs#overlays) shows how. ## Share or publish From the pack, choose **Marketplace**, **Share a link**, or **Bundle file (.bloop.zip)**. Each starts with this pack's flows in their saved order; review what travels before you finish. **Marketplace** and **Bundle file (.bloop.zip)** also bring the pack's overlays, with the files they use, and its control panels. **Share a link** shares the flows only, so choose one of the other two when the pack holds overlays or control panels. A pack of only overlays shares by **Marketplace** or **Bundle file (.bloop.zip)**; **Share a link** needs a flow. Sharing gives someone else a copy, and your own pack remains yours. On **Overlays → Packs**, **Submit to Marketplace** beside a pack you made opens its sharing steps. Choose **Marketplace** to submit a listing for review. ![The Share this pack panel: Marketplace, Share a link (unavailable) and Bundle file (.bloop.zip), with a note that this pack uses files or key graphics.](https://bloopbot.com/docs/screenshots/owned-pack-share.jpg) _Choose how to share a copy of the pack._ For Marketplace, check the flow list, the things the flows need, and any files or key graphics in the review. A submission is reviewed before it can appear to everyone. A share link carries no media files; use the bundle file when the pack needs images, sounds, videos or a Stream Deck key graphic. [Share, import and restore flows](https://bloopbot.com/docs/sharing-flows#share) explains the choices. ## If something is missing - **A flow is not in the pack:** open the pack’s page and press **Add to pack** on its dashed row. Flows in the Trash must be restored before they can run. - **A key is missing:** open the flow and add a **Stream Deck button** trigger; ordinary chat and alert flows still work without a key. - **“The … button on your … panel starts …, which is not in this pack”:** a panel in the pack has a button for a flow you are not sharing. Add that flow to the pack, or take the button off the panel, then share again. A tile that shows a variable none of the pack's flows or custom graphics use is stopped the same way. - **Add to pack is greyed out under Control panels:** the pack already holds 5 panels. Remove one first. - **Share is greyed out:** the pack is empty. Add a flow or an overlay. **Share a link** stays greyed out for a pack with no flows, and for one whose flows use files; use **Bundle file (.bloop.zip)** instead. - **A link cannot carry the pack's files:** choose **Bundle file (.bloop.zip)** and share the complete file. - **An overlay will not go into a pack:** a pack holds at most 10 overlays. Remove one first, or make another pack. **Make a pack from these** stays greyed out while more than 10 overlays are picked. - **You want a ready-made pack:** use **Flows → Add** or **Marketplace → Discover**, then look for its card under **Packs → Marketplace** after adding it. --- # The Marketplace Browse packs, flows, themes, overlays, alerts and media packs in one place, look one over, and add it to your channel. Updated 14 October 2026 ## What the Marketplace is The **Marketplace** is one place to browse everything you can bring into your channel: packs of flows, single flows, themes, overlays, alert designs and media packs of pictures and sounds, from Bloopbot and from other streamers. Every item has one card and one review, so you always see what an item brings before anything changes. Flows arrive paused: nothing runs until you switch it on. Everything in it also has a public page anyone can read without signing in ([Add from a public page](https://bloopbot.com/docs/the-marketplace#public)). The homepage’s **Featured in the Marketplace** section shows picks from the Bloopbot team, in the same order as the public [Marketplace](https://bloopbot.com/marketplace). Open a card to see what it holds, or press **Browse the marketplace** to see everything. You can look around before signing in. **Marketplace** sits near the bottom of the sidebar, above **Settings** and **Help**, so it is one click away from any page. When something in your channel has a newer version, a number beside **Marketplace** says how many. ![The Marketplace on Discover: one row with Search the marketplace, a Filters button and Sort set to Popular, a Featured shelf whose cards lead with a large cover, and every item below as a card with its cover, source, summary and contents.](https://bloopbot.com/docs/screenshots/marketplace-discover.jpg) _Discover: kind and category chips, Sort, the Featured shelf, and every item as a card._ The **Overview** also shows up to five items first listed since your previous sign-in. Select a card to open the same review here. On a first visit, it shows the latest listings instead; returning visits with no new listings say so. ## Find something 1. Open **Marketplace** in the sidebar. It opens on **Discover**. 2. Type in **Search the marketplace** to look through titles, summaries, creators and what each item holds. Type **Bloopbot** to find Bloopbot’s own items, or **overlays** to find what brings overlays. 3. Press **Filters**, beside the search, to open the filters. Under **Kind**, pick **Packs**, **Flows**, **Themes**, **Overlays**, **Alerts** or **Media**; **All** shows every kind again. 4. Under **Category**, pick one such as **Community**, **Moderation** or **Music**. Pick it again to clear it. 5. To see only what other channels made, press **Exclude built-in**. It hides Bloopbot’s own packs, flows, overlays and themes, and its official listings. Press it again to bring them back. 6. Choose an order under **Sort**, at the right of the same row: **Popular**, **Newest** or **Name**. Search, **Filters** and **Sort** share one row. The **Filters** button shows how many filters are on, and each one also appears as a chip under the row: press a chip to remove that filter, or **Clear all** to remove every one. Press **Escape** to close the filters. **Popular**, the default, puts the items the most channels added first, then the best rated, then goes by name. **Newest** puts the most recently updated items first, and **Name** runs A to Z. Bloopbot’s own packs are sorted and searched like everything else, so a community item that more channels added comes before them under **Popular**. With no search or filter, **Featured** shows the items the Bloopbot team picked, in the team’s order, above **Everything** — the same picks the public Marketplace leads with. While the team has picked nothing, it shows the most-added pack and theme instead. Sort orders the list below it. The page’s address keeps your kind, category, **Exclude built-in** and sort, so the back button and a bookmark both return to the same list. ## Read a card Every card reads the same way, top to bottom: - The cover: the creator’s own picture, or a preview. Bloopbot’s built-in packs and flows each have their own cover in the pack’s colour: a built-in flow’s picture shows what it does, such as a heart with a bell for **Follow alert**. Bloopbot’s ready-made overlays show the overlay itself, drawn in the Studio theme. A theme’s preview shows its colours, corners and font. - The title and its kind: Pack, Flow, Theme, Overlay, Widget, Alert design or Media pack. - Where it comes from: **Built in · Bloopbot**, **Community · by** its creator, **From a link**, or **Made by you**. - One line about it, then what it holds, for example **11 flows** or **Theme · 3 overlays**. - How many channels added it, and its star rating once 3 streamers have reviewed it. - Where you stand: **Add**, **Installed**, **Update ready**, or **Active** for the theme your overlays use now. A pack or flow whose steps need a paid plan carries a chip naming the plans that run it, such as **Free+ & paid** or **Pro**. **Free+ & paid** is on every item whose steps need a Web request: [Free+](https://bloopbot.com/docs/unlock-free-plus) and every paid plan run them. When your plan is not one of those named, the chip shows a lock and a warning colour, and hovering it explains: “Some flows in this need Free+ & paid. They won't run on your plan.” [When your plan doesn't cover it](https://bloopbot.com/docs/the-marketplace#plan-needs) says what to do. On Free+, that chip has no lock, because Free+ runs Web requests. A theme card can also carry a chip such as **Free holds 1 theme**: how many themes your plan keeps. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) lists the rest. ## Look an item over **Add** and **Details** both open the item’s page. The page is centred, with the review in a card on the right. On the left are its cover and pictures (screenshots of it running on a sample stream, and pictures its creator added, never the flows themselves), a longer description, **What’s inside** (grouped as Look, Flows, Stream Deck, Variables and Files), and what other streamers wrote about it. On the right is the review: one sentence about what happens, the button that adds it, a line on what stays off, and **What you get**. Open **What’s inside**, **Needs**, **Plan room** or **Files and licence** at the bottom of the review for the details. New sample-stream pictures show overlays over one of ten fictional game scenes starring Pebble. Each listing uses the same backdrop across its screenshots. Use the pictures to judge how the overlay looks over gameplay. Some listings also lead their pictures with a short silent video of the same sample stream, so you can watch the alerts play before you add them. When an item has pictures, the large picture is a gallery. Press the previous and next arrows, press the left and right arrow keys while the picture is focused, or swipe on a touch screen to move through them; the count in its corner reads like **2 of 5**. The small pictures under it jump straight to one, and a video shows a play mark on its thumbnail. A showcase video, when a listing has one, comes first; it plays silently and has its own controls to pause it. ![The Stream Boss item page: its cover and What’s inside on the left, and the review in a card on the right with Add 5 flows — paused.](https://bloopbot.com/docs/screenshots/marketplace-item.jpg) _An item page: What’s inside on the left, and the review with its Add button on the right._ The link icon (**Copy link**) beside the title copies the item page’s address. Paste it under **Paste a link** on any channel to open the same item. ## Add an item 1. Open the item and read the review’s sentence. 2. If the item carries a look and flows together, choose **Everything**, **Just the look** or **Pick parts**. [Full packs](https://bloopbot.com/docs/the-marketplace#full-packs) says what each adds. 3. If the review asks a question, answer it. For a channel point reward, **Make it for me** is the default, or the reward of the same name if you already have one. 4. Press the button. It says what arrives: **Add 5 flows — paused**, **Add everything — paused**, **Add 6 files** for a [media pack](https://bloopbot.com/docs/the-marketplace#media-packs), or **Add**. 5. The review turns into **Added — paused** and a short **Set it up** checklist. Only the steps that apply appear: switch on the flows you want, add each overlay to OBS with its copy icon (**Copy URL**), match a reward, set up Stream Deck keys, and open each [control panel](https://bloopbot.com/docs/control-panels) it brought. ![The review after adding Stream Boss: Added — paused, the sentence, and the Set it up checklist with Switch on the flows you want.](https://bloopbot.com/docs/screenshots/marketplace-added.jpg) _After Add: Added — paused, and the steps left to set it up._ Whatever you add, the files that come with it land in your media library in a folder named after the item, inside a folder called **Marketplace**, such as **Marketplace** › **Cosy stickers**, with the creator's tags on them. A file you already had stays where it is. Something you drop as a file or paste as a link puts its files in a folder named after it under **Imported** instead. A theme’s picture frames travel with it like its backgrounds: the frame pictures come into your media library when you add the theme, in that folder, and each panel, chat line or alert card it framed wears the frame once you make the theme Active and publish. If you list a theme of your own, its frame pictures go in the **Decor** slot ([Theme slots](https://bloopbot.com/docs/publish-to-the-marketplace#slots)). An item can bring control panels. Each arrives as a new panel whose buttons start your copies of the item's flows; switch those flows on before pressing. A channel holds up to 20 panels, so if the item would take you past 20, the review says so and adds nothing until you delete a panel. If you leave one of the item's flows out, its buttons are left off the panel; adding that flow later puts them on, as long as you have not changed the panel since. Adding changes nothing on stream or in chat. Flows arrive paused, and a new theme does not change what OBS shows until you make it Active and publish. If your plan already holds as many themes as it allows, the review offers **Swap themes**: the new theme takes your Active theme’s place in your draft only, and the old one stays in History. When flows come with the theme, **Add without the look** adds everything else and leaves your themes alone. ## Set up a native overlay look Prism, Fieldnotes and Signal bring five scenes, a matching theme and six alert flows. Prism uses smoky glass and mineral blue; Fieldnotes uses cream paper and a painted garden; Signal uses black, bone and red. Prism pairs Bodoni Moda headlines with Manrope for chat and smaller text; Fieldnotes pairs DM Serif Display with DM Sans; Signal pairs Bebas Neue with IBM Plex Sans. Each look has its own headline scale, with a smaller countdown aligned beneath it. The fonts load automatically in the overlay; OBS needs an internet connection to fetch them. The artwork is a background image. Chat, alert messages, countdowns, goals, polls and supporter lists stay editable widgets. You need room for one theme and five overlays on your plan, and OBS or another broadcaster that accepts browser sources. 1. Open the pack's review in **Marketplace**, or drop its **.bloop.zip** file under **Paste a link**. Choose **Everything** and add it. The six alert flows arrive paused. 2. Open **Studio** and select the pack's **Gameplay** overlay. Change **Name** from **Your channel** to your channel name. Use **Just chatting** for a large camera and chat layout. 3. Open **Starting soon**, **Be right back** and **Stream ending**. Edit their headline and next-stream text. Start a countdown with a flow's **Control a countdown** step, using the names **Starting soon** or **BRB**. 4. Copy each overlay's URL into a separate OBS browser source at **1920 × 1080**. Put Gameplay above your game and camera captures. Just chatting has a full background: put your camera capture above the overlay, inside its camera frame. 5. Preview an alert in Studio with **Test**. This preview stays in Studio. Publish your edits, then enable the pack's Follow, Sub, Resub, Gift sub, Cheer and Raid flows that you want to run on stream. Pause older flows for the same events to avoid duplicate alerts. For example, Fieldnotes' Starting soon screen combines its garden background with an editable headline and countdown. Replacing the image does not change the timer or your alert flows. Imported scenes use the pack's own theme; newly created overlays use your Active theme. To extend the look, make the pack's theme Active and publish before creating another overlay ([Themes](https://bloopbot.com/docs/widget-themes)). The goal bar follows your Twitch creator goal and stays hidden while no goal is active. Polls and predictions appear in Gameplay when those events run. Empty supporter lists need real activity or Studio's test data before they show names. A Redemption alert style is included, but there is no reward or redemption flow until you choose your own reward. If the review says your plan is full, free space or choose fewer parts before adding. If an alert stays silent, check its flow is enabled and your channel has the permissions the review lists. If OBS still shows an old edit, publish from Studio and refresh the browser source. ## When your plan doesn't cover it Some flows use a step that only certain plans run, such as a **Web request**. The Marketplace tells you before you add, so nothing surprises you later. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) lists which plan holds what. On Free, joining the Bloopbot Discord puts your channel on [Free+](https://bloopbot.com/docs/unlock-free-plus), which runs **Web request** steps within a daily and a monthly limit. 1. Look at the chip on the card or the item's page. **Free+ & paid** means Free+ and every paid plan run every flow in it. If your plan is not named, the chip has a lock and a warning colour. 2. Open the item and read the review. Under its first sentence, a box titled **Won't run on Free** (or whichever plan you are on) lists each flow that can't run, with the step and the plans that cover it, for example “Ping my server: Web request — Free+ & paid”. 3. Press the button as usual. What it does depends on the item, as described below. What happens to the flows your plan can't run: - **In a pack, or an item that holds more than flows,** they are left out (“These flows need a bigger plan, so they're left out.”) and the button counts only the flows that will arrive, for example **Add 1 flow — paused**. Tick **Add them anyway — they'll wait until you upgrade** to bring them in too (“These flows are added, but they won't run until you upgrade.”). - **In a single flow,** it adds, with the box as a warning (“This adds, but the steps below won't run until you upgrade.”). It arrives paused like any other. - **To run them,** press **Upgrade** in the box, which opens Plan & billing. A flow you added anyway stays in your channel. When it runs, the step your plan doesn't cover is refused. Upgrade, and the step works with nothing to redo. ![A pack card on a Free channel with a warning chip, a lock and Free+ & paid, beside the Add button.](https://bloopbot.com/docs/screenshots/market-plan-chip.jpg) _A pack card on a Free channel: the Free+ & paid chip with a lock and a warning colour._ ![The add review of a pack with a Won't run on Free block: the flow that needs Free+ & paid, an Add them anyway checkbox and an Upgrade link.](https://bloopbot.com/docs/screenshots/market-plan-short.jpg) _The review's Won't run on Free box: the flow that needs Free+ & paid, Add them anyway, and Upgrade._ Updating something you already added is never filtered: an update brings the new version of every flow, whatever your plan. ## Packs that work on every plan Some packs carry a **Works on every plan** chip. Bloopbot has checked their Web requests and lets them run on any plan, Free included, so their flows arrive with nothing left out and no **Free+ & paid** warning. ![A pack card on a Free channel with a quiet Works on every plan chip and no plan warning, beside the Add button.](https://bloopbot.com/docs/screenshots/market-every-plan.jpg) _A pack card on a Free channel: the Works on every plan chip, with no plan warning._ 1. Add the pack as usual. Its Web request steps arrive with the flows. 2. On the Flows page, set **Web requests** to **allowed**. Every channel has to allow outbound requests once, whatever its plan. 3. Turn the flows on. Each run can make up to 2 Web requests, the same as Plus. The exemption covers each Web request exactly as the pack shipped it. You can rename the flow, change its command, cooldown or chat text, and it still works. Change a Web request's URL, method, headers or body, and that step needs Free+ or a paid plan from then on; selecting it in the editor warns you first. A copy of the flow you make yourself is your own flow, so its Web requests need Free+ or a paid plan too. If the pack is later taken off the marketplace, its Web requests stop on plans without them, and nothing is deleted. ## Full packs A full pack is a whole stream setup in one item: flows, a theme, overlays, alert designs and Stream Deck keys, with the files, variables and channel point rewards they use. Its card says what it holds, for example **16 flows · theme · 2 overlays · 9 alerts · 8 Stream Deck keys**. 1. Open the pack and choose **Everything**, **Just the look** or **Pick parts**. Each is described below the steps. 2. Answer the review's questions. For each channel point reward the pack needs, it asks, for example, “Which channel point reward is Adventure Cheer?”. **Make it for me** is the default: Bloopbot makes the reward on your channel, switched off. If you already have a reward of the same name, it is picked for you. You can also pick any of your own rewards. 3. If your plan already holds as many themes as it allows, the review says, for example, “Your plan holds 1 theme. Swap Capsule for Solo Adventure, or add everything except the look.” Choose **Swap themes** or **Add without the look**, both described below. 4. Press the button. With Everything it reads **Add everything — paused**; with fewer parts it says how many flows arrive. The three choices: - **Everything** adds all of it. The flows start paused. - **Just the look** adds the theme, the overlays and the alert designs they show, and no flows. - **Pick parts** lists the pack's parts under **Look** and **Flows**. Tick what you want. Alert designs, files, variables and rewards come with the parts that use them. Overlays come with the theme or a flow, so one of those always stays ticked. At your plan's theme limit: - **Swap themes**, the default, puts the new theme in your draft only, and Capsule stays in History. - **Add without the look** adds the flows and leaves your themes and overlays as they are. ![The review of a full pack, Solo Adventure: Everything, Just the look and Pick parts; Which channel point reward is Adventure Cheer? with Make it for me; and Your plan holds 1 theme with Swap themes chosen.](https://bloopbot.com/docs/screenshots/marketplace-full-pack-review.jpg) _A full pack’s review: Everything, Just the look and Pick parts, the reward question with Make it for me, and the theme limit with Swap themes._ After adding, the review turns into **Added — paused** and a **Set it up** checklist with only the steps that apply: - **Add the OBS sources**: select the copy icon (**Copy URL**) beside each overlay and paste it into a Browser source in OBS. - **Switch on the flows you want**: **Choose flows to switch on** opens Flows at this pack. - **Match the Adventure Cheer reward**: already done when you picked a reward, or when Bloopbot made one during review. - **Set up the Stream Deck keys**: each key, and the chat command it shares. ![After adding Solo Adventure: Added — paused and Set it up, with Add the OBS sources with a copy icon (Copy URL) for each overlay, Switch on the flows you want, Match the Adventure Cheer reward already done, and Set up the Stream Deck keys.](https://bloopbot.com/docs/screenshots/marketplace-full-pack-checklist.jpg) _After adding a full pack: Added — paused and Set it up, with the OBS sources, the flows, the reward and the Stream Deck keys._ The same steps stay on the pack's **Installed** row, for example **Set it up: 1 of 4**, until each is done. When the pack's creator publishes a new version, its flows, overlays, alert designs and theme update by the same rules as everything else: see [Update what you added](https://bloopbot.com/docs/the-marketplace#update). ## Paste a link or drop a file Someone shared a pack with you, or sent you a `.bloop.zip`: 1. On the Marketplace, press **Paste a link** at the top. 2. Paste a Bloopbot link, such as a shared pack link, a marketplace listing page or a Marketplace item link, and press **Continue**. The item’s page opens with its review. 3. Or drop a `.bloop.zip` or `.json` export onto the box, or press **Choose a file**. Its review opens right there. ![Paste a link, open under the Marketplace header: a marketplace listing link typed in, Continue, and the box to drop a .bloop.zip or .json file.](https://bloopbot.com/docs/screenshots/marketplace-paste.jpg) _Paste a link, with a marketplace listing link typed in and the box for a file below._ A dropped file is not kept. If you leave before adding it, drop it again. A link from another site is refused with “That link is not a Bloopbot link.”, and a Bloopbot page that is not an item with “That link does not point at something to add.” ## Add from a public page Everything in the Marketplace also has a public page, so you can read about it, or send it to a friend, without signing in. Bloopbot’s own packs are there too. 1. Open the Marketplace from the site’s header, or a link someone sent you. Search, or pick **Packs**, **Themes** or another chip, just as in your dashboard. 2. Open an item. Its page shows the same cover, the same facts and the same review as your dashboard: what adding it does, **What you get**, and **What’s inside** folded underneath. 3. Press **Sign in with Twitch to add**. Sign in, and you come straight back to the same item in your dashboard, with its review open. 4. Press **Add** there. Nothing is added until you do. ![The public page for the Starter pack: its designed cover, Built in · Bloopbot, what adding it does, and a purple Sign in with Twitch to add button with You’ll come straight back here, ready to add under it.](https://bloopbot.com/docs/screenshots/marketplace-public-pack.jpg) _A built-in pack’s public page: its cover, what it adds, and Sign in with Twitch to add._ On a phone, the review sits under the picture, and **Sign in with Twitch to add** stays in reach while you read it. ![The Starter pack’s public page on a phone: the cover first, then its name and facts, then the review with Sign in with Twitch to add.](https://bloopbot.com/docs/screenshots/marketplace-public-phone.jpg) _The same page on a phone: the review under the picture, with Sign in with Twitch to add below the pack’s description._ A Marketplace item link someone copied from their dashboard works the same way: sign in, and it opens that item in yours. ## Installed and Made by you **Installed** lists what is in your channel, with anything marked **Update ready** first, then your packs, flows, themes, overlays and alerts. The number beside the tab, and beside **Marketplace** in the sidebar, is how many have an update. Pick a kind or search to narrow the list. Each row says how its flows stand, for example **11 flows, all on**, and a row with setup left says **Set it up: 1 of 4**: press **Continue setup** to see the steps that are left. ![The Installed tab after updating: Packs, with Starter showing Set it up: 0 of 2 and its steps unfolded, and Mod commands with Continue setup.](https://bloopbot.com/docs/screenshots/marketplace-installed.jpg) _Installed: each kind, with the setup left on a pack you just added._ **Made by you** lists everything you listed in the marketplace, whatever its status — **Draft**, **In review** with its place in the queue, **Changes requested**, **Listed**, **Unlisted** or **Taken down** — and the packs and flows you share by link. **Share…** at the top lists something new, shares flows by a link, or exports them as a file. On a row, **Publish an update** submits a new version and **Edit details** changes a listed item’s title, summary, description, category or cover without one. See [List your flows and themes in the marketplace](https://bloopbot.com/docs/publish-to-the-marketplace#share-options). ## Restore contents you deleted You can add your own listed marketplace pack to get its deleted contents back, just as you can add another streamer's pack. The listing holds the approved version you shared; deleting flows or overlays from your channel does not delete that version. 1. Open **Marketplace** → **Discover** and search for your pack's name. 2. Open its card. The review shows the missing flows, overlays and variable declarations it can add, even when its byline says **Made by you**. 3. Press **Add**, or the button naming the missing flows. Surviving installed flows and current variable values stay as they are. 4. Follow **Set it up** for restored overlays and switch on the restored flows you want. New flow copies start paused. For example, if you delete the overlay from your listed counter pack but keep its flow, opening the pack offers the missing overlay again. If only its variable declaration is missing, **Add** restores that declaration without copying the flow or overlay. Restoring a sealed graphic from a listing you made brings back its editable HTML, CSS and JavaScript. Open the restored widget on your **Widgets** page and choose **Edit code**, or select its layer in Studio and choose **Edit widget code**. Other streamers receive the sealed copy. Restored flows do not use your custom-flow allowance until you change their behaviour; behaviour edits then count normally, just like edits to other marketplace flows. A deleted variable starts at the value saved in the pack; its old channel or viewer values are not recovered. A restored overlay has a new OBS source address, so use the address in **Set it up**. A pack must still be **Listed** to add it; if you unlisted your own pack, use **Relist** in **Made by you** first. Unpublished local edits are not part of the approved snapshot. ## Media packs A media pack is an item that is only files: pictures, sounds and videos a creator shares. Adding one changes nothing on stream or in chat. The files just wait in your media library until you use them in an overlay, an alert or a flow. **Look at it first.** A media pack's item page and its public page show its files in **What's inside**: each picture with a thumbnail you can open full size, and each sound and video with a player, so you can look and listen before you add anything. A picture's thumbnail is a small copy that loads quickly, and a video shows a still frame until you press play. A newly shared pack can take a few minutes to get its small copies; until then its pages show the full files. Its cover is the creator's own, or a sheet of its first pictures, or a sound wave when it is only sounds. **Files and licence** says how the files may be used and carries any credit the creator asks for. Reading and playing need no sign-in. ![A media pack’s public page, signed out: Cosy stickers marked Media pack, its cover a sheet of four pictures, the review reading Adds 6 files to your media library, in Marketplace/Cosy stickers with Sign in with Twitch to add, and What’s inside with four picture thumbnails and two sound players.](https://bloopbot.com/docs/screenshots/market-media-listing.jpg) _A media pack's public page, signed out: its cover, the review with Sign in with Twitch to add, and every file with a thumbnail or a player._ **Add it.** 1. Open the pack and read the review's sentence, for example “Adds 6 files to your media library, in Marketplace/Cosy stickers.” 2. Press **Add 6 files**. If your file storage cannot hold them, nothing is copied and it says how much space the files need and how much you have free: free some space on the **Media** page in the sidebar ([Choose and upload media](https://bloopbot.com/docs/choose-and-upload-media)), then press the button again. 3. The files arrive in **Marketplace** › the pack's name. Files you already hold, even under another name, are not copied again and stay where they are. ![The review of a media pack: Adds 6 files to your media library, in Marketplace/Cosy stickers; the Add 6 files button; Nothing on stream changes; What you get, 6 files, 52 KB; and folds for What’s inside and Files and licence.](https://bloopbot.com/docs/screenshots/market-media-review.jpg) _The review of a media pack: Adds 6 files to your media library, in Marketplace/Cosy stickers, the Add 6 files button, and what you get._ **Update it.** When the creator shares a new version, the pack's row in **Installed** says **Update ready** and its button reads **Get new files**. It copies only the files you do not have yet. Files the creator dropped from the new version stay in your library. **Find it.** Open the pack from **Installed**: its status panel has **Open in Media library**, which opens the **Media** page where the files are in their folder, tagged as the creator tagged them. You can rename, move, tag or delete them like any file of yours ([Organise with folders and tags](https://bloopbot.com/docs/choose-and-upload-media#organise)). **Uninstall it.** Press **Uninstall** on the pack's row in **Installed**. The box lists the pack's files in your library: the ones nothing uses, each with a tick box that starts unticked, and the ones an overlay, alert or flow uses, marked **It stays**. Tick the unused files you want to delete and press the button, which then reads, for example, **Uninstall and delete 2 files**. Or press **Uninstall** to leave every file where it is. A file in use is never deleted here. Uninstalling only takes the pack out of Installed; if it is still listed you can add it again. ![Installed’s row for Cosy stickers with its Uninstall box open: five files nothing uses, cloud.png, heart.png, moon.png, pop.wav and star.png, none ticked; one file in use, chime.wav, used by the flow Chime on !hello, which stays; and Uninstall and Cancel.](https://bloopbot.com/docs/screenshots/market-media-uninstall.jpg) _Uninstall Cosy stickers: five files nothing uses, none ticked, and one file in use, chime.wav, used by a flow, which stays._ If a copyright claim removes a file, it is removed from every channel that added it, and the files you had already used from it show **Missing file** where you picked them. ## Update what you added When Bloopbot or a creator publishes a newer version of something you added, its row moves to **Update ready**. Updating never surprises you: - **Flows you haven't changed update in place and stay on or off as they were.** New flows in the new version arrive paused. - **Themes, overlays and alert designs update into your draft.** Nothing on stream changes until you publish in Studio, and your published version stays in History. - **Control panels you haven't changed update in place.** They take the new version's buttons and keep their place, their secret link and your moderators' access, and a panel open on another screen changes straight away. Panels the new version adds arrive as new panels. A panel you deleted does not come back, and one the new version leaves out stays as it is. - **Widgets update into your draft, one by one.** A widget you haven't changed takes the new version in your draft. One whose code you changed asks first, with **Keep mine** chosen. Your layers keep their own settings either way ([Widgets from the Marketplace](https://bloopbot.com/docs/your-widgets#marketplace)). - **Something you changed is never overwritten without asking.** The row asks “You changed Welcome. Keep your version?” with **Keep mine** chosen. That goes for a flow and for a control panel whose name or buttons you changed. 1. Open **Marketplace**, then **Installed**. 2. On a row with nothing to ask, press **Update**. It is done at once, and the row says what changed. 3. On a row that asks, choose **Keep mine** to keep what you made, or **Use the new one** to take the new version. Use **Now** and the new version’s number beside it to compare the two. 4. Press **Update**. **Not now** folds the question away until you are ready. **What’s new** opens the item’s page. ![Installed with two updates: Starter open with “You changed Simple command. Keep your version?”, Keep mine chosen, Update and Not now, and Now and Version 5 beside it listing what happens to each flow; below it Mod commands with What’s new and Update.](https://bloopbot.com/docs/screenshots/marketplace-installed-update.jpg) _One update that asks about a flow you changed, with Now and Version 5 beside it, and one with nothing to ask._ **Use the new one** replaces a changed flow in one step. Your version is kept in that flow’s **History**, so you can put it back from the flow editor. For a theme or overlay, the new version goes into your draft, and **History** in Studio keeps what was live. For a control panel, the new version’s buttons replace yours on the same panel, so its link keeps working; panels have no history, so your layout is not kept. The review counts the control panels an update would add. If they would take you past 20, it says so and **Update** waits until you delete a panel on **Control panels**. ![The question “You changed Simple command. Keep your version?” with Keep mine chosen and Use the new one beside it, and the note that your version stays in its History.](https://bloopbot.com/docs/screenshots/marketplace-keep-mine.jpg) _“You changed Simple command. Keep your version?” with Keep mine chosen._ **Keep mine** leaves your copy exactly as it is and stops the offer until the next version. You can also update an item from its own page: open it, and its review offers **Update**. If you removed some flows from a pack, its page offers **Add the 3 missing flows — paused** (or however many are missing). ## How items are reviewed - **Built in · Bloopbot** items are made and kept up to date by Bloopbot. - **Community** items are checked before they are listed, and each new version is checked again before it replaces the old one. Their page says **Reviewed by Bloopbot**. - An item **From a link** or from a file comes straight from another channel and is not reviewed. Read its review before you add it. ## If something looks wrong - **Add 6 files says your file storage has too little free.** The pack is bigger than the space you have left. Delete files you no longer use on the **Media** page in the sidebar: [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#limits) shows the space you have. - **A media pack's files are not where I expected.** Look in **Marketplace** › the pack's name in your media library, or open the pack from **Installed** and press **Open in Media library**. A file you already had is left where it was. - **The number beside Marketplace looks out of date.** It refreshes when you open a page, at most once a minute. **Installed** always shows the current list. - **An item page has no Add button.** Everything in it is already in your channel, or you made it. The page says where it lives and links there. - **Update ready does not go away after Update.** A theme or overlay update waits in your draft: publish in Studio to make it live. Until then the row says the new version waits in your draft. - **“This adds 1 control panel, and your channel already has 20 of 20.”** Delete a panel you no longer use on **Control panels**, then add or update the item again. - **An item says it is no longer in the marketplace.** Its creator unlisted it, or it was taken down. What you added keeps working, and it has no updates. - **Set it up stays on Add the OBS sources.** The step ticks itself once OBS opens each overlay's link. Another streaming app does not tick it: you can ignore the step once your overlays show. - **“This changed since you opened it.”** The item changed while you were reading. The review reloads; read it again and press the button again. - **Just the look and Pick parts are not offered.** Only an item that carries a theme and flows together offers them. A pack of flows with overlays and no theme is added whole. - **A dropped file shows nothing.** Only a `.bloop.zip` or a `.json` export from Bloopbot can be read. Ask for the file again, or for a link instead. - **I signed in from a public page and landed on my dashboard’s home instead.** The link waits 15 minutes for you to sign in. Open the item’s page again and press **Sign in with Twitch to add**. --- # List your flows and themes in the marketplace Share your flows, overlays, themes and media packs with other streamers from Made by you. Everything is reviewed before anyone can add it. Updated 14 November 2026 ## Before you start The marketplace is where streamers find what other streamers made. Everything listed there is reviewed first, and flows always arrive paused, so nothing you list can change another channel until that streamer switches it on. You need: - a backup sign-in email you have confirmed — see [Add a backup sign-in email](https://bloopbot.com/docs/backup-sign-in-email). Review outcomes and notices about your listings go there; - the flows, the theme or the files you want to share, working on your own channel; - the right to share every image, sound and video they use. Everything you share lives in one place: open **Marketplace** in the sidebar and choose **Made by you**. ## Get help with your setup Optional **Help me** reuses a pack or listing you maintain. On **Made by you**, review the exact draft, review and public state, member files and sharing rights. Setup does not submit, publish, sell or update anything automatically. ## Share… from Made by you **Made by you** lists everything you listed in the marketplace, whatever its status, and everything you share by link. Press **Share…** at the top to choose what to do: - **Submit for review…** lists something in the marketplace for every streamer. It takes four steps: **Pick contents**, **Details**, **Cover and previews**, and **Licence and Submit for review**. See [List flows](https://bloopbot.com/docs/publish-to-the-marketplace#list), [Publish a theme](https://bloopbot.com/docs/publish-to-the-marketplace#themes) and [List a widget on its own](https://bloopbot.com/docs/publish-to-the-marketplace#widgets). - **Share a media pack…** lists pictures, sounds and videos from your media library, and nothing else. See [Share a media pack](https://bloopbot.com/docs/publish-to-the-marketplace#media-pack). - **Share a link…** shares flows by a private link instead. Pick one flow to share it on its own, or two or more to share them as a pack; anyone with the link can add a copy. See [Share an install link](https://bloopbot.com/docs/sharing-flows#share). - **Export bundle…** downloads the flows you pick, with everything they need, as one `.bloop.zip` file. See [Export several flows as one bundle](https://bloopbot.com/docs/sharing-flows#export-bundle). ![Made by you in the Marketplace with Share… open: Submit for review…, Share a media pack…, Share a link… and Export bundle…, above the list of what the channel made.](https://bloopbot.com/docs/screenshots/market-share-menu.jpg) _Made by you with Share… open: Submit for review, Share a media pack, Share a link and Export bundle._ ## Set up your creator profile The first time you submit, the last step, **Licence and Submit for review**, asks for your creator profile: 1. Under **Your creator profile**, enter the **Creator name** other streamers will see, and optionally a line **About you**. 2. Read the creator terms (**Read the creator terms** opens them), then tick **I accept the creator terms**. 3. Press **Save creator profile**. The step carries on where you were. ![Your creator profile in Share…’s last step: Creator name Break Room, About you Small helpers for long streams., the creator terms ticked, and Save creator profile.](https://bloopbot.com/docs/screenshots/market-share-creator.jpg) _Your creator profile, set up in the last step: the name other streamers see, and the creator terms._ If your backup sign-in email isn’t confirmed yet, the step says so and links to **Account** instead. If the creator terms change later, the step asks you to accept them again before your next submission; what you listed stays listed meanwhile. ## List flows 1. In **Made by you**, press **Share…**, then **Submit for review…**. 2. **Pick contents**: tick the flows to include under **Flows**. **Comes along** shows everything they need — alert designs, files, variables, rewards, groups — and which flow needs each one; it all comes with them. Optionally tick overlays under **Overlays (optional)**, and [control panels](https://bloopbot.com/docs/publish-to-the-marketplace#panels) under **Control panels (optional)**. To list overlays on their own, tick them and leave **Flows** empty: see [List overlays on their own](https://bloopbot.com/docs/publish-to-the-marketplace#overlays). To share one of your themes with them, see [Share flows and a theme together](https://bloopbot.com/docs/publish-to-the-marketplace#mix). Press **Next: details**. 3. **Details**: give it a **Title** and pick a **Category**, then write a one-line **Summary** for its card and, if you like, a **Longer description** for its page. You can [format it](https://bloopbot.com/docs/publish-to-the-marketplace#description) with headings, bold text, lists and links. Press **Next: cover**. 4. **Cover and previews**: [add a cover](https://bloopbot.com/docs/publish-to-the-marketplace#cover), or leave it empty. Then [choose the pictures your listing shows](https://bloopbot.com/docs/publish-to-the-marketplace#previews): the screenshots taken of your flows, and up to 4 pictures of your own. **How it shows in an Add panel** shows your listing as other streamers will see it in a list. Press **Next: licence**. 5. **Licence and Submit for review**: choose a licence — see the two below. If it carries files, tick **I made these files or have the right to share them**. 6. Press **Submit for review**. The step says where it stands, for example “2nd in the queue”. ![Share… at step 1, Pick contents, open beside Made by you: Flows chosen, with Hydrate reminder and Stretch break ticked, and Next: details ready.](https://bloopbot.com/docs/screenshots/market-share-contents.jpg) _Pick contents: the flows ticked, ready to continue to Details._ Share… opens beside **Made by you**, so your list stays in view. Each step says what it still needs beside its **Next** button, for example “Pick a category.”, and **Back** — or a finished step’s name at the top — returns to an earlier step without losing anything. **Close** at the top shuts it. The two licences: - **Remix allowed with credit**: other creators may list their own version, naming yours as the original. - **No redistribution**: streamers can add it to their channel, but nobody else may list a copy or a remix. ![Share… at step 4, Licence and Submit for review, with the first three steps checked: Remix allowed with credit chosen, the review slots in use, and Submit for review ready.](https://bloopbot.com/docs/screenshots/market-share-submit.jpg) _Licence and Submit for review: the licence, how many review slots are in use, and Submit for review._ For example, a “Cosy Alerts” listing with a follow flow, its alert design and a soft chime sound is one listing; a streamer who adds it gets all three, with the flow paused. Files a listing carries follow the same limits as your media library: a picture or a sound can be up to 5 MB, a WebM video up to 25 MB, a listing holds up to 64 files, and everything it carries together fits in 95 MB. An overlay you list brings its backgrounds, its frames round panels, chat lines and alert cards, and any video it plays, within those limits. The automatic checks name any file that is over its limit. ## Format your description The **Longer description** has a small toolbar above it, and what you see in the box is what your listing’s page shows: - **B** makes words bold, and **I** makes them italic. - **H** turns a line into a heading. - The two list buttons start a bulleted or a numbered list. Press Tab in a list to indent an item under the one above it. - The link button turns the selected words into a link. Type a web address that starts with `https://`; leave it empty to remove the link. - Shift+Enter starts a new line without starting a new paragraph. ![The Longer description field with its toolbar (Bold, Italic, Heading, Bulleted list, Numbered list, Link) above a description with bold !hydrate, a What’s inside heading and a two-item bulleted list, and 205 of 2000 counted under it.](https://bloopbot.com/docs/screenshots/market-share-description.jpg) _The Longer description with a bold command, a heading and a bulleted list, as the listing’s page will show it._ You can also type the shortcuts you may know from chat apps: `**bold**`, `*italic*`, `- ` at the start of a line for a list and `### ` for a heading. Pictures, tables, quotes and code are not kept, so add pictures as [previews](https://bloopbot.com/docs/publish-to-the-marketplace#previews) instead. The description can be up to 2,000 characters, and the line under the box counts them. For example, a pack’s description might open with one sentence on what it does, then a **What’s inside** heading over a bulleted list: “16 flows, each with a Stream Deck button”, “Themed alerts for follows, subs and raids”, “A gameplay overlay and a be-right-back screen”. ## Add a cover The cover is the 16:9 picture at the top of your listing’s card, its page and its row wherever it appears. It is optional. Leave it empty to use the first picture your listing shows: see [Previews and screenshots](https://bloopbot.com/docs/publish-to-the-marketplace#previews). When someone shares your listing’s link on Discord, X, Bluesky or anywhere else that shows link previews, the preview is your cover with your listing’s title, your name and what it holds under it, and the Bloopbot logo. A listing with no picture gets a Bloopbot preview with its title. 1. In **Cover and previews**, under **Add a cover (16:9)**, press **Choose picture** to preview and pick a picture, or **Upload** to add one here. The picker shows each picture's size and explains why a picture that is not 16:9 cannot be used. A 1920×1080 or 1280×720 PNG, JPEG, WebP or GIF works. 2. Optionally, under **Describe the cover**, say what it shows for people who can’t see it. Left empty, your title is used. 3. Once a cover is picked, your pictures fold away: select the refresh icon (**Replace the cover**) to pick another, or the bin icon (**Remove the cover**) to take it off. ![Share… at step 3, Cover and previews: Add a cover (16:9) first, a warm dusk picture as the cover with a replace icon and a bin icon (Remove the cover) beside it and its description, then the start of Previews and screenshots with two pictures of the creator’s own at the top of Shown, in this order.](https://bloopbot.com/docs/screenshots/market-share-cover.jpg) _Add a cover (16:9) comes first: the picked cover, its description, and the start of Previews and screenshots._ The cover is reviewed with the rest of the version and shows once that version is approved; until then your listed version keeps its own. A new version keeps the current cover — the step says **The current cover stays.** — unless you remove it or pick another. A picture removed after a copyright claim can’t be used as a cover again. ## Choose your previews and screenshots Under the cover, **Previews and screenshots** sets the pictures on your listing’s page, in the order they show. It holds two kinds of picture: - **Screenshots** of your flows running on a sample stream, which are [taken for you](https://bloopbot.com/docs/publish-to-the-marketplace#screenshots) after your listing passes the automatic checks. Until then, each one shows its moment by name, for example **A chat message**, and **Taken after the automatic checks**. - **Your pictures**: up to 4 pictures of your own, such as your overlay on a real stream. Each must be 16:9, like 1920×1080. Neither kind ever shows your flows themselves. Other streamers see what your listing does on stream and in chat, never how you built it. 1. Under **Shown, in this order**, check the list. The screenshots your flows will get are already in it. 2. To add a picture of your own, go to **Add pictures of your own** and press **Add pictures** to select several, or **Upload** to add one here. Each new picture joins the end of the list, and the count says how many of the 4 you have picked. 3. Select the up arrow (**Earlier**) or the down arrow (**Later**) beside a picture to move it; the tooltip names the picture, for example “Move Your picture 1 earlier”. The first picture leads your listing’s page and, if you have no cover, its card. 4. Select the crossed-out eye (**Hide**) on a screenshot to leave it out. It moves to **Screenshots not shown**, where the eye (**Show**) puts it back at the end. Select the bin icon (**Remove**) on one of your pictures to take it off. ![Share… at step 3 scrolled to Previews and screenshots: two creator pictures and a planned screenshot under Shown, in this order; below, Preview pictures lists two selected file names with Choose from library and Upload file buttons.](https://bloopbot.com/docs/screenshots/market-share-previews.jpg) _Previews and screenshots: two pictures of your own moved first, then the screenshot your chat commands will get, taken after the automatic checks._ For example, a “Cosy Alerts” listing might lead with a picture of its follow alert on a real stream, then the screenshot **New follower: Newfriend**, and hide the chat screenshot. A new version keeps its pictures and their order unless you change them. A screenshot that your new contents no longer get drops out on its own, and a new one waits under **Screenshots not shown**. Your pictures are reviewed with the rest of the version. A picture removed after a copyright claim can’t be listed again. ## Publish a theme A theme listing shares one of your [themes](https://bloopbot.com/docs/widget-themes) — its colours, fonts, panels and alert look — together with the overlays that show it off, and the images and sounds they use. Other streamers find it among the marketplace’s themes, marked **Community** and credited to your creator name. You need the same [creator profile](https://bloopbot.com/docs/publish-to-the-marketplace#creator-profile) and confirmed backup sign-in email as for flows, a theme you made on your channel, and 1 to 4 pictures of it on a stream in your media library. Start from **Marketplace → Made by you**: press **Share…** → **Submit for review…** and pick your theme under **Theme (optional)**. Themes you added from the Marketplace aren’t offered, because they are someone else’s design. 1. **Pick contents**: your theme is picked under **Theme (optional)**. Your **Scene screens** start ticked; tick any others under **Overlays (optional)**. Each goes drawn with this theme, and your widget links never leave your channel. 2. **Details**: check the **Title**, write a one-line **Summary** and, if you like, a **Longer description**. The **Category** starts at **Themes**; pick another if it fits better. Under **Categories**, tick any of **Dark**, **Light**, **Bold**, **Minimal** and **Rounded** that fit. 3. **Cover and previews**: [add a cover](https://bloopbot.com/docs/publish-to-the-marketplace#cover) if you like. Then, under **Previews and screenshots**, go to **Add pictures of your own** and tick 1 to 4 pictures from your media library, or press **Upload a picture**. Each must be 16:9, like 1920×1080. Use the up and down arrows (**Earlier** and **Later**) to order them: the first leads the gallery and, when there is no cover, the card. A screenshot of your overlay in OBS makes a good preview. 4. **Licence and Submit for review**: under **Files and licences**, give every file the theme carries a **Slot** and a **Licence** — see below. Choose how others may reuse it, then press **Submit for review**. The step says where it stands, for example “2nd in the queue”. ![The Files and licences part of Share…’s last step: midnight-backdrop.png, a PNG, placed in the Be right back backdrop slot with the hint “Needs 1920×1080 PNG, JPEG, WebP or GIF.”, the licence CC BY (with credit text), and the credit text “Midnight sky” by Ana Ortiz, CC BY 4.0.](https://bloopbot.com/docs/screenshots/market-themes-publish-files.jpg) _Files and licences: each file goes in a slot that fits it, with the licence you share it under._ ## Theme slots A slot says what a file is for, so a theme lines up with the layout drawn over it. The **Slot** menu offers only the slots a file’s type fits, and shows each one’s size; once you pick one, the line under it says what it needs, or that the file is the wrong size. Every slot except **Vertical backdrop**, **Decor** and **Sound** holds one file. | Slot | Size | File types | | --- | --- | --- | | Starting soon, Be right back, Stream ending and Just chatting backdrops | 1920×1080 | PNG, JPEG, WebP or GIF | | Vertical backdrop | 1080×1920 | PNG, JPEG, WebP or GIF | | Webcam frame | 1280×720 | transparent PNG, WebP or GIF | | Panel frame | 1200×400 | transparent PNG, WebP or GIF | | Goal track | 1600×120 | transparent PNG, WebP or GIF | | Follow, Subscribe, Gift sub, Cheer, Raid and Redemption alert art | 800×800 | transparent PNG, WebP or GIF | | Stream Boss frame | 600×600 | transparent PNG, WebP or GIF | | Wheel centre cap | 400×400 | transparent PNG, WebP or GIF | | Wheel pointer | 200×200 | transparent PNG, WebP or GIF | | Sponsor card | 1200×300 | transparent PNG, WebP or GIF | | Decor | any size | transparent PNG, WebP or GIF | | Sound | — | WAV, OGG or MP3 | A scene screen with a [vertical layout](https://bloopbot.com/docs/vertical-overlays-twitch-dual-format) can carry its own portrait backdrop, so its picture goes in **Vertical backdrop**, one file per screen; it must be exactly 1080×1920. Art that sits over your camera or over text can’t be a JPEG, because a JPEG has no transparency. Every file is 5 MB at most, and a theme takes no video. A picture your theme draws as a frame round its panels, chat lines or alert cards ([Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames)) is a file the theme carries, so it needs a slot too. Put it in **Decor**, which takes any size of transparent PNG, WebP or GIF; a frame saved as a JPEG has to be saved again as one of those to be listed. Frames are pictures only: a video or a sound cannot be one. ## File licences For each file, say how you may share it. The licence is shown beside the file on your listing’s page. - **I made it**: you drew, photographed or recorded it yourself. - **CC0**: it was released with no rights reserved, so anyone may use it for anything. - **CC BY (with credit text)**: it may be shared as long as its author is credited. A **Credit text** box appears; write the credit the licence asks for, for example “Midnight sky” by Ana Ortiz, CC BY 4.0. - **Licensed to me for redistribution in overlays**: you bought or were given a licence that lets you pass it on in overlays for others to use. - **Made with an AI image tool I may use commercially**: you made it with an AI tool whose terms let you use and share what it makes commercially. If none of these is true of a file, leave the overlay that uses it out, or swap the file for one of your own. ## Files that came from someone else’s listing When you add a theme, overlay pack or flow from the marketplace, its files are copied into your media library. Those files are still their creator’s. When you list a flow, overlay or theme that plays one of them, it goes through only if the creator’s listing says people may reuse it: - **CC0** files go through unchanged. - **CC BY** files go through with the creator’s credit text. You don’t type it: Bloopbot copies it from their listing, shows it under **Files and licences** on your listing’s page with the creator’s name and the listing it came from, and keeps it there for every version. A theme’s file keeps the CC BY licence and credit in its own row, whatever you choose in the form. - A file from a flow or overlay listing that allows **remixes** counts like CC BY. Bloopbot credits the listing and its creator, for example “Cosy alerts” by Hearthlight, in the same place. - A file from a listing that allows **no copies** is stopped. - **I made it**, **Licensed to me for redistribution in overlays** and **Made with an AI image tool I may use commercially** stop the file too. Those are things the first creator says about their own file, and they can’t pass them on to you. - A file whose licence Bloopbot can’t find is stopped as well. - Files that came from Bloopbot’s own official items are always free to reuse in your listings, with nothing to credit. A media pack still can’t carry them. - A listing its creator has unlisted keeps the licence it was shared under, so its files follow the same rules. The check runs when you press **Share…** and pick contents, when you submit, and again when your listing is checked automatically, so uploading the same picture again doesn’t get around it. A file you uploaded yourself, or one that came from your own listing, is never stopped. Saving a flow to your computer, exporting a bundle file and backups are your own business and are never checked. If a file is stopped, the message names it and says why. Swap it in the overlay or flow for a file you made or one that is free to reuse, or leave it out and point people to the original listing in your description so they can add it themselves. A [media pack](https://bloopbot.com/docs/publish-to-the-marketplace#media-pack) can’t carry another creator’s files at all, whatever their licence. ## Share flows and a theme together One listing can carry your flows and one of your themes, with the overlays that show them off: a whole stream setup that another streamer adds in one go. When they add it, they choose **Everything**, **Just the look** or **Pick parts**. 1. In **Made by you**, press **Share…**, then **Submit for review…**. 2. **Pick contents**: tick your flows under **Flows**. Under **Theme (optional)**, pick one of your themes. Its **Scene screens** start ticked; tick any other overlays under **Overlays (optional)**. 3. **Details**: give it a **Title** and a **Summary**, pick a **Category** (any category, **Themes** included), and tick the theme's own categories. 4. **Cover and previews**: [add a cover](https://bloopbot.com/docs/publish-to-the-marketplace#cover) if you like, and pick 1 to 4 previews of the look. 5. **Licence and Submit for review**: under **Files and licences**, give each file the theme, an overlay or an alert design plays a **Slot** and a **Licence**, as for [a theme](https://bloopbot.com/docs/publish-to-the-marketplace#slots). Files only your flows play, such as a key graphic or a sound a flow plays, are covered by **I made these files or have the right to share them**. Choose how others may reuse it, then press **Submit for review**. For a set of flows that differ only a little, such as one Stream Deck key per moment, build one, then [duplicate it](https://bloopbot.com/docs/flow-basics#duplicate) and change each copy. For example, a “Solo Adventure” listing with 16 flows, the Solo Adventure theme, its two overlays and nine alert designs is one listing. Its card reads **16 flows · theme · 2 overlays · 9 alerts · 8 Stream Deck keys**. A streamer who adds it gets the flows paused, and the theme ready to switch to, or waiting in their draft when their plan's themes are full. A new version of any listing can bring a theme or leave one out. What a listing carries decides how it shows; its category stays the one you pick. ## Share control panels with your flows A listing can carry [control panels](https://bloopbot.com/docs/control-panels) whose buttons start the flows in it. Starting from a pack you made ticks its panels for you; otherwise tick them under **Control panels (optional)** in **Pick contents**, which appears once you pick a flow. - **A button may only start a flow in the listing.** If a panel has a button for a flow you did not tick, **Pick contents** says so, naming the button, the panel and the flow, for example “The "Hype" button on your "Match control" panel starts "Raid alert", which is not in this pack.” Tick that flow, or take the button off the panel, then continue. - **A variable or readout tile must show a variable the listed flows or custom graphics use.** Those variables come with the listing. Whoever adds the listing gets each panel as a new panel, with its buttons pointed at their own copies of your flows. Reviewers see every tile of every panel, and a new version that changes a panel is reviewed like a changed flow. ## List overlays on their own A listing can be overlays and nothing else, such as a set of scene screens. Start from a pack you made that holds only overlays, or from **Share…** in **Made by you**. 1. **Pick contents**: tick the overlays under **Overlays**, in the order you want them, and leave **Flows** empty. (The heading reads **Overlays (optional)** once you pick a flow or a theme.) **Comes along** lists the alert designs and files they use. Press **Next: details**. 2. **Details**, **Cover and previews** and **Licence and Submit for review** work as for flows. With no flow to run, one screenshot is taken of your overlays on their own once the listing passes the automatic checks, and you can add up to 4 pictures of your own, such as your overlays on a stream. If your overlays hold custom graphics or widgets with examples, you can [choose what each picture shows](https://bloopbot.com/docs/publish-to-the-marketplace#plays). In the marketplace it shows as an overlay, or as a pack when your overlays bring alert designs of their own. Whoever adds it gets the overlays with new links, under your listing on **Overlays → Packs**. ## List a widget on its own A listing can be one or more of your widgets and nothing else. Whoever adds it gets each widget on their **Widgets** page, ready to place on any overlay ([Reuse your widgets in every overlay](https://bloopbot.com/docs/your-widgets)). 1. Give each widget at least one example ([Give it examples and a demo](https://bloopbot.com/docs/author-custom-graphics#examples)). A widget listed on its own is previewed from its examples, so the next step waits until each has one. 2. In **Made by you**, choose **Share…**, then **Submit for review…**. Under **Widgets**, tick the widgets you want, and leave **Flows** and **Overlays** empty. 3. **Details**, **Cover and previews** and **Licence and Submit for review** work as for flows. The screenshot shows each widget on a black canvas, playing its demo, or else its first example. It shows in the marketplace as a **Widget**, with your widget's icon on its card, listed in Studio's **Add** tab where you listed it. When you share overlays, every widget they show comes along by itself. A widget you added from someone else's listing is not offered. ## Theme review, and what streamers see A theme is reviewed like any listing. The automatic checks look at every file the moment you submit: its type and exact size must fit its slot, a slot other than Vertical backdrop, Decor and Sound may hold only one file, and every file needs a slot and a licence (and credit text for CC BY). A theme that fails comes back straight away with what to fix, listed under it in **Made by you**. Then a person looks at the theme, its cover, its previews and its words. Once it is listed: - it appears among themes on every channel, marked **Community** and **Designed by** your creator name, with your cover or previews and the categories you ticked; - it has a public page at `/marketplace/`, then your Twitch name and a short form of its title, showing its cover, the review, its colours and what it includes, and every file with its slot, licence and credit. Its **Sign in with Twitch to add** signs the reader in and brings them straight back to it in their dashboard ([Add from a public page](https://bloopbot.com/docs/the-marketplace#public)); - a streamer who adds it gets the theme, its overlays and their files in their media library, in a folder named after your listing under **Marketplace**. Adding it never changes their Active theme. ![A theme’s public marketplace page: Midnight Drive, Theme, Community · by Nightshift Studio, its cover of a starry Be right back screen with a smaller preview under it, and on the right the review: Adds the Midnight Drive theme and 1 overlay to your channel, a purple Sign in with Twitch to add button with You’ll come straight back here, ready to add, What you get, the folded What’s inside, Needs and Files and licence, and Checked before it was listed.](https://bloopbot.com/docs/screenshots/market-themes-listing-page.jpg) _A theme’s public page: its cover, the review, and Sign in with Twitch to add._ Themes are free to add; selling a theme isn’t available yet. To update your theme, press **Publish an update** on its row in **Made by you**: the steps start as a new version, with its words and cover kept. Streamers who added it are offered the update under **Marketplace → Installed**. ## Share a media pack A media pack is a listing that is nothing but files: stickers, alert pictures, sound effects, looping backgrounds. It has no flows, overlays or theme, so a streamer who adds it gets the files in their media library and nothing else changes on their channel. It can hold up to 64 files: a picture or a sound up to 5 MB each, a WebM video up to 25 MB, and 95 MB in all. You need the same [creator profile](https://bloopbot.com/docs/publish-to-the-marketplace#creator-profile) and confirmed backup sign-in email as for any listing, and the right to share every file. Start from whichever is nearest: - On the **Media** page in the sidebar, tick some files and press **Share to marketplace** in the bar above them. [Organise with folders and tags](https://bloopbot.com/docs/choose-and-upload-media#bulk) shows the bar. - On the same page, open a folder and choose **Folder actions** then **Share to marketplace**. Every file in it and in its subfolders is picked. - In **Marketplace** → **Made by you**, press **Share…** then **Share a media pack…** and pick the files there. ![The Sounds folder with drum-roll.wav and airhorn.wav ticked and applause.wav not: the bar above the files reads Select all files, 2 selected with Move to…, Add tag, Remove tag, Share to marketplace, Delete… and Clear selection.](https://bloopbot.com/docs/screenshots/media-library-bulk.jpg) _Two sounds ticked in the Sounds folder, with Share to marketplace between Remove tag and Delete in the bar above the files._ Share… opens beside **Made by you** on the same four steps as any listing, with your files already picked: 1. **Pick contents**: the box **Files in this pack** lists your library with each file's type (**Image**, **Sound** or **Video**), size and folder. Tick or untick files, type in **Search files** to find one by name, folder or tag, or narrow the list with **Type**. The line under it counts them, for example **6 of 64 picked.**, and **Clear** unticks everything. Press **Next: details**. 2. **Details**: give it a **Title**, pick a **Category**, write a one-line **Summary** and, if you like, a **Longer description**, as for [flows](https://bloopbot.com/docs/publish-to-the-marketplace#list). Press **Next: cover**. 3. **Cover and previews**: [add a cover](https://bloopbot.com/docs/publish-to-the-marketplace#cover), or leave it empty and Bloopbot draws one from your files: a sheet of your first pictures, or a sound wave when the pack is only sounds. You can also add up to 4 pictures of your own, 16:9 like 1920×1080, to show on the listing's page. Press **Next: licence**. 4. **Licence and Submit for review**: under **How you may share these files**, choose one **Licence** for the whole pack from the [licences](https://bloopbot.com/docs/publish-to-the-marketplace#licences) and, for **CC BY**, write the **Credit text**. Choose how others may reuse it, tick **I made these files or have the right to share them**, and press **Submit for review**. ![Made by you with Share… open beside it on step 1, Pick contents: Files in this pack lists chime.wav, cloud.png, heart.png, moon.png and pop.wav with their types, sizes and folder, all ticked, the count reading 6 of 64 picked, and Next: details below.](https://bloopbot.com/docs/screenshots/market-media-files.jpg) _Share… on the first step, Files in this pack, with the six files of the Cosy stickers folder ticked and 6 of 64 picked._ ![Step 4 of Share… for a media pack, Licence and Submit for review: How you may share these files with the licence CC BY (with credit text), the credit text “Cosy stickers” by Hearthlight, CC BY 4.0, then How others may reuse it with Remix allowed with credit chosen, the tick I made these files or have the right to share them, and Submit for review.](https://bloopbot.com/docs/screenshots/market-media-licence.jpg) _The last step: one licence, CC BY with its credit text, for every file in the pack, then how others may reuse it and the rights tick._ Your tags on a file travel with it and are added to the tags of whoever gets it. Your folders do not: the files land in a folder named after your listing. The pack is a snapshot of the files as they are when you submit. Files you add, replace or edit in your library afterwards are not in it until you share a new version. For example, tick four sticker pictures and two sounds in a **Cosy stickers** folder, press **Share to marketplace**, title it **Cosy stickers**, choose **CC BY** with the credit “Cosy stickers” by Hearthlight, CC BY 4.0, and submit. Once it is approved, a streamer who adds it gets six files in **Marketplace** › **Cosy stickers**, and its public page lets anyone look at the pictures and play the sounds first ([The Marketplace](https://bloopbot.com/docs/the-marketplace#media-packs)). The pack goes through the same [review](https://bloopbot.com/docs/publish-to-the-marketplace#review) as any listing: the automatic checks first, then a person. What comes back, and why: - **More than 64 files**: the step says **A media pack holds up to 64 files** and the count turns red. Untick some, or split them into two packs. - **A file over its limit**: the checks name it. A picture or a sound is 5 MB at most, a WebM video 25 MB, and the whole pack 95 MB. Make the file smaller in your editor, upload that, and pick it instead. - **A file another creator shared first**: the checks say **The file … was first shared in the marketplace by another creator, so it can't go in your media pack. Use a file you made.** This holds however the file reached you, even if you added it from someone else's listing or uploaded the same picture yourself. Take it out, or replace it with one you made. - **No licence, or CC BY without credit text**: the step says **Choose the licence for the files.** or **Add the credit text for CC BY.** beside a greyed **Submit for review**. - **A file removed after a copyright claim**: it can't be listed again. Replace it with one you made. ## Update a media pack In **Made by you**, press **Publish an update** on the pack's row. The steps start with its title, words, cover and licence, with the last version's files ticked again wherever they are still in your library. A version is a snapshot, so tick any new files you want in it and untick the ones to leave out. If some files of the last version are not in your library any more, the step says how many. Say **What changed in this version** under **Details**. The listed version stays up while the new one is in review. Once it is approved, streamers who added the pack are offered **Get new files** under **Installed**; it copies only the files they do not have, and never removes what they already hold, including any file you took out of the pack. ## Screenshots of your bundle Bloopbot takes pictures of your flows for you. Once a submission passes the automatic checks, it is run on a sample stream — a game on screen and a chat beside it — and photographed the way a viewer would see it. Each picture shows one moment: - an alert your flows play, or a widget they draw, over the sample game; - or, for a chat command, what the bot says in chat when a viewer types it. Up to 3 pictures are taken, one for each kind of moment, alerts first. They never show your flows themselves, so how you built something stays yours. The pictures are on your listing’s card, its preview and its public page, and you can see them in **Made by you** while it waits for review. You choose which of them show, and in what order, beside pictures of your own: see [Choose your previews and screenshots](https://bloopbot.com/docs/publish-to-the-marketplace#previews). If you [add a cover](https://bloopbot.com/docs/publish-to-the-marketplace#cover), it leads instead of the first picture. A listing that shows nothing on screen and says nothing in chat gets a picture of its category instead. If a picture does not show your flows at their best, change what they do on a sample and submit a new version: every version is photographed afresh. ## Choose what each picture shows When your overlays hold a custom graphic, a screenshot of it needs something to show: a raid card does nothing until a raid arrives. By default each picture plays what your flow sends the graphic, or else the graphic's own [demo](https://bloopbot.com/docs/author-custom-graphics#examples). **What each picture shows**, under **Previews and screenshots** in the cover step, lets you choose instead, for each screenshot and for the video. You need an overlay with a custom graphic, or with a built-in widget that has examples (the Poll, Event list, Clip player and Media share player). A graphic with no examples can still be set to **Nothing (idle)**. 1. In **Share…**, pick your overlays and go to step 3, **Cover and previews**. 2. Under **What each picture shows**, find the picture: **Screenshot** followed by the moment it shows (**New follower: Newfriend**, or **your overlays on their own** when your listing has no flows), or **Video**. 3. Each graphic in your listing has a list. Choose **Automatic** (what pictures always showed), **Its demo**, **Nothing (idle)**, or one of its examples by name. A built-in widget's examples are under **Built-in examples**. 4. Choose for another picture, or leave it on **Automatic**, then continue as usual. ![What each picture shows, in Share… step 3: a Screenshot box and a Video box, each with a Raid card list set to Small raid for the screenshot and Its demo for the video.](https://bloopbot.com/docs/screenshots/market-share-plays.jpg) _What each picture shows, in Share… step 3: a Screenshot box and a Video box, each with a Raid card list set to Small raid for the screenshot and Its demo for the video._ For example, set the screenshot to **Huge raid** so the picture shows the 500-viewer raid, and the video to **Its demo** so it plays the whole demo. - **One choice per picture and graphic.** If your overlays have several graphics, each has its own list, so one can show an example while another idles. A graphic you leave on **Automatic** plays as before. - **A screenshot is chosen for its moment.** A moment is photographed several times along its timeline, and all of those pictures share the choice. The video uses its own choice for every moment it records. A choice stays with its flow if you pick your flows in another order, and is dropped, with a note, if you rename or remove the flow. - **An example is on screen when the picture is taken.** It starts a second before the picture, whatever another graphic's demo is doing then. - **An example plays with its data.** The graphic's example records and values are used too, so a song or a counter reads as you set it. Examples never reach OBS, Twitch or your flows. - **A new version keeps your choices.** They start from what the listing shows now. If you removed a graphic or an example they pointed at, that choice is dropped, **What each picture shows** says so, and the picture plays automatically; it never stops a picture from being taken. After you submit, the same note is on your listing in **Made by you**. - **Capture again keeps them.** If a picture is taken again, it uses your choice again. Pictures are still taken after your listing passes the automatic checks, so you see them in **Made by you** a little later. ## While it is in review Every submission is checked automatically the moment you press **Submit for review**, then reviewed by a person. The automatic checks send it straight back, with what to fix, when: - a flow, a variable or an alert design holds something that looks like a password, a key or a private web address — secrets never go in a shared listing; - a file is not an image, sound or video the media library accepts, or is over its limit (5 MB for a picture or a sound, 25 MB for a WebM video); - a file, a preview or the cover was removed from the marketplace after a copyright claim; - a media pack carries a file that came from another creator’s listing, or that another creator first shared in the marketplace: a pack can only hold files you made or have your own copy of. You are told which files, and can take them out; - a flow is a copy of one in another creator’s listing. If that listing allows remixes, list yours as a remix of it to credit the original; if it does not, make the flow your own or leave it out. **Made by you** shows each listing with one status: - **Draft**: you withdrew it before any version was listed. Press **Publish an update** on it when it is ready. - **In review · 2nd in the queue**: waiting for a person, with its place in the queue. We aim to decide within a day, and the decision is also emailed to your backup sign-in email. - **Changes requested**: it came back. Press **See notes** beside it to read the reviewer’s note, headed **From the reviewer**; the automatic checks’ list sits under it, headed **Fix these, then submit again:**. Press **Publish an update** on it once you have fixed it. - **Listed**: it is in the marketplace. While a new version waits, the row says so, for example “Version 2 in review · 1st in the queue”. - **Unlisted** and **Taken down**: see [New versions, unlisting and relisting](https://bloopbot.com/docs/publish-to-the-marketplace#versions) and [If your bundle is taken down](https://bloopbot.com/docs/publish-to-the-marketplace#taken-down). - **Shared by link**: a pack or flow you share by link, not in the marketplace, with the link icon (**Copy link**). ![Made by you: each row with its status beside its title and its actions under it. Greeter (Listed) shows Publish an update and Edit details; Lurk thanks (Changes requested) shows Publish an update; Stream helpers (Listed, version 2 in review) shows Edit details; Raid welcome is In review; Break helpers is Shared by link.](https://bloopbot.com/docs/screenshots/market-made-by-you.jpg) _Made by you: each row with its status beside its title and its actions under it, from Publish an update and Edit details to the icon buttons._ Each row ends with its actions, in the same order on every row: **Publish an update**, **Edit details**, then the icons for **Unlist** or **Relist**, **View listing** (it opens a listed one’s public page) and **Withdraw**. A row only shows the actions that apply to it. A row for a pack you made also says **Made from** with the pack’s name, a link back to it. The top of the list says how many of your review slots are in use: you can have 3 submissions waiting at once, and submit up to 10 times a day. Review follows [Twitch’s Community Guidelines](https://safety.twitch.tv/s/article/Community-Guidelines): anything you could not show or say on Twitch is refused. ## Share your bundle’s page Once your listing is live, it has its own page in the public marketplace, at `/marketplace/`, then your Twitch name and a short form of its title — for example `/marketplace/cosycorner/cosy-alerts`. If you change your Twitch name, the page moves to the new name, and links to the old address still reach it. Anyone can open it without signing in: it shows your cover, your summary and description, the same review a streamer sees in their dashboard, what is inside, reviews, your creator name, the licence and how many channels added it. Readers sign in from it and come straight back to add it ([Add from a public page](https://bloopbot.com/docs/the-marketplace#public)). Share that link wherever you talk to other streamers. Your listed bundles also show on your channel's home page, `/c/`, the page your viewers use for giveaways and the store. An **In the marketplace** section lists your three most-added bundles, each linking to its marketplace page, and links to your creator page for the rest. It appears once you have something listed, and leaves again if you unlist everything. ![A theme’s public marketplace page: Midnight Drive, Theme, Community · by Nightshift Studio, its cover of a starry Be right back screen with a smaller preview under it, and on the right the review: Adds the Midnight Drive theme and 1 overlay to your channel, a purple Sign in with Twitch to add button with You’ll come straight back here, ready to add, What you get, the folded What’s inside, Needs and Files and licence, and Checked before it was listed.](https://bloopbot.com/docs/screenshots/market-themes-listing-page.jpg) _Your listing’s public page: anyone can read it without signing in._ Once something of yours is listed, you also have a creator page at `/creators` followed by your Twitch login — for example `/creators/cosycorner` — with your creator name, the line about you, and everything you have listed. Each of your listings links to it. ![A public creator page for PixelPal: the line Soft, cosy alerts for slow streams, 1 bundle, 3 channels in all and 3 reviews, and a card for the Cosy Alerts bundle with its screenshot.](https://bloopbot.com/docs/screenshots/marketplace-creator-page.jpg) _Your creator page: your name, the line about you, and what you have listed._ Streamers who have used your listing for 3 days can review it, and its rating shows once 3 of them have. You can’t remove a review of your own listing; if one breaks the rules, report it like anyone else. The page also has **Report this bundle**, for anyone who thinks it breaks the rules. If you unlist it, the page says it is no longer listed. ## New versions, unlisting and relisting Your listed pack keeps its approved snapshot even if you delete its original flows, overlays or variables from your channel. Open the pack in **Marketplace** → **Discover** to add its missing contents back, including when it says **Made by you**. See [Restore contents you deleted](https://bloopbot.com/docs/the-marketplace#restore). Only the approved version comes back; a deleted variable starts at the pack's saved value. - **Publish an update** on a row in **Made by you** submits a new version. It opens the same steps as **Share…**, starting with the listing’s words and its cover; say **What changed in this version** under **Details**. The listed version stays up — with its title, summary, description and cover — while the new one is in review. Once it is approved, streamers who added it are offered the update, with what changed beside it. Their untouched flows update in place; any flow they changed stays as they changed it. The button is missing while a version of that listing is already waiting in review. - **Edit details** changes only a listed listing’s words and cover, with no new version: see [Edit details](https://bloopbot.com/docs/publish-to-the-marketplace#edit-details). - The crossed-out eye (**Unlist**) beside a listed row takes a listing out of the marketplace. Channels that added it keep their copies. - The restore icon (**Relist**) beside an unlisted row puts it back, with no new review. ## Edit details Use **Edit details** to fix a typo, reword the summary or description, change the category or swap the cover of something that is already listed. It changes no flows, files or theme, so it is not a new version, and nobody who added the listing is offered an update. To change what the listing contains, press **Publish an update** instead. 1. In **Made by you**, press **Edit details** on a listed row. The button is only there for a listing that is **Listed**. 2. In **Edit the details of** your listing’s title, change the **Title**, **Category**, **Summary** or **Longer description**, or replace or remove the cover under **Add a cover (16:9)**. 3. Press **Send for review**. ![Edit details for Greeter: the Title, Category, Summary and Longer description filled in from the listing, the cover below them, and Cancel and Send for review at the bottom.](https://bloopbot.com/docs/screenshots/market-edit-details.jpg) _Edit details for a listed listing: its title, category, summary, longer description and cover filled in, with Cancel and Send for review._ Your listing keeps its current words and cover until a reviewer approves the change. Meanwhile the row says **Details change in review**, and **Withdraw change** beside it takes the change back. If a reviewer sends it back, the row shows their note under **From the reviewer, on your details change**; press **Edit details** again to fix it and resend. Listing a new version is a separate review, so the two can wait side by side. ## If your bundle is taken down A listing that breaks the marketplace rules, or uses someone else’s work, can be taken down. You are told on your dashboard and by email, with the reason. A taken-down listing leaves the marketplace for good and gets no more updates; channels that added it keep their copies. In **Made by you** it reads **Taken down**, with the reason under it. If you think a policy takedown was mistaken, email [support@bloopbot.com](mailto:support@bloopbot.com) with your listing’s marketplace address and why you disagree. For example, explain which part of a flow was misunderstood and what it actually does. A person reviews the appeal and replies; the taken-down listing stays unavailable while that happens. The same address accepts copyright claims if you cannot use the [claim form](https://bloopbot.com/marketplace/copyright). After a copyright claim, the files the claim names — the cover and previews included — are also removed from every channel that added them, and can’t be listed again. If you believe the claim is wrong, press **Send a counter-notice** on its row in **Made by you**, and say why, and that you have the right to share the files. A person reviews it; sending it does not restore the listing or the files in other channels automatically. How claims and counter-notices work is set out in the [terms](https://bloopbot.com/terms#marketplace-copyright). ## Troubleshooting - **Next is greyed out**: the line beside it says what the step still needs, for example “Pick a category.” - **“Shorten the longer description to fit.”**: the description is over 2,000 characters, and the count under it turns red. Formatting counts too: a few characters for each bold word, heading or link. - **Save creator profile stays greyed out**: enter a creator name and tick the creator terms. If the step asks you to confirm your backup sign-in email first, do that under **Account**. - **Submit for review is greyed out, with “You have 3 submissions waiting on review”**: wait for a decision, or withdraw one. - **“This bundle carries files”**: tick the rights box, or leave out the flow that plays the file. - **“The … button on your … panel starts …, which is not in this pack”**: tick that flow in **Pick contents**, or take the button off the panel ([Share control panels with your flows](https://bloopbot.com/docs/publish-to-the-marketplace#panels)). - **“… came from another creator’s marketplace listing, and only files under CC0 or CC BY (with credit) can be reused”**: the file in brackets is stopped, and the words in brackets say why: its licence doesn’t let others reuse it, its listing allows no copies, or Bloopbot can’t find its licence. Swap it for a file you made or one that is free to reuse, or point people to the original listing ([Files that came from someone else’s listing](https://bloopbot.com/docs/publish-to-the-marketplace#reused-files)). - **“… was first shared in the marketplace by another creator, and its licence …”**: the automatic checks found the same file, uploaded again, under a licence that doesn’t let it be reused, or a CC BY one without its credit. Replace it with one you made ([Files that came from someone else’s listing](https://bloopbot.com/docs/publish-to-the-marketplace#reused-files)). - **I can’t pick a cover or a preview**: it isn’t 16:9. Take a 1920×1080 screenshot of your overlay and upload that. - **“The cover … was removed from the marketplace after a copyright claim”**: pick another cover, or leave it empty. - **A picture shows the wrong example, or a graphic shows nothing**: open [What each picture shows](https://bloopbot.com/docs/publish-to-the-marketplace#plays). **Nothing (idle)** draws the graphic with no event playing, and a choice dropped because an example was removed says so in **Made by you**. Choose the example again in your next version. - **My listing shows a picture of its category, not a screenshot**: the pictures are taken shortly after a submission passes the automatic checks, so a brand-new one may not have them yet. A listing that shows nothing on screen and says nothing in chat on a sample stream keeps the category picture. Add a [cover](https://bloopbot.com/docs/publish-to-the-marketplace#cover) to choose the picture yourself. - **“It did not pass the automatic checks”**: the list under it in **Made by you** names each flow or file and what to change. Fix them on your channel, then press **Publish an update** on it. - **“It was removed from the marketplace after a copyright claim, so it can’t be listed again”**: a file in the listing was taken down. Replace it with one you made, then submit again. - **A file’s Slot menu has nothing that fits**: no slot takes that kind of file — a video, say. Leave out the overlay that uses it. - **“This file is 1280×720; the Be right back backdrop is 1920×1080 …”**: resize the image to the slot’s size in your media library, or pick a slot it fits. - **“A media pack holds up to 64 files”**: untick files in **Files in this pack** until the count is 64 or fewer, or share two packs. - **“… was first shared in the marketplace by another creator”**: a file in your media pack was listed by someone else first. Take it out, or use a file you made ([Share a media pack](https://bloopbot.com/docs/publish-to-the-marketplace#media-pack)). - **My media pack asks for a licence, or for credit text**: choose one licence for the whole pack in the last step; **CC BY** also needs the **Credit text**. - **A theme is not offered under Theme (optional)**: you added it from the Marketplace, so it is someone else’s design. Share a theme you made on your channel. ## Share authored graphics An overlay that shows one of your widgets carries the widget as an item of its own: its HTML, CSS, JavaScript, exposed settings, selected channel variables, icon, where it is listed and bound library media. Publish its Studio draft first, add the overlay to a pack, then choose Marketplace or Bundle file. Include flows that change its variables, and declare those variables before exporting. Recipients get the widget on their **Widgets** page and can change its exposed controls on each layer without editing source. Only submit code and media you have the right to distribute; review is the same as for other overlays. [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics#share) shows the steps. --- # Connect values with data wires See where each step’s values come from, and drag a wire to use one step’s value in another. Updated 7 October 2026 ## What a data wire is Most steps hand something on when they run: **Check song request limits** hands on how many songs are waiting, **Find a song** hands on the track it settled on, a trigger hands on who started the flow. On the canvas those values sit as small dots, called **ports**, in a tray under each card: what a step hands on down the right of its tray, and the fields that read a value down the left. A **data wire** is the dashed line from one step’s value to the field that uses it. It is drawn from what the field already says: a wire and the `$(from.…)` text it stands for are the same thing, so a flow you built before wires existed shows its wires the moment you open it, and nothing about how it runs has changed. The colour tells you the kind of value — blue for text, amber for a number, green for a yes/no, lavender for a list. ![Three steps on the flow canvas — Chat command, Check song request limits and Chat message — each with a tray of values under it. An amber dashed wire runs from the Queue length value of Check song request limits to the Message field of Chat message, whose summary names it as Check song… › Queue length, and a blue dashed wire runs from the trigger’s Who typed it value to the same field, which carries a user badge.](https://bloopbot.com/docs/screenshots/data-wires-canvas.jpg) _Check song request limits hands its Queue length value to the Chat message’s Message field along an amber dashed wire, and the trigger hands Who typed it to the same field along a blue one._ ## Before you start - Open the flow and choose **Canvas** in the top bar. The **Simple** view shows the same fields as a form, without ports or wires. - The step whose value you want must run _before_ the step that uses it — connected ahead of it on the flow’s path. A value from a step further along has not been made yet. - The **Insert…** menu beside a field still works and is the keyboard route: choosing a step’s value there draws the same wire. ## 1. Draw a wire 1. Find the value on the right of the first step’s tray — **Queue length** on **Check song request limits**, for example. Hover a value to see the name it goes by in a field, such as `queueLength`. Up to four values are shown; the rest fold into **+N**. Hovering it lists them, and pressing it shows them all, each with its own dot; press **−** to fold them away again. 2. Press on the value’s dot and drag. Drop it on a field’s dot on the left of another step’s tray to use it in that field. 3. Or drop it anywhere on the other step’s card. A small picker asks _Where should Chat message use Songs this viewer has queued?_ and lists that step’s fields. Pick one. A field that cannot take this kind of value is greyed out, with the reason beside it. 4. Press **Save**. ![A value dropped on the Chat message card: a small picker reads “Where should Chat message use Songs this viewer has queued?” above a highlighted Message button and a Cancel button.](https://bloopbot.com/docs/screenshots/data-wires-field-picker.jpg) _Dropping a value on a card: the picker asks which field should use it, and Message is the field that can._ A value folded into **+N** gets its dot back when you press **+N**. The field’s **Insert…** menu reaches it too; the wire appears once the value is in the field. > **What a field accepts** > > A text field takes any value. A number or yes/no field takes a matching value, or text. A list only goes into a field built for lists, such as a For each step. A refused drop says why in a short message — for example that the value is a number and the field wants a link — and changes nothing. ## 2. Words and values in one field A field can mix your own words with values, such as `There are ` followed by a value, then ` songs waiting, $(user).` On the card each value shows as a small chip that names the step and the value the way its tray does — **Check song… › Queue length** — never the raw `$(from.…)` text behind it, since a step's own id in that text is one the editor makes up. Every wire into the field lands on the same dot, and one field can take as many wires as you like. Dropping a wire on a field that already has words adds the value at the end, where you can move it as you type. Dropping it on a field that holds a single value replaces that value. Either way it is one step for **Undo**. ## 3. Trigger words, variables and loop values Not every value comes from a step. Values the trigger gives you, such as `$(user)` or `$(query)`, your own variables (`$(var.…)`) and the current item of a For each loop also show as small **badges** next to the field’s dot, naming the value. A trigger value has a wire as well, drawn all the time like any other: the blue line from the trigger in the first picture is one. A variable has no wire, since it is not handed on by a step. A loop value’s wire is drawn only while you select the step that reads it, so a busy loop stays readable. To see every wire in the flow at once, press **Show all data wires**, the link icon in the canvas toolbar beside **Fit to view**; press it again to go back. ## 4. Remove a wire 1. Click the wire. It turns to the highlight colour and a small close icon appears on it. 2. Press the close icon (its name is **Remove this data wire**) or the Delete key. Removing a wire takes that value out of the field and leaves the rest of the field’s words alone. **Undo** puts it back. A loop wire stands for every loop value the field reads, so it is removed by editing the field instead. ## Red wires: a value that is not there yet A wire drawn in red reads a step that has not run by the time the reading step runs. That value would always be empty, so Bloopbot refuses to save the flow and says what to change, in words like: _“$(from.…) is always empty here: Check song request limits hasn’t run by the time Chat message runs. Connect Chat message after Check song request limits.”_ (the `$(from.…)` names the step by its own internal id, not a word you would recognise.) ![A flow where Chat message runs before Check song request limits: a red dashed wire runs from the Queue length value of Check song request limits back to the Message field of Chat message, beside a blue dashed wire from the trigger’s Who typed it value.](https://bloopbot.com/docs/screenshots/data-wires-red.jpg) _Chat message runs before Check song request limits, so the wire from Queue length back to Chat message is red._ 1. Look at where the red wire starts: that step needs to come first. 2. Reconnect the flow so the reading step comes after it, or take the value out of the field and use one that exists at that point. 3. Save again. The wire turns back to its value’s colour. A flow saved before this check existed keeps running as it always did: the value simply comes through empty. **Flows → Needs attention** lists it as _reads a value before it’s set_, with the same message, and you see the red wire when you open it. Fix it the same way, then save. ## A worked example: a !queue command A command that tells the viewer how many songs are waiting, without typing a single token by hand. 1. Open **Flows → + New flow → Start blank**, add a **Chat command** trigger and set its command to `queue`. 2. Add **Check song request limits** after the trigger. Leave **The song to look up** blank: this command only needs the queue. 3. Add a **Chat message** after it and type `There are songs waiting, $(user).` — with a gap where the number goes. 4. Drag **Queue length** from the check’s tray onto the Chat message card and pick **Message**. The value lands at the end of the message as a chip: select the Chat message and move that chip into the gap in the **Message** box. 5. Press **Save**, then **Test fire**, and expand the **Run log**. The test is simulated and does not send a Twitch message. 6. Switch the flow on and type `!queue` in your Twitch chat to see the real reply. ## What you should see - An amber dashed wire from **Queue length** to the Chat message’s **Message** dot, and a chip in the message on the card. - In the Run log, the simulated message with the number filled in. - In chat, with three songs waiting and PixelPal asking: `There are 3 songs waiting, PixelPal.` ## Troubleshooting - **The drop did nothing and a message appeared.** The field wants a different kind of value. Read the message, then pick another field or another value. - **Every field in the picker is greyed out.** None of that step’s fields can take this value. Hover a field for the reason. - **The wire is red and the flow will not save.** The value comes from a step further along the path — see [Red wires](https://bloopbot.com/docs/data-wires#red). - **The value is empty in chat.** Check that the step it comes from really ran on that path: a condition may have sent the run another way. A value handed out by a group only exists after the exits that hand it out — [reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes) explains exits. - **I cannot see a wire for a loop value.** Loop values are badges: select the step that reads it, or press **Show all data wires**. - **The value I want is under +N.** Use **Insert…** on the field; the wire appears once it is in. --- # Reuse a set of nodes as a group Turn a few steps into one reusable card with named ways in and exits, drop it into any flow, and change it in one place. Updated 15 October 2026 ## What a group is A **group** is a set of steps you build once and use in as many flows as you like. In a flow it is a single card. Change the group and every flow that uses it changes too, so a check you rely on in three commands lives in one place. The card reads like any other step. Its **ways in** are on the left, its named **exits** are on the right — **Allowed**, **Refused**, **Full** — and every group also has an **error** exit. The values it hands out sit in its tray, under the name of the exit that hands them out, ready for a [data wire](https://bloopbot.com/docs/data-wires). ![A group card named Queue has room, with an Open button, the exits Full, Room and Error on its right and, under the exit headings FULL and ROOM, a queueLength value each. A Chat command leads into it, Full and Room lead to two Chat messages, and dashed wires carry queueLength into both messages.](https://bloopbot.com/docs/screenshots/group-node-card.jpg) _A group called Queue has room in a flow: one way in from the Chat command, the Full and Room exits leading to two Chat messages, and the queueLength value it hands out wired into both._ ## Before you start - Groups are built on the **Canvas**. A flow that uses a group can still open in the Simple view: the group’s inputs show as fields there. - Anyone who can edit your flows can make and edit groups, including your editors. - Groups belong to your channel. A group that came with a template is your own copy, and changing it never touches anyone else’s. ## 1. Turn a selection into a group 1. Open a flow on the **Canvas** and select the steps you want to reuse: click the first one, then Shift-click the others (Ctrl-click on Windows and ⌘-click on a Mac work too). 2. In the panel on the right, press **Group selection**. It tells you how many ways in and exits the group will have. 3. Give the group a name, such as `Queue has room`. 4. Name each exit for what it means. They start with the label of the connection they replace, such as `true` and `false` — with the step’s name in front when two connections share a label, such as `Check a value true`; `Full` and `Room` read better on the card. 5. Press **Save as group**. ![Two selected steps on the canvas, Check song request limits and Check a value, and the Selection panel reading 2 nodes selected: Group name is Queue has room, the Exits list renames true to Full and false to Room, each marked “hands out queueLength”, above Save as group and Cancel.](https://bloopbot.com/docs/screenshots/group-selection.jpg) _Two steps selected and Group selection open: the group is named Queue has room, and its two exits are renamed Full and Room. Each says which value it hands out._ The group is saved, and the steps you selected are replaced by one group card wired exactly as they were. Every connection that came into the selection becomes a way in, every connection that left it becomes an exit, a value the selection read from an earlier step becomes an input on the card, and a value a later step read from the selection becomes a value its exit hands out. **Undo** puts the steps back in one go, and removes the group it had just made when nothing else uses it yet. When a selection cannot become a group — a trigger is in it, for example — **Group selection** is greyed out and the reason is written under it. ## 2. Open a group and find your groups Double-click a group card, or select the **Open** icon at the top right of it, to edit what is inside. The canvas swaps to the group’s own steps, and the top bar shows where you are: the flow’s name, then the group. Click the flow’s name to go back to it. A bar across the top of the group says who uses it — for example _“Used by 1 flow: Is there room? — saving recompiles it.”_ — so you know what a change reaches before you make it. With nothing selected, the panel on the right shows the group’s **Ways in** and **Exits**, as its card shows them in every flow. ![The editor open inside the group Queue has room: the top bar reads Is there room? › Group › Queue has room with History, Test the flow and Save; a bar reads “Used by 1 flow: Is there room? — saving recompiles it.”; the canvas runs from a Group input through Check song request limits and Check a value to two Group outputs, Full and Room; the panel lists Ways in (in, no inputs) and Exits (Full and Room, each handing out queueLength).](https://bloopbot.com/docs/screenshots/group-body.jpg) _Inside Queue has room: the path back to Is there room? at the top left, the Used by bar, the steps from Group input to the two Group outputs, and the Ways in and Exits panel._ Every group your channel has is on the **Flows** page, under the **Groups** tab beside **Flows**. Each row says which flows use it and how many ways in and exits it has. **+ New group** starts an empty one; select the arrow icon (**Open the group**) on a row to edit it, even a group no flow uses yet. ![The Groups tab of the Flows page, reading Groups · 2, with the line “A group is a set of nodes you build once and drop into any flow.” and a + New group button, above two rows: Enforce chat rules, used by AI chat moderation — delete and warn, 1 way in and 2 exits; Screen reward text, used by Check reward text before it goes on stream, 1 way in and 2 exits. Each row has an open chevron and a bin icon (Delete).](https://bloopbot.com/docs/screenshots/groups-tab.jpg) _The Groups tab: Enforce chat rules is used by AI chat moderation — delete and warn and has 1 way in and 2 exits; Screen reward text is used by Check reward text before it goes on stream and has 1 way in and 2 exits._ ## 3. Ways in, inputs, exits and values Inside a group, a **Group input** step is a way in and a **Group output** step is an exit. Select one to edit it in the panel. | Part | On the group card | Inside the group | | --- | --- | --- | | Way in | A connection point on the left, named after the way in | A **Group input** step the run starts from | | Input | A field under its way in: type a value, pick one from **Insert…** or drop a data wire on it | Read as `$(input.name)`; the default you give it is used when the card leaves the field blank | | Exit | A named connection point on the right | A **Group output** step; a path that reaches one leaves the group by that exit | | Exit value | A port under the exit’s name, read as `$(from..name)` (`` is the group card’s own id, not a word you type) | Filled in on each **Group output** step for that exit | An input is text, a number or a yes/no. A value belongs to its exit: a group that finds a track can hand out its **Spotify link** and **Song title** on an **Allowed** exit — both read from **Insert…** rather than typed — and a refusal line on a **Refused** exit, so a step after **Refused** has no track to read. **Insert…** only offers a step the values the exit before it hands out. A group can have more than one way in, each with its own inputs, and each call through a way in starts fresh. Use **+ Add a way in** and **+ Add an exit** in the panel, and the arrows beside each to set the order they appear on the card. Renaming an input keeps every flow’s value for it. ## 4. Use a group in another flow 1. Open the other flow on the **Canvas**. 2. Press **Browse the library** and choose the **Groups** topic, or type the group’s name into **Add a node** (⌘K). Your groups also turn up under **Suggested next**. 3. Add it, connect the step before it to a way in, and connect each exit you use to what should happen next. 4. Fill in its inputs on the card, and wire its exit values into the steps after it. 5. Press **Save**. ![The node library’s Groups topic showing Enforce chat rules and Screen reward text, each used by one flow.](https://bloopbot.com/docs/screenshots/node-library-groups.jpg) _The node library’s Groups topic, listing Enforce chat rules and Screen reward text with what each one leaves by._ ## 5. Save, test and undo a group Saving a group saves it for every flow that uses it, and checks each of those flows first. If the change would break one — an exit a flow depends on is gone, or a value it reads is no longer handed out — nothing is saved and a bar says **Not saved.** and names the flow and the problem. Fix the group, or fix that flow first, and save again. **Test the flow**, in the group’s top bar, runs the flow you opened the group from as a simulated test: the steps inside the group light up as the run passes through them, and the Run log lists them under the group’s line. A simulated test does not send a Twitch message. **History**, the clock icon in the top bar, lists the group’s earlier versions; restoring one goes through the same check as a save. ## What reaches inside a group - **The trigger passes through.** Inside a group, `$(user)`, `$(query)` and the rest of the trigger’s words still work, and actions still act for the viewer who started the flow. - **Steps outside do not.** A step inside cannot read a step in the flow around it: anything it needs comes in as an input. A value a step keeps for the rest of the run — a Web request’s **Keep the answer as**, read as `$(local.…)` — stays on its own side: a group neither sees the flow’s nor leaves its own behind. - **Each place a group sits has its own cooldown.** A Cooldown inside a group counts per card: two cards of the same group in one flow keep separate cooldowns, and a flow with the group in it once has one, whichever way in the run took. - **Errors leave by the error exit.** A step inside that fails with nothing connected to its own **error** sends the run out of the group’s **error** exit. A Stop step inside ends the whole run. - **Limits are the flow’s.** Steps inside a group count towards the flow’s own limits on steps, time and chat messages. Groups can sit inside groups, three deep at most. ## Groups that come with templates Two templates ship with their checks already in a group. Installing the template installs the group as your own copy; open it from the flow to read or change it. | Group | Used by | Exits | | --- | --- | --- | | **Enforce chat rules** | AI chat moderation — delete and warn | **Handled**, **Clean** | | **Screen reward text** | Check reward text before it goes on stream | **Safe**, **Held back** | [Set up AI moderation](https://bloopbot.com/docs/ai-moderation) and [Screen viewer text with AI](https://bloopbot.com/docs/text-screening) walk through what each one decides. A group of your own can hand values out of an exit: the card shows each value by its name in words, and **Insert…** offers it under that same name to any step that reads it. Renaming a value in your copy changes the words on the card; the short name behind it, and every step that reads it, stays as it is. An earlier **Song request** or **Smart !sr** used a third group, **Song request checks**. A copy you installed keeps it and still works; the current templates make one **Can they request a song?** check instead. ## Delete a group On the **Groups** tab, select the bin icon (**Delete the group**) on the group’s row. A group that is still in use is not deleted: the message names every flow that uses it, including a flow waiting in the Trash, marked _(in the Trash)_ — restoring that flow would otherwise bring back a flow with a missing group. 1. Open each flow the message names and remove the group card, or replace it with the steps it stood for. 2. For a flow marked _(in the Trash)_, open the Trash and select the bin icon (**Delete forever**) on it, or restore it with the restore icon (**Restore**) and remove the group. 3. Delete the group again. ## A worked example: Queue has room A check that answers “is there room in the song queue?”, reused by any command that needs it. 1. Build a flow `!room`: **Chat command** → **Check song request limits** → **Check a value** with **Check** filled in from **Insert…** with **Check song request limits › Queue length**, **is at least** and `10`. Wire **true** to a Chat message reading `The queue is full (` then that same value from **Insert…**, then ` songs). Try again later!`, and **false** to `There is room: ` followed by the value, then ` songs waiting.` 2. Select **Check song request limits** and the **Check a value** step together and press **Group selection**. 3. Name it `Queue has room`, rename the exits `Full` and `Room`, and press **Save as group**. 4. Press **Save** on the flow, then **Test fire** and read the Run log. 5. In another command, add **Queue has room** from the library’s **Groups** topic and connect its **Room** exit to whatever should happen when there is space. ## What you should see - One **Queue has room** card where the two steps were, with **Full**, **Room** and **error** exits and the two messages still wired to them. - Both messages’ numbers wired from the `queueLength` value under the card’s exit. - On the **Groups** tab: _Used by Is there room?_, and after the second command, both flows. - In chat, with twelve songs waiting: `The queue is full (12 songs). Try again later!` ## Troubleshooting - **“Find the track needs $(query); the On a timer trigger doesn’t provide it.”** The group reads a word the trigger does not have. Fill the group’s input on the card instead — for example the song from a variable — or use the group under a trigger that has it, such as a Chat command. - **“$(from.…) is always empty here: no exit that hands out “title” leads here.”** The step reads a value from an exit it does not come after (the `$(from.…)` names the group card by its own internal id, not a word you would recognise). Move it after the exit that hands the value out, or read a value the exit before it does have. - **“… is empty on some ways here.”** A warning, not an error: some paths reach the step through an exit without that value, and there it is empty. Split the step per exit if the empty case matters. - **Not saved.** on a group: the change would break a flow that uses it. The bar names the flow; change the flow first, or keep what it depends on. - **A path ends without a Group output.** Saving a group warns about it: a flow using the group stops there. Connect that path to an exit if the flow should carry on. - **“Group input only works inside a group.”** Group input and Group output steps belong inside a group. Use **Group selection** to make one. - **The group will not delete.** It is still used — see [Delete a group](https://bloopbot.com/docs/group-nodes#delete). --- # Ask the AI judge in a flow Use the AI nodes to branch a flow on what a message means, work out which option a viewer meant, and answer a question from your own FAQ. Updated 7 October 2026 ## Before you start You’ll need the **Judge & route nodes** AI feature on your channel — check [Plan & billing](https://bloopbot.com/docs/what-your-plan-includes). Without it, **AI: yes or no**, **AI: route by meaning** and **AI: answer from your FAQ** appear in the node library dimmed with a **Not included in your plan** badge; you can look, but you can’t add one to a flow. **AI: which one they meant** can always be added, and settles exact answers without the AI (see [below](https://bloopbot.com/docs/ai-conditions-and-routing#pick)). You’ll also want some comfort with [building on the canvas](https://bloopbot.com/docs/flow-basics), since these nodes live there, not in Simple view. ## “AI: yes or no” — branch on a plain-English question Search the node library for **AI: yes or no** and drop it into a flow, wired the same way any condition is — between a trigger and the action it should gate. 1. In **Question**, write a plain-English yes/no question about the incoming chat message, e.g. “Is this viewer asking for tech help with their PC?” Anything you type is expanded first, so `$(...)` tokens work here too. 2. Optionally fill in **What counts as yes** and **What counts as no** to spell out edge cases — the more precisely you describe the boundary, the more reliable the answer. Leave both blank for a plain reading of the question. 3. Set **True above** (default `0.7`) — how likely a “yes” has to be before the flow follows the **true** path. 4. Set **Unsure band around 0.5** (default `0.1`) — how close to “as likely as not” counts as genuinely unsure. While the band is on, an answer that leans yes but falls short of **True above** also follows **unsure**, so **false** always means a clear no. With the defaults, 0.7 and up follows **true**, 0.4 to 0.7 follows **unsure**, and 0.4 or lower follows **false**. Set it to `0` for a plain split: **true** above the bar, **false** below it. 5. Connect the **true**, **false** and **unsure** outputs to whatever should happen for each. The judged probability is available to later steps from the **Insert…** menu, under this step’s name as **Probability of yes**, or you can [drag a data wire](https://bloopbot.com/docs/data-wires) from the step’s tray — handy for a chat message that quotes how confident the bot was. Pick it from that menu rather than typing it. > **It answers the question you wrote** > > Spell out the boundary cases. “Is this viewer being rude?” and “Is this viewer harassing someone by name?” are different questions, and the judge answers exactly the one you asked. ## “AI: route by meaning” — pick one of several branches Search for **AI: route by meaning** for a message that could mean one of several things — a support-style “which of these is this about?” flow, for example. 1. In **Options**, add 2 to 8 rows: a short label for the branch (e.g. “Song request”) and a description of what belongs in it (e.g. “The viewer wants a song played”). The judge reads both, so give each branch a label that says what it is rather than “A” or “Option 1”. A **none of these** branch is added automatically — you never write it yourself. 2. Set **Confident above** (default `0.5`) — below this, the node follows **unsure** instead of guessing between two close options. 3. Connect each labelled output, plus **none** and **unsure**, to what should happen next. Example: three branches — “Song request” (the viewer wants a song played), “Tech question” (the viewer is asking about the streamer’s setup) and “Shoutout” (the viewer wants another streamer shouted out) — each wired to its own reply. A message like “can you play some Bowie?” follows Song request; “nice merch, dude” follows none. Confidence is available to later steps from the **Insert…** menu as **Confidence**, or as a [data wire](https://bloopbot.com/docs/data-wires) from the step’s tray. Each row gets its own output the moment you add it — two options means two branch handles, eight means eight, each labelled with the name you typed. Renaming a branch only changes its label; the connection you already drew stays exactly where it is. Delete a row and its handle goes with it: any connection still leaving it is drawn coral and dashed on the canvas to show it goes nowhere. The flow still opens and still saves — you’ll get a warning naming the node — and a run simply treats that branch as a dead end. ## “AI: which one they meant” — match a viewer’s words to your options Search for **AI: which one they meant** when a viewer answers in their own words and your flow needs to know which of a few options they chose: “the blue one” for a team, “tacos please” for lunch, “the big apple” for a trivia answer. It works out the match; it never writes anything back. 1. In **What they said**, keep `$(query)` (everything the viewer typed after the command), or pick another value from the **Insert…** menu. 2. In **Options**, write one option on each line, up to 50. Write each the way a viewer would say it (“Team Blue”, “New York City”). A `$(...)` on a line, such as a variable, is filled in each time the flow runs, and a line that comes out empty is dropped. 3. Optionally open **More options** and move **Sure enough above** (default `0.6`): the AI’s pick has to be at least this sure to count. **A number picks that option** (on by default) lets a viewer say just `2` for the second line; turn it off when the options are answers rather than choices. 4. Connect **matched** to what should happen for a match and, if you want to answer a miss, **none**. The step settles the easy cases itself, without asking the AI and on every channel, and only these: - The answer is exactly one of your options. Capital letters, accents, punctuation and a leading “the”, “a” or “an” don’t matter, so `eiffel tower` is **The Eiffel Tower**. - The answer is just a number, such as `2`, and picks the option on that line of your list. This needs **A number picks that option** on, at least two options, and no digit in any option, so a list like “World War 1” and “World War 2” never reads `1` as a position. - You have two or more options, and the answer is a short one (six words at most) with no “not”, “but”, “instead” or similar, where every word that matters is in one option and only that one. “The red one” picks **Team Red** from Team Red, Team Blue and Team Green. “Hate red” does not, because “hate” is not in any option, and neither does “George Bush” for **George Washington**. Anything else goes to the AI, which chooses one of **your** options or none of them. It is asked whether the viewer’s words name the same thing as an option, so “the right answer” or “whichever” picks nothing. Without the Judge & route nodes feature the AI part is skipped and the step follows **none**. The **Its position in the list** value is the line the option is on in your list as you wrote it. Later steps can read **The option they meant**, **Its position in the list (1 is the first)** and **How sure it was** from the **Insert…** menu, or as a [data wire](https://bloopbot.com/docs/data-wires). Exact matches count as fully sure. The **Trivia: answers in plain words** template in the **AI helpers** pack puts the step to work: open **Variables** and change the value of `trivia_answer` to the right answer, and a viewer typing `!answer the big apple` is congratulated by name when the answer is “New York City”. The reply names the winner and says only that the guess is correct, and the template then replaces `trivia_answer` with a dash, so nobody can paste the answer and the next question needs a new value. A wrong guess gets no reply, so nothing is given away. In this template a number is never read as a position, so `!answer 1` is only ever a guess. ## “AI: answer from your FAQ” — reply with your own words Search for **AI: answer from your FAQ** to let chat get an answer to a question without a command: “when do you stream?”, “what’s your Discord?”. The AI never writes the reply. It chooses which of **your** entries answers the question and checks that the entry really does; the reply is the text you wrote. 1. In **The question**, keep `$(message)`: the viewer’s whole chat message. 2. In **Questions and answers**, add a row for each thing viewers ask, up to 40: the question as a viewer would ask it (“When do you stream?”), then the answer to send (“Monday to Thursday at 7pm Eastern.”). `$(...)` in an answer is filled in when it is sent. 3. Leave **Answer from my chat commands too** on to include your plain commands. A command counts only when anyone can use it, it takes no extra word after its name, and its flow is nothing but an optional cooldown and one chat message, like a `!discord` that says “Join us: …”. A command that checks who is asking or what they typed, such as a password, a level or a role, is left out so its reply is never given to everyone, and so is a command that does anything else, such as entering a giveaway or sending a second message. A reply may use `$(user)` and `$(channel)` but nothing else. Its reply becomes an answer, and the flow’s description tells the AI what it is for. 4. Connect **answered** to a **Chat message** whose text is the step’s **The answer, ready to send** (pick it from **Insert…**), set to send as a reply. **none** means nothing answered the question: leave it unwired and the bot stays quiet. The **Answer common questions** template in the **AI helpers** pack builds all of this for you: a chat message passes a free check first (it has to look like a question: a `?` or a word like “when” or “how”, at least eight characters, and not a command), then a cooldown of one answer per viewer a minute and one per channel every 15 seconds, then this step, then the reply. Install it, open the step and add your own questions and answers. It only answers when it is sure. The AI has to pick an entry with confidence at least **Sure enough above** (default `0.6`) and judge that the entry fully answers the question, so “how many hours a week do you stream?” does not get a schedule that only gives days. When a question shares nothing with a long list of entries, the AI isn’t asked at all. Later steps can also read **Which entry it came from** and **How sure the AI was it picked the right entry**. > **This one needs the feature** > > **AI: answer from your FAQ** has no non-AI way to work, so it needs **Judge & route nodes** on your channel. Without it, the step is refused and the flow follows **none**, which in the template means the bot stays quiet. ## What happens when the judge can’t answer All of these nodes fail to their safest path automatically — no error, no stalled flow. - **AI: yes or no** follows **unsure**. - **AI: route by meaning** follows **unsure** too, never a guessed branch. - **AI: which one they meant** and **AI: answer from your FAQ** follow **none**, never a guessed option or entry. - This happens whenever the channel doesn’t hold the feature, the AI judge is unreachable, times out or doesn’t answer the question, or — for the route, pick and FAQ nodes — nothing clears the confidence bar. Open the flow’s **Run log** after a real run; the detail line says which of these happened. > **Budget** > > A single run can ask the AI at most six times across all of its AI steps (a Test fire never asks the AI at all — it takes the unsure or none path, so a dry run cannot fake a real judgment; the one thing it does run for real is **AI: which one they meant** settling an exact match, a number or a one-option word on its own). The ceiling is that high because one flow may chain several AI steps; it is there so a long chain cannot run away with a viewer waiting on the reply. ## Troubleshooting - Node greyed out in the library? Your channel doesn’t currently include the Judge & route nodes feature — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes). - **AI: which one they meant** follows none on an answer you’d expect to match? Check the line in the Run log: it says whether the AI wasn’t available or how sure it was. Write the options the way a viewer would say them, and lower **Sure enough above** a little if it is almost sure. - **AI: answer from your FAQ** stays quiet? The question may not look like one to the template’s free check, an entry may only partly answer it, or your channel may not hold Judge & route nodes. Add the question as its own row, worded the way viewers ask it. - Always follows unsure? Save first — an unsaved question never reaches the judge. Then check the Run log’s detail line for the reason. - Test fire never shows true/false/a labelled branch? That’s expected — Test fire always takes the unsure (or none) path for the AI nodes so a dry run can’t fabricate a judgment. The exception is **AI: which one they meant**: an exact match, a number or a word that fits one option follows **matched** in a Test fire, because the step settles those without the AI. Trigger the flow for real, or use the Run log from a live run, to see the AI’s own picks. - Getting the wrong branch consistently? Tighten the option labels and descriptions — the judge answers the question and criteria exactly as written, and a vague description is read as vaguely as it sounds. --- # Wake a flow when chat means something Use the “AI: chat means…” trigger to fire a flow on meaning, with no exact command or keyword. Updated 1 October 2026 ## Before you start You’ll need the **Intent trigger** AI feature on your channel — check [Plan & billing](https://bloopbot.com/docs/what-your-plan-includes). Without it, the node shows locked in the library: a flow that already has one keeps running, it just never fires. This is a Canvas-only trigger — open a flow and switch to **Canvas**, then search the node library for **AI: chat means…**. ## How this differs from a keyword trigger **When chat mentions** (the keyword trigger) needs an exact phrase. **AI: chat means…** instead judges what a message _means_, so “what game is this” and “what are we even playing right now” can both wake the same flow without you listing every phrasing. Every eligible chat message in the channel is judged against every intent trigger you’ve built, in one batched request per message, and this happens off to the side so it never delays your ordinary commands. ## Set it up 1. In **Fires when…**, describe in plain English what the message has to mean, e.g. “the viewer is asking what game this is”. This is the whole question the judge is asked, so spell out anything you don’t want it to catch. 2. Set **Probability needed** (default `0.8`) — how likely the message has to be to mean what you described. Higher means fewer, surer fires. 3. Set **Minimum length** (default `8` characters) to skip short messages before they ever reach the judge. 4. Optionally fill in **Must mention** with a comma-separated list — at least one has to appear before the message is even a candidate. Leave blank to skip this check. 5. Optionally turn on **Only questions** to skip anything that doesn’t look like a question. 6. Set **Whole channel cooldown** and/or **Per viewer cooldown** (20 seconds per viewer to start with; pick seconds, minutes or hours beside the amount) to bound how often this trigger can fire. Connect its single output to whatever should happen — a chat reply is the obvious one. ## A worked example Fires when: _“the viewer is asking what game this is or what the streamer is playing”_. Must mention: `game, playing`. Probability needed: `0.8`. Chat message: “yo what game is this even” → the trigger fires, and a connected **Chat message** action can reply with `$(query)` or the game via a variable. A message like “this game is so good” never fires it — it mentions “game”, but doesn’t ask what it is, so the judged probability stays below 0.8. The trigger passes three values on to the rest of the flow — how likely the judge found it, the person who sent the message, and the message itself — and each of them is offered in the **Insert…** menu. Pick it there rather than typing it. ## Troubleshooting - Never fires? Confirm the channel includes the Intent trigger feature, the flow is live, and the **Must mention** / **Only questions** / minimum-length checks aren’t filtering the message out before it ever reaches the judge. - Fires on things it shouldn’t? Raise **Probability needed**, or make **Fires when…** more specific about what should _not_ count. - Fired twice in quick succession, or not again for a while? Check the whole-channel and per-viewer cooldowns — they’re independent, and both apply per trigger, not per flow. - Test fire doesn’t make it wake? Expected — this trigger only ever fires from real chat messages Jev has judged; there’s no synthetic “test message” to simulate it with. --- # Screen viewer text with AI Check viewer-written text before a quote is saved or a reward’s input goes on stream. Updated 15 October 2026 ## Before you start You’ll need the **Text screening** AI feature on your channel — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes). Without it the step can’t be added, and text is saved or shown exactly as it always was. ## What it checks One step — **AI: text OK to show?** — that you put in front of whatever you want checked. It asks about a slur or hate speech, sexual content, someone’s personal information (doxxing), harassment of a named person, and anything that would visibly embarrass you in front of your audience. Ordinary, mundane or off-topic text always passes. **Where is it going** sets the bar. **Shown on stream** is stricter, because nobody reviews an alert before it is live; **Saved for later** — a quote, a queue — is looser. Each category is also offered as a value a later step can read. ## Screening new quotes Install **Check a quote before saving it** from the **AI helpers** pack: `!addquote` → mods only → the check → save it. A flagged quote takes the **Flagged** branch and the flow says so in chat instead of saving it. Saved quotes land in your [quote book](https://bloopbot.com/docs/quotes). The reason it flagged is available as **Reason** on that step’s **Insert…** menu, and as a [data wire](https://bloopbot.com/docs/data-wires) from its tray, which the template puts in the reply. ## Screening a reward’s typed-in text Install **Check reward text before it goes on stream**. A viewer redeems a reward and types something; the check reads it before anything shows it. Clean text goes on screen: the flow shows your `redemption` alert design with the viewer’s name and what they typed. The decision sits in one group inside the flow, **Screen reward text**, with a **Safe** and a **Held back** exit; open it from the flow to change what happens ([reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes)). Flagged text stays off screen. The flow tells the viewer “I didn't put that one on screen” before it tries to refund their points. The reply does not promise a refund: Twitch allows one only for a reward Bloopbot created. A reward from your own Twitch dashboard stays in your reward queue for you to handle. If the refund attempt fails, the flow still finishes on **Held back** and the viewer has already been told. [The reward guide](https://bloopbot.com/docs/reward-redemptions#keep) explains which rewards Bloopbot can refund. If you installed an older copy that says “you have your points back,” take the **AI helpers** update from **Marketplace → Installed** ([Update what you added](https://bloopbot.com/docs/the-marketplace#update)). Installed copies keep their behavior until you update them; check any changes you made before choosing **Use the new one**. ## Spoken messages The **Text to speech** pack puts the same check in front of every **Speak text** step: a message the AI finds unfit is not read out, and a points message is refunded. On a plan without the check, every message takes the **Unsure** branch and is read out after the step’s own cleaning. [Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech#screening) explains how each answer behaves. ## Alert cards Overlay alerts are no longer screened behind the scenes. If you want a sub or cheer message checked before it goes on screen, put the step in front of the alert action in your own alert flow, the same way the reward template does — and you get to decide what happens when it flags, rather than the message silently disappearing from the card. ## The Unsure branch matters The step leaves by **Unsure** when the judge can’t answer — your channel doesn’t include the feature, or the judge is unreachable. Both templates wire it to the same place as **Safe**, so the quote is still saved and the reward still works. Leave it unwired and a channel without the feature saves no quotes at all. The editor puts a warning on the step if you do. ## Troubleshooting - Step won’t add? Confirm your channel includes the Text screening feature — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes). - Nothing ever saves? Check the **Unsure** branch is wired — see above. - Something you expected to pass got flagged? The judge answers the exact wording. Try **Saved for later** if it is not going straight on screen, or untick the category that is firing. - Screening feels slow or gets skipped? It fails open — a timeout, rate limit or outage lets the text through exactly as if the step were not there. --- # Use Stream Deck keys and web requests in flows Give a flow its own web address for a Stream Deck key or a script, and let a flow fetch or send data with a web request. Updated 7 October 2026 ## Three ways to press a flow from outside chat There are three ways to run a flow's **Stream Deck button** trigger, or reach a flow's private URL, from outside chat: - **The Bloopbot Stream Deck plugin.** A beta companion app for Elgato Stream Deck, downloaded from your dashboard: sign in once, and a key presses exactly the one Stream Deck trigger you assign to it. There's no URL to keep secret. Recommended for a Stream Deck key. See [Run flows from a Stream Deck](https://bloopbot.com/docs/stream-deck-plugin). - **The Stream Deck app's own Website action, with a flow's private URL.** Works today, on any Stream Deck, without the plugin. It calls the flow's URL as a plain web request, so it runs every URL trigger in that flow, not only the one you meant. Covered below. - **A script or a phone shortcut**, calling the same private URL. Covered below. ## Two directions A flow can talk to the rest of the internet both ways: - **In:** the **On a web request** and **Stream Deck button** triggers give a flow its own private URL. Pressing a Stream Deck key, tapping a phone shortcut or running a script calls that URL, and the flow runs — for example, a key that posts your Discord link in chat. - **Out:** the **Web request** action calls a web address of yours from inside a flow — to ping a service when you go live, or fetch a line of text to post. Both are listed under **Automation** in **Plan & billing**, as **Webhook triggers** and **Outbound requests**. Webhook triggers are included on every plan, and outbound requests in Free+, Plus and Pro; when your channel does not include one, its node shows a lock in the library. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) explains the page. ## 1. Get a flow’s URL The quickest start is the **Stream Deck button** flow in the Starter pack: it already has a **Stream Deck button** trigger, and it posts whatever message the caller sends. To build your own, add **Stream Deck button** for a key or **On a web request** for another caller from the node library’s **Integrations** topic. Both currently use the same private URL for that flow. A Stream Deck key can call it with the **Website** action set to **GET request in background** — no plugin required, though it calls every URL trigger in the flow rather than a single chosen one; the [Bloopbot Stream Deck plugin](https://bloopbot.com/docs/stream-deck-plugin) presses one specific trigger instead. 1. Open the flow and press **Save** once. A new flow has no URL until its first save; until then the trigger says _Save this flow once and its URL appears here_. 2. The trigger’s **Your URL** field now shows the address. Select the copy icon (**Copy URL**). 3. Turn the flow on. A paused flow does not answer its URL — pack flows arrive paused. 4. Paste the URL into the tool that will call it — a Stream Deck action that calls a web address, a phone shortcut or your own script. ![The Stream Deck button trigger in the Starter flow, showing its private URL hidden, a selected blue Discord key graphic, Stream Deck graphics and All images filters, an image picker, Upload image and Make simple graphic controls.](https://bloopbot.com/docs/screenshots/webhook-trigger.jpg) _The Stream Deck button trigger with a simple key graphic. The URL itself is hidden here: treat yours like a password._ Anyone who has the URL can run the flow, so keep it private. The rotate icon (**Rotate URL**) makes a new URL and the old one stops working at once. The broken-link icon (**Revoke URL**) removes the URL entirely until you save the flow again or choose **Create one**. Removing every URL trigger from the flow removes its URL too. If a flow has both an **On a web request** trigger and a **Stream Deck button** trigger, one call to the shared URL starts a run from each of them — this is a property of calling the URL, not of the Bloopbot Stream Deck plugin, which always presses one specific trigger and nothing else in the flow. ## Make a key graphic The **Stream Deck button** trigger can keep an image with the flow. In its **Key graphic** field, choose an image, press **Upload image**, or type a short label and press **Make simple graphic**. The simple option makes a square PNG with white text on a blue background. For example, enter _Discord_ for a key that posts your Discord link. You can clear the field with **No graphic**. The picker starts on **Stream Deck graphics**, showing only images tagged for keys. Uploads and simple graphics made here get that tag automatically. Choose **All images** to pick one already in your media library; choosing it tags it as a Stream Deck graphic too. The tag makes the image easier to find later and does not remove it from the regular media library. A graphic imported in a bundle is tagged the same way. After saving the flow, choose **Open graphic for your Stream Deck key** and save the image. In Stream Deck, set that image on the same **Website** action that calls the flow URL. The image does not change the URL or fire the flow by itself. The flow stores the image so you can find it again; if you use the [Bloopbot Stream Deck plugin](https://bloopbot.com/docs/stream-deck-plugin) instead, it picks up the same graphic on its own. If you export the flow or select it for **Export bundle**, the image goes in the `.bloop.zip` file with it. Whoever imports that file gets a pack with their own copy of the image, but must still set up their own Stream Deck key and use the new flow URL. Share links cannot carry media files; use the bundle file when sharing a graphic. [Share, import and restore flows](https://bloopbot.com/docs/sharing-flows#export) explains bundle files. ## 2. Send it some details A call can carry details for the flow to use. Each one becomes a token named `$(hook.` plus its key — a key called `message` is `$(hook.message)`. - **POST** a flat JSON object, such as `{"message": "Discord is open!"}`. - Or **GET** the URL with query parameters, such as adding `?message=hello` to the end. For example, from a terminal, with your copied URL in place of the placeholder: ``` curl -X POST "PASTE-YOUR-FLOW-URL-HERE" -H "Content-Type: application/json" -d '{"message": "Discord is open! discord.gg/example"}' ``` The **Stream Deck button** flow sends `$(hook.message)` to chat, so this posts _Discord is open! discord.gg/example_. Keep details simple: - Up to 20 keys of up to 64 characters, named with letters, digits and underscores. Keys are read in lower case, so `Message` arrives as `$(hook.message)`. - Each value is text, a number or true/false, up to 200 characters. Nested objects and lists are refused. - The whole body is at most 4 KB. - A key the caller did not send comes out empty. ## 3. Require a secret (optional) By default the trigger says _Anyone with the URL can fire this flow_. For a script you control, choose **Require a secret**. The secret is shown once, so copy it straight away; the trigger then reads _Signed requests required_. Each call must then carry an HMAC-SHA256 signature of the exact request body — for a GET, of the query string after the `?` — made with the secret, sent as a hex string in the `X-AWRA-Signature` header. A `sha256=` prefix is accepted. Calls without a valid signature are refused. The key icon (**New secret**) replaces it, and the bin icon (**Remove secret**) goes back to URL-only. A Stream Deck key or phone shortcut usually cannot sign requests. For those, keep the URL private and rotate it if it leaks. ## Check it works 1. **Test fire** checks the flow’s steps without calling the URL. A test has no caller, so the trigger reports _no payload_ in the Run log and every `$(hook.…)` token comes out empty — the Stream Deck button flow _would_ send an empty message. Nothing is posted. 2. Call the real URL — press your Stream Deck key, or run the command above. This runs the flow for real: its chat message is posted in your chat. 3. A successful call answers `202` with `{"ok": true}` straight away, before the flow finishes. Open the flow’s **Run log** to see what it did. ## Call a service from a flow The **Web requests** and **Secrets** buttons appear when your plan includes Web requests, or you have an installed marketplace flow with a request that still [works on every plan](https://bloopbot.com/docs/the-marketplace#every-plan). A paused flow counts, so you can set it up before turning it on. On Free without a qualifying flow, both buttons are hidden. Removing the last qualifying flow or changing all its exempt requests hides them again; your saved secrets stay with your channel. On Free, a **Web request** step's panel says **Free+ unlocks this: join our Discord** beside the upgrade. **Join the Discord** opens in a new tab, so your flow stays where you left it: it adds you to the Bloopbot Discord and puts your channel on Free+, which runs web requests within a daily and a monthly limit. **Not now** hides it for 30 days. [Unlock Free+ by joining the Discord](https://bloopbot.com/docs/unlock-free-plus) has those limits. 1. On the **Flows** page, the header button reads **Web requests: off** until you allow them. Choose it so it reads **Web requests: allowed**. This is one switch for your whole channel. 2. In a flow, add the **Web request** action from the **Integrations** topic. 3. Fill in **URL** (`https://` only; `$(...)` tokens are filled in), **Method** — **GET (fetch)** or **POST (send a body)** — and, for a POST, **Body (POST)**. A body that is valid JSON is sent as JSON; anything else is sent as plain text. 4. To use the answer, set **Keep the answer as** to a short name such as `weather`. Later steps read the reply as `$(local.weather)` and its status code as `$(local.weather_status)`, or through **Insert…** under this step’s name. To read inside a JSON answer, use [Read JSON](https://bloopbot.com/docs/webhooks#read-json) below instead: it reads the whole answer, while the kept copy holds only its first 4,000 characters. 5. Wire the step’s **ok** output to what should happen next, and its **bad answer** output to a fallback, such as a chat line saying the service is down. For example, a `!weather` command that fetches a plain-text forecast: | Field | Value | | --- | --- | | URL | `https://weather.example/today?format=text` | | Method | GET (fetch) | | Keep the answer as | `weather` | | Next chat message | `Today: $(local.weather)` | **Test fire** never makes the request: the Run log shows the address it _would_ call, and the answer reads _(dry run)_. Only a real run reaches the service. > **What a web request can reach** > > Requests go to public `https://` addresses only — never a local or private network address — and must answer within 2 seconds. Redirects are not followed, only the first 64 KB of an answer is read, [Read JSON](https://bloopbot.com/docs/webhooks#read-json) reads all of it, a kept answer (`$(local.…)`) holds its first 4,000 characters, and one run can make **2 requests on Free+ or Plus, or 20 on Pro** (also 20 on Legacy), and Free+ also counts the runs that send one: [50 a day and 200 a month](https://bloopbot.com/docs/unlock-free-plus#limits). The run’s time and step limits still apply. No one else ever gets your webhook URLs: they are never part of an export. Web-request steps are different: a flow someone imports or installs arrives without them, but the file you export still holds each step’s URL, headers and body, so check it for private addresses before you share it, and keep keys in [Secrets](https://bloopbot.com/docs/webhooks#api-keys), which an export never includes. ## Send headers a service asks for Some services refuse a request that does not carry headers of their own, such as a name for your app, a way to contact you, or a key in `Authorization`. Their documentation says which ones they need. 1. In your **Web request** step, open **More options** and find **Headers**. 2. Choose **Add a header**. Type the header’s name in the left box, such as `X-Api-Key`, and its value in the right box. **Insert…** beside the value adds `$(...)` tokens, just as in the URL. 3. Add one row per header, up to 10, then save the flow. For example, the Helldivers 2 community API answers `400` with “The X-Super-Client and X-Super-Contact headers are required” until each call names your app and a way to reach you: | Field | Value | | --- | --- | | URL | `https://api.helldivers2.dev/api/v1/war` | | Method | GET (fetch) | | Headers | `X-Super-Client` → a name for your bot, such as `bloopbot-yourchannel`; `X-Super-Contact` → your email address or Discord name | With both headers set it answers `200`. Add [Read JSON](https://bloopbot.com/docs/webhooks#read-json) with a **Pick** row such as `players` → `statistics.playerCount`, then a chat message that inserts **players** from under the Read JSON step’s name. - For a key, write a secret in the value, such as `Authorization` → `Bearer $(secret.api_key)`. The [secret rules](https://bloopbot.com/docs/webhooks#api-keys) are the same as for the URL: type the address in full up to the first `/`. - Bloopbot sets some headers itself, and saving refuses them in **Headers**: `Host`, `User-Agent`, `Content-Length`, `Transfer-Encoding`, `Connection`, `Keep-Alive`, `Upgrade`, `TE`, `Trailer`, `Expect` and any `Proxy-…` header. `Content-Type` is allowed and replaces the type Bloopbot picks from the body. - A header name is letters, digits and `-`, `_` or `.`, up to 64 characters, and each name appears once (capitals don’t matter). A value holds up to 1,000 characters as typed. A line break that a viewer’s text brings in is sent as a space. - **Test fire** lists the headers a step would send by name only, never their values. - An exported flow holds each Web request’s headers along with its URL and body, so keep keys in [Secrets](https://bloopbot.com/docs/webhooks#api-keys). ## Keep an API key out of your flow Many services want a key in the address, like `?key=…`, or in a [header](https://bloopbot.com/docs/webhooks#headers). Written straight into the step, anyone who can edit your flows sees it, and so does your Run log. Save it as a secret instead, and the flow only holds its name. 1. On the **Flows** page, choose **Secrets** beside **Web requests**. If neither button appears, your channel needs a plan with Web requests or an installed flow with a request that [works on every plan](https://bloopbot.com/docs/the-marketplace#every-plan). 2. Under **Add a secret**, type a **Name** such as `weather_key` — lowercase letters, digits and underscores, starting with a letter. 3. Paste the key into **Value** and choose **Save**. The name appears in the list with the day you saved it. 4. In your **Web request** step, write `$(secret.weather_key)` where the key goes in the **URL**, **Body (POST)** or a **Headers** value, for example `https://weather.example/today?key=$(secret.weather_key)`. 5. Run the flow for real. The step sends the key; the Run log names only the service’s address, such as `200 from weather.example`. ![The Secrets panel on the Flows page listing two saved secrets, $(secret.stats\_token) and $(secret.weather\_key), each with its updated date and replace and delete buttons, above the Add a secret form with Name and Value fields and a Save button](https://bloopbot.com/docs/screenshots/flow-secrets-panel.jpg) _The Secrets panel with two saved secrets and the Add a secret form._ - A value is never shown again once saved, not even to you. Bloopbot never writes it to chat or the Run log, unless the service you call repeats it in its answer. - To change a key, choose the pencil icon (**Replace**) on its row and paste the new value; every flow that uses the name picks it up on its next run. The bin icon deletes it after you confirm. - Secrets work only in a Web request’s **URL**, **Body (POST)** and **Headers** values. Anywhere else, `$(secret.…)` goes out as typed, and saving the flow warns you. - When a step uses a secret, type the address in full up to the first `/`, as in `https://weather.example/…`, with no `$(…)` in it. Put the secret after that, in the path or the `?…` part. Saving refuses a secret in the address itself, such as `https://$(secret.name).example.com`, and any `$(…)` in the address of a step that uses a secret. That is what keeps your key safe from chat: text a viewer types or a webhook sends can never fill in a secret or choose the site it goes to. - **Test fire** never uses a secret: it hides every `$(secret.…)` behind dots and does not check the name, so a misspelt name still looks fine there. Check a new name with a real run: the Run log says “Secret … is not set on this channel.” when the name is wrong. - A channel holds up to 20 secrets, each up to 4,096 characters. Secrets stay with your channel: exporting or sharing a flow never includes them. - Anyone who can edit and run your flows, such as an editor or an AI assistant you connected with write access, can send a secret to any `https://` address they put in a Web request. Tying a secret to the one site it belongs to is planned. ## What the bot sends A Web request from a Bloopbot flow reaches your site as a plain `GET` or `POST` over `https://` on port 443, and identifies itself with this user agent: ``` Bloopbot-flows/1 (+https://bloopbot.com/docs/webhooks#abuse) ``` - It waits at most 2 seconds for an answer, reads at most 64 KB of it, and does not follow redirects. - It never reaches a private or local network address. - One flow run makes at most **2 requests on Free+ or Plus, or 20 on Pro** (also 20 on Legacy), and one channel makes at most 60 a minute, however many viewers trigger it. Past that, the step leaves by **bad answer** with the reason “This channel has made too many web requests in the last minute”, and nothing is sent. - A channel on Free+ sends web requests in at most 50 flow runs a UTC day and 200 a UTC month. Past that, the step leaves by **bad answer** with status `0` and nothing is sent. - It sends no cookies and no account details of its own. The request holds only what the streamer put in the flow’s URL, headers and body. A streamer chooses which addresses their flows call. If you run a site that receives these requests and want them to stop, you can block the `Bloopbot-flows` user agent. To report a channel, or to ask us to look at a request you did not expect, email [support@bloopbot.com](mailto:support@bloopbot.com) with the time, the address that was requested and the request’s source address if you have it. ## Read a JSON answer Most services answer in JSON. **Read JSON** picks the values you want out of it, so a chat line can use them and **For each** can go through a list. 1. After your **Web request**, add **Read JSON** from the **Integrations** topic and wire the web request’s **ok** output to it. 2. Set **Read** to the web request’s answer: choose **Insert…**, then **Response text** under the web request’s name. It reads `$(from..text)`. 3. Under **Pick**, add a row per value: a short name, then the path to it. Each name becomes a value later steps can insert. 4. Wire **ok** to what happens next, and **not found** to a fallback line. Paths follow the answer’s own keys, separated by dots: | The answer | Path | You get | | --- | --- | --- | | `{"current":{"temp_c":14}}` | `current.temp_c` | `14` | | `{"items":[{"name":"Sword"}]}` | `items[0].name` | `Sword` (positions count from 0) | | `{"data":{"2":{"high":288}}}` | `data.2.high` | `288` (a number on an object is a key) | | `{"data":{"2":{…},"6":{…}}}` | `data.*` | a list, one item per entry | - Keys are case-sensitive in a path: `highTime` is not `hightime`. - A path can use a value from the command: `data.$(1).high` reads the item the viewer typed. - A pick that holds a list also gives **How many in …**, its length. The list itself keeps its first 50 items, while **How many in …** still counts them all. - A pick can’t be called `all`, and put **Read JSON** before any **Wait**: a Wait keeps only the first 4,000 characters of an answer. **Going through a list.** Set **For each**’s **Go through** to the pick, such as `$(from..entries)`. Inside the loop, `$(item.)` reads each item’s fields. Nested fields are joined by `_`, so `user` → `name` becomes `$(item.user_name)`, and capitals don’t matter there: `$(item.highTime)` and `$(item.hightime)` both work. An item from `*` also has `$(item.key)`, its entry’s key. ## Turn a timestamp into words Services often give times as a long number, such as `1790721171`. **Format a time** turns one into words. 1. Add **Format a time** from the **Integrations** topic. 2. Set **Time** to the timestamp, such as `$(item.hightime)`. It reads seconds, milliseconds or a date like `2026-09-29T20:14:00Z`. 3. Pick a **Clock**: 24-hour or 12-hour. 4. Choose **Insert…** in a later step to use what it made: **How long ago** (`2 minutes ago`), **Clock time** (`20:14`), **Date** (`29 Sep`), **Day of the week**, **Day, date and time**, or **Minutes ago** to compare in a check. 5. Wire **ok** onward. Text that isn’t a time leaves by **not a time**. Times and dates use your channel’s time zone, the same one your weekly timers use: the one you pick when you add a stream on the [**Schedule** page](https://bloopbot.com/docs/schedule), or, if you have never picked one, the time zone of the browser you first opened your dashboard in. If neither is known, they are in UTC. They are always in English. For example, a `!prices` command that posts each item’s last high price and when it traded: | Step | Setting | | --- | --- | | Web request | URL `https://prices.example/latest`, GET (fetch) | | Read JSON | Read `$(from..text)`; Pick `entries` → `data.*` | | For each | Go through `$(from..entries)` | | Format a time | Time `$(item.hightime)` | | Send a chat message | `Item $(item.key): high $(item.high), $(from..relative)` | Wire **For each**’s **each** output to **Format a time**, and **Format a time**’s **ok** to the chat message, so they run once per item. Chat shows one line per item, such as `Item 2: high 288, 2 minutes ago`. ![The Read JSON step's settings: Read holding the web request's answer, $(from.web.text), and one pick named entries with the path data.\*, which turns every entry of the answer into a list.](https://bloopbot.com/docs/screenshots/flow-read-json.jpg) _Read JSON picking every entry of a price answer, ready for For each_ ## Troubleshooting - The URL answers `404`: the flow is paused, the URL was rotated or revoked, or the flow was deleted. Turn the flow on, or copy its current URL again. A flow restored from the Trash comes back paused, with a new URL. - `429`: too many calls. One URL takes up to 10 calls a minute, and your channel up to 30 across all its URLs. Wait a minute. - `401`: the flow requires a secret and the signature is missing or wrong. Sign the exact body you send. - `400` or `413`: the details are not flat JSON, break one of the limits above, or the body is over 4 KB. The answer says which. - The flow ran but the message is blank: the caller did not send the key the message uses. Match the key names exactly, such as `message`. - The key shows no picture: save the image opened from **Key graphic**, then set it on the Website action in Stream Deck. Choosing an image in the flow does not change the physical key automatically. - The **Web request** step always leaves by **bad answer**: check **Web requests: allowed** on the Flows page, that the address starts with `https://`, and the Run log’s reason, such as no answer within 2 seconds or a redirect, or the channel having made 60 web requests in the last minute; it recovers by itself as the minute passes. - On Free+, a **Web request** that worked earlier now leaves by **bad answer** with status `0`, and the Run log says the channel has used its flow runs with web requests for today or this month: that's a [Free+ limit](https://bloopbot.com/docs/unlock-free-plus#limits). The rest of the run still carries on. Requests start again at midnight UTC, or on the 1st for the month's limit. - The service answers `400`, `401` or `403` and names a header it needs: add that header under the step’s [**Headers**](https://bloopbot.com/docs/webhooks#headers), or check the spelling of one you added. - The Run log says “Secret weather\_key is not set on this channel”: the name in the step does not match one under **Secrets**, or it was deleted. Check the spelling, or add it again. No request was made. - **Read JSON** always leaves by **not found**: open the Run log. “The answer isn't JSON” means the service answered something else, often an error page; “no … in the answer” names the path it could not find, so check its spelling and capitals against the answer. **Test fire** makes no web request, so Read JSON after one always leaves by **not found** there — run the flow for real to test it. - A time is an hour or more out: **Format a time** uses the time zone of your Schedule, the one you pick when you add a stream on the [**Schedule** page](https://bloopbot.com/docs/schedule). Check it there. - The node shows a lock: your channel does not include that capability yet. Nothing else about the flow changes. - A key made with the **Bloopbot Stream Deck plugin** shows Paused, Offline, Reassign or another status instead of pressing: that's the plugin's own key states, covered in [Run flows from a Stream Deck](https://bloopbot.com/docs/stream-deck-plugin#press). --- # Run flows from a Stream Deck Sign in to the Bloopbot Stream Deck plugin, put a flow's Stream Deck trigger on a key, and press it to run that flow. Updated 14 October 2026 ## What the plugin does The Bloopbot Stream Deck plugin is a small companion app for Elgato Stream Deck. Sign in once, and it lets you put a flow's **Stream Deck button** trigger on a physical key: press the key, and that one trigger runs. It's a **beta for macOS and Windows**, downloaded from your dashboard. Compared with wiring up a key yourself with the Website action and a flow's private URL ([Use Stream Deck keys and web requests in flows](https://bloopbot.com/docs/webhooks#url)), the plugin signs in with your account instead of a URL you have to keep secret, and a key runs exactly the one trigger you chose — never every URL trigger in the flow. The private URL still works and is still the right choice for a script or a phone shortcut; [Three ways to press a flow from outside chat](https://bloopbot.com/docs/webhooks#three-ways) compares them. ## What you need - Stream Deck app **7.1 or later**, on macOS 12+ or Windows 10+. - A Bloopbot channel you own or edit, with a flow that has a **Stream Deck button** trigger. [Use Stream Deck keys and web requests in flows](https://bloopbot.com/docs/webhooks#url) shows how to add one; the Starter pack's **Stream Deck button** flow already has one. ## Install the plugin The plugin is a beta, downloaded from your dashboard. The steps are the same on macOS and Windows: ![The Downloads page showing the Stream Deck plugin beta with its version, release date and size, a Download button and the two install steps.](https://bloopbot.com/docs/screenshots/downloads-page.jpg) _The Downloads page: the plugin's version, release date and size, and the Download button._ 1. In your dashboard, open **Settings** › **Downloads**. It shows the latest version of the **Stream Deck plugin**, when it was released and its size. 2. Choose **Download**. Your browser saves a `.streamDeckPlugin` file. 3. Open the downloaded file (double-click it). Stream Deck asks to install the plugin; confirm. 4. **Bloop Flow** now appears under the **Bloopbot** category in the Stream Deck app. Drag it onto any key, then [sign in](https://bloopbot.com/docs/stream-deck-plugin#sign-in). To update, download the latest version from the same page and open it; Stream Deck replaces the old one and your keys keep their setup. ## Remove the plugin Right-click the plugin in the Stream Deck app and choose **Uninstall**. Removing the plugin removes your keys' setup along with it; sign out first if you'd rather keep your Bloopbot sign-in for a later reinstall. ## Sign in 1. Drag **Bloop Flow** onto a key, or select a key that already has it. 2. In the key's settings panel, choose **Sign in to Bloopbot**. Your browser opens to a Bloopbot sign-in and consent page. 3. Sign in with Twitch, or with your backup sign-in email if you've set one up ([Keep a backup way to sign in](https://bloopbot.com/docs/backup-sign-in-email)). 4. Review what the plugin can do — list the channels you own or edit and their Stream Deck triggers, read Stream Deck key graphics, and press a trigger you've assigned to a key — and choose **Allow**. 5. Switch back to the Stream Deck app. The panel now shows **Signed in as** your account. The plugin holds one signed-in account at a time. Choose **Sign out** to sign out of it everywhere in the plugin; every key keeps its setup but stops pressing until you sign in again. To use a different account, sign out first, then sign in with the other one. This sign-in also shows up on **Connected apps** in your dashboard, on every channel you own or edit — see [See and remove connected apps](https://bloopbot.com/docs/connected-apps) to review it there or revoke it remotely. ## Put a Bloop Flow key on your deck Once you're signed in, the key's settings panel shows the channel and trigger rows under Stream Deck's own Title and image settings. 1. Check **This key**. It starts on your remembered default channel; pick a different one you can edit if you need to. 2. Under **Trigger**, use **Search flows and packs** to find the trigger you want, or scroll the list. Flows you grouped into [your own packs](https://bloopbot.com/docs/create-packs#make) appear under those pack names. Ungrouped flows appear under **My flows**, and flows in packs you added from the Marketplace appear under those names. A flow can appear in more than one pack. A disabled flow's trigger is labelled **(Paused)** in the list; assigning it is fine, but the key won't press until you turn the flow on. 3. A flow with more than one **Stream Deck button** trigger lists each one separately — pick the specific one this key should run. 4. Choose a trigger. The key updates immediately with that trigger's graphic. Once a trigger is chosen, **Open flow** opens that flow in your Bloopbot dashboard in the browser, so you can change what the key does. **Default channel** (in the same panel) sets which channel a newly dragged-on key starts with; each key can still be pointed at a different channel you can edit. For example, to make a "Discord link" key: add a **Stream Deck button** trigger to your Discord-announcement flow if it doesn't have one yet, sign in to the plugin on a key, search for the flow's name, and choose its trigger. Pressing the key now posts your Discord link, the same as it would through the flow's private URL. ## Send values from a key A flow with a **Run button** trigger can take inputs, such as a team name or an amount ([Fix or ask for a button's inputs](https://bloopbot.com/docs/control-panels#inputs) shows them on a control panel). A Stream Deck key can set those inputs too, so one flow serves several keys. This needs plugin version **1.2 or later**; download the latest from **Downloads** ([Install the plugin](https://bloopbot.com/docs/stream-deck-plugin#install)). 1. Give the flow a **Run button** trigger beside its **Stream Deck button** trigger, and add its inputs there. The flow reads each as `$(input.name)`. 2. In the key's settings, choose the flow's trigger. An **Inputs** row appears under **Trigger**, with one field for each input: text, a number, or **Yes** / **No**. 3. Fill in the fields you want this key to send. A field left empty uses the input's default. An input with no default is marked **(required)**: the flow reads it as empty until you fill it in, and once a key sets any value, leaving a required one empty makes the press show the warning triangle. 4. Press the key, or use **Test key**. The flow starts with those values. The values live in the key's own Stream Deck settings, not in Bloopbot, so two keys on the same trigger can send different values. For example, a _Goal scored_ flow with a **Team** input can sit on your deck twice: a **Home goal** key with Team set to `home` and an **Away goal** key with Team set to `away`, both running the message `GOAL for $(input.team)!`. Choosing a different trigger for a key clears its values, because they belong to the flow they were set for. A key on a **Bloop Pack** page has no settings of its own, so it presses with each input's default; use a Bloop Flow key when you need to set values. A flow with no Run button trigger shows no **Inputs** row, and its keys press as before. ## Key graphic and name By default a key shows the trigger's own graphic, kept in sync with the flow (or the pack it came from), and no title. If the trigger has no graphic set, the key shows a plain Bloopbot graphic. - **Name:** to put a name on the key, type it into Stream Deck's own **Title** field at the top of the key's settings. Clear the Title to take the name off again. - **Picture:** to use your own picture on one key, set the key's image in Stream Deck itself, the same way as for any other action. It stays in your Stream Deck profile and is never uploaded to Bloopbot. Remove it in Stream Deck to go back to the trigger's graphic. - **On the key** in the settings panel previews what the key is showing right now. A key with your own picture doesn't show the plugin's status labels such as **Paused** or **Offline**, because Stream Deck shows your picture instead. The tick or warning after a press still appears. ## Put a whole pack on a page A **Bloop Pack** key opens one of your own packs, or a pack you added from the Marketplace, as a page of keys: every Stream Deck trigger in the pack gets its own key, with its graphic, without setting each one up. 1. Drag **Bloop Pack** from the **Bloopbot** group in Stream Deck's action list onto an empty key. 2. In its settings, check **This key** is on the right channel, then choose a pack under **Pack**. Each pack shows how many Stream Deck triggers it has. **My flows** collects your ungrouped flows' triggers. 3. Press the key. The first time, Stream Deck asks to install the Bloopbot pack page; allow it. 4. The deck switches to the pack page. Each key runs one of the pack's triggers, the same as a Bloop Flow key, with the same tick or warning after a press. 5. The last key is **Back** and returns you to where you were. When a pack has more triggers than fit on one page, the key next to it is **More** and shows the rest. For example, a **Bloop Pack** key for **WoW Solo** opens a page with **Set goal**, **Death +1**, **Clip moment**, **Rare drop** and the pack's other keys, and **Back** in the corner. The page follows the pack. For your own pack, the keys follow the flow order you set under **Flows → Packs → Mine**, using **Move up** and **Move down** on the pack’s page; when a flow has several Stream Deck triggers, its keys follow their order in that flow. A pack you added from the Marketplace keeps its own member order, and a trigger that joins later goes after the keys already there. The page re-checks the pack each time you open it. The page itself can't be edited in Stream Deck; to arrange keys your own way, use Bloop Flow keys instead. Pack pages work on the Stream Deck, Stream Deck MK.2, Mini, XL, Neo and the keys of a Stream Deck +; on other models the Bloop Pack key shows a warning. ## Press and what the key shows Pressing a key sends the press to Bloopbot and shows the result on the key itself: - A **green tick** means Bloopbot accepted the press — it does not mean every action in the flow finished, or finished successfully. There's no per-action progress from a key press. - A **yellow warning triangle** means the press was refused or failed, or the key couldn't press (for example while it's **Paused** or **Offline**). - Only one press runs at a time per key, and one more may wait behind it. A press sent while both are occupied gets **Busy** and does not start. Besides the tick or warning after a press, a key can show a sticky status until it changes: - **Paused** — the trigger's flow is disabled. - **Offline** — Bloopbot couldn't be reached. - **Signed out** / **Expired** — sign in again to resume pressing. - **No access** — your account can no longer edit this channel; the key keeps its setup. - **Reassign** — the trigger this key used was removed or replaced; choose another one in the key's settings. - **Choose flow** — the key has no trigger assigned yet. If a press times out, the key shows the warning triangle and the settings panel's last press reads **Unknown** — Bloopbot may or may not have run it. The plugin never presses again on its own; it does not retry. ## Test key **Test key** in the settings panel runs the real flow immediately, exactly as if you'd pressed the physical key — including posting in chat, playing an alert, or anything else the flow does. Use it to check a key works, not as a dry run. ## Keys across devices and profiles A key's assignment lives on that specific Stream Deck device and profile. Two keys on different devices (or different profiles on the same device) can point at the same trigger independently, and both stay in sync with the flow's graphic. Exporting a Stream Deck profile carries a key's trigger assignment, Title and picture with it. Importing that profile onto another Stream Deck does not carry your sign-in: the plugin asks you to sign in again before its keys will press. ## Troubleshooting - **The key shows Choose flow:** no trigger is assigned yet. Open the key's settings and pick one under **Trigger**. - **The key shows Reassign:** the trigger it used was deleted or the flow was replaced. Open the key's settings and choose a new trigger; the key's Title and picture stay as you set them. - **The key shows Paused:** the trigger's flow is disabled. Turn the flow on from **Flows** in your dashboard. - **The key shows No access:** your account no longer owns or edits this channel. Sign in with an account that does, or ask the owner to add you as an editor. - **The key shows Offline:** Bloopbot couldn't be reached. Check your connection and try again; the key keeps its last known graphic. - **The key shows Signed out or Expired:** sign in again from the key's settings panel. - **Every press shows the warning triangle:** open the key's settings panel and expand **Diagnostics** at the bottom — it shows the last error and when the key last synced. - **The key shows the warning triangle and Last press says Request failed (bad request):** a value the key sends is not accepted. Check **Inputs** in the key's settings: an input marked **(required)** needs a value, a number input needs a number, and an input the flow no longer has is dropped. If you renamed or removed an input in the flow, open the key's settings and fill in the fields that are there now. - **The key has no Inputs row:** the flow has no **Run button** trigger with inputs, or the plugin is older than version 1.2. Update the plugin ([Install the plugin](https://bloopbot.com/docs/stream-deck-plugin#install)). - **The wrong flow runs when you press a key:** each key is assigned to one specific trigger. Open the key's settings and check which one is selected under **Trigger**. A flow can have one Stream Deck trigger, so a key that should do something different needs a flow of its own. --- # See and remove connected apps Review every app signed in to your channel — the Stream Deck plugin, and any assistant or tool you've connected — and revoke one you no longer want. Updated 14 October 2026 ## What a connected app is Some tools sign in to your Bloopbot account instead of using a private URL: the **Stream Deck plugin** is one, and an AI assistant or coding tool that works with your flows is another. Signing in gives that app its own access — never your password — scoped to exactly what you allowed when you connected it. Every app you've signed in to shows up on **Connected apps**, under **Settings** in your channel's sidebar, whether you connected it yourself or an editor did. From there you can see what each one can do and remove one at any time. Connecting an AI assistant to your flows comes with Pro — [Connect an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant) walks through it. It goes through the same sign-in and appears on this page exactly like Stream Deck does. ## Connect an app Connecting starts from the app or tool you want to use, not from Bloopbot — its own **Connect to Bloopbot** or **Sign in** step (the Stream Deck plugin's is **Sign in to Bloopbot** in a key's settings panel). That sends your browser to a Bloopbot sign-in and consent screen, where you pick which channel it should reach and what it's allowed to do: - **Who's asking** — the app's name, and its domain when it has one you can check. No domain shown means Bloopbot can't verify who published it; be as careful with it as you would with any app asking for account access. - **Which channel** — if you own or edit more than one channel, choose the one this app should reach, right there on this screen. An app is connected to one channel at a time; connect it again from a different channel's page to add a second one. - **What it can do** — a checkbox per permission, in plain language, such as seeing your flows or public page. Every permission the app asks for starts ticked; untick anything it doesn't need, such as **Turn a flow on or off** or **Actually run a flow, for real**. Editing an enabled flow changes its live behaviour at once. A new overlay appears in Studio immediately; draft edits stay there until you **Publish**. Choose **Allow** to finish connecting it, or **Cancel** to back out. Nothing is shared until you choose **Allow**. ![The consent screen with a channel picker and separate permissions for flows, points store items, overlay drafts, publishing the Studio draft and the public page.](https://bloopbot.com/docs/screenshots/connected-apps-consent.jpg) _The consent screen for a connecting app: choose a channel, then choose flow, store, overlay and public page permissions._ ## Review what's connected Open **Settings** › **Connected apps** to see every app that can reach the channel you're viewing: - **Name and domain** — which app it is, and where it says it's from. - **Connected by** — who signed it in, in case it wasn't you. - **What it can do** — the permissions it was allowed when it connected. - **Created** and **last used** — when the connection was made, and the last time the app actually used it. The Stream Deck plugin is a little different: signing in to it once covers every channel you own or edit, not just one. It still shows up here on each of those channels, marked **All your channels**, so you always know it has access — even though there's only one sign-in behind it. As an editor, if that sign-in belongs to someone else who also helps manage the channel, you see it listed (so you know it has access) but not its last-used time or a Revoke button — that stays between that person and the channel owner. ![The Connected apps page listing a connected AI tool and the Stream Deck plugin, marked All your channels.](https://bloopbot.com/docs/screenshots/connected-apps-page.jpg) _The Connected apps page listing a connected AI tool and the Stream Deck plugin, marked All your channels._ ## Revoke access Select the bin icon (**Revoke**) next to any app to sign it out at once. Whatever it was doing stops immediately — there's no delay and nothing left to clean up afterwards. Revoking the Stream Deck plugin from any one of your channels signs it out of **all** of them, since it's one sign-in underneath; the confirmation says so before you continue. Revoking anything else only affects the channel you're viewing — connect it again from another channel and it needs its own new sign-in there. If an editor connected an app themselves, you (as the channel owner) can still revoke it from this page. An editor can revoke any app connected to a channel they help manage, except the Stream Deck plugin of someone else who also helps manage it — only that person, or the channel owner, sees a Revoke button for it. To reconnect an app with different permissions, revoke it and connect it again — choosing what to allow starts over from the consent screen. ## Troubleshooting - **An app I don't recognize is listed:** revoke it. The **Connected by** line says whose account signed it in; for an app connected to this specific channel (not the Stream Deck plugin, which is one sign-in for every channel you reach), that same connection is also in **Audit log**. Remove that person as an editor if it wasn't you or someone you trust. - **A flow's history or Audit log shows "via" a name I don't expect:** that names the app that made the change — Stream Deck, or a connected assistant — alongside whoever's account it was made under. A change made from your dashboard shows no "via" at all. It's the same information **Connected apps** shows, next to the change itself. - **I revoked an app but it's still working:** it stops immediately on Bloopbot's side. A tool that cached a result before you revoked it may still show that old result until it asks Bloopbot again. - **The app I want isn't listed:** it hasn't been connected yet, or it may not be available on your channel. Check [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) for what your channel currently has. - **I don't see a permission I expected:** permissions are chosen when the app connects. Revoke it and connect it again to change which ones it has. --- # Connect an AI assistant Connect Claude, ChatGPT or Claude Code to work with flows, overlays, store items and your public page. Updated 14 November 2026 ## What an assistant can do Connect an AI assistant to your channel and you can build flows by describing them in a chat. Ask it for "a !hug command that hugs whoever you name" and it looks at what your channel already has, drafts the flow, checks it, tries it out without anything happening on stream, and saves it for you — switched off, ready for you to look over. It can also give the flow a short [description](https://bloopbot.com/docs/flow-basics#describe) of what it is for. **Copy a starter prompt for your assistant** ``` Help me connect Bloopbot to this assistant at https://bloopbot.com/api/mcp. Guide me through adding it as a custom MCP connector, signing in, choosing my channel, and allowing permission to see flows, create and edit flows, and run a flow as a test. Untick live switching and real runs unless I ask for them. After connecting, verify it works by listing my flows and packs. Suggest a simple first flow, validate it and test it as a dry run. Show me the result before saving anything. ``` Not sure yet what you want? Say so, for example "help me make my stream better". Instead of guessing, the assistant asks you to choose what to make: **flows** (chat commands and automations), a **simple overlay** from Studio's ready-made widgets and themes, an **advanced overlay** with a custom code widget, or **an overlay and flows together**, such as an alert your viewers set off. It tells you if that choice needs a permission you didn't allow, then asks only what it still needs to know before it starts. You can also ask it to arrange your public page, switch its pages on or off, update your links and gear, or choose one Google Font for all headings and another for body text. If you allow domain management, it can start connecting a domain you own and show you the DNS record to add. You can ask it to group existing flows and overlays into one of [your own packs](https://bloopbot.com/docs/create-packs#make), change their order, or rename a pack. It leaves each flow's live state and each overlay as they were. Putting an overlay in a pack needs the assistant to be allowed to see your overlays. It can also make, change and delete your [control panels](https://bloopbot.com/docs/control-panels), and put them in a pack you made. [Build a control panel](https://bloopbot.com/docs/connect-an-ai-assistant#panel-example) shows how. If you allow it to create and edit flows, it can also make, edit and delete your [groups](https://bloopbot.com/docs/group-nodes), the sets of steps several flows share. Before it saves a group, it checks every flow that uses it. A change that would break one of them isn't saved, and the assistant tells you which flow it would break. A saved change reaches every flow using the group straight away, switched-on ones included. It can't delete a group while a flow still uses it, including a flow in your Trash. It can add a **Post to Discord** step to a flow and write its message, embed and link button, for example to [announce your stream in Discord](https://bloopbot.com/docs/discord-go-live). It can't see your connected Discord servers, so it leaves the server, channel and any role to mention empty. Choose them in the step yourself before you switch the flow on. It never adds a ping unless you ask for one. It can build [video request flows](https://bloopbot.com/docs/media-share#flows) with **Request a video**, **Skip the video** and the **Video request ended** trigger, but approving a video stays with people: only you, your editors or a moderator can press **Play** on the Media share page. It can add a **Post to Bluesky**, **Post to Mastodon**, **Post to X**, **Post to Threads**, **Post to Instagram** or **Post to Facebook** step to a flow and write its text, choose the picture and the link card, for example to [announce your stream on social media](https://bloopbot.com/docs/announce-your-stream-on-social-media). It knows the **Socials** pack already holds a go-live flow for each network, and it won't build a second one for a network that has one. It can't connect or disconnect your accounts, see which account is connected, install the pack, send a test post or add X balance: connect the network on **Connections**, then press **Send test post** in the step yourself. A go-live flow can't be enabled until its network is connected. If you allow points store access, it can show your items, make a new one or edit one you already have. New items it makes start off sale. It can also inspect a wheel's segments to help plan a flow; wheel edits still happen in Studio and take effect when you **Publish**. If you allow overlay access, it can create an overlay or a theme, inspect them and edit their Studio drafts, including picture frames round panels, chat lines and alert cards. It can start from Studio's ready-made layouts to build a matching set of gameplay, chatting, Starting soon, Be right back and Ending screens. It can show you a picture of each draft over sample stream content, make changes and show another picture until the design looks right. It can choose a file already in your media library, or upload a new picture, sound or video when your assistant can read the file you give it (in seconds, when your assistant can run commands on your computer), and it can put files into folders, label them with tags and delete the ones nothing uses to keep the library tidy. It can also place a layer on the vertical layout for Twitch's dual format and show you a picture of how it looks on a phone-shaped 1080×1920 canvas. Viewers see none of it until the draft is published: you review and **Publish** it in Studio yourself, or, if you allow it, the assistant publishes it for you once you've agreed. The assistant can show you the kinds of layers Studio offers — including **Chat**, each alert type and **Minigames** — and explain their starting settings before you choose one. It can put a **Clock**, a **Social rotator** with your handles, an **Event list** of your latest follows, subs, gifts, cheers, raids and redemptions, a **Clip player** for your `!so` shoutouts, or a **Media share player** for the YouTube videos your viewers share on an overlay, and start a **Label** as a **Viewer count** or **Follower count**. Your saved overlays are a separate list, so you can name the one you want to change. In a theme’s alert designs it can also give an alert card the **Free** layout, placing its picture, title, subtitle and message where you ask, then show you a picture of the result. It can also move the whole Free card inside its layer with the design’s card X and Y offsets, without changing the layer’s placement. Custom alerts that draw the same design use the same arrangement. An assistant can preview an optional new look for a built-in widget before changing it. For example, [Now playing 2](https://bloopbot.com/docs/now-playing-in-obs#add) keeps the song settings and groups the current track and queue in one panel. Ask to see the preview first; after you choose it, the change waits in the Studio draft until **Publish**. It works with any assistant that can add a custom connector, sometimes called an MCP server: Claude, ChatGPT and Claude Code among them. You can ask the assistant to add **Turn flows on or off** with several selected flows, or **Turn a pack on or off** to make a mode command or Run button. It can use your existing flows and packs, then test the switch without changing their live state. [Switch packs from a flow](https://bloopbot.com/docs/create-packs#switch) explains what happens when the controlling flow runs for real. It can also build flows that start from [what OBS does](https://bloopbot.com/docs/control-obs-from-flows), such as a chat message when you switch to your BRB scene, and flows that [make OBS act](https://bloopbot.com/docs/control-obs-from-flows#actions), such as a mods-only `!brb` that switches scenes. It cannot list your OBS scenes or change OBS settings, so give it the scene’s name exactly as OBS shows it, and raise the overlay’s Page permissions in OBS yourself. ## Let your assistant read a guide You can ask an assistant to read Bloopbot’s public guides before helping you. This needs no sign-in or paid plan. For an overview, give it [Bloopbot’s agent guide](https://bloopbot.com/AGENTS.md). It links the public guides, current prices, authentication instructions and the supported MCP connection. Your assistant can also find a connection skill from [Bloopbot’s public skill index](https://bloopbot.com/.well-known/agent-skills/index.json). Reading these documents gives it information; connecting to your channel still needs your sign-in and permission choices. 1. Give the assistant a guide’s link, for example [Build your first flow](https://bloopbot.com/docs/flow-basics). 2. Ask it to fetch the page with `Accept: text/markdown`, or add `.md` to the guide’s address. 3. Ask it to use that guide to explain your next step. It receives the headings, instructions and links as text. For example: “Read https://bloopbot.com/docs/flow-basics as Markdown, then help me plan a command that welcomes whoever I name.” The assistant can also read the [guide index](https://bloopbot.com/llms.txt) or [all guides in one file](https://bloopbot.com/llms-full.txt). If it still sees the browser page, use the address ending in `.md`. Reading a public guide gives the assistant instructions; connect it below when you want it to work with your channel. Your assistant can read this channel’s published [Social images](https://bloopbot.com/docs/social-images), including their names and published revisions, and select one in an existing **Post to** step. Only published designs from your channel may be selected. It cannot create, edit or publish designs: make and review them in **Social images** yourself. ## Before you start - **A Pro plan.** Connecting an AI assistant comes with Pro. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows what your channel holds; if the assistant says it can't reach your channel, this is the first thing to check. - **An assistant that supports custom connectors.** Some plans of some assistants only offer this on certain tiers; the assistant's own settings will show whether you can add one. - **Owner or editor on the channel.** You connect as yourself, and choose which of your channels the assistant reaches. A moderator you have ticked on [Team](https://bloopbot.com/docs/editors) cannot connect an assistant; ask the owner or an editor. ## Get help with your setup Setup help can explain the tool you want to connect, using its own allowance. It does not grant an assistant access or unlock the AI capabilities of your plan. Keep keys, passwords and private setup links out of goal descriptions and help messages; use the normal connection and approval controls. ## Connect it Every assistant connects the same way: you give it Bloopbot's connector address, and it sends you to a Bloopbot sign-in and consent screen. The address is: ``` https://bloopbot.com/api/mcp ``` 1. In your assistant, add a custom connector (or MCP server) and paste the address above. Name it **Bloopbot**. 2. Choose **Connect**. Your browser opens Bloopbot's consent screen — sign in to Bloopbot first if it asks. 3. Pick the channel the assistant should reach, and check what it's allowed to do (see [what it can and can't do](https://bloopbot.com/docs/connect-an-ai-assistant#permissions)). 4. Choose **Allow**. You're sent back to the assistant, and it can start working with the parts of your channel you allowed. Where to add the connector, in the assistants most people use: - **Claude** — Settings → Connectors → add a custom connector. - **ChatGPT** — add it as a connector in ChatGPT's settings, where your plan allows custom connectors. - **Claude Code** — run `claude mcp add --transport http bloopbot https://bloopbot.com/api/mcp`, then `/mcp` to sign in. ![The consent screen with a channel picker and separate permissions for flows, points store items, overlay drafts, publishing the Studio draft and the public page.](https://bloopbot.com/docs/screenshots/connected-apps-consent.jpg) _The consent screen: choose a channel, then choose permissions for flows, store items, overlays and your public page._ ## What it can and can't do What the assistant may do is exactly what you leave ticked on the consent screen. Every permission it asks for starts ticked; untick any you don't want it to have: - **See your flows, packs, variables, collections and how they're wired** — it can read every flow on the channel, including each step's full settings, the ordered members of your own packs, and your control panels with every button's fixed inputs. That includes anything you pasted into a step, such as a link in a **Web request** step, so only connect an assistant you trust with that. It can also see which [text-to-speech voices](https://bloopbot.com/docs/text-to-speech#voices) your plan can use, so a **Speak text** step it builds names one you have; it can't add or change voices. - **Create and edit flows, packs, variable declarations and collections** — every new flow it makes starts **switched off**. It can create several flows with the same name: Bloopbot gives each an available identifier when the assistant leaves it to Bloopbot. Editing a flow that's already on changes what it does straight away, the same as if you'd saved the change yourself, and it can move a flow to the trash. It can change or delete one of your own packs; deleting a pack leaves its flows and overlays alone. It can make, change and delete control panels, and add a **Run button** trigger to a flow so a panel button can start it. There's no permanent flow delete: anything it trashes comes back from the Trash. It can set up a collection and its catalogue of items (names, pictures from your media library, rarity and weight), but it can't give a viewer an item or take one away, can't see what a particular viewer owns and can't delete a collection. You do those on the Collections page, or a flow does. - **Run a flow as a test, without it going live** — it can try a flow out and see what would have happened, without sending chat or showing anything on stream. - **Turn a flow on or off** — lets the assistant switch flows on and off for you. - **Actually run a flow, for real** — With it, the assistant can run a flow that starts with a **Run button** trigger, exactly as if you pressed **Run** in the editor: chat is sent, alerts show, points change. - **See your points store items and their settings** — It can read an item's price, stock, limits, question and whether it is on sale. - **Create, edit and archive points store items** — New items start off sale unless you ask for them to be available immediately. Editing an item already on sale takes effect for the next buyer. Archiving removes it from sale; past purchases remain in your history. - **See your overlays, themes and Studio drafts** — It can read each overlay's and theme's published design, any unpublished Studio changes and the names, types, folders and tags of files in your media library. It can render a draft picture with sample content. Designs may include text and links you entered. It cannot see the private Browser Source key or URL. - **Create overlays and themes, edit Studio drafts and organise your media** — It can create an overlay or a theme, edit part of an overlay draft or replace an overlay's or theme's full draft design, upload media files you give it, move, tag and rename files in your media library, and delete files nothing uses. A new overlay appears in Studio immediately, within your overlay limit; it reaches OBS only after you add its Browser Source there. A new theme waits in the draft. Draft changes do not reach OBS until they're published, by you in Studio or by the assistant with the permission below. Studio checks file type and storage limits, and refuses a draft save if someone changed it since the assistant last read it. It can also make a [custom widget](https://bloopbot.com/docs/your-widgets), put it on an overlay, change its code once for every overlay that shows it, restore an earlier version, make a separate copy, rename it, give it an icon and choose where it is listed in Studio's **Add** tab. - **Publish your Studio draft, so viewers see the changes** — With it, the assistant can press **Publish** for you. That publishes your Studio draft, the same as the button in Studio: every unpublished overlay, theme, alert and wheel change, including ones you made yourself, or only the parts you choose, with anything they need. What it leaves out stays in the draft. Before it publishes, the assistant lists what will go live and waits for your go-ahead. - **See your public page, links, sections, gear and domain** — It lets the assistant read the page's saved settings, including which pages are switched on. - **Edit your public page, links, sections, fonts and gear** — The assistant can replace your full link and gear lists, change the section order, text, YouTube source and page-wide fonts, and switch Home, Giveaways, Store or Quotes on or off. Saves appear on your public page straight away when your plan includes the feature. - **Add, check and remove your public page domain** — The assistant can start domain setup, check its status or disconnect it. You still add the DNS record with your domain provider. Custom domains come with Pro and may not be available on your channel yet. Whatever it does is recorded under the assistant's name: the flow's version history and your Audit log say which changes came from it. The assistant can choose which public command groups your [Commands page](https://bloopbot.com/docs/public-page#commands) lists. Moderator and broadcaster commands appear automatically only for signed-in viewers at those channel levels; the assistant cannot make them public by switching a group on. The [Public page guide](https://bloopbot.com/docs/public-page) explains the page controls. If a save is refused because your plan does not include links or sections, check [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). The assistant's permission does not change your plan. ## A worked example With **See**, **Create and edit** and **Run as a test** allowed, ask: "Make a !hug command: when someone types !hug and a name, say that they give that person a big hug." The assistant looks at your existing commands so it doesn't clash with one, drafts a flow with a **Chat command** trigger and a **Send chat** step, checks it, and runs it as a test. It then tells you the flow is saved and switched off. Open **Flows**, find it, look it over, and switch it on when you're happy. ## Build a control panel Allow **See your flows** and **Create and edit flows** when you connect. Then: 1. Ask: "Make a control panel called Match night for my Match day pack: a Home goal and an Away goal button for my Goal scored flow, and the home and away scores. Then put the panel in the pack." 2. The assistant reads what each flow asks for when it starts. A flow without a **Run button** trigger gets one first, and the assistant tells you about anything the flow reads that a button press leaves empty, such as the name of whoever typed a command. 3. It makes the panel with your buttons and tiles, fixing inputs where you said so, such as **Team** set to `home` on **Home goal**, and puts the panel in the pack. 4. Open **Bot** › **Control panels** and select **Open** on **Match night** to check it. A pack's panel may only have buttons for flows in that pack, so the assistant adds the flows to the pack first. If you edit the same panel in the dashboard while the assistant works on it, it is told the panel changed and reads it again before saving. A channel holds up to 20 panels. The assistant can't press a panel's buttons; with **Actually run a flow, for real** allowed, it can run the button's flow instead. [Control panels](https://bloopbot.com/docs/control-panels) explains every tile. ## Make a points store item Allow **See your points store items and their settings** and **Create, edit and archive points store items** when you connect. Then: 1. Ask: "Add a Hydrate item to my points store for 50 points. Let people buy it once per stream, and keep it off sale until I review it." 2. Have the assistant show you the item's price, limit and sale status after it saves. 3. Open **Loyalty and store** under **Viewers**, choose the **Store** tab, review the item and switch it on when you're ready. The new item appears in your store off sale. If the assistant says it needs `store:write`, reconnect it with the store edit permission ticked. [Let viewers spend points in a store](https://bloopbot.com/docs/points-store) explains what happens when someone buys it. ## Create an overlay Allow **See your overlays, themes and Studio drafts** and **Create overlays and themes, edit Studio drafts and organise your media** when you connect. Then: 1. Ask: "Create an overlay called Chat corner with a Chat starting layer." 2. Ask the assistant to show the new overlay's name and starting layer. Open **Studio** to arrange the layer or add others. 3. When the design is ready, [add the overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) using its Browser Source address from Studio. The assistant does not receive that private address. The new overlay exists as soon as the assistant creates it. Later design edits stay in Studio's draft until you **Publish**. If it says you have reached your overlay limit, review your existing overlays in Studio before creating another. ## Build a matching set For a stream with several scenes, ask: "Show me Studio's overlay layouts. Make a matching gameplay overlay, Starting soon, Be right back and Ending screen, then show me a picture of each with sample content. Use the same colours and type across them." 1. Let the assistant list your existing overlays and the ready-made layouts. Your channel can have one screen for each scene role, so use an existing screen if you already have one. 2. Ask it to create the missing layouts. They follow your **Active** theme and appear in **Overlays** straight away. Ask it to make or edit a theme in the Studio draft if you want a new look, and preview each screen with that theme. 3. Check the pictures for legible text, room for gameplay and a consistent look. Ask for changes and another picture until the set works together. Open **Studio** to review the draft and **Publish** it. Make the new theme Active there if you want all the overlays to follow it. 4. Add each scene's Browser Source from **Overlays** to its matching OBS scene; set it to 1920 × 1080. The assistant does not receive those private addresses. The pictures show sample content, so check the overlays against your own game and camera in OBS before going live. A scene that already exists keeps its Browser Source: ask the assistant to edit that screen's draft instead of creating a second one. [Scene screens](https://bloopbot.com/docs/widget-themes#scenes) explains how they fit into OBS. ## Design a look Your assistant has Bloopbot's design guide to work from, so ask for a feeling, not a list of settings. It asks a few quick questions if you haven't said: three words for the vibe, your brand colours or logo, the games you play, and where your webcam sits. Then it picks one look, says it back to you in a sentence, builds a theme for it first and styles every screen from that theme. It checks each picture the way a viewer on a phone would see it, making sure the words read and the game and your face stay clear, before showing it to you. 1. Ask: "Design a cosy look for my channel. Warm and handmade, my colour is terracotta. I play Stardew Valley and my webcam is bottom right." 2. Look at the pictures it shows you and react in your own words: "bolder", "calmer", "bigger countdown", "less glow". 3. For moving backgrounds on your Starting soon, Be right back and Ending screens, give it a looping WebM video (up to 25 MB). It puts the video behind the whole screen and darkens it where the words sit. It doesn't put a video behind your gameplay overlay, where it would cover the game. **Copy a design prompt** ``` Design a matching set of overlays for my channel: gameplay, Starting soon, Be right back and Ending. The vibe is late-night, neon and a bit retro; my brand colour is #2DF5C6. Use the attached looping video behind the three break screens. Tell me the look you chose, then show me a picture of each and leave it all unpublished so I can review it. ``` The assistant can't make a video itself. If you don't have one, it suggests what to look for and uses a gradient in the meantime. A picture shows one still moment of a video, so watch the loop in **Studio** before you go live. ## Edit an overlay draft Allow **See your overlays, themes and Studio drafts** and **Create overlays and themes, edit Studio drafts and organise your media** when you connect. Then: 1. Ask: "Show me the layer types Studio can add, then show me my Starting soon overlay and change its headline to 'Stream starts in five minutes' in the Studio draft." 2. Ask it to show a picture of the draft over sample stream content. If text is cramped, a layer covers gameplay, or the colours are hard to read, ask it to adjust the draft and show another picture. 3. Open **Studio**, select **Starting soon**, review the draft, and choose **Publish** when it looks right. Ask for “a preview on black” to check the overlay on its own, or “preview it over this gameplay screenshot” and give the assistant a direct public HTTPS image link. PNG, JPEG, GIF and WebP images up to 5 MB work; a private link, a redirect or a file that cannot load is refused. The picture is centred and cropped to fill the preview player. This background is only for the picture and does not become a layer in your overlay. With no background link, previews use black. The picture uses your draft layout and theme with made-up chat, alerts and other sample content. It is not a capture of your live stream. The assistant reads the latest Studio draft before saving. If Studio says the draft changed, ask it to read the overlay again and apply your change to the newest version. [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay) walks through reviewing and publishing. For a new picture, sound or video, give the file to your assistant and ask it to upload the file to your media library before adding it to the draft. PNG, JPEG, GIF, WebP, MP3, OGG, WAV and WebM files work, within the same size and storage limits as Studio: a picture or a sound up to 5 MB, a WebM video up to 25 MB, and your channel's media storage. A file over its limit is refused and nothing is saved. How quickly the upload goes depends on your assistant: - **An assistant that can run commands on your computer**, such as Claude Code or Codex, asks Bloopbot for a one-time upload link and sends the file to it directly. That takes seconds, even for a 25 MB video. The first time, your assistant may ask you to allow the `curl` command it uses to send the file. Each link works once, for 15 minutes. - **An assistant that can only chat** has to spell the whole file out as text. That is slow, a few minutes even for a small picture, and only works for files under 3 MB. If your assistant cannot send a file to Bloopbot, or a large file is taking too long, upload it in Studio's **Media** tab first, then ask the assistant to use that existing file. ## Publish from your assistant Allow **Publish your Studio draft, so viewers see the changes** as well as the two overlay permissions when you connect. Then, once a draft looks right in the pictures: 1. Ask: "Publish my overlay changes." 2. The assistant lists every change waiting in your Studio draft, for example "Starting soon: changed overlay settings" or "added theme Night show", and asks which to publish. 3. Say "all of them" or name the ones you want. The assistant publishes, and your Browser Sources in OBS update within a few seconds, just as when you press **Publish** in Studio. You can publish just some of it. Say "Publish only Starting soon" and the other changes stay in your draft, as when you untick them in Studio's **Publish your overlay** review. If what you pick needs an alert design or theme that isn't live yet, that goes too, and so can another overlay (when you renamed an alert design that several overlays show, they go live together), and the assistant tells you so before it publishes. If you or an editor changed the draft since the assistant last looked, it tells you what's new and asks again. If a published change turns out wrong, open **Studio**, choose **History**, restore the version from before it into your draft and publish again ([Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay) explains **History**). Without this permission, the assistant tells you the draft is ready and you publish it in Studio yourself. ## Keep your media library tidy With the same two overlay permissions, your assistant can file what it uploads into a folder and label it with tags. Studio's **Media** tab and every media picker let you browse by those folders and tags, and the **Media** page in the sidebar is where you manage them. Ask for it in your own words: "Upload this as a sub alert picture into a folder called Alerts/Subs, and tag it cute." Folders can be nested up to three levels, a folder name is up to 48 characters, a file can carry up to 20 tags, and the assistant creates a folder that does not exist yet. If it cannot make the folder (for instance you have reached the folder limit), the file still goes into your library at the top level and the assistant tells you. It can also tidy files you already have: "Move my four sub pictures into Alerts/Subs and tag them cute", "Rename that file to Sub chime", or "Show me everything tagged cute." It looks files up by folder, tag or part of a name. It can also read how your library is organised, every folder with how many files and subfolders it holds and every tag with how many files carry it, so "What folders do I have?" or "Which tags do I use most?" gets a real answer, and it can reuse a folder or tag you already have instead of making a near-duplicate. Seeing the folders and tags needs only the **See your overlays, themes and Studio drafts** permission. Moving, tagging and renaming a file never breaks an overlay or theme that already uses it. A new file name can use letters, digits, spaces and the characters `_ . ( ) -`, up to 80 characters; the assistant is told when a name needs changing. If you upload a picture that is already in your library, the assistant tells you where the existing copy lives instead of adding another; the copy stays put and any tags you asked for are added to it. Files you install from the marketplace appear in a folder called Marketplace, inside a folder named after the listing. It can delete files you no longer need: "Delete the three old sub pictures in Alerts/Subs." Deleting is permanent, so the assistant names the exact files and waits for your go-ahead before it deletes anything. A file that something still uses is kept, even if you ask. That includes an overlay, a theme, an alert design, a giveaway, a points store item or a flow, published or waiting in your unpublished Studio changes. The assistant tells you what uses it, so you can swap the file out there first. It deletes up to 200 files at a time, and the rest still go if some are kept. Your assistant cannot delete folders, and it cannot publish anything to the marketplace. Deleting a folder can remove files something still uses, so you do it yourself on the **Media** page, where you confirm by typing the folder's name. Publishing needs you to confirm you have the rights to what you share, so that stays with you too. ## Create a theme Allow the two overlay permissions when you connect. Then: 1. Ask: "Make a theme called Night show from my current theme. Use a deep navy panel and warm gold accent." 2. Ask the assistant to show the colours, type and any alert designs it changed, then show a picture of one of your overlays in the new theme. Ask it to refine the look and preview again as needed. 3. Open any overlay in **Studio**, choose **Theme**, select **Night show** and review it on the canvas. Choose the check icon (**Make Active**) if every overlay should follow it, or use it on one overlay. Press **Publish** when it looks right. The assistant can also start with **Studio**, **Capsule**, **Scoreboard** or **Minimal**. A new theme stays in your draft and does not change OBS until you publish. If your plan's theme limit is reached, Studio asks you to replace or remove a theme before creating another. [Style every overlay with a theme](https://bloopbot.com/docs/widget-themes#new) explains themes and how they affect overlays. ## Add a frame to your panels Allow the two overlay permissions when you connect. A frame is a picture drawn as a border round a panel, a chat line or an alert card ([Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames)). Then: 1. Attach a PNG or WebP frame picture with a see-through middle, and ask: "Upload this as a frame and put it round the panels in my Night show theme. Its corners are 32 pixels, so cut it at 32 and draw it 16 pixels thick." 2. The assistant saves the frame in your draft, then shows a picture of one of your overlays in that theme and checks the corners. If they look squashed or the frame covers your text, it changes the corner size, the thickness or how the sides fill, and shows another picture. You can ask for the same by hand. 3. To frame just one layer, name it: "Give the Follow alert layer its own thicker frame." The assistant sets that layer’s own frame and leaves the theme’s as it was. To keep the theme’s frame off one layer, or one part such as a chat line, say so: it sets that layer’s or part’s frame to **None**, which clears it completely. 4. Open **Studio**, look the draft over, and press **Publish** when it looks right. **Copy a frame prompt** ``` Upload the attached PNG as a frame and use it as the panel frame of my Night show theme, with 32 pixel corners and a frame width of 16. Then show me a picture of my Starting soon overlay in that theme. Leave everything unpublished so I can review it in Studio. ``` What the assistant knows about frames, and what you can rely on: - A frame’s **Frame width** replaces the box’s own border width, including a **Border** set on a part under **Parts**. Studio, Capsule and Scoreboard give alert cards, and chat lines in the Bubbles layout, a 2-pixel border (Capsule’s chat lines have one in every layout), so a frame’s width takes its place there. Minimal draws none. - **None** on a layer or a part clears a frame completely: no picture, and no thick edge left behind. - A chat line frame works in every chat layout. - A Poll card, the End credits panel, an Image layer and a Box or Circle shape take the panel frame. A Divider and a Minigames layer take none, so the assistant will not promise one there, and a frame set on a layer that draws none is refused. - A theme the assistant copies keeps its frames. - A picture used as a frame must be an image; a sound or a video is refused. When Bloopbot refuses a save, it says which field was at fault, for example a layer’s frame picture, so the assistant can read it and fix it. If your assistant cannot send a file to Bloopbot, upload the picture in Studio’s **Media** tab first and ask it to use that file. The frame waits in your draft like any other change until you publish. ## Remove it Open **Settings** › **Connected apps** in your channel's sidebar and select the bin icon (**Revoke**) next to the assistant. It's signed out straight away and can't reach your channel again until you connect it again. [See and remove connected apps](https://bloopbot.com/docs/connected-apps) covers the page. ## Troubleshooting - **"AI assistant connection is not included in this channel's plan"** — connecting an AI assistant comes with Pro. Check [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). - **"Missing scope" when it tries to do something** — that permission wasn't ticked when you connected. Revoke it on **Connected apps**, connect it again, and tick the permission on the consent screen. - **It says a flow is paused when it tries to run it** — the flow is switched off, or it has no **Run button** trigger. Only a switched-on flow that starts with **Run button** can be run. - **"Busy" or "too many runs"** — the flow is already running, or it has been run a lot in a short time. Wait a moment and try again. - **A social post step it made says the account is not connected, or needs reconnecting** — the assistant can't connect accounts. Open **Settings** › **Connections**, connect or reconnect that network, and run the flow again. A message that posting to a network isn't available yet means the network isn't offered on your channel yet, not that the step is wrong. - **A Discord step it made says to choose a server and channel** — the assistant can't see your Discord servers, so it leaves them empty. Open the flow, choose the server and channel in the **Post to Discord** step, and save. - **A save is refused because the flow changed** — someone saved the same flow in the meantime. The assistant is given the latest version so it can redo its change on top. - **An upload takes minutes, or a file of 3 MB or more won't upload** — your assistant is spelling the file out as text. An assistant that can run commands on your computer, such as Claude Code, uses a one-time upload link instead and takes seconds; see [Edit an overlay draft](https://bloopbot.com/docs/connect-an-ai-assistant#overlay-example). Or upload the file in Studio's **Media** tab and ask the assistant to use it. - **A custom widget takes minutes to save** — for a small edit, ask the assistant to patch the widget with only the changed snippet, rather than send its whole code again. It edits the widget once, for every overlay that shows it. See [Work with your widgets](https://bloopbot.com/docs/connect-an-ai-assistant#widgets). A graphic that is not a widget can use a source link instead: see [Ask for a custom graphic](https://bloopbot.com/docs/connect-an-ai-assistant#graphics). - **"This upload link is unknown, already used or expired"** — each upload link works once, for 15 minutes. Ask the assistant to upload the file again; it gets a new link. ## Ask for a custom graphic An assistant can author HTML, CSS and TypeScript or JavaScript in a **Custom graphic** layer, with the bundled GSAP or PixiJS libraries. Give it the events, named flow messages, variables and editable settings you need; ask it to create or reuse a delivery flow for every selected alert and message; ask it to discover the graphics contract, save source to the Studio draft, then render a simulated event at a chosen timestamp. To check an animation, ask for a frame strip: up to twelve timestamps rendered as one image each, such as the entrance, the hold and the exit. Ask it to declare the values each flow message carries, so the flow editor can fill in and check the **Send to overlay** rows. Ask it to add [examples and a demo](https://bloopbot.com/docs/author-custom-graphics#examples), such as “a small raid, then a huge one two seconds later”, so whoever adds your graphic can press **Play example**; its previews then play that demo. Review the expanded code-and-preview workspace before **Publish**. See [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics#assistant) for a prompt and the complete workflow. A TypeScript mistake never blocks its save; the assistant is told the line to fix. For later edits, the assistant can change just the affected source snippet or setting. It keeps the rest of your graphic and saves to the same Studio draft. 1. Connect with **See your overlays, themes and Studio drafts** and **Create overlays and themes, edit Studio drafts and organise your media** permissions and ask the assistant to read your current graphic. 2. Give it a focused change, for example: “Change the raid card accent from red to green. Use `patch_overlay_draft` with only the changed snippet; keep the rest of the graphic.” 3. Ask it to preview the changed raid card, then review the result in **Studio** before **Publish**. A graphic you installed from the marketplace may be **sealed**: its creator kept the code private, so the assistant can't read or change it. It can still read the graphic and change its settings, messages, variables and sound volume, and it will tell you if you ask for new code. See [Sealed graphics](https://bloopbot.com/docs/author-custom-graphics#sealed). A small edit no longer needs the assistant to send all the unchanged HTML, CSS and JavaScript again. The first version or a complete rewrite still needs the new source. If Studio changed in the meantime, the assistant must read the latest draft and reconcile its edit. If the same snippet appears more than once, it must include enough surrounding text to identify the intended change. A refused patch saves nothing; OBS keeps the published version until you publish the draft. This is for a graphic that is not one of your [widgets](https://bloopbot.com/docs/connect-an-ai-assistant#widgets); a widget's code is patched instead. A big graphic saves fastest from files. An assistant that can run commands on your computer, such as Claude Code, keeps the graphic's HTML, CSS and JavaScript as files, asks Bloopbot for a source link once and sends each changed file in a second or two, instead of writing the whole code out, which can take minutes. You can ask for it directly: “Keep the raid card's code in files and send them with a source link.” Each file lands in the same Studio draft through the same checks as any other save. A link lasts 15 minutes and saves up to three times; if you edit the graphic in **Studio** in the meantime, the link stops working and the assistant reads your latest draft and asks for a new one, so your change is never overwritten. Nothing reaches OBS until you **Publish**. ## Work with your widgets Your [widgets](https://bloopbot.com/docs/your-widgets) are kept once and shown on as many overlays as you like. With **See your overlays, themes and Studio drafts** an assistant can list them, see which overlays show each one and read its code. With **Create overlays and themes, edit Studio drafts and organise your media** it can also: - make a widget and put it on an overlay, at a position you ask for or top left by default, for you to adjust in Studio; - change a widget's code once, for every overlay that shows it, in your draft; - bring back a version you published before, or delete a widget and its layers in your draft; - give one layer its own copy, rename a widget, set its icon, and choose where Studio's **Add** tab lists it. For example: "Make my raid card widget's accent green, and list it under Raid alert." Its code changes wait in your draft until you press **Publish**, or the assistant publishes with your go-ahead; a name, an icon and **Listed under** apply at once. It can't read or change a sealed widget's code. A widget's code is changed by patching the widget, not with a source link: a source link works only for a graphic that is not a widget. --- # Add an overlay to OBS Create a hosted label, goal bar, event stack, poll, alerts, media, chat box, now-playing or giveaway panel and put it on screen. Updated 27 October 2026 ## 1. Name your overlay Open **Overlays**. The **Overlays** tab has a searchable library with a live thumbnail for each overlay, drawn with your variables’ and channel data’s current values: **Published** when its saved overlay edits have been published, **Unpublished** when its draft has changes still waiting. Published does not tell you whether OBS is open or the source is in your current scene; check your OBS preview for that. Select an overlay to inspect its preview, then choose **Open in Studio** to edit it. The copy icon beside that action copies its private OBS URL. On a phone, **Back to library** returns to your overlays. > **Pebble can walk you through it** > > Pebble’s **Set up your bot** tutorial adds your ready-made _My alerts_ overlay to your streaming app and watches an alert play, **Put your alerts on stream** does the same later if you put that step off, **Your first overlay** builds an alert and publishes it, and **Add a goal bar** puts a goal on an overlay you already have. Start either from [Tutorials](https://bloopbot.com/docs/tutorials). ![The Overlays tab with Media, Add alerts and Browse templates below the search, beside the Gameplay inspector with its live preview, Published state, Open in Studio and Copy OBS URL actions.](https://bloopbot.com/docs/screenshots/overlays-list.jpg) _Your overlays: one card per Browser Source, each with a live thumbnail, its publication status, and copy and bin icons._ There are two ways to make one. - **Browse templates** below the overlay search opens **Add to Overlays** on the right of your overlays: Bloopbot’s ready-made overlays, each a whole layout drawn in your Active theme, with a picture of what it looks like. Press **Add** on a row, read its review — “Adds 1 overlay to your channel.” — and press **Add**. It reads **Added**, with **Add the OBS source** and a copy icon (**Copy URL**) under **Set it up**, and the overlay joins **Your overlays** under the row’s name. - **New overlay**, or the dashed **New overlay** card at the end of the library, makes an empty one. Give it a **Name** you will recognise — that is all it asks — and press **Create overlay**. The editor opens on a blank canvas, on its **Add** tab, ready for the first layer. | In Add to Overlays | What you get | | --- | --- | | **Gameplay** | A camera frame with your name, a goal, polls and predictions, chat and alerts, around your game | | **Just chatting** | A big camera frame with a topic line, supporters, a goal, chat and alerts, on its own backdrop | | **Q&A** | A big camera frame with the viewer question you are answering underneath it, a topic line, chat and alerts, on its own backdrop | | **Starting soon** | A welcome line, a five-minute countdown, what is playing, chat and alerts | | **Be right back** | A five-minute countdown, a status line, top gifters, chat and alerts | | **Stream ending** | A thank-you, when you are next live, top gifters and rolling end credits | | **Webcam frame** | A camera frame with your name, your latest follower and your latest sub, bottom right | | **Subathon** | A subathon timer and goal, top gifters, a supporters ticker, chat and alerts | | **Chat** | Chat down the right, with a highlighted message above it | | **Alerts & pop-ups** | Every alert, polls and predictions, and a highlighted message; nothing shows until something happens | | **Goals & events bar** | A bar along the bottom with your latest follower and sub, a goal and how long you have been live | Each row says **Overlay · Over your game**, **Overlay · Scene screen** or, for the full-screen **Q&A**, **Overlay · Full screen**, and the overlay you add takes the row’s name. To add one thing on its own, such as a counter or a single alert, open any overlay and drag its tile from the editor’s **Add** tab ([Mix the types you want](https://bloopbot.com/docs/arrange-your-overlay#kinds)). | In the editor’s Add tab | What you get | | --- | --- | | Label | A counter, a line of text or a recent subscriber | | Goal bar | Progress towards a goal or a stored number | | Event stack | Polls, predictions, hype trains and ad breaks | | Poll | Whichever Twitch poll or prediction is running right now, on its own card | | An alert type — Follow, Sub, Resub, Gift sub, Cheer, Raid, Redemption or Custom alert | That alert, drawn from its own design; every alert and media file waits its turn in one shared queue | | Media | The spot where the images, videos and sounds your **Play media** flows play are shown, such as a sound for a [channel points reward](https://bloopbot.com/docs/reward-redemptions#sound) | | Chat | Your channel’s chat, with emotes, badges and moderation | | Emote Wall | The emotes chat sends, 7TV, BTTV and FFZ included, moving across the screen — [Add an emote wall](https://bloopbot.com/docs/emote-wall) | | Now playing | The track that is playing now and the requests coming up next | | Giveaway | Your live giveaway: the prize, the keyword, who has entered, and the draw | | Wheel | A Spin Wheel your flows spin — [Spin a wheel on stream](https://bloopbot.com/docs/spin-wheel) | ![Your overlays with Add to Overlays docked on the right: Search overlays, the All, Overlays and Alert designs filters, then the ready-made overlays, each with a picture of its layout and Add: Gameplay, Webcam frame, Subathon, Chat and Alerts & pop-ups reading Overlay · Over your game, Q&A reading Overlay · Full screen, and Just chatting, Starting soon, Be right back and Stream ending reading Overlay · Scene screen.](https://bloopbot.com/docs/screenshots/overlays-add-door.jpg) _Add to Overlays: Bloopbot’s ready-made overlays, each pictured in your theme._ ![The New overlay popover under the New overlay button: Name holds Just chatting, a line saying it starts empty and you add layers in the editor, and Create overlay and Cancel buttons.](https://bloopbot.com/docs/screenshots/new-overlay.jpg) _New overlay: a name, and nothing else. It starts empty. Esc or a click outside closes it._ An overlay is a surface, and every part of it is a layer — so whatever you start with, you can add more of any type afterwards, and every type is offered on every overlay. [Arranging your overlay](https://bloopbot.com/docs/arrange-your-overlay) walks through building one; [Put now-playing on stream](https://bloopbot.com/docs/now-playing-in-obs) is the worked example for a single type. ## Start from a ready-made overlay Choose **Browse Marketplace** at the top, or beside the selected overlay, to find community overlays. **Submit to Marketplace** opens the submission steps: choose the overlays or custom widgets you made, fill in their listing, and submit them for review. [Publish to the Marketplace](https://bloopbot.com/docs/publish-to-the-marketplace) explains what can be shared. A ready-made overlay is a whole layout, not a single piece. Everything on it follows your Active theme: switch themes and its text, panels, camera frame and backdrop change with it. Open it like any overlay to move, restyle or remove any part. - **Your camera.** An overlay can frame your camera but never shows it. In OBS, put your camera source above the overlay’s Browser Source in the Sources list and size it to the inside of the frame. On **Just chatting** and **Q&A**, the backdrop covers the whole canvas, so the camera must be above it. - **Your name.** **Gameplay** and **Webcam frame** have a name plate that says your channel’s name. Click it in the editor to change the text. - **Viewer questions.** **Q&A** has a **Viewer questions** layer under the camera. It stays empty until you put a question on your overlay, so nothing shows until then; [Catch viewer questions](https://bloopbot.com/docs/catch-viewer-questions) shows how to collect and show them. It is not one of your scene screens, so adding it never asks you to restyle one. - **Scene screens.** **Starting soon**, **Be right back**, **Stream ending** and **Just chatting** are [scene screens](https://bloopbot.com/docs/widget-themes#scenes). When you do not have that screen yet, the one you add becomes it. - **IRL layouts.** On a channel with the cloud stream, the Marketplace also offers IRL layouts, laid out around your phone camera. When you already have that scene screen, the review asks what to do: 1. **Restyle my screen**, picked to start with, gives your screen this layout. Your screen’s current layers are replaced; History keeps them. It keeps its URL, so OBS needs nothing new, and the change waits in your draft until you publish. 2. **Add a new overlay** adds it as an ordinary overlay and leaves your screen as it is. ![The review for Starting soon when the channel already has a Starting soon screen: You already have a Starting soon screen, the Add button, the question Restyle Starting soon with this layout, or add it as a new overlay? with Restyle my screen picked and Add a new overlay beside it, the note that the screen’s current layers are replaced and History keeps them, What you get, and What’s inside folded.](https://bloopbot.com/docs/screenshots/overlay-template-clash.jpg) _Adding Starting soon when you already have that screen: Restyle my screen is picked, and Add a new overlay is the other choice._ For example: press **Add** on **Starting soon** when you already have Studio’s Starting soon screen, leave **Restyle my screen** picked and press **Add**. It reads “… has the Starting soon layout in your draft.” Publish, and your **Starting Soon** scene in OBS shows the new layout on the same URL. If something looks wrong: - Chat runs past the bottom of its box: that cannot happen on a ready-made overlay. Each chat box keeps to its height and drops the oldest lines. If your own chat layer grows, drag its bottom edge to give it a fixed height. - The camera frame is empty in OBS: add your camera source and place it inside the frame, as above. - The name plate says **yourchannel**: your channel’s name could not be read when you added it. Click the plate and type your name. ## 2. Configure and check the canvas 1. Open the overlay: **Create overlay** opens it for you; after **Add**, click its card in **Your overlays**. The editor opens with the canvas in the middle, your layers on the left under **Layers**, and the selected layer’s settings on the right — or the overlay’s own style when nothing is selected. 2. For a counter or live label, choose the variable or data field it should display. 3. Use the canvas to check text length, size and placement. Your changes go into a draft as you make them, and the status in the top bar reads **1 change · draft saved**, **2 changes · draft saved** and so on. 4. Press **Publish** in the top bar, review the named changes and affected overlays, then confirm Publish to update the published version your Browser Source uses. The status then reads **Published**. Routine edits and fresh channel values update the canvas without replaying an unchanged sample alert or its sound. Use **Test in editor** on an alert layer, or **Simulate** beside **Editor preview** in the top bar, when you want to replay a sample. Click the status to see what is waiting: **Waiting to publish** includes the overlay’s edits and shared changes, such as alert designs and themes. The draft chip counts those shared changes too. **Publish** always opens a review, even for one changed part; choose which changed overlays, themes, designs, wheels and flows go live, and leave the rest in your draft. **Discard changes…** asks before it throws them all away, on every overlay. ![The editor status reading 1 change · draft saved, opened into Waiting to publish with only “Starting soon: changed Main settings”, a reminder that Publish and Discard apply to the whole channel draft, an explanation that Published does not confirm OBS visibility, and Publish and Discard changes… buttons.](https://bloopbot.com/docs/screenshots/draft-status.jpg) _Waiting to publish: overlay and shared edits, Publish, and Discard changes…._ **History**, beside it, lists every Publish as a version, newest first, with the live one marked **Live**. **Preview** shows a version on the canvas without changing anything; **Restore to draft** puts it back in your draft, and nothing changes on stream until you publish again. ![The History popover: “Every Publish is a version. Restoring puts it in your draft — nothing changes on stream until you publish.”, then v1 with its date and author marked Live, listing what it published — Gameplay: added Follow alert, added Raid alert, added Chat, added Media, added design follow, added design raid, created flow Alert: raid — and a Preview button.](https://bloopbot.com/docs/screenshots/history-popover.jpg) _History: every Publish is a version you can preview and restore into your draft._ An overlay is a surface: that design is the one its layers start with, and you can add pieces of other kinds to the same overlay and give any one of them a design of its own. [Arranging your overlay](https://bloopbot.com/docs/arrange-your-overlay) is the guide for that — dragging layers around the canvas, mixing the kinds and setting one layer apart. ## 3. Add the Browser Source Open **OBS URL** in the editor’s top bar and select the copy icon (**Copy OBS URL**), or use the copy icon (**Copy URL**) on the overlay’s card. The key in it is never shown, only copied. ![The OBS URL popover under the OBS URL button: Overlay URL with the key painted over, the Copy OBS URL icon, the lines about a 1920 × 1080 Browser Source and leaving Shutdown source when not visible unticked, so only the scene on screen plays alerts and they wait while it is hidden, then the Make a new OBS URL… and Delete overlay… icons, and “Treat the URL like a password”.](https://bloopbot.com/docs/screenshots/obs-url-popover.jpg) _OBS URL: copy it for your Browser Source. New URL… and Delete overlay… each ask first._ 1. In OBS, open the scene that should show the widget. 2. Add a **Browser Source** in Sources and give it a clear name. 3. Paste the copied overlay URL into the URL field. Overlays use a web URL, so leave **Local file** off. 4. Set Width to **1920** and Height to **1080**, then position the source in your scene. Leave **Shutdown source when not visible** unticked: only the scene on screen plays alerts, and alerts wait while it is hidden ([alerts in more than one scene](https://bloopbot.com/docs/alerts#several-scenes)). 5. Keep the scene visible while checking the widget. Make another design change in Bloopbot, press **Publish**, and confirm it appears in OBS. Streaming in Twitch's dual format as well? The same panel has a second link for a 1080 × 1920 vertical canvas: [Vertical overlays for Twitch dual format](https://bloopbot.com/docs/vertical-overlays-twitch-dual-format). Until you publish, OBS keeps showing the version it already has. Step 5 of [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay), **Publish your changes**, explains the draft, Publish and History. Starting soon, Be right back, Stream ending and Just chatting screens come ready-made with a theme. [Scene screens](https://bloopbot.com/docs/widget-themes#scenes) lists which OBS scene each goes in, and [Import the scenes into OBS](https://bloopbot.com/docs/widget-themes#obs-import) adds all four at once. > **Keep your source URL private** > > A widget URL includes its access key. Anyone with the URL can open that widget. If you rotate the key in the editor, replace the old URL in each OBS source that uses it. ## Move a goal bar or counter from a flow A goal bar whose source is **A number you keep**, and a label that shows `$(var.deaths)`, both follow a variable. A flow never talks to the widget: it changes the variable with **Set variable**, and every widget watching that variable updates on its own. The quickest start is the **On-screen numbers** pack: on **Flows**, press **Marketplace** and add it. | Number on screen | Variable it keeps | Point this widget at it | | --- | --- | --- | | Goal bar | `goal` — new subs, resubs and gifted subs add to it; `!goal` reads it and `!addgoal 5` moves it by hand, and setting that flow’s step to **set** starts the bar over | Goal bar → source **A number you keep** → variable `goal` | | Win counter | `wins` — `!win` adds one, and setting the step to **set** with a value of `0` starts the count over | Label → text `Wins: $(var.wins)` | | Death counter | `deaths` — from the Starter pack’s Counter templates, not this one: `!deaths +` adds one, mods only. This pack does not declare `deaths` any more — install Starter’s Counter to get the flow and the variable together, or declare `deaths` yourself under **Variables** if you only want the label. | Label → text `Deaths: $(var.deaths)` | 1. Install the pack and let the install prompt create `goal` and `wins`, its number variables. 2. Create the widget and point it at the same variable name. The Goal bar’s **Your own number** design is already set to **A number you keep** and follows `goal` with a target of 100, and the Label’s counter design already shows `$(var.deaths)`. To choose another, open the goal bar’s **Variable** list — each entry shows its value now, like `goal (now 0)` — or pick **New variable…** at the bottom to declare a number there and then and have the bar follow it. 3. Check the line under the variable: **Changed by 1 flow · Open** means one switched-on flow moves it, and **Open** lists every flow that changes it, each a link to the flow. Pack flows install paused, so it reads **Changed by 0 flows** until you turn one on; a paused flow is listed, marked _paused_, but not counted. 4. Type the command in chat, or use **Test fire** on the flow, and watch the widget move. 5. To count something else — bits, follows, raids — open one of the installed flows, swap its trigger, and set how much **Set variable** adds. ![A goal bar layer’s settings with its source set to A number you keep and the Variable picker reading “goal (now 0)”. Under it the line “goal · Changed by 1 flow · Open”, and the Open popover titled Flows that change goal lists four flows as links: Goal: !addgoal, Goal: count gifted subs and Goal: count resubs, each marked paused, and Goal: count new subs, which is on.](https://bloopbot.com/docs/screenshots/widget-variable-panel.jpg) _A goal bar following `goal`: one flow that is on changes it, and Open lists the paused ones too._ **Using a Twitch-goal bar or your own widget?** A goal bar whose source is a Twitch goal follows only a goal you run on Twitch, so a flow cannot move it. To show a number you keep, open the bar, set its source to **A number you keep** and pick the variable. A widget you built yourself reads the variable from the `vars` updates it asks for when it connects. **Show or hide a piece from a flow.** To bring a layer on screen or take it off — a BRB screen for `!brb`, a banner for ten seconds after a reward — use the **Show a layer** and **Hide a layer** steps: [Show or hide layers from a flow](https://bloopbot.com/docs/arrange-your-overlay#flow-show-hide). An older flow may still have a **Show a goal** step. That step has been retired, so the flow shows as needing attention until you remove it: switch the goal bar’s source to **A number you keep** first, then delete the step. The **Event stack** widget shows your real Twitch polls, predictions, hype trains and ad breaks as they happen — [React to polls, predictions and hype trains](https://bloopbot.com/docs/polls-and-predictions) covers them. Four actions under Overlay stage one without anything really running on Twitch: **Overlay poll card**, **Overlay prediction card**, **Show a hype train** and **Show an ad break**. Each one puts its event on the widget from numbers your flow gives it — a poll’s choices and vote counts, a prediction’s outcomes and points, a hype train’s level and progress — remembers it for a widget that connects later, and steps aside while a real one of that kind is running on your channel. > **Keep the two targets the same** > > The goal bar’s target lives on the widget. The **Goal: reached!** flow celebrates when the variable passes its own number, 100 to start with. If you change one, change the other. ## Delete an overlay An overlay you no longer use can be deleted from **Overlays**. It frees a place when your channel has all the overlays it can have. 1. Open **Overlays**. 2. On the overlay’s card, select the bin icon (**Delete overlay…**). 3. Read the question and press **Delete overlay** to confirm, or **Cancel** to keep it. The card disappears from the list. Any Browser Source in OBS that used its URL goes blank, and the deletion cannot be undone. Alerts, chat and goal designs it showed stay on your channel for your other overlays. The same bin icon (**Delete overlay…**) is also under **OBS URL** in the editor’s top bar. ## Delete several overlays at once 1. Open **Overlays** and tick the box on each overlay card you want to delete, or tick **Select all** above the cards. 2. Hold **Shift** and tick another card to take every card between the two. 3. Select the bin icon (**Delete**) in the bar above the cards. The question names how many overlays it covers; press **Delete overlays** to confirm. The cross icon (**Clear selection**) unticks everything instead. Each overlay goes the same way as [Delete an overlay](https://bloopbot.com/docs/widgets-in-obs#delete): any Browser Source in OBS that used its URL goes blank, and it cannot be undone. An overlay that could not be deleted stays in the list and is named above the cards. ## Group overlays into packs A pack keeps overlays that belong together beside the flows that drive them, for example the screens and the alerts of one stream style. [Group flows and overlays into a pack](https://bloopbot.com/docs/create-packs#overlays) shows how to make one. 1. Open **Overlays** and choose the **Packs** tab. It lists every pack that holds at least one of your overlays. The toggle switches between **All**, **Mine** for the packs you made, and **Marketplace** for the packs you added. 2. Read a card's bar: one segment per overlay, solid for **Published** and outlined for **Unpublished changes**. The card offers **Review in Studio** when one of its overlays has changes OBS has not got yet, or says **All published**. Publish from Studio: review which parts go live, because the draft can include changes beyond this pack. 3. Select a pack to inspect it beside the library. Each overlay has the copy icon (**Copy the OBS URL**) for its Browser Source, the pencil icon (**Open in Studio**) and, in a pack you made, the minus icon (**Remove from this pack**). **Also in this pack** links to the pack's flows on **Flows**. On the **Overlays** tab, a small chip on a card names the pack it is in; click it to open that pack. An overlay that came with a pack you added from the Marketplace is grouped under that pack by itself. Overlays in no pack are listed under **Not in a pack** at the bottom of the **Packs** tab, with **Make a pack from these**. ![The Packs tab with search and source filters above a compact library containing Solo Adventure and On-screen numbers; the selected On-screen numbers inspector shows its publication state and Goal bar overlay, with loose overlays below.](https://bloopbot.com/docs/screenshots/overlay-packs-list.jpg) _Overlays → Packs: a pack you made with an overlay waiting to publish, beside a built-in pack, and the overlays in no pack._ ## If you cannot see anything - A transparent label with no content may look empty. Check its text and selected variable first. - An alert layer or event stack may be idle until an event arrives. Use the matching test in its editor where available. - A banner says **Your old Alert box was retired**: that widget had an Alert box, which alerts no longer use. Its settings were not carried over, so add the alert types you want from **Add** on the left of the editor, then **Publish**. - Make sure the source is visible and is above any full-screen capture that would cover it. - If an overlay URL stops working, overlays may not be available for your channel yet, or may just be temporarily unavailable — try again in a moment. Your flows still run, and the widget editor’s canvas still shows what the widget looks like. --- # Vertical overlays for Twitch dual format Give your overlay its own layout for Twitch's vertical video. Updated 24 October 2026 ## What dual format is Twitch's dual format streams a wide 16:9 video and a tall 9:16 one for phones at once. In OBS the tall picture comes from a second canvas next to your usual one, and your overlay can draw on both. Each overlay has two layouts that share everything except where things sit: a horizontal layout on the 1920 × 1080 canvas you already use, and a vertical layout on a 1080 × 1920 canvas. Settings, theme, layer names and layer order are the same on both, so you only arrange the vertical picture once. You need an overlay already on screen in OBS ([Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs)) and OBS Studio 32 or newer. Dual format is available to all streamers on Twitch; [Twitch's dual format help article](https://help.twitch.tv/s/article/dual-format-vertical-video) has the latest steps. ## 1. Turn on OBS's vertical canvas 1. Install the **Aitum Vertical** plugin for OBS (the setup Twitch walks through; Twitch also lists StreamElements' vertical plugin), and restart OBS. 2. In OBS, open **Settings → Stream**. Under **Multitrack Video**, tick **Enhanced Broadcasting**. 3. Set the **Additional Canvas** dropdown to **Aitum Vertical**. If it is not listed, close and reopen OBS. 4. In OBS's top menu, open **Docks** and enable **Vertical Scenes** and **Vertical Sources**. 5. Apply. OBS now has a vertical canvas. You switch scenes from your main (horizontal) scene list. You should see a vertical canvas, with **Vertical Scenes** and **Vertical Sources** panels, in OBS. Press **Start Streaming** once to go live in both formats; there is no separate Go Live for the vertical canvas. ## 2. Add the vertical link as a Browser Source 1. In Studio, open your overlay and choose **OBS URL** in the top bar. 2. Find the second row, **Vertical canvas (Twitch dual format) — 1080 × 1920**, and select its copy icon. The key in the link is never shown, only copied. 3. In OBS, press the **+** in the **Vertical Sources** panel and add a **Browser Source**. 4. Paste the link into **URL**, then set **Width** to **1080** and **Height** to **1920**. You should see the overlay drawn tall on the vertical canvas. ![The OBS URL popover with two links: the overlay's usual link, and a second row for the Vertical canvas (Twitch dual format), 1080 by 1920, each with a copy icon.](https://bloopbot.com/docs/screenshots/vertical-obs-link.jpg) _OBS URL: the usual link, and under it the Vertical canvas (Twitch dual format) link for a 1080 × 1920 Browser Source._ The vertical link is your overlay's usual link with `?layout=vertical` on the end. Keep the first link on your horizontal canvas as it is. Treat both links like passwords. ## 3. Arrange the vertical layout in Studio 1. Open your overlay in Studio. Above the canvas, press the **Vertical layout** icon (the tall rectangle, next to the wide **Horizontal layout** icon). 2. Look at the canvas: it is now tall. What you change from here belongs to the vertical layout only. 3. Drag or resize a layer, or press its eye, and see the vertical layout take that change while the horizontal one stays as it was. 4. Press the **Horizontal layout** icon whenever you want the wide layout back. Pebble can walk you through this on the real pages: open [Tutorials](https://bloopbot.com/docs/tutorials) and start **Make your overlay vertical**. It has you press **Vertical layout**, drag one layer on the tall canvas, and copy the vertical link from **OBS URL**. You should see a 1080 × 1920 canvas on Vertical and your usual canvas on Horizontal. Here is what happens to layers: - Layers you have not touched on Vertical are **Auto-placed**: they follow your horizontal layout, keeping their anchor and how far they sit from the edge, scaling their position across and capping their width to fit. Alerts are centred. - Move or resize a layer on Vertical and it stops being Auto-placed. It keeps the place you gave it, and the horizontal layout is not touched. - The eye on a layer, while on Vertical, hides it on the vertical picture only. - A layer's states have their own Vertical place too. With the **Vertical layout** icon pressed, pick a state in the state picker above the canvas and move the layer: that place is the state's on the vertical picture only. Until you do, the state follows its horizontal place the way an Auto-placed layer does ([Glide a layer between sizes with states](https://bloopbot.com/docs/arrange-your-overlay#layer-states)). - To hand a layer back, select it and press **Reset to auto**. - The background can differ too. Open **Overlay settings** below the theme entry, then **Background · on stream**: a change on Vertical is the vertical backdrop; **Same as horizontal** puts it back. ![Studio with the Vertical layout icon pressed above the canvas: a tall 1080 by 1920 canvas where the Headline layer has been placed by hand and the Badge layer above it is still Auto-placed.](https://bloopbot.com/docs/screenshots/vertical-studio.jpg) _Studio on Vertical: a tall canvas with Headline placed by hand and Badge still Auto-placed._ Ready-made overlays from **Browse templates** already come with a vertical layout worked out, so they are ready to open on Vertical and adjust. **Example:** your Gameplay overlay has a poll in the top right. On Vertical, drag it to the top centre and resize it. The wide picture still shows the poll in the corner. ## 4. Chat starts hidden On phones, Twitch adds its own chat to the vertical view automatically, so there is no need for a chat overlay. So a **Chat box** layer starts hidden on Vertical. If you want your own chat on the vertical picture anyway, select the layer with the **Vertical layout** icon pressed and turn its eye on. ## 5. Keep the bottom clear About the bottom 560 px of the vertical video can be covered by Twitch's chat and player controls on phones. Anything you place there may be hidden. Keep goals, names and cameras above that band, in the top three quarters of the 1920 px height. ## 6. Show or hide a layer on one layout from a flow The flow steps **Show a layer** and **Hide a layer** have an **Only on** choice: **Both layouts** (the default), **Horizontal** or **Vertical**. Use it to show a banner on the vertical picture only, or to take your webcam frame off the wide picture while it stays on the tall one. Leave it on **Both layouts** and the step works as before. [Show or hide layers from a flow](https://bloopbot.com/docs/arrange-your-overlay#flow-show-hide) walks through the steps. ## If it does not look right - **The vertical Browser Source is blank:** check you pasted the link from the vertical row, with `?layout=vertical`, and that the source is 1080 × 1920 and was added in the **Vertical Sources** panel. - **A layer is missing on Vertical:** its eye may be off on the vertical layout only, or it is the Chat box, which starts hidden. - **A layer moved on one picture but not the other:** that is the point of two layouts. Press **Reset to auto** to make it follow the wide layout again. - **Twitch does not show the vertical video:** that setting is in OBS and Twitch, not Bloopbot; see Twitch's help article above. --- # Arrange your overlay Build one overlay out of several pieces — a chat box, a goal bar, an event list, a counter — and put each of them where you want it. Updated 24 October 2026 ## Before you start You need an overlay. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source; everything below happens in that overlay’s editor, and what you arrange is its layers. > **Pebble can show you the first moves** > > Pebble’s **Set up your bot** tutorial opens a ready-made overlay for you. **Your first overlay** walks through dragging an alert onto the canvas and publishing, and **Add a goal bar** does the same for a goal layer. Start either from [Tutorials](https://bloopbot.com/docs/tutorials). You can also [ask a connected AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant#create-overlay) to create an overlay with a starting layer, or have it edit an existing overlay's Studio draft. Open the overlay in Studio to review draft changes, then press **Publish** when you want OBS to show them. If you edit the draft in Studio before the assistant saves, its older save is refused; ask it to read the overlay again first. You can write your own widget with HTML, CSS and JavaScript inside Studio and place it on any overlay. Its expanded workspace puts code beside a live preview, with selected channel data and controls for whoever adds it. [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics) walks through the code, and [Reuse your widgets in every overlay](https://bloopbot.com/docs/your-widgets) through placing it. ## 1. An overlay is a surface of layers In a short desktop window, Studio keeps the canvas and both panels inside the window. Scroll inside **Layers**, **Add**, **Media** or the selected layer’s settings to reach their lower items. **Publish** stays in the top bar, and the position numbers stay at the foot of the settings panel. Use **Zoom to fit** above the canvas to see the whole overlay. ![Overlay Studio in a short desktop window, with the Layers panel, canvas, settings and position numbers visible.](https://bloopbot.com/docs/screenshots/studio-short-window.jpg) _Studio in a 450px-high window, with its canvas, panels and position numbers visible._ Every widget is made of layers. A layer has its own type, its own place on the 1920 × 1080 canvas, its own width and — if you want — its own look. The **Layers** tab on the left lists the whole overlay, and the top of the list draws on top: drag a row, or use its up and down arrows, to change which layer covers which. Hover over a row or focus it with your keyboard to show its arrows, lock and visibility controls over the right side. On a touch screen, select the row to show its controls below the label. An overlay starts with a whole layout when you added one of Bloopbot’s ready-made overlays from **Browse templates** on the Overlays page, or with nothing at all when you made it with **New overlay**. An empty surface is a real starting point, not a broken one — the editor opens it on the **Add** tab (step 3), where the first layer comes from. Until you place one, the **Layers** tab says **Nothing is placed on this overlay yet**, and **Add a layer** under the list brings you back to **Add**. ![Studio’s Layers panel with its compact Theme entry and Overlay settings action above four layers, beside the retained canvas and progressive layer inspector.](https://bloopbot.com/docs/screenshots/widget-surface-layers.jpg) _The Layers tab: one row per layer, each showing its type, the top of the list drawing on top._ ## 2. Move and size a layer 1. Click a layer on the canvas to select it. Its name and its handles appear over it, with a small toolbar underneath: the six **Align** buttons, **Duplicate**, **Lock**, **Hide** and **Remove…**, and on an alert or Media layer **Test**, which plays it on the canvas only. Where layers overlap, a click picks the smallest one under your pointer, so a small layer is never stuck behind a full-screen one such as your alerts or chat. To reach the layer underneath, click the selected layer again; each click picks the next layer under your pointer, then goes round to the first again. Hidden layers are skipped, and a locked layer comes after the others. 2. Drag it where you want it. The box follows your pointer, and the layer lines up with the middle of the canvas, its edges and the other layers when you get close. 3. Drag any of its handles to change its size (step 2a has the details). 4. Nudge a selected layer with the arrow keys — one pixel at a time, or ten with **Shift** held. 5. Changed your mind? **Undo** steps back through your changes and **Redo** puts them back. 6. You do not need to save: each change goes into your draft about a second after you make it, and the chip in the top bar counts it — **1 change · draft saved**. OBS keeps showing the version it already has until you press **Publish** (step 5). Alert layers move and size the same way. Their workspace starts with message, picture, sound and editor test; **Layer appearance · Local**, **Parts · Layer** and **Motion · Layer** change the selected placement, while **Layout & timing · Shared design** changes every placement using its design. To put one alert big in the middle of one overlay and small in a corner of another, see [Show alerts on stream](https://bloopbot.com/docs/alerts). ![The canvas of an overlay drawn over a sample game backdrop: a follow alert reading “Ada just followed” inside its layer at the top right, and the selected chat layer at the bottom left with a chat line from PixelPal, carrying its name as a filled blue pill, its outline and corner handles, and a toolbar under it with Duplicate, Hide and Remove…; nothing else on the canvas has a box around it.](https://bloopbot.com/docs/screenshots/widget-surface-canvas.jpg) _Several layers on one canvas: each draws its own kind’s content, and the selected layer shows its outline and resize handles._ ## 2a. Resize from any edge, rotate, and snap to a grid A selected layer shows eight square handles — the four corners and the middle of each edge — and a round handle above its name for turning it. 1. Drag an edge handle to change that one side: the side you drag follows your pointer and the opposite side stays where it is. Drag a corner to change both width and height; hold **Shift** while dragging a corner to keep the layer’s proportions. 2. Drag the round handle to rotate the layer around its own centre. Hold **Shift** to turn it in 15-degree steps. The outline and handles turn with it, and the resize handles keep working along the layer’s own sides. 3. A layer you move snaps its edges and centre, and a handle you drag snaps the edge it moves, to the canvas edges and centre and to the edges and centre of every other layer. With **Safe areas** on in the top bar it snaps to the action-safe margin too. Hold **Alt** to drag or resize without snapping. A rotated layer, or a corner held with **Shift**, resizes without snapping. 4. Turn on **Grid** above the canvas for an even grid to snap to as well, and pick 8, 16 or 32 pixels from the size next to it. It is off until you turn it on. 5. Nudge a selected layer’s width with **Alt** and the left or right arrow — one pixel at a time, or ten with **Shift** held. The numbers at the foot of the settings panel show where the layer sits, including its height and rotation once it has them. The reset icon (**Reset rotation**) there puts a turned layer upright again. A layer you never resize from its top or bottom keeps sizing itself to its own content, exactly as before. Once a layer has a height, its content no longer has to sit at the top of the box. Three buttons at the end of the numbers at the foot of the settings panel put it at the top, in the middle or at the bottom: 1. Select the layer and drag its top or bottom handle to make the box taller than what it shows. 2. At the foot of the settings panel, choose **Align content top**, **Align content middle** or **Align content bottom**. The content moves on the canvas straight away, and in OBS once you publish. For example, stretch a _BE RIGHT BACK_ label to the height of your camera frame and choose **Align content middle**, and the words sit centred against the camera. Content taller than its box still runs off the bottom edge, never the top. The buttons don't appear on a layer without a height, or on layers that already fill their whole box: Image, Shape, Chat, Emote Wall, End credits, Supporter ticker, Slideshow, Support Jar, Clip player and Media share player. These buttons move a layer's content inside its own box. The **Align** buttons in the toolbar move whole layers against the canvas or each other. ![The foot of a layer's settings panel: its position and height, then three buttons that put the layer's content at the top, middle or bottom of its box, with middle selected.](https://bloopbot.com/docs/screenshots/editor-content-valign.jpg) _The foot of the settings panel for a tall layer: its height, then the three content buttons, with Align content middle selected._ ![A label layer on the editor canvas turned a few degrees, with eight square resize handles along its turned sides, a round rotate handle above its name tag, and its toolbar underneath.](https://bloopbot.com/docs/screenshots/editor-resize-rotate.jpg) _A selected layer turned a few degrees: eight square handles along its turned sides, the round rotate handle above its name, and its toolbar underneath._ ## 2b. Work on several layers at once To select more than one layer: - **Shift**-click or **Cmd/Ctrl**-click layers on the canvas or rows in the **Layers** list. - Drag a box across empty canvas: every layer it touches is selected. - Press **Cmd/Ctrl+A** to select every layer on the overlay. A click on one member of a selection, without dragging, selects just that layer again. With more than one layer selected, the toolbar under them offers: - **Align** — left, centre, right, top, middle or bottom. The switch at its start says what they line up against: **Selection** (the outer edge of the whole selection) or **Canvas** (the 1920 × 1080 canvas). A single layer’s own toolbar aligns it to the canvas, so one click centres it or puts it flush against an edge. - **Distribute**, horizontally or vertically, once you have three or more selected: it spaces the ones in between evenly, without moving the two at either end. - **Group**, which ties the selection together (step 2c). - **Duplicate**, **Lock**, **Hide** and **Remove**, applied to every layer selected. **Remove** here, and **Delete** on the keyboard, remove the whole selection at once; **Undo** brings it back. Dragging or nudging any member of a selection moves every layer in it together, by the same amount. ![Three label layers selected on the editor canvas, each with an outline, and the selection toolbar under them with the Selection switch, the six Align buttons, the two Distribute buttons, Group, Duplicate, Lock, Hide and Remove.](https://bloopbot.com/docs/screenshots/editor-multi-select.jpg) _Three layers selected: each shows its outline, and the toolbar under them offers Align, Distribute, Group, Duplicate, Lock, Hide and Remove._ ## 2c. Group and lock layers **Groups.** Select two or more layers and press **Group** in their toolbar, **Group selected layers** below the **Layers** list, or **Cmd/Ctrl+G**. The list shows a group heading above its members. The arrow beside the heading folds those members away and opens them again; the heading stays, so you can still rename the group or ungroup it while it is folded. Click that heading to open the group's settings on the right. Change **Group name** there to give the collection a useful name, such as “Starting soon details”. Under **Visibility**, choose a channel variable or channel data field and a comparison to show or hide every member together. For example, choose **Category**, **Equals** and **Art** to show a grouped title and chat box only while the stream category is Art. You can also choose an entrance and exit motion for the group. Each member's own visibility rule still applies, so a member appears only when both rules allow it. The rule waits for its first channel value before showing the group. Use **Always show** to remove the group rule; **Undo** restores a name or rule change, and **Publish** sends the result to OBS. ![The named Art stream details group selected in the overlay editor, with its Visibility settings showing Stream category equals Art.](https://bloopbot.com/docs/screenshots/editor-group-visibility.jpg) _A named group uses Stream category equals Art to show its member layers together._ The heading's **Ungroup** button takes the members out again. Group headings may appear in more than one place when other layers sit between members, so the list still shows the true drawing order. A click on any grouped member on the canvas selects the whole group, and dragging, nudging, hiding and locking act on all of it. The **Align** and **Distribute** controls treat the group's combined outline as one piece, keeping the members in the same positions relative to each other. To work on one member alone, double-click it on the canvas or click its row in the **Layers** list. That member’s own settings open on the right, including **Layer appearance · Local**, and it stays in the group. A click on another member, or on the same one after you have clicked away, selects the whole group again. The group’s own settings come back when you click its heading. **Ungroup** in the toolbar, or **Cmd/Ctrl+Shift+G**, also takes the layers out of the group. A group holds ordinary layers, never another group, and a copy you **Duplicate** starts outside any group. If a group does not appear, check that its chosen channel value is available and matches the rule, then check the members' own visibility settings. **Lock.** Once a layer is where you want it, lock it so a stray drag cannot move it: press **Lock** in its toolbar, press the lock beside its row in the **Layers** list, or press **Cmd/Ctrl+Shift+L**. A locked layer still draws normally, but it ignores drags, resizing, rotating and nudges, and **Remove…** is greyed out until you unlock it the same way. **Cmd/Ctrl+Shift+L** toggles: pressed on a selection that is all locked, it unlocks it. **Cmd/Ctrl+Shift+H** hides and shows the same way. A copy of a locked layer starts unlocked. The **Layers** list marks a locked row with a small lock. Group members sit under their group heading and carry a small group icon. ![The Layers tab showing Group 1 above Sub goal and Follower goal, with the locked Webcam frame selected below.](https://bloopbot.com/docs/screenshots/editor-lock.jpg) _The Layers list: the two goal layers under Group 1, and a locked webcam frame selected below them._ ## 2d. Zoom, and keyboard shortcuts Use **−** and **+** above the canvas to zoom in for fine placement, or click the percentage to zoom back to fit. **Mute preview**, the speaker beside those, is on until you turn it off. A sample alert or a media file keeps replaying on the canvas as you edit, and this keeps its sound off. Turn it off when you want to hear a test here. It does not change what OBS plays. Zoomed in, the canvas scrolls: use the scroll bars, your mouse wheel or trackpad to move around it. With the pointer over the canvas, **Cmd/Ctrl +**, **Cmd/Ctrl −** and **Cmd/Ctrl+0** do the same; anywhere else on the page they stay your browser’s own zoom. Zooming only changes what you see while you work; it is never part of the overlay itself. Press **?** for the full list of shortcuts, including the ones above: duplicate (**Cmd/Ctrl+D**), group and ungroup (**Cmd/Ctrl+G**, **Cmd/Ctrl+Shift+G**), lock and hide (**Cmd/Ctrl+Shift+L**, **Cmd/Ctrl+Shift+H**), alongside the arrow keys, **Delete**, **Esc** and undo and redo. On a phone the canvas cannot be arranged, so the arranging shortcuts and the zoom keys do nothing there; undo and redo still work. ## 2e. Show or hide layers from a flow A flow can press a layer’s eye for you while you stream: a `!brb` command that brings in your BRB screen and hides your webcam frame, a channel-point reward that shows a _Hydrate!_ banner for ten seconds, or a Stream Deck button that hides your sidebar. Two steps under **Overlay** in the flow editor do it, **Show a layer** and **Hide a layer**, and any trigger can run them. Before you start, give the layer, or the group it is in, a name you will recognise, and publish the overlay ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). A layer you want a flow to bring in can stay hidden in the editor: press its eye so it starts off screen, and **Show a layer** still brings it in. 1. Open **Flows**, press **+ New flow**, and choose a trigger — for example the **Chat command** trigger named _brb_, with a **Who can trigger** check set to moderators. 2. Add a **Show a layer** step. In **Layer or group**, type the name as your overlay shows it, such as _BRB screen_. Capitals and spaces at the ends don’t matter. A group’s name changes every layer in that group. 3. Leave **On overlay** empty to change the layer on every overlay that has one with that name, or type an overlay’s name to change it on that overlay only. 4. To show it for a while only, set **Hide again after**, for example 10 seconds. Leave it empty to keep it shown until a flow hides it. **Hide a layer** has **Show again after** instead. The time can also come from an earlier step: on the canvas, drag a [data wire](https://bloopbot.com/docs/data-wires) from a number of seconds that step hands on to **Hide again after**, as Starter’s **Shoutout** does with how long its clip plays ([Play a streamer’s clip when you shout them out](https://bloopbot.com/docs/shoutout-clips#your-own-flow)). When that value isn’t a time between 1 second and a day, the step leaves by **error** and changes nothing. 5. To swap one thing for another, add a **Hide a layer** step after it for _Webcam frame_. 6. Streaming in Twitch's dual format? Both steps have an **Only on** choice: **Both layouts** (the default), **Horizontal** or **Vertical**, to change the layer on just one of your two layouts ([Vertical overlays for Twitch dual format](https://bloopbot.com/docs/vertical-overlays-twitch-dual-format#flows)). 7. Save the flow and turn it on. Make a second flow, `!back`, that does the opposite. ![A flow’s Do this card with a Show a layer step for BRB screen and a Hide a layer step for Webcam frame, each with Layer or group, On overlay and a time to switch back after.](https://bloopbot.com/docs/screenshots/layer-show-hide-steps.jpg) _A `!brb` flow’s steps: **Show a layer** brings in *BRB screen*, then **Hide a layer** takes *Webcam frame* off screen. Both times are empty, so the change stays._ **Example:** `!brb` runs **Show a layer** for _BRB screen_ and **Hide a layer** for _Webcam frame_, and `!back` runs them the other way round. A reward called _Hydrate!_ runs **Show a layer** for a hidden _Hydrate banner_ layer with **Hide again after** set to 10 seconds. What you should see: the layer fades in or out straight away in every OBS source showing it. A layer with its own **Visibility** rule plays its **When it appears** or **When it disappears** motion instead, and the rule still has to allow it before it shows. The newest step wins, so after hiding a group you can show one layer of it again. The change stays when OBS refreshes the source or you switch scenes, until another step changes it or its time runs out. A flow’s change is not saved into the overlay: Studio’s canvas keeps showing each layer’s own eye, and publishing does not undo what a flow did. Run the opposite step to change it back. Alert and **Media** layers can be shown and hidden too: alerts go only to the alert layers on screen, so while you hide one, its alerts play on another overlay that shows that alert, or wait in the queue until one is shown. **Test fire** in the flow editor lists the change in the **Run log** without touching your overlay; use the flow for real to see it on stream. If the run log says _No layer or group is called …_, check the name in your overlay’s **Layers** list and that the overlay is published. _No overlay is called …_ means **On overlay** names an overlay you don’t have. ## 2f. Glide a layer between sizes with states A layer can have **states**: other places and sizes that a flow switches it to while you stream. Give your route map a small _Corner_ state and a large _Big_ one, and a `!map` command glides it from the corner to the middle of the screen. With three panels, _Explore_, _Face_ and _Route_ states can each make a different panel the big one. Before you start, open the overlay in Studio and place the layer where it normally sits ([Move and size a layer](https://bloopbot.com/docs/arrange-your-overlay#move)). That place is its **Default** state. 1. Select the layer. In the right panel, open **States** and press **Add state**. The new state, _State 1_, starts where the layer is shown now. Type a name over it, such as _Big_, and press Enter. A layer can have up to six states. 2. A state picker appears above the canvas, beside the layout icons, and now shows _Big_. It stays hidden until some layer has a state. Move, resize or rotate the layer: the change belongs to _Big_ only, and Default stays where it was. Until you do, _Big_ draws just like Default: its row in **States** reads **Same as Default: move or resize the layer while it's shown**, and the play icon is off, with the tooltip **Nothing to glide: Big matches Default**. Fields marked **This state**, such as the chat box's **Messages on screen**, can be different in _Big_ too. Every other setting is shared by all states. The eye beside a state in the **States** list shows it on the canvas (press it again to go back to Default), and the bin deletes it. 3. Pick **Default** in the state picker, then _Big_ again, and press the play icon beside it. Its tooltip reads **Preview the glide from Default to Big**. The canvas plays the glide from the state you had before to the one you picked. 4. Publish the overlay ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). 5. Open **Flows**, press **+ New flow** and choose a trigger, for example the **Chat command** trigger named _map_. Add the **Change layer state** step from **Overlay**. In **State**, type _Big_; in **Layer**, type the layer's name, such as _Route map_. Capitals and spaces at the ends don't matter. Leave **On overlay** empty to change it on every overlay that has the layer. 6. To glide back on its own, set **Go back after**, for example 20 seconds. Leave it empty to stay in the state until another step changes it. To go back to the layer's own place, type _Default_ as the state. 7. Under **More options**, **Transition** is **Glide** or **Instant**. **Glide time (ms)** (100 to 3000, 600 to start) and **Easing** (**Smooth**, **Snappy**, **Bouncy** or **Linear**) shape the glide. **Only on** works as on **Show a layer**: **Both layouts**, **Horizontal** or **Vertical**. 8. Save the flow and turn it on. ![Studio with the state picker above the canvas set to Big, the Route map layer in Big’s place, and the right panel’s States list holding Big, with show and delete buttons, and Add state.](https://bloopbot.com/docs/screenshots/layer-states-studio.jpg) _Studio showing the Big state: the state picker above the canvas reads Big, the layer sits in Big's place, and the layer's States list in the right panel holds Big with its show and delete buttons and Add state._ ![A flow’s Do this card with a Change layer state step: State Big, Layer Route map, Go back after 20 seconds.](https://bloopbot.com/docs/screenshots/layer-state-step.jpg) _A `!map` flow’s Change layer state step: State Big, Layer Route map, Go back after 20 seconds._ **Switch the whole overlay at once.** Leave **Layer** empty, and every layer that has a state with that name glides into it together, while every other layer goes back to Default. Three tabs that pick which panel is big work like this: give the map, the face cam and the main cam each an _Explore_, a _Face_ and a _Route_ state, then make three flows whose **Change layer state** step has an empty **Layer** and the state _Explore_, _Face_ or _Route_. The state the whole overlay last switched to is in `$(overlay.state)` (**Last overlay-wide layer state** in the variable picker). Use it in a custom graphic or a chat reply, for example to light up the tab that is showing. It is empty until a flow switches the whole overlay. **Example:** a Label layer named _Route map_ has a _Corner_ state at 300 × 300 in the bottom right and a _Big_ state at 1200 × 800 in the middle. `!map` runs **Change layer state** for _Big_ on _Route map_ with **Go back after** set to 20 seconds. What you should see: the layer glides to its new size and place in every OBS source showing the overlay. Its content is drawn again at each size on the way, so text stays sharp. An OBS source refreshed later opens straight in the current state. If a viewer's computer is set to reduce motion, or the step is set to **Instant**, the change happens at once. The **Clip player** and the **Media share player** move to their new place but keep their size. A flow's change is not saved into the overlay. Studio shows each layer in Default until you pick a state, and publishing does not undo the change, except that a layer goes back to Default when you delete the state it is in and publish. **Test fire** lists the change in the **Run log** without moving anything; run the flow for real to see it. If the run log says _… has no state called …_, check that state's name on that layer in Studio, and that the overlay is published. A state can have its own **Shape** and **Outline** too ([Shape a layer](https://bloopbot.com/docs/arrange-your-overlay#shape)). Pick the state in the state picker above the canvas, then change them under **Layer appearance · Local**: they are marked **This state**, and the reset icon (**Use the Default shape** or **Use the Default outline**) hands them back. Choosing **None** in a state draws the plain box there, so a camera panel can lose its angles when it goes big. ## 3. Mix the types you want One overlay can hold pieces of different types — a goal bar along the bottom, a chat box in the corner, a counter in the other — instead of one Browser Source for each. They all come from the **Add** tab: 1. Choose **Add** at the top of the left panel, beside **Layers**. Use **Find a widget…** to search names and descriptions, your own widgets included, or choose **Alerts**, **Media**, **Chat & info** or **Goals & games** to narrow the list. **All** shows every group. If nothing matches, choose **Clear filters**. 2. Drag a layer’s name onto the canvas: the layer lands where you drop it, at that type’s usual size. Nothing asks first — a new layer does nothing until you set it up. 3. For a quick add, press the **Add** icon beside a layer’s name. **Add** puts the layer in the middle of the canvas. Select the name instead to open its full gallery in the left panel. The built-in example and every widget listed under that type appear as full-width cards, one below another, even if your search matched only one of them. Select a card to put that widget in the middle of the canvas. The heading explains what the type does and whether this overlay already shows it. Either way the new layer is selected and the left panel switches back to **Layers**. **Back**, or **Esc**, returns to the list with your search and category kept. 4. Give it a name you will recognise: the name at the top of the settings panel on the right is where you type it. To take a layer off screen without losing it, press the eye beside its row, or **Hide** on the toolbar under it. 5. A row with your own widgets under it shows a count and an arrow beside **Add**: open it to place one. **More**, at the end of a section, holds the rest ([Place it on another overlay](https://bloopbot.com/docs/your-widgets#place)). ![Studio’s Add tab with Find a widget… search, category filters and compact rows with Add buttons, and New widget at the foot.](https://bloopbot.com/docs/screenshots/widget-surface-drawer.jpg) _The Add tab: search or filter the list, open a row with your widgets under it, use a row’s Add button, or start a New widget at the foot._ ![The Add tab with Raid alert opened: Back, the Raid alert heading, its description, On this overlay, and a full-width gallery card with a rendered raid preview labelled Raid alert and Built-in. A note explains that selecting a card places it in the middle of the canvas or it can be dragged onto the canvas.](https://bloopbot.com/docs/screenshots/studio-add-layer-details.jpg) _Raid alert opened from Add: its full-width example gallery and that it is on this overlay already._ To build your own widget, choose **New widget** at the foot of **Add**. It stays outside the categories and search results. The widget goes on your **Widgets** page too, ready for any overlay: see [Reuse your widgets in every overlay](https://bloopbot.com/docs/your-widgets) and [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics#code). A widget holds up to 24 layers — when it is full the Add tab says **This overlay holds as many layers as it can** — and every type is offered on every widget: two counters, or two chat boxes, are simply two pieces of the overlay. For ready-made overlays, open **Marketplace** or **Overlays → Add**. To add a theme, choose **Theme → Add a theme** for **Browse marketplace** or **Create new theme** ([Add a theme](https://bloopbot.com/docs/widget-themes#new)). Alerts work the same way. Each alert type — **Follow**, **Sub**, **Resub**, **Gift sub**, **Cheer**, **Raid**, **Redemption** and **Custom alert** — is its own layer, and you can place it on any overlay: raids big in the middle of one, follows small in the corner of another. A layer shows one design, and a design belongs to your channel, not to the layer, so a change you make to it from one layer changes it everywhere it is shown. Every alert, and every file a flow plays, waits its turn in one shared queue and plays one at a time, so nothing overlaps or talks over anything else. The **Media** layer is where your **Play media** flows show their images, videos and sounds. Some layers show something you run from the dashboard. The **Viewer queue** layer, under **Goals & games**, shows who is waiting in your [viewer queue](https://bloopbot.com/docs/viewer-queue#layer) and follows it as viewers join and are pulled. To check a mixed overlay piece by piece before you go live, open **Simulate** in the top bar. Under **Test events** it lists a test for every type on the overlay, grouped by type. They play on the canvas only; tick **Also play on the live overlay in OBS** when you want one to reach your stream, where viewers see it. ## 3a. Add an image or a shape Two more tiles live under **Media** in the **Add** tab, for pieces that draw nothing on their own — a picture, or a plain filled box. - **Image** shows one file from your media library. Set its **Fit** — **Fit inside the box**, **Fill the box** or **Stretch to the box** — its **Opacity** and its **Corner radius**. A GIF or WebP file keeps playing exactly as it does anywhere else, even when the computer showing it asks for reduced motion; there is no separate animation setting for it. Until you pick a file, and if you later delete that file from your media library, the layer shows nothing at all on stream — the layer stays in the list, ready for a new picture. - **Webcam frame** is the same Image layer with a fixed 16:9 box already sized and placed bottom-right, ready for a decorative frame around your camera: upload the frame picture (its centre transparent, where your camera shows through), pick it here, and drag your camera source under it in OBS. If your theme has a **Panel frame**, the picture wears that too; press **None** under **Panel frame** in the layer’s **Layer appearance · Local** section when your picture is the frame ([Put a frame around one layer’s panel, lines or cards](https://bloopbot.com/docs/arrange-your-overlay#frames)). - **Box**, **Circle** and **Divider** are the three Shape layers: a rounded rectangle, an ellipse and a thin filled bar. Each one's **Fill** is the same colour, gradient or image control as an overlay's own background ([Give the overlay a background](https://bloopbot.com/docs/arrange-your-overlay#background)) — never a video, since a decorative shape is not worth a video decoder running for as long as OBS shows it — plus a **Border width** and **Border colour** for the rectangle and the circle. A rectangle also has its own **Corner radius**. A Box or Circle wears your theme’s **Panel frame** as well, whose **Frame width** replaces its **Border width** while it is on; a Divider never does. A Divider has a **Thickness** instead (1 to 40 px): the bar is drawn that thick, centred across the layer's height, so drag the layer's ends to make it longer and use **Thickness** to make it bolder. A shape’s **Border colour**, and its **Fill** colour or gradient stops, can follow your theme: open the colour’s menu and pick **Theme accent**, **Theme panel** or **Theme text** instead of **Custom colour**. The shape then changes with your Active theme, which is how the camera frames and bars on Bloopbot’s ready-made overlays follow it. Pick **Custom colour** to fix it to the colour it shows now. The overlay’s own background has the same menu. ![A Box layer’s Settings in the editor: Shape Rectangle, Corner radius 12, Fill None, Border width 6, and Border colour set to Theme accent, its swatch showing the theme’s accent with Follows your theme beside it.](https://bloopbot.com/docs/screenshots/shape-theme-colour.jpg) _A Box’s Border colour set to Theme accent: the swatch shows this overlay’s theme accent, and the colour follows the theme._ Drag either kind's tile onto the canvas, or open it and press **Add**, exactly as any other layer (step 3). **Webcam frame**, **Box**, **Circle** and **Divider** always start at their own size; **Add** puts them where that tile places them (the webcam frame bottom-right, the others in the middle), and a drop puts them where you let go. The plain **Image** tile starts from your last Image layer on this overlay — same fit, opacity and rounding — so a second logo matches the first; pick its file and it is ready. A Shape or Image layer resizes and moves like every other layer. An Image layer's **Corner radius** rounds the layer's box, separately from any radius your theme gives its panel. With **Fill the box** or **Stretch to the box** the picture fills that box, so its corners are rounded too. With **Fit inside the box**, a picture whose shape differs from the box sits inside it with empty space around it, and the rounding falls on the box's corners in that empty space, not on the picture: size the box to the picture, or pick **Fill the box**, when you want the picture's own corners rounded. Under **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)), an Image layer has one part, **Picture**, and a Shape layer one, **Shape**. **Corners** or a **Border** set on that part are drawn instead of the layer's own **Corner radius** and border, so set them in one place or the other; the layer's own settings are the simpler place. ![The Add tab’s Media rows: Media, Image, Webcam frame, Box, Circle and Divider, with a Box and a Divider already placed on the canvas.](https://bloopbot.com/docs/screenshots/widget-image-shape.jpg) _The Add tab’s Media tiles: Media, Image, Webcam frame, Box, Circle and Divider, with a Box and a Divider already placed on the canvas._ ## 3b. Show a slideshow or a sponsor banner A **Slideshow** layer shows pictures from your media library one after another — your sponsors' logos, fan art, a "coming up" reel. You'll find two tiles for it under **Media** in the **Add** tab: - **Slideshow** starts a 16:9 box in the middle of the canvas that fits each picture inside it and changes every 8 seconds. - **Sponsor banner** starts a wide, short strip along the bottom that fills its box with each picture and changes every 15 seconds — made for a row of logos. Both tiles make the same kind of layer, so you can turn one into the other by changing its settings or dragging its box. To build one: 1. Drag the **Sponsor banner** (or **Slideshow**) tile onto the canvas, or open it and press **Add**. 2. In the layer's settings, press **Add pictures** to add several pictures at once, or **Upload** to add a new picture there. PNG, JPEG, GIF and WebP all work, and a GIF or WebP keeps playing while it is on screen. 3. The pictures show in the order of the **Pictures** list. Use the up and down arrows to reorder them, or the bin to take one out. You can add the same picture again so it comes round twice as often. A slideshow holds up to 50 pictures. 4. Set **Each picture shows for** (2 seconds to an hour), the **Transition** — **Fade**, **Slide** or **Cut (no transition)** — and the **Fit**: **Fit inside the box**, **Fill the box** or **Stretch to the box**, as on an Image layer. 5. Tick **Shuffle the order** if the pictures shouldn't always come in the same order. A shuffled slideshow still shows every entry in the list once before any comes round again, and never shows the same entry twice in a row. A picture you added to the list twice counts as two entries, so now and then it can stay on screen for two turns running. 6. Publish ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). **Example:** three sponsor logos in a **Sponsor banner**, 15 seconds each, **Fill the box**, **Fade**. On stream, each logo stays for 15 seconds and then fades into the next, round and round. The rotation follows the clock, not the moment a page was opened. Every OBS source that shows this overlay — in two scenes, or a scene and a preview — shows the same picture at the same moment, and so does a source you refresh or add mid-stream. Shuffled slideshows agree too, and so do slideshows a flow has moved (below). The editor's canvas is running the same rotation as your stream, so it shows the same picture. **Move it from a flow.** A flow can move a slideshow on for you: a `!next` command for your mods, a new sponsor's logo when a reward is redeemed, or the first picture again when you go live. Add a **Control a slideshow** step (under **Overlay**) to any flow: 1. Open **Flows**, press **+ New flow**, and choose a trigger — for example the **Chat command** trigger, named _next_, with a **Who can trigger** check set to moderators. 2. Add a **Control a slideshow** step and choose what it does under **Do what**: **Next picture**, **Previous picture** or **Show picture number…**. 3. For **Show picture number…**, type the picture's place in the **Pictures** list in **Picture number**: 1 for the first. You can use a variable, such as `$(1)` for the number after the command, so `!slide 3` shows the third picture. 4. In **Slideshow layer**, type the layer's name as it is called in your overlay, such as _Sponsor banner_, to move only that one. Leave it empty to move every slideshow on your overlays. 5. Save the flow and turn it on. **Example:** a `!next` command with **Next picture** and **Slideshow layer** set to _Sponsor banner_. A mod types `!next`, and the banner fades to the next logo straight away. That logo then gets its full 15 seconds before the banner carries on round the list as before. What you should see: the picture changes at once, with the layer's own **Transition**, and the timer starts again from that picture, so it always gets its whole **Each picture shows for**. Every OBS source showing the slideshow moves together and stays in step afterwards, and a source you open or refresh later picks up from the same place. A shuffled slideshow shows the picture you asked for and then carries on in its shuffled order, the same on every source. **Test fire** in the flow editor lists the move in the **Run log** without changing your overlay; use the flow for real to see it on stream. If the run log says _No Slideshow layer is called …_, check the layer's name, or leave **Slideshow layer** empty. _… has only 3 pictures_ means **Picture number** is past the end of the list. A slideshow moves only once you have published the overlay it is on. If the picture you asked for has been deleted from your media library, the next picture in the list shows instead. If you delete a picture from your media library, the slideshow skips it. The **Pictures** list keeps it, marked **Missing file**, so you can see why a sponsor never shows up and remove it. A picture a slideshow is still showing on your published overlay can't be deleted from the media library: take it out of the list and publish first. With no pictures, the layer shows nothing on stream. When the computer showing the overlay asks for reduced motion, **Slide** fades instead. OBS itself never asks for it. Under **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)), a Slideshow layer has a **Frame** — the box the pictures show in, where **Corners**, a **Border** or a **Fill** go — and a **Picture**, which is each picture. In custom CSS they are `.w-slideshow` and `.w-slide`. ![Studio’s Sponsor banner slideshow with its chosen pictures and settings beside the canvas, plus the compact Theme entry and progressive layer controls.](https://bloopbot.com/docs/screenshots/widget-slideshow.jpg) _A Sponsor banner on the canvas showing one of three sponsor logos, with its settings open to Pictures, Add pictures, Upload, interval, Transition, Fit and Shuffle._ ## 3c. Roll end credits An **End credits** layer rolls the people who supported your stream, section by section — new followers, subscribers, gifters, cheerers and raiders — then an end card. It is made for the screen you show when the stream ends: its card drops in as a full-height column on the right, leaving the middle of the screen clear. 1. Choose **Add** and drag the **End credits** tile from **Chat & info** onto the canvas, or open it and press **Add**. Or, on the Overlays page, press **Browse templates** and add **Stream ending**, which comes with an End credits column already placed. 2. Under **Settings**, type the **Heading** the roll opens with, such as _Thanks for hanging out_ (leave it empty for none). 3. Under **Sections, in roll order**, tick the sections you want, type each one's title, and use the arrows to change the order. **Redemptions** — everyone who redeemed a channel-points reward — is off to start with. 4. Choose the **Pace**: **Speed** rolls at a steady number of pixels a second (10 to 400), so a long list rolls for longer; **Total time** makes one roll take the same number of seconds (10 to 900) however many names there are. 5. Leave **Loop** on to roll again from the top after the end card — the end card leaves the top of the column and the next pass starts from the bottom, so the column is briefly empty between passes — or turn it off to stop with the end card in the middle of the column. 6. Type the **End card** line, such as _See you next stream!_, and what the layer says **When nobody is listed yet** — _Thanks for watching!_ to start with. 7. Press **Publish**. ![Studio’s End credits layer with its editable supporter sections and pace controls, the compact Theme entry and retained canvas.](https://bloopbot.com/docs/screenshots/credits-layer.jpg) _An End credits layer selected in the editor: its settings show six sections in roll order, each with its own title, and the pace below._ The names are this stream's, and each viewer appears once per section, in the order they first supported you. Each section starts with up to the 50 people who most recently supported you that way; names that arrive while the overlay is open are added to those, so a source left open all stream can list more (up to 200 a section), and refreshing the source in OBS starts again from the 50 most recent. A name that arrives mid-roll joins its section and the roll carries on from where it was — it never starts over. After you go offline the credits keep the stream that just ended, so they are still there when you switch to your ending screen, and they start empty again when your next stream begins. If the computer showing the overlay asks for reduced motion, the credits fade from one page to the next instead of scrolling: the heading, then each section a screenful at a time, then the end card. To try it before you go live, open **Simulate** in the top bar and press **Test credits**. It rolls made-up names — never a real viewer — with one more follower arriving a few seconds in, on the canvas; tick **Also play on the live overlay in OBS** to show it on stream. When the demo's roll ends, your real supporters come back on their own. Nothing about the test reaches Twitch or changes any real data. ![End credits as OBS shows them: the heading Thanks for hanging out, then New Followers RetroRae and ByteBaron, Subscribers QuietMouse, Gifted Subs NeonNina, Cheers MapleMonk and Raiders PixelPilot, and the end card See you next stream!](https://bloopbot.com/docs/screenshots/credits-overlay.jpg) _End credits on the OBS page at the end of a stream: the heading, one section per kind of support, and the end card._ **Roll them from chat or a flow.** The **Mod commands** pack includes **Roll the credits (!credits)**. Add it from **Flows → Add** and switch it on. When a moderator types `!credits`, every End credits layer on your overlays starts again from the top with this stream's supporters; `!credits Ending` rolls only the layer named _Ending_ (the name it has in the editor's layer list). In your own flows, the **Roll the credits** action does the same, with an optional **End credits layer** name. It follows its **error** output, and rolls nothing, when none of your saved overlays has an End credits layer, or none with the name you gave; connect a **Chat message** there to say so. **Do something when they finish.** The **Credits finished** trigger runs when a roll started by **Roll the credits** reaches its end: the end card settles in the middle of the column, or, with **Loop** on, the end card leaves the top at the end of that first pass. It runs once per roll, even with the overlay open in OBS and in a browser at the same time. `$(layer)` is the name of the layer that finished. When one roll restarts several End credits layers, they can finish at different times: with **Only this layer** left blank, the trigger runs once, for whichever layer finishes first; with a layer named in **Only this layer**, it runs when that layer finishes, whether or not another layer finished before it. For example, **Credits finished** then **Chat message** with _Thanks for watching, see you next time!_ When nobody supported the stream, the layer shows its **When nobody is listed yet** message for five seconds and then counts as finished. Credits finished only runs while an overlay with that End credits layer is open, because the overlay is what tells Bloopbot the roll ended. A roll that simply plays when the overlay loads, the later passes of a looping roll and a **Test credits** demo never run it. Test fire in the flow editor shows what **Roll the credits** would do without restarting anything on your overlay. Under **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)) an End credits layer has **Panel**, **Heading**, **Section title**, **Name**, **End card** and **Empty message**. In custom CSS they are `.w-credits`, `.w-credits-title`, `.w-credits-section-title`, `.w-credits-name`, `.w-credits-end` and `.w-credits-empty`; each section is a `.w-credits-section` with its kind in `data-section` — `follows`, `subs`, `gifts`, `cheers`, `raids` or `redemptions`. ## 3d. Add a clock or a social rotator Two tiles under **Chat & info** in the **Add** tab draw everything from their own settings: there is nothing to connect and nothing to test. ![The Add tab’s Chat & info rows, including Clock and Social rotator, with Viewer count and Follower count, beside a canvas with a clock in the top-right corner and a social rotator in the bottom-left.](https://bloopbot.com/docs/screenshots/widget-clock-socials-add.jpg) _Clock and Social rotator under Chat & info, with a clock and a rotator already on the canvas._ **Clock** shows the time of day, and the date if you want it. 1. Choose **Add** and drag the **Clock** tile from **Chat & info** onto the canvas, or open it and press **Add**. **Add** puts it in the middle of the canvas and a drop puts it where you let go; drag it where you want it. 2. In the layer's settings, pick **Hours**: **24-hour (15:07)** or **12-hour (3:07 pm)**. 3. Tick **Show seconds** for a clock that ticks every second. 4. Pick a **Date**: **No date**, **Short (29 Sep)** or **Long (Tuesday 29 September)**. The date shows on its own line under the time. 5. Publish ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). The clock shows the time on the computer running OBS, so it always matches your PC's clock, summer time included. There is no time zone to set. Day and month names are always in English. **Social rotator** shows one of your socials at a time, with the platform's icon and your handle, and moves on to the next every few seconds. 1. Drag the **Social rotator** tile from **Chat & info** onto the canvas, or open it and press **Add**. **Add** puts it in the middle of the canvas and a drop puts it where you let go; drag it where you want it. It starts with two examples, X and Discord, so you can see it on the canvas. 2. In the right panel, each row is one social. Pick its platform and type your handle as you want it to read: `@yourname`, `youtube.com/@yourname` or `discord.gg/yourserver`. Use the arrows to reorder the rows and the bin to take one out. 3. Press **Add** for another row. It starts on a platform you have not listed yet, with an empty handle to fill in. A rotator holds up to 12. 4. Set **Seconds each** (3 to 60), the **Transition** (**Fade**, **Slide** or **Cut (no transition)**) and the **Icon colour**: **Brand colours** or **Theme text colour**. 5. Publish ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). The platforms are X, YouTube, TikTok, Instagram, Twitch, Discord, Kick, Bluesky, Threads, Facebook, Reddit, Patreon, Ko-fi and **Website**, a globe for any other link. A handle is text on your overlay: viewers can't click it, so write it the way people should type it. **Example:** Twitch `twitch.tv/pixelpal`, YouTube `youtube.com/@pixelpal` and Discord `discord.gg/pixelpal`, 6 seconds each, **Fade**. On stream, each one shows for 6 seconds and then fades into the next, round and round. ![A Social rotator selected in the editor: its Content tab lists Twitch, YouTube and Discord rows with their icons and handles, then Add, Seconds each, Transition and Icon colour.](https://bloopbot.com/docs/screenshots/widget-socials-panel.jpg) _A Social rotator selected: one row per social with its platform, icon and handle, then Add, Seconds each, Transition and Icon colour._ Like a slideshow, the rotation follows the clock, not the moment a page was opened. Every OBS source showing this overlay, and the editor's canvas, shows the same social at the same moment. With one social the layer simply shows it; with none it shows nothing on stream. With **Brand colours**, an icon whose brand colour is black, such as X, Threads or TikTok, draws in your theme's text colour instead, so it never disappears on a dark panel. When the computer showing the overlay asks for reduced motion, **Fade** and **Slide** change without moving. OBS itself never asks for it. ![The editor canvas with a clock reading 3:07 pm, Tuesday 29 September, in the top-right corner and a social rotator showing one platform icon and handle in the bottom-left.](https://bloopbot.com/docs/screenshots/widget-clock-socials-canvas.jpg) _A clock reading 3:07 pm, Tuesday 29 September, and a social rotator on the canvas._ Under **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)), a Clock layer has **Panel**, **Time** and **Date**, and a Social rotator has **Panel**, **Icon** and **Handle**. In custom CSS they are `.w-clock`, `.w-clock-time` and `.w-clock-date`, and `.w-socials`, `.w-socials-icon` and `.w-socials-handle`; each social is a `.w-socials-entry` with its platform in `data-platform`. Both panels wear your theme's **Panel frame**. **Show your live viewer or follower count.** Under **Chat & info**, beside the plain **Label**, are two ready-made ones: 1. Drag **Viewer count** or **Follower count** onto the canvas, or open it and press **Add**. 2. Change its **Heading** in the right panel if you want other words than _Viewers_ or _Followers_. The number is grouped, so 12345 reads 12,345. 3. Publish ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). The viewer count refreshes about once a minute, when Bloopbot next checks your stream, and shows 0 while you are offline. The follower count goes up the moment someone follows and is checked against Twitch every minute. Any **Label** can show the same numbers with `$(data.stream.viewers)` or `$(data.channel.followers)` in its **Text**. ## 3e. Show your latest events An **Event list** shows the latest things that happened on your channel, newest first, one row each: an icon, who it was and what they did. ![The Add tab’s Chat & info rows, including Event list, beside a canvas with an Event list showing one sample row of each type: a redemption, a raid, a cheer, gifted subs, a resub and a follow.](https://bloopbot.com/docs/screenshots/widget-event-list-add.jpg) _Event list under Chat & info, with an Event list's sample rows on the canvas._ 1. Choose **Add** and drag the **Event list** tile from **Chat & info** onto the canvas, or open it and press **Add**. **Add** puts it in the middle of the canvas and a drop puts it where you let go; drag it where you want it. 2. In the layer's settings, under **Show**, untick any type you do not want: **Follows**, **Subs**, **Gifts**, **Cheers**, **Raids** or **Redemptions**. All six are on to start with. 3. Set **Rows**, how many events show at once: 1 to 20, 6 to start with. 4. Pick where the newest event goes under **Newest**: **At the top** or **At the bottom**. 5. Publish ([step 5](https://bloopbot.com/docs/arrange-your-overlay#publish)). ![An Event list selected in the editor: its Content tab shows Follows, Subs, Gifts, Cheers, Raids and Redemptions switched on, Rows 6 and Newest At the top, beside the canvas’s sample rows.](https://bloopbot.com/docs/screenshots/widget-event-list-panel.jpg) _An Event list selected: the six types under Show, then Rows and Newest._ Each row says who and what: | Event | The row reads | | --- | --- | | Follow | _PixelPal_ followed | | Sub | _QuietMouse_ Tier 1 sub | | Resub | _LoyalLlama_ Tier 2 sub · 12 months | | Gift subs | _GenerousGifter_ gifted 5 subs (_gifted a sub_ for one; _gifted 5 Tier 2 subs_ above Tier 1) | | Cheer | _BitsBandit_ 500 bits | | Raid | _RaidingRaccoon_ raided with 42 | | Redemption | _HydrateHero_ redeemed Hydrate | The list is your channel's, not one stream's: it carries on from one stream to the next, and a follow that comes in while you are offline shows too. It goes back as far as the last 90 days. The messages viewers send with a cheer or a resub are not shown, only who and what. An anonymous gift reads _Anonymous_. A new row slides in at the newest end and the rows already there stay put; the oldest row goes when the list is full. How a row comes in follows your theme's **Motion** → **Event list rows** → **Coming in** ([Make chat lines, rows and media move](https://bloopbot.com/docs/widget-themes#motion)), and it simply appears when the computer showing the overlay asks for reduced motion. ![An Event list on the OBS page with seven rows, newest at the top: HydrateHero redeemed Hydrate, RaidingRaccoon raided with 42, BitsBandit 500 bits, GenerousGifter gifted 5 subs, LoyalLlama Tier 2 sub · 12 months, QuietMouse Tier 1 sub and PixelPal followed, each with its own icon.](https://bloopbot.com/docs/screenshots/widget-event-list-overlay.jpg) _An Event list in OBS after a follow, a sub, a resub, gifted subs, a cheer, a raid and a redemption, newest at the top._ The editor's canvas always shows one made-up row of each type, so you can place and style the layer before anything happens; your real events show in OBS. To watch a row arrive, open **Simulate** in the top bar and press **Test event list**: it shows the made-up rows and then one more arriving on top. Tick **Also play on the live overlay in OBS** to show it on stream, where your real list comes back after a few seconds. A test never adds to your real list and nothing reaches Twitch. Under **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)) an Event list has **Panel**, **Row**, **Icon**, **Name** and **Detail**. In custom CSS they are `.w-eventlist`, `.w-eventlist-row`, `.w-eventlist-icon`, `.w-eventlist-name` and `.w-eventlist-detail`; each row has its type in `data-kind` — `follow`, `sub`, `gift`, `cheer`, `raid` or `redemption`. The panel wears your theme's **Panel frame**, and each row its frame and background: the **Event row frame** on the layer’s **Layer appearance · Local** section, or **Chat line and event row frame** in the theme. ## 4. Give one layer its own look Every layer draws with the overlay’s theme. Under **Layers**, **Theme · My theme** names the assigned theme and says **Follows Active** or **Pinned to this overlay**. Open it to edit the shared theme, then use **Back to** followed by the selected layer’s name to return. Clicking empty canvas, or **Overlay settings** below the theme entry, opens this overlay’s local settings instead. [Style every overlay with a theme](https://bloopbot.com/docs/widget-themes) covers theme management. 1. Select the layer and open **Layer appearance · Local** in the right panel. It names the theme it follows, for example **Follows My theme**, and shows that theme’s values. Open **Typography**, **Colours & panel**, or **Background & spacing** (spacing, border, frames and backgrounds) for the fields you need. 2. Change a field — the accent colour, a font, the panel or the spacing. That field now belongs to this layer only: **Reset to theme** appears under it, a dot marks its group, and the other layers keep the theme. 3. Change as many fields as you like. The ones you leave alone keep following the theme, so a later change to the theme still reaches them. The note inside **Layer appearance · Local** counts the fields this layer has changed. 4. Press **Reset to theme** under a field to hand that field back, or the reset icon (**Reset all to theme**) in the note inside **Layer appearance · Local** to hand back every field at once. Nothing else changes. 5. To style one piece of the layer — just the names in a chat box, just an alert’s title — open **Parts · Layer**. Opening a part shows its name and outlines it on the canvas; **Back to parts** returns to the list. Fields identify **Local override**, a named theme source or **Widget default**; [Style one part at a time](https://bloopbot.com/docs/widget-themes#parts) covers fonts, gradients, text effects and highlighted values. 6. To make the layer move — chat lines that bounce in, an idle float, a wave on a name — open **Motion · Layer**. For an ordinary alert, open **Motion · Layer** for idle and letters; its entrance, exit and word timing are in **Layout & timing · Shared design** in the same workspace. [Make chat lines, rows and media move](https://bloopbot.com/docs/widget-themes#motion) and, for alerts, [Make it move](https://bloopbot.com/docs/alerts#motion) cover each choice. ![The selected layer’s Layer appearance · Local section. Layer opacity is the first control, set to 80%. Colours & panel is expanded; Accent is #FF7A59, labelled Local override with Reset to theme, while the other fields follow My theme or their widget defaults.](https://bloopbot.com/docs/screenshots/widget-surface-design.jpg) _The selected layer’s Layer appearance · Local section: Layer opacity is the first control, at 80%, and Colours & panel is open with its accent colour changed on this layer only, marked by a dot and Reset to theme._ ## Fade one layer **Layer opacity** makes a whole layer see-through, its panel and its content together. Use it to let a watermark sit quietly over your game, or to push a banner back behind a chat box. 1. Select the layer and open **Layer appearance · Local** in the right panel. 2. Drag **Layer opacity**, the first control there. Every layer starts at **100%**, fully solid. The canvas fades as you drag, and the percentage shows beside the slider and, once it is below 100%, at the foot of the settings panel with the layer’s other numbers. 3. Publish when it looks right. OBS shows the same fade. A whole drag is one step for **Undo**. Drag back to **100%** to make the layer solid again. **0%** is invisible but not gone: the layer keeps its place, stays in the **Layers** list and keeps running, so a counter keeps counting and a flow can still show or hide it. The eye in the **Layers** list is different: a layer you hide there is not drawn at all. A layer a flow’s **Show a layer** step brings in fades to the opacity you chose, not to solid. The **Clip player** and the **Media share player** have no slider. Twitch and YouTube will not play a video that is faded or covered, so those layers always draw solid, and so does a custom graphic that plays one of them. An Image layer’s own **Opacity** fades just its picture; **Layer opacity** is separate and fades the whole layer, so the two multiply. On a Vertical layout a layer follows its Horizontal position and opacity until you place or fade it there; from then on it keeps its own Vertical position and opacity, and **Reset to auto** gives it both back from Horizontal. ## Shape a layer Any layer can be cut to a shape: a hexagon face cam, a speech-bubble chat box, or an angled panel with pointed ends for an _Up next_ bar. An outline and a soft glow can follow the same edge. **Shape** has four choices: - **None** is the plain box. Every layer starts here. - **Library** shows shape tiles: hexagon, chevron, star, speech bubble and the rest. Pick one and it stretches to the layer’s box. - **Angled panel** sets each side to **Straight**, **Point out** or **Point in**, with its depth, and cuts any corner by its own field, such as **Top-left cut**. Everything is in pixels, so the angles stay the same however big the layer is. - **Custom SVG** cuts the layer to an SVG from your media library. 1. Select the layer and open **Layer appearance · Local** in the right panel. **Shape** and **Outline** are under **Layer opacity**. 2. Under **Shape**, press **Library**, **Angled panel** or **Custom SVG**. For **Library**, pick a tile. For **Custom SVG**, choose a file under **Shape file**, or press **Upload** to add a new one. 3. For an Angled panel, the canvas shows diamond handles. Drag a corner’s handle inwards to cut that corner. Drag a side’s middle handle outwards for a point, or inwards for a notch. Handles move a whole pixel at a time and stop before the panel would cross itself. You can also press Tab to reach a handle, then use the arrow keys to change it, with Shift for 10 px. 4. Under **Outline**, turn on **Draw an outline** and set its **Width**. Its **Colour** starts on **Theme**, which follows your theme’s layer outline colour; press **Custom** to pick one for this layer. Turn on **Glow** for a soft light round the edge, and set its **Blur** and **Strength**. 5. Publish. OBS draws the same shape, outline and glow. ![The Shape section set to Library: a grid of shape tiles with Hexagon picked.](https://bloopbot.com/docs/screenshots/layer-shape-library.jpg) _Shape set to Library on a face cam layer: the shape tiles, with Hexagon picked._ ![An Up next bar cut to an angled panel with pointed ends and a glowing teal outline, with diamond handles at its corners and side midpoints.](https://bloopbot.com/docs/screenshots/layer-shape-panel.jpg) _An *Up next* bar as an Angled panel with pointed ends and a glowing teal outline, zoomed in so its diamond handles are clear._ ![The Outline section: Draw an outline on, Width 3 px, Colour Custom with the teal #5ce1e6, Glow on with Blur 12 px and Strength 60%.](https://bloopbot.com/docs/screenshots/layer-shape-outline.jpg) _The bar’s Outline: 3 px wide in a Custom teal, with Glow on at Blur 12 px and Strength 60%._ **Example:** a Label layer named _Up next_, 520 px wide, that says _Boss rush_. Set it to **Angled panel** with **Left** and **Right** on **Point out** at 60 px, then turn on **Draw an outline** at 3 px, press **Custom** and pick a teal, and turn on **Glow**. It reads as a bar with arrow-head ends, lit round its edge. A shape changes only the layer’s edge, and the content inside stays where it was. Give a panel with deep points some padding (under **Background & spacing**) so its words stay clear of the angles. A Custom SVG must be made of flat shapes only: paths, polygons, rectangles, circles and ellipses, up to 100 KB. A file with text, pictures, scripts, links to other files or effects is refused with **Flatten the shape to paths and upload it again**. To fix it, open the file in your drawing app, convert text and strokes to outlines, remove any pictures, and save it as a plain SVG. The **Clip player** and the **Media share player** have no Shape or Outline, and neither does a custom graphic that plays one of them. Twitch and YouTube don’t allow their players to be cut or covered, so those layers say so instead. ## Put a frame around one layer’s panel, lines or cards A theme can wear a picture frame round its panels, chat lines and alert cards ([Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames)). One layer can wear a different frame, or none, without touching the theme. 1. Select the layer and open **Layer appearance · Local**. Open **Background & spacing**. Under **Border colour** you find **Panel frame** for the layer’s panel, and a frame for its lines or rows, named for the layer — **Chat line frame** on a chat box, **Event row frame** on an event stack or an event list. An alert layer’s **Alert card frame** is under its backgrounds. A layer shows only the frames its type draws: a **Poll**, **End credits**, **Image** or **Shape** layer has a **Panel frame** only, round its card, its panel, its picture or its box, and a **Minigames** layer draws none, so it shows no frame control. On a chat box the **Chat line frame** goes round each line in every layout: **Bubbles**, **Lines** and **Compact**. 2. A layer that follows a theme with a frame shows that frame already chosen. Change a setting — the **Frame image**, **Corner size**, **Frame width**, **Frame outset**, **Sides** or **Draw the middle of the picture** — or press **Image** on a layer whose theme has none. That frame now belongs to this layer: a dot and **Reset to theme** appear beside it, and the other layers keep the theme’s. 3. To take the theme’s frame off this layer alone, press **None**. The layer keeps a **None** of its own, so it stays plain even when the theme changes. 4. Press **Reset to theme** under a frame to hand it back, or the reset icon (**Reset all to theme**) in the note inside **Layer appearance · Local** for every field. The canvas shows each change as you make it. Press **Publish**. A layer’s frame replaces the theme’s frame as a whole, so choose every setting you want on it. While a frame is on a box, its **Frame width** replaces any **Border width** of that box, including a **Border** set on its part. To frame just one piece of the layer, open **Parts · Layer**: a part that draws a box, such as a chat line or a goal bar’s track, has a **Frame** under **Box**, and a part’s own frame keeps its own width. To take the theme’s frame off one box, press **None** on the part’s **Frame**, which says **Uses the theme’s frame** until you choose: the frame goes completely, leaving the box’s plain border and no thick edge behind, and **Reset to theme** brings it back. ![A layer’s Panel frame with Frame width changed to 8: a dot and Reset to theme mark that this layer now has a frame of its own: a copy of the theme’s frame with only the width changed.](https://bloopbot.com/docs/screenshots/widget-frame-layer.jpg) _A layer’s Panel frame with its width changed to 8: the dot and Reset to theme mark the one frame this layer overrides._ A frame goes round a layer’s panel. It is not the overlay’s background: [Give the overlay a background](https://bloopbot.com/docs/arrange-your-overlay#background) fills the whole canvas behind every layer. ## Give the overlay a background An overlay can fill the whole 1920 × 1080 canvas behind its layers: a colour, a gradient, a picture, or a looping video. It is what turns an overlay into a scene screen — starting soon, be right back or ending — and it belongs to this overlay alone, so your gameplay overlay stays clear. 1. Click empty canvas or press **Overlay settings** below the theme entry. Open **Background · on stream** in **Overlay settings · Local**. 2. Pick **Colour**, **Gradient**, **Image** or **Video**. A new image or video starts on your library’s first file of that kind. 3. At the **Image** or **Video** field, press **Choose picture** to preview another file, or **Upload** to add one. A WebM video can be up to 25 MB; a PNG, JPEG, GIF or WebP can be up to 5 MB. Set its **Fit**, **Position**, **Opacity** and **Blur**. 4. Press **Publish**. OBS shows the background behind every layer of this overlay. A background video always plays muted and loops for as long as the scene is on screen; it never makes a sound, so music and alert sounds stay with your alerts and the **Media** layer. One layer can also have a video behind its own panel: select it, then open **Layer appearance · Local** → **Background & spacing** and set its **Panel background** to **Video**. One overlay plays at most **2** background videos, its own and its layers’ panels together. With two playing, **Video** is greyed out on the rest, with a note saying why; change one of the two to an image, a gradient or a colour to free a place. ![Background · on stream and Video selected, opened from the overlay editor’s Background tab: the WebM clip from the media library, Fit Cover and Position Centre, with Opacity and Blur below.](https://bloopbot.com/docs/screenshots/widget-background-overlay.jpg) _Background · on stream set to Video: the library’s WebM clip, covering the canvas from the centre._ ![A starting soon overlay in OBS: a looping deep-blue video fills the canvas, and a chat box on the right shows two chat lines, each on a gradient bubble.](https://bloopbot.com/docs/screenshots/widget-background-live.jpg) _The published overlay as OBS shows it: the looping video behind the chat box, each chat line on the theme’s gradient._ > **Leave it at None over your game** > > The background covers the whole canvas, so an overlay that sits over your gameplay should keep **Background · on stream** at **None**. The editor’s own backdrop is just for your preview. [Choose what sits behind the canvas](https://bloopbot.com/docs/arrange-your-overlay#preview-backdrop) without changing OBS. ## Preview over your current stream The **Backdrop · only you see this** control lets you judge an overlay against what viewers currently see. It starts with your current stream, muted, while you are live, and with **None** while you are offline. It never reaches OBS. 1. Open **Overlay settings** and expand **Canvas preview** in the panel on the right. 2. Under **Backdrop · only you see this**, choose **Current stream** to follow your live broadcast. You can also choose **None**, **Sample gameplay** or **Your screenshot**. A choice you make stays in this browser. 3. Arrange a layer against the picture behind the canvas. For example, place a goal bar where it does not cover your webcam, then **Publish** when the overlay itself is ready. The stream plays muted behind the editor canvas only. If your channel is offline, **Current stream** shows **None** until you go live. If it stays blank while you are live, check that your stream has started on Twitch and refresh the editor; you can use **Sample gameplay** or **Your screenshot** meanwhile. An overlay’s own **Background · on stream** is separate and still appears in OBS when published. ![Overlay settings’ Canvas preview controls with Current stream selected. The offline explanation says the canvas shows None until the stream goes live.](https://bloopbot.com/docs/screenshots/studio-current-stream-backdrop.jpg) _Current stream selected on an offline channel: the canvas shows None and the editor explains when the picture will appear._ ## Style parts with custom CSS The overlay has one **Overlay CSS** editor, not one per layer. Open **Overlay settings**, then **Overlay CSS**. Whatever you write there loads after every layer's own look and after your theme's own **Theme CSS** ([Style every overlay with a theme](https://bloopbot.com/docs/widget-themes#edit)), so it can reach further than the colour and spacing controls above it — right down to one part of one layer's content, like just the fill of a goal bar or just the names in your chat box. The canvas updates as you type, it holds up to 12,000 characters, and clearing the box returns every layer to its own controls. A rule applies across the whole overlay: two goal bars on the same overlay both pick up a rule written for `.w-goal-fill`. Each kind of layer draws its own named parts, and those names stay put across a redesign, so a stylesheet you write today keeps working after you change your theme. A quick example for each: - **Label** — `.w-text { font-size: 60px; }` grows the text past what the size slider offers. - **Goal bar** — `.w-goal-fill { background: linear-gradient(90deg, gold, orange); }` gives the filled part its own gradient. - **Event stack** (polls, predictions, raids, hype trains) — `.w-stack-card { border-radius: 24px; }` rounds every card's corners. - **Poll** — `.w-poll-fill { background: linear-gradient(90deg, gold, orange); }` gives the option bars their own gradient. - **Wheel** — `.w-wheel-seg[data-hit] { stroke: white; stroke-width: 2; }` outlines the segment the wheel landed on; `.w-wheel-label` is each segment's text. - **Alert** — `.w-alert-title { text-transform: uppercase; }` capitalises every alert's title. - **Media** — `.w-media-item { border-radius: 12px; }` rounds the corners of whatever plays. - **Chat box** — `.w-chat-name { color: #ff6ad5; }` gives every viewer's name the same colour instead of their own — Bloopbot draws each viewer's own colour through a variable, and a plain rule like this one for the same part still overrides it. - **Now playing** — `.w-nowplaying .w-nowplaying-title { font-style: italic; }` italicises the current track. Write it with `.w-nowplaying` in front: the built-in rule for the title names both, and a shorter `.w-nowplaying-title` on its own loses to it. - **Giveaway** — `.w-giveaway-slot[data-reveal="settled"] .w-giveaway-winner-name { font-size: 1.4em; }` makes a revealed winner's name stand out, without also enlarging the slots still waiting their turn. - **Image** — `.w-image { filter: grayscale(1); }` desaturates the picture. - **Shape** — `.w-shape { box-shadow: 0 12px 30px rgba(0, 0, 0, 0.5); }` drops a shadow behind a Box, a Circle or a Divider. - **End credits** — `.w-credits-section[data-section="raids"] .w-credits-name { color: gold; }` colours just the raiders' names. - **Custom graphic** — a rule reaches inside a custom graphic when it names one of the graphic's own classes that start with `w-` ([Match your overlay's theme](https://bloopbot.com/docs/author-custom-graphics#theme)). The same named parts are what **Parts** styles without CSS ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)); a part style is drawn before your stylesheet, so a rule here still wins over it. Bloopbot always loads your stylesheet last, so your rule wins a tie against a built-in rule that names the same parts — that is why the colour and gradient examples above work with nothing more than the part's own name. But the tie only goes to you when your rule is at least as specific as the one it replaces, which is why the now playing and giveaway examples above name an extra part around the one they change. Reach for `var(--w-accent)`, `var(--w-text)` and `var(--w-panel-fill)` inside your own rules to pick up your theme's colours instead of hard-coding one, so the part still matches if you later switch themes. A rule aimed at a part a layer doesn't have simply does nothing. ## 5. Publish your changes The canvas is your **Editor draft**; the **Published output** is what your Browser Source can show. Editing the draft does not update that output on its own. Each change saves to your channel’s **draft** about a second after you make it, and OBS keeps showing what you last published until you press **Publish**. The draft holds every overlay on your channel, your alert designs, themes and wheels. They wait there together, and when you press **Publish** you choose which of them go live. The one thing that saves straight away is the overlay’s name. The chip in the top bar says where you are: **Saving…** while a change is on its way, **3 changes · draft saved** once it is in the draft, and **Published** when this overlay has no edits waiting. Published is its publication status; check OBS to see whether the source is showing in your current scene. **Waiting to publish** includes this overlay’s edits and shared edits, such as alert designs and themes; the draft chip counts those shared changes too. **Publish** can cover the whole channel draft, including edits to other overlays and shared themes, designs, wheels and flows, and **Discard changes…** always throws away all of it. 1. Make your changes. You can close the tab once the chip says **draft saved** — they are still there when you come back. 2. Click the chip to open **Waiting to publish**: changes by name, such as “Gameplay: moved Raid alert”, and shared changes waiting with them. 3. Press **Publish**, in the top bar or in that list. **Publish your overlay** always opens first, even for one changed part, so you can review its named changes and affected overlays before choosing what goes live (below). Once it is live, the editor says **Published — ready for your Browser Source**. Open Browser Sources affected by your edits refresh; shared theme or design edits can affect several overlays. 4. Changed your mind instead? **Discard changes…** in the same list asks first, then throws away every change since the last publish, on every overlay. **Choose what goes live.** **Publish your overlay** says "Choose what goes live now. Anything you leave unticked stays in your draft." It has one tick box for each part that changed: every changed overlay by its name, plus **Alerts**, **Themes** and **Wheels** when those changed. Each row lists its changes, and every row starts ticked. Untick a row to keep its changes in your draft; they are not lost, and not on stream. ![Publish your overlay dialog with a tick box for each changed part: Starting soon ticked, Gameplay unticked, and the button reading Publish 1 of 2](https://bloopbot.com/docs/screenshots/studio-publish-parts.jpg) _Publish your overlay with Starting soon ticked and Gameplay unticked: the button reads Publish 1 of 2._ - **A locked row.** If a part you ticked needs another part, that part is ticked and locked, marked "Needed by" the overlay that uses it. For example an overlay that plays an alert design takes the changed alert designs with it, and a publish can also bring along another overlay: when you renamed an alert design that several overlays show, they go live together. - **New flows.** Each new flow the publish would create has its own choice: **Create and switch on**, **Create switched off** or **Don’t create**. A flow that plays an alert design you are not publishing says "Waits for Alerts" and offers **Later** or **Don’t create**. **Later** keeps the flow in your draft until that alert goes live. - **The button.** It counts what you picked: **Publish 1 of 2**, or just **Publish** when everything is ticked. Untick every row and only the new flows you chose are set up; the overlay, alert, theme and wheel changes all stay in your draft. - **Afterwards.** The status line says how many changes are still in your draft, and the chip keeps counting them. Press **Publish** again whenever you want the rest live. **History**, in the top bar, lists every publish as a version: newest first, the one on stream marked **Live**, each with the changes it made. The eye icon (**Preview**) on a version shows it on the canvas without changing anything; **Back to draft** returns to your edits. **Restore to draft** puts that whole version back in your draft, and **Restore only** followed by the overlay’s name brings back just the overlay you are editing. Restoring never changes your stream by itself — look it over, then publish. If one of your alert flows plays a design the restored version does not have, the editor names that flow so you can point it at another design. Editing in two tabs, or on two computers? If the other one saved the draft first, a banner across the canvas says **Changed in another tab**. **Load theirs** replaces what this tab has with the saved draft; **Keep mine** saves this tab’s changes over it. Until you choose, nothing saves from this tab and Publish waits. > **Tests on stream play what is published** > > The test buttons play on the canvas with your draft. On the live overlay they play your published designs, so an alert design you have only added or changed in your draft can be tested in OBS once you publish it. ## A worked example A stream overlay in three pieces, on one Browser Source. Open your widget’s editor, then: 1. Choose **Add** and drag the **Goal bar** tile to the bottom of the canvas. 2. Drag a **Label** tile to the top-left for your death counter. 3. Drag a **Chat** tile down the right-hand side. 4. Select the goal bar and, under **Layer appearance · Local** → **Colours & panel**, change its **Accent** and **Panel** colours, so it stands out while the counter and the chat box keep the overlay’s theme. 5. Press **Publish**, review the named changes, confirm Publish and check the scene in OBS. The canvas is what the Browser Source shows: three kinds of content in one source, one of them with colours of its own. ## What you should see - Every layer drawing its own kind’s content on the canvas — a chat box showing chat, a goal bar showing progress, a counter showing its number — never a plain box. - The layer you select carrying its name, its eight resize handles and its rotate handle, over its own content — and every other layer drawing plainly, with no box around it. - Several layers selected together each carrying a lighter outline than the one you selected last, and an Align/Distribute/Group toolbar under them. - A locked layer marked in the **Layers** list, ignoring a drag or a nudge until you unlock it. - Each layer where its frame says on the 1920 × 1080 canvas, with the whole surface shown scaled to fit the editor’s canvas card — and, once you rotate one, tilted exactly as much in OBS. - A published change reaching an open OBS Browser Source on its own within a few seconds, with nothing to do to the source, and the chip in the top bar reading **Published**. - An edit you have not published yet showing on the canvas, but not in OBS, with the chip counting it — for example **2 changes · draft saved**. - Text you type on one layer appearing in the canvas while the other layers keep their place. A sample that starts again as you edit stays quiet while **Mute preview** is on. - A hidden layer drawing nothing, and coming back when you show it again. - A layer you faded showing through to what is behind it on the canvas and in OBS once published, and its percentage at the foot of the settings panel. - A layer a flow’s **Show a layer** or **Hide a layer** step changed fading in or out in OBS at once, and staying that way after OBS refreshes. - An overlay with a background video looping it, silently, behind every layer, in the editor and in OBS. - A field you changed on one layer marked with a dot and **Reset to theme**, and that layer’s other fields following the overlay’s theme. - A layer’s own frame drawn round its panel, chat lines or alert cards on the canvas and in OBS once published, while the other layers keep the theme’s. - A test for every type you have placed under **Simulate** → **Test events** in the top bar, drawing on the canvas until you tick **Also play on the live overlay in OBS**. - An alert layer drawing nothing until an alert plays on it — press **Test in editor** in its workspace (or **Test** on its toolbar) to see the draft on the canvas, or **Test published output…** to send the published design to the real queue. Check its playback in your streaming app. ## If something looks wrong - A layer draws nothing: its row may be marked **hidden**, a flow’s **Hide a layer** step may have hidden it, or its content may only arrive with an event — an alert layer or the Media layer sits empty until something plays on it. - A layer stays hidden although its eye is on in Studio, or stays on screen although it is hidden there: a flow’s **Hide a layer** or **Show a layer** step changed it, and publishing does not undo that. Run a flow with the opposite step ([Show or hide layers from a flow](https://bloopbot.com/docs/arrange-your-overlay#flow-show-hide)). - A layer sits somewhere other than where Studio shows it, at another size: a flow's **Change layer state** step put it in one of its states. Pick that state in Studio's state picker to see it, or run a step that changes it back to **Default** ([Glide a layer between sizes with states](https://bloopbot.com/docs/arrange-your-overlay#layer-states)). - A banner says **Your old Alert box was retired**: the Alert box is gone and its settings were not carried over. Add an alert layer for each alert type you want from the **Add** tab, then **Publish**; the old box is removed from OBS with that Publish. - **There is no Layer opacity slider.** It is the first control under **Layer appearance · Local**, so select a layer first. The Clip player and the Media share player never offer it, because Twitch and YouTube will not play a faded video. - **The align-content buttons are missing.** They only show for a layer with its own height: drag its top or bottom handle first. Layers that fill their whole box (Image, Shape, Chat and the others listed in [Resize from any edge](https://bloopbot.com/docs/arrange-your-overlay#resize)) don't have them. - The canvas is ahead of OBS: a change reaches OBS when you press **Publish**, not as you drag. The chip in the top bar says how many changes are waiting. - The chip reads **Not saved — fix the highlighted fields**: a change was refused. The message sits beside the field, and that change is kept only in this tab until you fix it — it is not in your draft yet. - Opening another overlay asks **Your last change to … isn’t saved**: that change has not reached your draft. Press **Cancel** to stay and fix it, or **Switch anyway**, knowing it may be lost. A refused change on an overlay you switched away from is listed under the canvas, starting with that overlay’s name. - The chip reads **Couldn’t save — retrying**: the editor lost its connection. It keeps trying on its own; keep the tab open until the chip says **draft saved** again. - A banner says **Changed in another tab**: choose **Load theirs** or **Keep mine** (step 5). Nothing saves from this tab until you do. - A new or changed alert design does not play when you test it in OBS: tests on the live overlay use the published designs. Publish first, then test. - **Add** in a layer’s details is greyed out and the tab says **This overlay holds as many layers as it can**: the overlay has its 24 layers. Remove one, or put the new piece on another overlay. - On a phone, layers cannot be dragged: open a tile in **Add** and press **Add** to place it in the middle, and arrange the overlay on a larger screen. - One layer ignores a change to the theme: it has its own value for that field. Select it and press **Reset to theme** under the field in **Layer appearance · Local**. - A layer has no frame though the theme does: it has switched the theme’s frame off with **None**. Select it and press **Reset to theme** under the frame. If the frame’s control is missing from its **Layer appearance · Local** section, the layer’s type does not draw that frame. - An End credits layer shows _Thanks for watching!_: nobody has followed, subscribed, gifted, cheered or raided this stream yet, or only in sections you turned off. It fills in as soon as someone does. - End credits show the last stream's names after you go live: the list starts over when Twitch reports the new stream; give it a moment. - The clock shows the wrong time: it shows the time of the computer running OBS. Set that computer's clock and time zone; the overlay follows it on its next tick. - The chip reads **Not saved — fix the highlighted fields** and a social's row says **Type a handle of 1-60 characters.**: **Add** makes a row with an empty handle, and saving refuses it until it holds one. Type the handle, or press the bin to remove the row. - A social's icon is missing, or its row says **Choose one of the listed platforms**: an overlay made elsewhere, such as by an AI assistant or from an older copy, names a platform the list does not offer. Pick another platform, or **Website** for any other link. - An Event list shows nothing in OBS: nothing has happened yet of a type it shows, or every type is switched off under **Show**. It fills in with the next follow, sub, gift, cheer, raid or redemption. - An older sub in the Event list reads **subscribed** with no tier: subs saved before the Event list arrived were kept without their tier. New subs show it. - The Event list on the canvas shows made-up names: the canvas always draws sample rows so you can style the layer. Your real events show in OBS. - A chat layer spills past its box: give it a fixed height by dragging its bottom edge. A chat box with a height keeps the newest lines and drops the oldest at its edge. - The made-up names from **Test credits** are still showing: they go when the demo's roll ends — at most a minute and a half. If they stay, refresh the Browser Source in OBS. - **Video** is greyed out under a background: this overlay already plays 2 background videos. Change one of them to an image, a gradient or a colour. - The background video stands still on the canvas: your computer is set to reduce motion, so the preview shows the video’s first frame. OBS plays it. - A video will not upload: WebM videos can be up to 25 MB, and pictures and sounds up to 5 MB. Files you drop together upload one after another. A file started from another tab or window while one is still uploading is refused with **Another file is still uploading** — try it again once the first has finished. - A layer will not go where you want it: drag it on the canvas, or nudge it with the arrow keys. Any of its eight square handles resizes it, and the round handle above its name rotates it. - A layer will not move, resize or be removed: it is locked (a small lock shows in its **Layers** row). Unlock it from its toolbar, the lock beside its row, or **Cmd/Ctrl+Shift+L**. - Clicking one layer selects several: it is in a group. Double-click it, or click its row in the **Layers** list, to work on it alone — its **Layer appearance · Local** section is that layer’s, not the group’s — or **Ungroup** the group. Click the group heading for the group’s own settings. - The canvas plays a sound every time you edit: **Mute preview** above the canvas turns that off. It stays off until you turn it back on, and OBS is unchanged. - A resize does not snap: the layer is rotated, **Shift** is held on a corner, or **Alt** is held. Snapping works on upright layers. - The whole widget is in the wrong place in OBS: that is the source’s position and size in your scene, not the editor. A 1920 × 1080 source is what the editor’s canvas shows. --- # Reuse your widgets in every overlay Keep your custom widgets on the Custom widgets page, place one on any overlay from Studio's Add tab, edit it once for every overlay that shows it, and add or share widgets on the Marketplace. Updated 15 October 2026 ## Before you start A **widget** is one piece you can place on an overlay. Bloopbot's own widgets, such as the chat box, the goal bar and each alert, are built in. A **custom widget** is one you wrote, or one you added from the Marketplace. It is kept once, on the **Custom widgets** page, and every overlay that shows it shows that same widget: change its code once, publish, and every one of those overlays changes. Each place a widget appears on an overlay is a **layer**. A layer keeps its own position, size and settings, so the same raid card can be big on one overlay and small on another, with a different accent colour on each. You need an overlay to open in Studio. Writing a widget's code is covered in [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics); this guide is about keeping and reusing what you make. ## 1. Make a widget 1. Open **Overlays**, then **Open in Studio** on any overlay. 2. Choose **Add** at the top of the left panel. 3. Press **New widget** at the foot of **Add**. It stays outside the categories and the search, so it is always there. Studio makes a widget on your **Custom widgets** page, starting from a raid card, and places it on this overlay as a layer called **Custom widget**. Select the layer and press **Edit widget code** in the **Widget** section to change it: [Author a custom graphic](https://bloopbot.com/docs/author-custom-graphics#code) walks through the code workspace. Choosing **Edit code** on a built-in layer, such as a Label, also makes a widget: a copy of that built-in's code, which no longer gets Bloopbot's fixes. **Reset to built-in** turns only that layer back; the copy stays on your **Custom widgets** page. ## 2. Place it on another overlay 1. Open the other overlay in Studio and choose **Add**. 2. Your widgets sit inside the list, each beneath the built-in widget it is listed under. Every built-in row has an arrow beside its **Add** button: press it to see the built-in’s example and any widgets listed under it. Select the row’s name to open the same full gallery in the left panel, with one full-width card per row. It includes every widget listed under that type, even when your search matched only one. **Back**, or **Esc**, returns to your filtered list. A row with your widgets shows their count. Widgets listed under no built-in are in **More**, at the end of their section. 3. Each card shows a rendered example, its name, **Built-in**, **Yours** or **Installed**, and, for your widgets, how many overlays use it. A card that cannot draw an example shows its icon. 4. Select a widget to put it in the middle of the canvas, or drag it to where you want it. ![Studio’s Add tab: the Raid alert row opened on Raid card, tagged Yours and Used in 2 overlays, and More under Media holding Sponsor loop.](https://bloopbot.com/docs/screenshots/studio-add-drawer.jpg) _Add with the Raid alert row open on its built-in example and Raid card, tagged Yours, and Sponsor loop in More under Media._ Studio remembers up to six open rows for this channel in this browser, including **More**. Opening another closes the oldest. **Find a widget…** searches your widgets by name too, and opens the rows that hold them while you search. Clear the search to return to your remembered rows. If your browser blocks saved preferences, the rows start closed when you return. The categories (**Alerts**, **Media**, **Chat & info**, **Goals & games**) show your widgets with the built-ins of that section. The square arrow at the end of a widget's row opens it on the **Custom widgets** page in a new tab. ## 3. Edit it once for every overlay Select a layer that shows one of your widgets. Above its settings, a note says how many overlays use the widget, for example **Used in 2 overlays.** 1. Press **Edit widget code** in the **Widget** section and make your change. It saves to your draft as you type. 2. Choose **Back to Studio**. Every layer that shows the widget, on this overlay and on the others, already shows the change in Studio. 3. Press **Publish**. Every overlay that shows the widget changes in OBS. ![The settings of a layer showing Raid card: Used in 2 overlays, Make a separate copy, Open in Widgets, and Edit widget code under Widget.](https://bloopbot.com/docs/screenshots/widget-layer-banner.jpg) _A layer showing Raid card: Used in 2 overlays, Make a separate copy, Open in Widgets and Edit widget code._ A layer's own settings, such as an accent colour or which flow messages it reacts to, stay with that layer: changing them on one overlay leaves the others as they are. The code, the settings it offers and its examples belong to the widget. **Open in Widgets** in the same note opens the widget in the code workspace. ## Choose where it is listed **Listed under** decides which row of Studio's **Add** list a widget sits beneath. It changes nothing about what the widget does. 1. Open **Overlays**, then the **Custom widgets** tab, and press the widget's pencil (**Edit**). 2. In the code workspace, choose **Data & settings**, then **Widget**. Open **Listed under** and choose a built-in widget, such as **Raid alert** or **Wheel**, or a section's **More**. ![Raid card’s code workspace, with Widget name, icon, Listed under, Shown on and History in Data & settings](https://bloopbot.com/docs/screenshots/widget-detail.jpg) _Raid card’s code workspace: Widget settings with its name, icon, Listed under, the overlays that show it and History._ It applies at once, with nothing to publish. **Automatic** lists a copy of a built-in's code under that built-in, and a widget that uses a built-in's data, such as a wheel, a leaderboard or a Twitch goal, under that built-in. Everything else goes in **More** under **Chat & info**, a new widget included. ## Give it an icon 1. On the **Custom widgets** page, press the widget’s pencil (**Edit**). In the code workspace, open **Data & settings**, then **Widget**, and press the icon (**Change widget icon**). 2. Under **Icons**, pick one, or search with **Find an icon…**. Or choose **Your pictures** and pick a PNG or WebP from your media library, or upload one. ![Icon for Spin timer: Icons and Your pictures, a search for rocket with the matching glyphs, No icon and Cancel.](https://bloopbot.com/docs/screenshots/widget-icon-picker.jpg) _Searching the widget icons for rocket._ The icon shows in the **Add** list and on the **Custom widgets** page, and Studio shows it on the layer's row and in its settings. **No icon** puts back the plain one. It applies at once. A picture used as an icon can't be deleted from your media library until you choose another icon. ## The Custom widgets page Open **Overlays**, then the **Custom widgets** tab beside **Overlays** and **Packs**. Search by name to find a widget. Each widget shows its icon, its name, **Made by you** or **Installed**, how many overlays use it, and **Edited, not published** or **Deleted when you publish** while your draft holds a change to it. An installed widget with a newer version waiting shows **Update ready**. ![The Custom widgets tab with Raid card, Spin timer and Sponsor loop in a searchable library beside the selected Raid card inspector: its running example, Edit widget, Submit to Marketplace, Browse Marketplace and overlay usage.](https://bloopbot.com/docs/screenshots/widgets-page.jpg) _The Custom widgets tab: each widget with its icon, where it came from, how many overlays use it and what your draft holds for it._ - Select a name to inspect its example and usage beside the library. Press its pencil (**Edit**) to open the code workspace. - In **Data & settings → Widget**, edit **Widget name** and press **Save name**, change its icon or choose **Listed under**. These changes apply at once; layers keep their own names. - The code opens on a blank canvas that plays the widget’s examples. Choose **Back to widgets** when you have finished. - **Publish…** and **Discard draft…** at the top act on your whole Studio draft, as they do in Studio. **New widget** shows your overlays. Open one in Studio, choose **Add**, then **New widget**. If you have no overlay yet, create one first. On a phone, select a widget to open the inspector and use **Back to library** to return. **Browse Marketplace** opens the community widget catalogue; **Submit to Marketplace** starts a listing for widgets you made. You choose the content in the submission steps. Installed widgets belong to their original creator. On desktop, the inspector stays beside the library as you scroll through your overlays, custom widgets or packs. If its details are taller than the window, scroll inside the inspector to reach the remaining actions. You can also focus the inspector with Tab and scroll it with the arrow keys. ## Go back to an earlier version Each time you publish a change to a widget, its page keeps the version under **History**, the last 50 of them. 1. Press the widget’s pencil (**Edit**) on the **Custom widgets** page, then choose **Data & settings → Widget**. 2. Under **History**, press the restore icon (**Restore version 3**, for example) beside the version you want. 3. The version goes into your draft, and every overlay that shows the widget shows it in Studio. Choose **Back to widgets**, then press **Publish…** to put it live. ## Make a separate copy To change a widget on one overlay only, give that layer its own copy. 1. In Studio, select the layer. 2. Press **Make a separate copy** in the note above its settings, then **Make a copy**. Your **Custom widgets** page gets a widget with the same name and _copy_ after it, such as **Raid card copy**, and only this layer shows it. Changes to one no longer reach the other. A sealed widget can't be copied. ## Delete a widget 1. On the **Custom widgets** page, press the bin beside the widget, or **Delete…** on its page. 2. The warning lists every overlay that shows it: its layers are removed from them. Press **Delete widget**. 3. The widget and its layers stay on stream until you publish, and **Discard draft…** brings them all back. Press **Publish…** to delete it for good. ![Delete Raid card?: it is on 2 overlays, Gameplay and Be right back, whose layers are removed; it stays on stream until you publish; Cancel and Delete widget.](https://bloopbot.com/docs/screenshots/widget-delete-warning.jpg) _The warning before a delete lists every overlay that loses the widget._ ## Widgets from the Marketplace Some Marketplace items are widgets on their own: choose **Widgets** in **Discover** to see them. An overlay you add can bring widgets with it, too. 1. Open the widget's page and press **Add**. It goes onto your **Custom widgets** page as **Installed**. 2. Under the steps to set it up, **Add to an overlay** lists your overlays: pick one and press **Add to an overlay**. The widget lands in that overlay's draft at the spot you pick under **Where on the overlay** (top left to start). Open the overlay in Studio to move it, then **Publish**. You can place an installed widget from Studio's **Add** list too, like one of yours, under the row its creator listed it under. When its creator publishes a new version, the item moves to **Update ready** under **Installed**, and the widget shows **Update ready** on your **Custom widgets** page. If you haven't changed the widget, **Update** puts the new version in your draft; publish to put it live. If you changed its code, the update asks first: **Keep mine**, chosen to start with, keeps your version, and **Use the new one** puts the creator's version in your draft. Either way your layers keep their own settings. See [Update what you added](https://bloopbot.com/docs/the-marketplace#update). An installed widget keeps its creator’s icon, including when its code is sealed. A **sealed** widget's creator keeps its code private: you can place it, change the settings it offers and take its updates, but not see, edit or copy its code. See [Sealed graphics](https://bloopbot.com/docs/author-custom-graphics#sealed). ## Share a widget on its own 1. Give the widget at least one example: open its code and use the **Examples** tab ([Give it examples and a demo](https://bloopbot.com/docs/author-custom-graphics#examples)). A widget shared on its own is previewed from its examples, and can't be shared without one. 2. Open **Marketplace**, then **Made by you**, and choose **Share…**, then **Submit for review…**. 3. Under **Widgets**, tick the widget. Carry on as in [List a widget on its own](https://bloopbot.com/docs/publish-to-the-marketplace#widgets). When you share an overlay, every widget it shows comes along as a widget of its own, with its icon and where it is listed. You can share the widgets you made; an installed widget stays with its creator's listing. ## Ask an assistant A [connected AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant#widgets) allowed to edit your overlays can list your widgets, make one, put it on an overlay, change its code once for every overlay, restore a version, make a separate copy, rename it, give it an icon and choose where it is listed. It can't read or change a sealed widget's code. Its code changes wait in your draft until you publish, or until the assistant publishes with your go-ahead. ## If something looks wrong - **My change shows on only one overlay** — the other overlay's layer may show a separate copy: select it and read the name in its note. Or the change isn't published yet: press **Publish**. - **I can't find my widget in Add** — open the row it is listed under, or **More** at the end of its section, or search for its name. Check **Listed under** on its page. A widget deleted in your draft is left out until you publish or discard. - **Edit widget code isn't there** — the widget is sealed. Its creator's listing is the only place its code changes. - **A picture won't delete from my media library** — a widget uses it as its icon or in its code. Choose another icon, or change the code and publish. --- # Choose and upload media Pick pictures, sounds and videos where you use them, organise your media library with folders and tags, choose pictures that suit a frame and replace a missing file. Updated 14 November 2026 ## Choose a file where you use it Your media library holds the pictures, sounds and videos you use in overlays, alerts, flows, giveaways and other parts of your channel. You keep it tidy on the **Media** page in the sidebar. To use a file, start at the field where it will go; you do not need to leave the task to add one. 1. Open the part you are editing, such as an Image layer in **Overlays** or **Cover art** on a giveaway's **Prize** step. 2. Press **Choose picture**, **Choose sound**, **Choose video** or **Choose media**, depending on the field. **Your library** opens with folders on the left, **Search your library** above the files and **Preview** beside them. **Filters** shows tags and, when several types are offered, a type filter. **Recent uploads** changes the order. 3. Check the destination named in the picker, select a file to inspect it, then press **Use picture**, **Use sound**, **Use video** or **Use media**. For a Slideshow or Marketplace previews, use **Add pictures**, select several, then press **Use 3 files** (the button shows your actual count). The selected strip keeps their order and the footer says how many more fit. An incompatible file can be inspected, but the preview explains why it cannot be used. 4. Wait for the choice to apply, then save or publish the thing you are editing as you normally would. The new file choice follows that page's usual save or publish step. Choose **Recent choices** to find files you successfully used earlier in this browser, for your account on this channel. It shows choices the current field supports. **Your library** has the full library, folders and search; **Upload files** adds a file without leaving the chooser. KLIPY has its own **Recent** list inside the **KLIPY** tab. For a video or sound, use **Play preview**, **Unmute preview**, **Seek preview** and **Preview volume** to audition it. Preview volume changes only what you hear in the chooser. **Stop preview** returns to the start; returning to results or switching sources stops that audition. On a phone, select a file for the larger preview, then press **Results** to return to **Your library**, or **Recent choices** to return to that list. When your device asks for reduced motion, uploaded GIFs show a still picture or a static file icon in the chooser. If a thumbnail cannot load, you can still use an available file. If the file itself is unavailable, it cannot be used; choose another file. The destination stays named while you choose. After **Use**, the choice applies to that item and focus returns to its field. If the save fails, the chooser keeps your candidate and explains the problem so you can retry. An uploaded file stays in your library if you cancel before using it. When an alert field says **From theme**, it is following the named theme’s media. Choosing a file makes an explicit choice for the named design. Where offered, **Reset picture to theme** or **Reset sound to theme** removes that choice and follows the theme again. The field also names the channel or theme design being edited; shared-design edits affect its other placements. See [Choose alert media and sound](https://bloopbot.com/docs/alerts#alert-media). ![The shared media picker with library folders, search, an ordered selection, a file preview and an explicit Use action.](https://bloopbot.com/docs/screenshots/media-picker.jpg) _The shared picker shows the library, an ordered selection and the file preview before Use._ For example, add an Image layer, press **Choose picture**, preview `starting-soon.png`, press **Use picture**, then publish the overlay. The picture appears in that layer in OBS. Choosing a file in a flow changes the flow's draft until you save it; it does not send anything to Twitch by itself. ![An empty picture field with separate Choose picture and Upload actions.](https://bloopbot.com/docs/screenshots/media-picker-entry.jpg) _Choose picture and Upload are separate actions at an empty field; a chosen file offers Change._ ## Get help with your setup Optional **Help me** uses the real saved media you choose. An uploaded file is prepared media, not proof of playback or visibility. Review its destination, licence and volume before using it in a flow or published overlay; help does not play it. ## Find a GIF, sticker or clip You can also find media without uploading a file. For example, choose a celebration clip for an alert or a reaction sticker for an Image layer. 1. Open the picture or video field and press **Choose picture** or **Choose video**. 2. Choose the **KLIPY** tab, then **GIFs**, **Stickers** or **Clips**. Start with **Trending**, use **Recent** to find something you have used, or type in **Search KLIPY**. 3. Select a result to see its larger **Preview**. Clip previews start muted. Press **Unmute preview** to hear it, then **Mute preview** to silence it again. Preview play, seek, mute and volume controls only audition the file; they do not change your alert or destination’s stored sound settings. 4. Press **Use GIF**, **Use sticker** or **Use clip**. When the field accepts several files, press **Add GIF**, **Add sticker** or **Add clip** for each choice, then **Use 3 files** with your actual count. Your selections stay in order when you switch sources. 5. Save or publish the thing you are editing as usual. An Image or Slideshow plays a clip silently; an alert follows its existing sound and volume settings. ![The contextual media picker’s KLIPY tab, with Recent choices and Your library beside it, GIFs, Stickers and Clips, Search KLIPY, a selected sample clip, preview controls, Use clip and the official Powered by KLIPY attribution.](https://bloopbot.com/docs/screenshots/klipy-picker.jpg) _Preview a KLIPY clip and check its sound before using it._ A destination that requires a still picture offers **Use poster** instead. This uses the still image KLIPY supplies; it does not turn a clip into a picture without telling you. If no compatible poster is available, choose another result. Marketplace covers and previews use uploads, because a listing keeps its own copy. KLIPY keeps hosting the media. A selection does not use your uploaded-file storage, and it cannot be copied into a downloadable media bundle. If KLIPY removes an item, choose a replacement. **Report clip**, **Report GIF** or **Report sticker** sends a report to KLIPY. If KLIPY is unavailable or a search fails, your existing file stays selected. Retry the search, or switch to **Your library** to choose an upload. ## Upload a new file 1. Press **Upload** beside an empty field, or **Change** beside its current file and then **Upload files** at the top of the picker. Choose files from your computer. The upload view also accepts a file dropped onto its drop area, and lists the accepted formats and destination folder. **Save to** names the target folder. To upload somewhere else, press **Change folder**, open that folder in **Your library**, then upload your next file. Files already in the queue keep their original destination. 2. Wait for each file to say **Ready**. A failed file keeps its message and a **Retry** action. Removing a row from the queue does not delete an uploaded file. 3. Inspect the preview and press **Use picture**, **Use sound** or the counted **Use files** action to apply it. **Cancel** keeps the previous destination choice; completed uploads remain in **Your library**. ![Choose picture for the Image destination: celebration-picture.png is Ready, with its folder, Candidate preview · not applied, Cancel and a separate Use picture action.](https://bloopbot.com/docs/screenshots/media-picker-upload.jpg) _A completed upload is Ready, with a preview and a separate Use picture action._ On a phone, selecting a result opens its full preview. **Results** returns to **Your library**, or **Recent choices** returns to that list, with your search and selection preserved. The Use action stays at the bottom. ![A phone picker shows Candidate preview · not applied for the Image destination, follower-picture.png, Results to return to the grid, Cancel and Use picture.](https://bloopbot.com/docs/screenshots/media-picker-mobile.jpg) _The phone preview keeps Results, the file and Use picture within reach._ You can also upload several files from Studio’s **Media** tab or with **Upload files** on the **Media** page. These management views save files to the library without a destination Use step. Their upload list names each ready or failed file, with Retry for a failure. Where the file lands is in [Organise with folders and tags](https://bloopbot.com/docs/choose-and-upload-media#organise). Images and sounds can be up to 5 MB each; WebM video can be up to 25 MB. For [custom graphics](https://bloopbot.com/docs/author-custom-graphics#models-and-fonts) you can also upload 3D models as `.glb` files, up to 8 MB, and fonts as `.woff2`, `.woff`, `.ttf` or `.otf` files, up to 5 MB; filter by **3D models** or **Fonts** to find them. The **Media storage** line in [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#limits) shows the space your channel has. The same limits hold when a file travels in a shared listing or a `.bloop.zip` bundle file, which holds up to 95 MB in all ([List your flows and themes in the marketplace](https://bloopbot.com/docs/publish-to-the-marketplace#list)). If an upload is refused, the previous choice stays in place and the message explains what to change. A file can be refused for its type, size or remaining storage space. For Marketplace covers and previews, a picture also has to be 16:9, such as 1920×1080; the picker shows its dimensions before you choose it. ## Organise with folders and tags Once you have more than a handful of files, sort them. Open **Media** in the sidebar, under **On stream**. The **Folders** list on the left has **All media** at the top, **Not in a folder** for files you have not filed, then your folders. A file lives in one folder at a time. Tags are the other way to find things: a file can carry several, and a tag works across every folder. ![The Media page, headed Media with the channel-wide subtitle, with Alerts › Subs open: the Folders list with All media, Not in a folder, Alerts (Follows, Subs), Frames and Sounds and a file count beside each; the trail All media, Alerts, Subs; a search box, type and sort selects; tag chips cute, sound, alert, hype, backdrop and frame; and three files, each with its tags.](https://bloopbot.com/docs/screenshots/media-library-folders.jpg) _The Media page with the Alerts folder open at Subs: the Folders list with a count beside each folder, the trail All media, Alerts, Subs, the search box, the tag chips and three files with their own tags._ 1. Press **New folder**, type a name (up to 48 characters) and press **Create folder**. With a folder open, the new one goes inside it. Folders nest up to three levels, such as **Alerts**, **Subs**. 2. Open a folder to work on it. **Folder actions** offers **Rename…**, **Move to…**, **Share to marketplace** ([Share a media pack](https://bloopbot.com/docs/publish-to-the-marketplace#media-pack)) and **Delete…**; the trail above the files (**All media** › **Alerts** › **Subs**) takes you back up. 3. To file a picture or sound, drag its tile onto a folder in the list, or use its three-dot icon (**More**) and choose **Move to…**. Select several files first and drag any one of them to move the lot. **Not in a folder** in the list is a place you can drop files too. 4. To tag a file, select its three-dot icon (**More**) and choose **Edit tags…**. Type a tag and press Enter, remove one with the cross beside it (**Remove tag**), then **Save tags**. A tag is up to 32 characters and a file carries up to 20. 5. Press a tag chip above the files to see only files with that tag, from every folder. Press it again to clear it. With a tag chosen, **Rename tag…** appears: it renames the tag on every file at once, and if another tag already has that name the two merge. 6. Type in **Search all folders** to look by file name across every folder. Each result names the folder it is in, or says **Not in a folder**, so you can tell two files with the same name apart. **Clear filters** brings the folder back. Use the type and sort selects to narrow by **Images**, **Sounds** or **Videos** and to order by **Newest first**, **Name** or **Largest first**. 7. To rename a file, select its three-dot icon (**More**) and choose **Rename…**. 8. A big library opens 120 files at a time, so the page stays quick however many you have. Scrolling towards the end brings in the next batch by itself; **Show more files**, under the list, does the same for a keyboard or a short list and says how many are on screen, such as **Showing 120 of 480 files**. Search, tags and the type filter always look through every file, not only the ones already on screen. Pictures and videos are drawn from a small copy that loads quickly, and a video shows a still frame until you press play. A file you have just uploaded shows the full picture until its small copy is ready, which takes a few minutes; nothing changes about the file itself. Moving, tagging and renaming a file never breaks what uses it: an overlay, alert, theme or flow that points at the file keeps working, because it points at the file and not at its folder or its name. For example, to keep your sub alerts together, make a folder **Alerts** with **Subs** inside it, drag `sub-alert-cute.png` and `sub-chime.wav` onto **Subs**, and tag both **cute**. Next month, pressing the **cute** chip lists everything cute from every folder at once. ## Work on several files at once Tick the box on a tile, or **Select all files** to take every file in the view (when your library is bigger than what is on screen, it first loads the rest, so the count is the whole view), and a bar appears above the files with the count. The bar stays at the top of the list as you scroll, and the answer to what you do (for example **Moved 3 files to Alerts.**) appears right under it. **Move to…** files them in a folder you choose, **Add tag** adds one or more tags to all of them, **Remove tag** lists the tags the selection carries and removes the ones you tick, **Share to marketplace** starts a [media pack](https://bloopbot.com/docs/publish-to-the-marketplace#media-pack) from them, and **Delete…** removes them. **Clear selection** starts over. Shift-click a second tile to take everything between two. ![The Sounds folder with drum-roll.wav and airhorn.wav ticked and applause.wav not: the bar above the files reads Select all files, 2 selected with Move to…, Add tag, Remove tag, Share to marketplace, Delete… and Clear selection.](https://bloopbot.com/docs/screenshots/media-library-bulk.jpg) _Two of three sounds ticked in the Sounds folder, with the bar above the files reading 2 selected and offering Move to, Add tag, Remove tag, Share to marketplace, Delete and Clear selection._ A file something still uses is never deleted this way: the message names what uses it, so you can change that first, and the other files in the selection still go. If a file would go over 20 tags, the message says which file, and the rest still get the tag. ## Delete a folder Choose **Folder actions** then **Delete…**. Deleting a folder deletes its subfolders and every file in them, so it first counts what would go. If any of those files is still used, the box lists each one and what uses it, and warns that whatever uses it will show nothing afterwards: an overlay layer draws no picture, a flow plays no sound. If one of your marketplace listings has any of those files, the box says so: the listing keeps its own copy, so the delete doesn't change it. You confirm by typing the folder's name; **Delete folder** stays greyed out until it matches. A folder with nothing in use only needs the button. ![The Delete the folder Alerts? box: it deletes 3 folders and 4 files, 2 of which are still used, listing sub-alert-cute.png used by Sub celebration and sub-chime.wav used by the flow Sub chime, with the name Alerts typed in the confirm box and Delete folder and Cancel below.](https://bloopbot.com/docs/screenshots/media-library-folder-delete.jpg) _Delete the folder Alerts?: it deletes 3 folders and 4 files, 2 of which are still used, listing sub-alert-cute.png used by Sub celebration and sub-chime.wav used by the Sub chime flow, with the folder name typed to confirm._ There is no undo. To keep a file the folder holds, move it out first, or use **Move to…** on the folder itself to file the whole folder somewhere else. ## Uploads and duplicates **Upload files** on the **Media** page puts the new file in the folder you have open, or at the top level when you are looking at **All media** or **Not in a folder**. If the file is already in your library, Bloopbot does not keep a second copy: it says **Already in your library at** the folder it is in, with **Show** to jump there. The existing copy stays where it was. The same goes when you upload from a picker or field. ## In Studio and in every picker You do not have to leave what you are doing. Studio's **Media** tab and every media picker show the same trail, subfolders, tag chips and search, and list files with their folder when the search or a tag spans every folder. In the picker, open **Filters** to choose a tag. ![The shared media picker with Filters open on the cute tag, showing picture results from different folders.](https://bloopbot.com/docs/screenshots/media-picker-folders.jpg) _A picker opened from a Slideshow layer with the cute tag chosen: three pictures from three folders, pink-frame.png in Frames, follow-heart.png in Alerts/Follows and sub-alert-cute.png in Alerts/Subs._ - Uploading from the open picker or from the **Media** tab puts the file in the folder on screen. Pressing a field's own **Upload** button, with no picker open, puts it at the top level. - The **Media** tab can also rename a file, edit its tags and move it, from a file's three-dot icon (**More**). Creating, renaming and deleting folders, and renaming tags, are done on the **Media** page. - The library and pickers remember compatible browsing choices for your channel and account on this device. A sound field keeps its own supported file types; it does not inherit an incompatible picture choice. - A picker only shows the files that suit its field, such as pictures for a frame, so a folder can look emptier there than on the library page. For an alert, start at **Picture / GIF / Video** or **Sound** in its workspace. The picker names the selected layer, shared design and destination field. Your choice applies to that destination even if you browse other layers; wait for the draft to save before publishing. Choosing or uploading a file does not play the published overlay. Use **Test in editor** to hear the draft and open **More alert options · Shared design** below the tests for **Alert volume**, which changes its stored level. Files you add from the marketplace land in a folder named after the listing, inside a folder called **Marketplace** ([The Marketplace](https://bloopbot.com/docs/the-marketplace#media-packs)). Rename or move them like any others. ## Pictures for frames A frame is a picture drawn as a border round a panel, a chat line or an alert card ([Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames)). Its picker lists images only, and these suit it best: - **A PNG or WebP with a see-through middle.** The panel’s own colour and background then show inside the frame. These formats keep the see-through parts and soft edges. - **Corners at least as big as the frame is thick.** A picture is cut into nine pieces, and the four corners are drawn as they are. A 96 × 96 picture with 32-pixel corners works well: type **32** as the **Corner size**. - **A GIF works too.** A JPEG works for a solid frame, but it cannot be see-through, so its corners are solid squares. - **Not accepted:** SVG pictures, videos and sounds. Save vector art as a PNG first. Upload it from the frame’s own control with **Upload**, or add it to the **Media** tab first and pick it with **Choose picture**. A file a theme or an overlay uses as a frame cannot be deleted from your library until you change that use, like a background image. ## Replace or remove a file Press **Change** to replace a chosen file. For an empty field, use its Choose action or **Upload**. Press the bin icon (**Remove**) beside them to clear it where the field allows an empty choice. If a file was deleted from the library, the field says **Missing file** instead of silently clearing the saved choice; pick another file or remove it. A slideshow keeps a missing picture in its ordered list so you can see which entry it skips on stream. If the media library cannot load, press **Try again** where it appears, or refresh the page and reopen the picker. If a file cannot be deleted, it may still be used by a published overlay or another record; change that use first. [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay#slideshow) explains the slideshow's ordering and missing-picture behavior. --- # Style every overlay with a theme Keep your colours, fonts, panels, backgrounds, picture frames, alert art and sounds in themes, switch every overlay to a new look at once, add ready-made scene screens for OBS, and give one overlay or one layer a look of its own. Updated 22 October 2026 ## What a theme is A theme holds your channel’s colours, images and sounds for widgets: the fonts, the text and accent colours, the panel behind each piece, its rounding and spacing, the backgrounds behind panels, chat lines and alert cards, picture frames around them, the art and sound of alerts, the style of each part — a chat name, an alert’s title — and, if you want, some custom CSS of your own. Every overlay draws with a theme, so changing the theme restyles every overlay that uses it, live in OBS, without touching a Browser Source. A custom graphic follows the theme too when its code uses it ([Match your overlay's theme](https://bloopbot.com/docs/author-custom-graphics#theme)). Your channel always has at least one theme, **My theme**, and one theme is the **Active** one. Every overlay follows the Active theme unless you pin it to another, so switching the Active theme changes the look of your whole stream in one step. You need an overlay to try this on. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source; everything below happens in an overlay’s editor. ## 1. Open a theme 1. Open any overlay in Studio. Under **Layers**, the compact **Theme · My theme** entry names the theme this overlay uses and says **Follows Active** or **Pinned to this overlay**. 2. Press that theme entry to edit it without losing your selected layer. The right panel names the theme and says **Theme · Shared**. **Back to** followed by the layer’s name returns to its settings; your layout and canvas zoom stay put. While this editor stays open, returning to a scope restores its open sections and position. 3. To manage or preview another theme, choose **Theme** at the top of the left panel, or **Manage themes** in the shared editor. The manager lists your themes, the Active one first. **Active** marks the theme unpinned overlays follow, and **This overlay** marks the one the overlay you are editing draws with. Each theme has a small sample of its colours and type; a theme with a panel frame shows it round its sample ([Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames)). 4. Click a theme to preview and edit it. This does not make it Active or pin the overlay. If it differs from the overlay’s assigned theme, Studio names both: “The canvas previews Capsule; this overlay uses My theme.” Returning to the layer’s settings restores its actual overlay theme. ![The Theme tab on Plus: 2 of 15 themes on your plan, Ranked nights Active, My theme open and used by this overlay with Switch & publish and icons to pin it to this overlay, rename, duplicate and delete it, then Add a theme.](https://bloopbot.com/docs/screenshots/widget-themes-tab.jpg) _The Theme tab: Ranked nights is Active; My theme is open with its actions, and Add a theme is under the list._ ## 2. Change a theme’s look 1. Press the theme entry under **Layers**, or open a theme in the manager. Check the named theme and **Theme · Shared** scope before editing. Clicking empty canvas opens **Overlay settings · Local**, where **Edit My theme** opens the assigned theme instead. 2. Open **Appearance**, then open **Typography** for the fonts, **Colours & panel** for the colours and the panel, or **Background & spacing** for the spacing, border, frames and backgrounds. The canvas follows as you type. 3. For finer control, open **Theme CSS** in the shared theme editor. It applies to every overlay using that theme. The overlay’s **Overlay CSS** lives separately under **Overlay settings**, applies to that overlay only, and wins when the two disagree. 4. Press **Publish**, review the named changes and confirm Publish. Every overlay using the theme updates in OBS within a few seconds. Under **Colours & panel**, **Drop shadow** puts a soft shadow behind a layer's panel, including the card of a Leaderboard, Poll, Now playing, Supporter ticker, Goal bar, Queue, Stream Boss, Support Jar or giveaway. A panel with nothing to see, with **Panel opacity** at 0 and no background or frame, gets no shadow. **Alert designs · Shared theme** is a separate section in this editor. Choose one of that theme’s existing alert designs there to change its message, media, layout and timing. These are shared design edits, not local layer overrides. The selected overlay layer keeps its own assigned design. ![The shared Theme inspector names Preview B while the overlay remains pinned to Pinned A. Its Alert designs section selects b-only, with the message Edited B $(name), media controls and Back to the retained layer.](https://bloopbot.com/docs/screenshots/studio-theme-alert-design.jpg) _Preview B’s shared alert design is open while this overlay stays pinned to Pinned A. Back returns to the selected layer._ Theme edits are draft changes like any other edit: they wait in your draft, the chip in the top bar counts them, and nothing reaches OBS until you publish. [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay#publish) explains the draft, Publish and History. ## 3. Add a theme Open **Theme** and press **Add a theme** under your themes. Choose **Browse marketplace** for a ready-made look, or **Create new theme** to make your own. 1. For a ready-made theme, choose **Browse marketplace**. The Marketplace opens with **Themes** selected: Bloopbot’s **Studio**, **Capsule**, **Scoreboard** and **Minimal**, and themes other streamers designed. 2. Open a theme and look over its review, then press **Add**. The theme joins your themes; nothing on stream changes until you make it Active and publish. Some themes bring overlays and scene screens too, which appear on **Overlays**. 3. Return to your overlay’s **Theme** tab, open the theme and press **Switch & publish**, or **Make Active** and publish when you are ready ([Switch the Active theme](https://bloopbot.com/docs/widget-themes#switch)). ![The Theme tab with Add a theme expanded, offering Browse marketplace and Create new theme. My theme remains Active.](https://bloopbot.com/docs/screenshots/studio-add-theme-review.jpg) _Add a theme offers Browse marketplace and Create new theme from the Theme tab._ To make your own, press **Create new theme**. **New theme** opens for editing with Studio’s default look, and is saved to your draft. Use **Rename** to name it and open **Appearance** in the shared editor. It becomes Active only when you choose **Make Active** or **Switch & publish**. Creation is unavailable when your theme allowance is full: free a place first, or browse Marketplace to swap in a theme ([How many themes you can keep](https://bloopbot.com/docs/widget-themes#limit)). To start from a theme you already have, open it in **Theme** and select **Duplicate**. The copy, named like **My theme copy**, is in your draft; select **Rename** to name it, and open **Appearance** from there. If you [connect an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant#theme-example) with overlay permissions, you can ask it to copy one of your themes or start from Studio, Capsule, Scoreboard or Minimal, then adjust the theme's look in your Studio draft. Ask it to show a picture of an overlay in the draft theme, refine the look, and preview again. Open the new theme in **Theme** to review it yourself before you publish. | Theme | What it looks like | Works well for | | --- | --- | --- | | **Studio** | Dark blue framed panels, clear white text and blue names. | A general stream with chat, alerts and goals together. | | **Capsule** | Light rounded callouts; chat lines fit their words rather than filling the whole box. | Compact lower thirds and quick alerts. | | **Scoreboard** | Dark square panels with bright amounts, ranks and progress. | Competitive streams where numbers should stand out. | | **Minimal** | No panel fill; outlined white and warm yellow words stay visible over video. | A quieter look that leaves more gameplay in view. | The same chat, follow alert, leaderboard, goal and poll over a racing stream show how each of Bloopbot’s themes treats busy footage: ![Studio starter over racing gameplay with blue framed chat lines, a follow alert, a leaderboard, a goal and a poll.](https://bloopbot.com/docs/screenshots/widget-starter-studio.jpg) _Studio: blue framed panels keep each layer distinct over gameplay._ ![Capsule starter over racing gameplay with compact light chat tags, a rounded follow alert, a leaderboard, a goal and a poll.](https://bloopbot.com/docs/screenshots/widget-starter-capsule.jpg) _Capsule: short chat tags and rounded light cards leave gaps between layers._ ![Scoreboard starter over racing gameplay with dark square panels and bright ranked numbers, a follow alert, a goal and a poll.](https://bloopbot.com/docs/screenshots/widget-starter-scoreboard.jpg) _Scoreboard: bright values and ranks sit on square dark panels._ ![Minimal starter over racing gameplay with outlined chat text, a follow alert, leaderboard, goal and poll without panel fills.](https://bloopbot.com/docs/screenshots/widget-starter-minimal.jpg) _Minimal: outlined text leaves most of the playfield visible._ The gameplay frame is by [SuperTuxKart contributors](https://commons.wikimedia.org/wiki/File:STK_track_8.png), used under [CC BY 1.0](https://creativecommons.org/licenses/by/1.0/). A theme you add is a starting point. You can change its colours and type under **Appearance**, and its **Parts** and **Motion** in their own sections, and each overlay can override a field for one layer. Your **My theme** and any other theme keep their appearance when you add one. ## Import a theme with a bundle You can bring in a theme on its own, or as part of a bundle with flows and overlays. Open **Marketplace**, press **Paste a link or drop a file**, drop the `.bloop.zip` file, and check its review. For a theme on its own, the review says it adds the theme and lists the art and sounds it carries. Press **Add**. Your existing flows, widgets and Active theme stay as they are. Drop the same theme file again and nothing is added twice. To use the theme, open a widget editor, choose the theme in the **Theme** tab, then use **Switch & publish**. New widgets follow the Active theme. Standard alert layers on those widgets use the theme’s matching image and sound. A theme can also supply defaults for new custom alerts; if you give a custom alert its own image or sound, that choice wins. Switching themes changes the images and sounds the alert inherits, as well as its colours. Select an alert layer to edit a matching theme design, then publish to update every widget using that theme. If the review says there is no room for another theme, it offers to swap it in: see [How many themes you can keep](https://bloopbot.com/docs/widget-themes#limit). ## Add a theme from the Marketplace The Marketplace lists every theme: Bloopbot’s own **Studio**, **Capsule**, **Scoreboard** and **Minimal**, and **community themes** other streamers designed. A community theme says **Community** and names its designer, and shows the designer’s pictures; every one is reviewed before it is listed, and its images and sounds come into your media library when you add it, in a folder named after the listing under **Marketplace**. To share a theme of your own, see [Publish a theme](https://bloopbot.com/docs/publish-to-the-marketplace#themes). Each of Bloopbot’s themes comes with overlays drawn in it — a chat box, an alerts overlay with follow, sub, cheer and raid alerts, and a goal bar — and four full-screen [scene screens](https://bloopbot.com/docs/widget-themes#scenes), so you can add a whole look in one go. 1. Open **Marketplace** and pick **Themes**. The **Theme** tab’s **Add a theme → Browse marketplace** opens this list too ([Add a theme](https://bloopbot.com/docs/widget-themes#new)). 2. Open a theme and look it over in its review: one sentence saying what adding it does, and **What you get**, such as the theme, its overlays and its scene screens. 3. Press **Add**. The theme joins your themes, and its overlays and scene screens appear on **Overlays**. 4. At your plan’s theme limit the review swaps the new theme into your draft in place of your Active one and keeps the old one in History ([How many themes you can keep](https://bloopbot.com/docs/widget-themes#limit)). 5. To use it, switch to it from Studio’s **Theme** tab ([Switch the Active theme](https://bloopbot.com/docs/widget-themes#switch)). **Adding never changes your Active theme**, unless it swaps one in at your limit, and then only in your draft. OBS keeps drawing your current look until you switch and publish. When Bloopbot or a designer improves a theme you added, it is marked **Update ready** under **Marketplace → Installed**: - If you have not changed your copy, **Update** puts the new version into your draft. Nothing on stream changes until you publish; then every overlay using the theme restyles in OBS within a few seconds. History keeps the version that was live. - If you changed your copy, it asks “You changed Neon. Keep your version?” with **Keep mine** and **Use the new one**. **Use the new one** puts the new version into your draft in place of your changes; History keeps your published version. More on updates is in [Update what you added](https://bloopbot.com/docs/the-marketplace#update). For example, on a Free channel: open **Marketplace**, pick **Themes**, open **Capsule** and press **Add**. Capsule is Active in your draft, its overlays and scene screens are on **Overlays**, and your old theme is in History. Publish, and every overlay that follows the Active theme turns Capsule in OBS. If something is not as expected: - Nothing changed in OBS after adding: adding a theme never switches the Active one. Switch to it in the **Theme** tab, and publish after a swap. - The review says you already have it: an identical theme is on your channel, so it is not added twice. - No **Update** though a newer version is out: you changed your copy, so it asks **Keep mine** or **Use the new one** instead, and an update never overwrites your work without asking. - A community theme says one of its files is not available right now: nothing was added. Try again later. If it says the file was taken down, the theme can’t be added. ## Scene screens Scene screens are full-screen overlays for the moments between your gameplay: **Starting soon**, **Be right back**, **Stream ending** and **Just chatting**. Each fills the whole 1920 × 1080 canvas with the theme’s backdrop, and each belongs in its own OBS scene: | Scene screen | What it shows | OBS scene | | --- | --- | --- | | **Starting soon** | A welcome line, a 5-minute countdown, what is playing, and your chat | **Starting Soon** | | **Be right back** | A countdown, a line saying chat is still open, top gifters and your chat | **Be Right Back** | | **Stream ending** | A thank-you, when you are next live, top gifters and scrolling end credits | **Stream Ending** | | **Just chatting** | A frame for your camera on the left, a topic line and supporters under it, and a goal and your chat on the right | **Just Chatting** | The same four layouts are on **Overlays → Add** as ready-made overlays ([Start from a ready-made overlay](https://bloopbot.com/docs/widgets-in-obs#templates)): a theme’s scene screens are those layouts in its own backdrop. Your channel keeps one of each. They arrive with a theme you add, and you find them on **Overlays**, under **Scene screens**. Their text, panels, countdowns, camera frame and backdrop colours follow your Active theme, like any overlay. Screens you added before 27 September 2026 keep the layout they came with, and their camera frame and backdrop keep the colours of the theme you added them from; updating that theme does not change them. To give one the new layout that follows your theme, use **Use Studio’s layout…** (or the theme you want) under **Scene screens** ([Use another theme’s layout](https://bloopbot.com/docs/widget-themes#scenes-layout)), or add that screen from **Overlays → Add** and keep **Restyle my screen**. ![Studio’s Starting soon scene screen on a full 1920 × 1080 canvas: a dark blue gradient backdrop, a WELCOME IN line reading “Grab a drink — we start in a moment” and a STARTING SOON countdown at 5:00 on the left, with a Now playing panel below them; the chat down the right is empty until someone chats.](https://bloopbot.com/docs/screenshots/widget-themes-scene-screen.jpg) _Studio’s Starting soon screen as OBS draws it, on the full 1920 × 1080 canvas._ ## Add the scene screens Scene screens arrive with a theme: they are in its review’s **What you get**. You find them on **Overlays**, under **Scene screens**, below your overlays. 1. Add a theme from the Marketplace ([Add a theme from the Marketplace](https://bloopbot.com/docs/widget-themes#catalogue)). 2. Open **Overlays**. Under **Scene screens**, each screen has a row: its name, **Add to your OBS scene Be Right Back** (or whichever scene it belongs to) and a copy icon (**Copy URL**). 3. For each row, open that scene in OBS, add a **Browser Source**, press the copy icon (**Copy URL**) and paste it into the source’s URL. Set Width to **1920** and Height to **1080**. The URL is copied, never shown, because it carries the screen’s private key. ![Overlays → Scene screens: one row each for Starting soon, Be right back, Stream ending and Just chatting, each naming its OBS scene with a copy icon (Copy URL), Just chatting noting that the camera source goes above it, the reminder to paste each URL into a 1920 × 1080 Browser Source, and Download OBS scenes.](https://bloopbot.com/docs/screenshots/widget-themes-scene-checklist.jpg) _Overlays → Scene screens: one row per screen, each naming its OBS scene, with a copy icon (**Copy URL**)._ The checklist stays on **Overlays**, so you can copy a URL again whenever you need it. To add all four scenes to OBS at once instead, see [Import the scenes into OBS](https://bloopbot.com/docs/widget-themes#obs-import). **Just chatting needs your camera on top.** The screen’s backdrop covers the whole canvas, so in the **Just Chatting** scene put your camera source **above** this Browser Source in OBS’s Sources list, and size it to the frame on the left. ## When you already have scene screens Adding another theme never adds a second screen for a scene you already have. Your screen, its URL and its layout stay exactly as they are, and it takes nothing from your plan. To give it the new theme’s layout, see below. Adding **Starting soon**, **Be right back**, **Stream ending** or **Just chatting** from **Overlays → Add** when you have that screen asks first: **Restyle my screen** gives your screen that layout on the same URL. ## Use another theme’s layout Switching your Active theme restyles the text, panels and backdrop colours on your scene screens, but never swaps a screen’s layout. To give your screens another theme’s layout: 1. Open **Overlays**. Under **Scene screens**, press **Use Capsule’s layout…** (or the theme you want). There is a button for each theme that has a layout for a screen you hold. 2. Tick the screens to change. Each takes the theme’s layers and backdrop; its name, its URL and the theme it follows stay the same. 3. Press **Use this layout**. The change is in your draft; OBS still shows the old layout. 4. Press **Publish**, review the named changes and confirm Publish. When that theme is on your channel but not Active, **Switch & publish** also makes it Active in the same step. The review also lists other waiting draft parts; leave any part unticked to keep it for later. Nothing in OBS needs changing: every screen keeps its URL, and an open Browser Source shows the new layout within a few seconds. **History** keeps the layout you had, so **Restore to draft** and Publish bring it back. For example: you added Studio. Press **Use Capsule’s layout…**, leave only **Be right back** ticked, press **Use this layout**, then **Publish**. Your **Be Right Back** scene in OBS now shows Capsule’s layout, and your other three screens keep Studio’s. ## If a scene screen looks wrong - The **Just Chatting** scene shows no camera: the screen covers the whole canvas. Move your camera source above the Browser Source in OBS’s Sources list. - A scene screen looks cut off or small: set the Browser Source to **1920** × **1080** and your OBS canvas to 1920 × 1080. - A new theme changed a screen’s colours but not its layout: adding and switching themes never change a layout. Use **Use Capsule’s layout…** (or the theme you want) under **Scene screens**, then **Publish**. - There is no **Scene screens** section on **Overlays**: you have no scene screen yet. Add a theme that brings them, such as Studio, first. - The copy icon (**Copy URL**) is greyed out: the page is still loading your screens. Wait a moment, or reload the page. - The layout changed in the Studio but not in OBS: it is waiting in your draft. Press **Publish**, review the named changes and confirm Publish. ## Import the scenes into OBS Instead of adding four Browser Sources by hand, you can download your scene screens as an OBS scene collection and import it. 1. Open **Overlays**. Under **Scene screens**, press **Download OBS scenes**. Your browser saves `bloopbot-scenes.json`. 2. In OBS, open **Scene Collection → Import**, choose that file and press **Import**. 3. Open **Scene Collection** again and pick **Bloopbot scenes**. OBS adds it as a new collection and does not switch to it by itself. The collection holds four scenes, **Starting Soon**, **Be Right Back**, **Stream Ending** and **Just Chatting**, each with one Browser Source at 1920 × 1080 showing that scene screen. It is made for a 1920 × 1080 canvas. Add your camera to **Just Chatting** yourself, above its Browser Source, and your microphone and other sources as you like. The file follows the scene collection format of OBS Studio 30 to 32, and was built against what OBS Studio 32.2 imports. ![Under the Just chatting row, the Download OBS scenes button with “Contains your private widget links — don't share it.” and “Made for a 1920×1080 canvas. OBS imports it as a new scene collection.”](https://bloopbot.com/docs/screenshots/widget-themes-obs-download.jpg) _Download OBS scenes under your scene screens, with the reminder that the file holds your private links._ **The file contains your private widget links — don’t share it.** Anyone who has it can open your scene screens. If you make a new URL for one of them, the old file stops working for that screen: download it again. Already have a scene collection you want to keep? Importing always makes a new one, so use the [copy-URL checklist](https://bloopbot.com/docs/widget-themes#scenes-install) instead and paste each URL into your existing scenes. ## 4. Switch the Active theme 1. Open the theme you want in the Theme tab. 2. Select the check icon (**Make Active**) to switch in your draft, then look over your overlays and press **Publish**. 3. Or press **Switch & publish** to change Active and open the publish review. Review the waiting parts and their impact before confirming Publish. Every overlay that follows the Active theme restyles in OBS at once. The previous theme is kept, so switching back is the same two steps. Scene screens restyle too, but keep their layout and backdrop; [Use another theme’s layout](https://bloopbot.com/docs/widget-themes#scenes-layout) changes those. ## 5. Pin one overlay to a theme With two or more themes, one overlay can keep its own theme while the rest follow the Active one — a starting soon screen in a calmer look, for example. 1. Click an empty part of the canvas so nothing is selected. 2. In **Overlay settings · Local**, open **This overlay uses** and change its selection from **Active theme** to the theme you want. It is shown as **(pinned)**. 3. Press **Publish**, review the theme assignment and confirm Publish. Switching the Active theme later leaves this overlay alone. You can also pin from the Theme tab: open the theme and select the pin icon (**Pin to this overlay**), or the crossed-out pin icon (**Unpin: follow Active**) to undo it. Deleting a theme an overlay is pinned to moves that overlay back to the Active theme. ## 6. Give one layer its own values A layer draws with its overlay’s theme, field by field, and can change any field for itself. 1. Select the layer and open **Layer appearance · Local** in the right panel. It says which theme it follows, for example **Follows My theme**. Open **Colours & panel** for the accent colour. 2. Change a field — the accent colour, say. That field now belongs to this layer: **Reset to theme** appears under it, a dot marks its group, and every other field keeps following the theme. 3. Press **Reset to theme** under a field to hand it back, or the reset icon (**Reset all to theme**) in **Layer appearance · Local** for every field at once. Because a layer keeps only the fields you changed, a later change to the theme still reaches every field that layer did not change. ![A layer’s Layer appearance · Local controls, following My theme with Accent set to #FF7A59 as a Local override and Reset to theme available.](https://bloopbot.com/docs/screenshots/widget-layer-override.jpg) _A layer with its accent colour changed: the dot and Reset to theme mark the one field it overrides._ ## 7. Put a background behind panels, chat lines and cards A theme holds three backgrounds, under **Appearance** → **Background & spacing**. Each one can be **None**, a **Colour**, a **Gradient** or an **Image** from your media library, with its own **Opacity** and **Blur**: - **Panel background** goes behind every layer’s panel: a label’s card, a goal bar, a chat box, Now playing and a giveaway. - **Chat line and event row background** goes behind each chat line and each poll, prediction or hype train card — the “bubble” look. - **Alert card background** goes behind every alert card. 1. With the theme open (step 2), open **Background & spacing** under **Appearance**. 2. Pick a type. A **Gradient** starts with two colour stops: set its **Shape** (**Linear** or **Radial**), its **Angle**, and each stop’s colour, **Position** and **Opacity**; **Add a stop** takes it up to four. For an **Image**, press **Choose picture** to preview an existing picture or **Upload** to add one here. Then set its **Fit** (**Cover**, **Contain**, **Stretch** or **Tile**) and **Position**. 3. Press **Publish**, review the named changes and confirm Publish. Every overlay using the theme picks the background up. A background is drawn over the panel colour, so at part **Opacity** it tints the panel. Set **Panel opacity** to 0 to see the background alone. On a single layer, open **Layer appearance · Local** → **Background & spacing** for the same three fields, each with **Reset to theme**; a layer can switch a theme’s background off for itself by choosing **None**. Only the backgrounds its type draws are shown — a chat box has a panel and chat lines, an alert layer has cards. ![The Chat line and event row background field set to Gradient: a linear gradient at 135 degrees with two colour stops, each with a position and an opacity, and Video greyed out.](https://bloopbot.com/docs/screenshots/widget-background-theme.jpg) _A theme’s chat line and event row background set to a linear gradient at 135 degrees, with its two colour stops._ A theme’s backgrounds are never videos: a theme is on every overlay that uses it, so a video there would play behind every panel of every overlay. A looping video goes on one overlay, or on one layer’s panel — [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay#background) shows how. ## 7a. Put a frame around panels, chat lines and cards A frame is a picture drawn as a border: an ornate gold edge, a neon outline, a torn-paper edge. It goes round the same three places as a background, and each has its own control under **Appearance** → **Background & spacing**: - **Panel frame**, just under **Border width** and **Border colour**, goes round the panel of each layer that draws one: a Label, Chat, Countdown, Goal bar, Leaderboard, Now playing and the other panel layers. It also goes round a **Poll** card, the **End credits** panel, an **Image** layer’s picture, and a **Box** or **Circle** shape. A **Divider** takes no frame, and neither does a **Minigames** layer, so a theme’s frame leaves them as they are. - **Chat line and event row frame**, under it, goes round each chat line, in every chat layout (**Bubbles**, **Lines** or **Compact**), and each poll, prediction, hype train or ad break card in an event stack. - **Alert card frame**, with the backgrounds, goes round every alert card. A frame picture is cut into nine pieces: the four corners are drawn as they are, and the sides stretch or tile to fit, so one picture fits a box of any size. Use a PNG or WebP with a see-through middle, so the panel’s own colour and background still show inside the frame. A PNG, JPEG, GIF or WebP works; SVG pictures, videos and sounds are not accepted. [Choose and upload media](https://bloopbot.com/docs/choose-and-upload-media#frames) says which pictures suit a frame. 1. With the theme open (step 2), open **Background & spacing** under **Appearance**. 2. Under the frame you want, press **Image**. Press **Choose picture** to pick a picture you already have, or **Upload** to add one. The picker lists images only. **None** takes the frame away again. 3. Set **Corner size** to the size of your picture’s corners, in pixels. A picture with 32-pixel corners takes **32**. Left blank, each side is cut a third of the way in. Press **Edit each side** to give the top, right, bottom and left their own sizes, and **Link the sides** to bring them together again. 4. Set **Frame width**, how thick the frame is drawn, from 0 to 64 pixels. It starts at 16. Set it to the corner size and the corners are drawn at the size you made them; smaller draws them smaller. **Frame outset**, from 0 to 64, moves the frame outwards past the edge of the box, so it does not cover what is inside. 5. Under **Sides**, choose how the sides fill their length: **Stretch**, **Tile**, **Tile, fitted** (scaled so a whole number of tiles fit) or **Tile, spaced** (small gaps instead of scaling). Tick **Draw the middle of the picture** only when the middle of your picture is meant to cover the panel; left off, the middle stays empty. 6. Look at the small preview under the controls, and at the canvas, which draws the frame on your overlay as you type. Then press **Publish**. Every overlay using the theme wears the frame in OBS within a few seconds. ![The Panel frame control in a theme’s Background & spacing: Image is chosen, the frame picture is picked, Corner size is 32, Frame width is 16, Frame outset is 0, Sides is Stretch, and a live preview shows the frame on a box.](https://bloopbot.com/docs/screenshots/widget-frame-theme.jpg) _A theme’s Panel frame: Image is chosen, the picture is picked, Corner size is 32, Frame width is 16, and a live preview shows the frame on a box._ While a frame is on, its **Frame width** takes the place of **Border width** for that box, including a **Border** you set on the box’s part under **Parts**; a part with a frame of its own keeps its own width. If the picture cannot be loaded, the box is drawn with its plain border again. The same picture can go in all three places, or each can have its own. The small theme samples in the **Theme** tab wear the theme’s panel frame, so you can tell themes apart at a glance. ![The Theme tab listing two themes: the Active one draws its small sample with the gold and plum frame around it, and the other's plain sample has no frame.](https://bloopbot.com/docs/screenshots/widget-frame-samples.jpg) _The Theme tab with two themes: the Active theme’s small sample is wrapped in its gold and plum frame, and the plain theme’s sample has none._ ![The published overlay as OBS draws it: a label panel, two chat lines and a follow alert card, each wrapped in the same frame picture.](https://bloopbot.com/docs/screenshots/widget-frame-live.jpg) _The published overlay as OBS draws it: a label panel, two chat lines and a follow alert card, each wrapped in the same frame picture._ A frame belongs to a theme like a colour does. On a single layer, open **Layer appearance · Local** → **Background & spacing** for the same frames, each with **Reset to theme**; a layer can switch a theme’s frame off for itself by choosing **None** ([Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay#frames) shows how). Only the frames a layer’s type draws are shown: a chat box has a panel and chat lines, an alert layer has cards, a Poll, End credits, Image or Shape layer has a panel frame only, and a Minigames layer has none. A part that draws a box, such as a chat line or an alert card, also takes a **Frame** of its own under **Box** in **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)). ## 8. Style one part at a time Every kind of layer is made of named parts: a chat box has a **Name**, a **Message**, **Badges** and each **Line**; an alert has its **Card**, **Picture**, **Title**, **Subtitle** and **Viewer message**; a goal bar has its **Label**, **Track**, **Fill** and **Readout**. **Parts** styles each one on its own, with no CSS. 1. Select a layer and open **Parts · Layer**. Each row summarises its style. 2. Point at a row: that part is outlined on the canvas, so you can see which piece it is. 3. Click the row to open it. **Part · Title**, for example, names the selected part. **Back to parts** returns to the list. 4. Under **Type**, press **Font** to pick from every Google Font. Type to search, or filter by **Sans**, **Serif**, **Display**, **Handwriting** or **Mono**; each name is shown in its own font. Then set **Size**, **Weight**, **Letter case**, **Letter spacing** and **Line height**. An empty box reads **Auto** and keeps the part’s usual look. 5. Under **Colour**, choose **Solid** for one colour or **Gradient** for a colour run across the letters, set the same way as a [background gradient](https://bloopbot.com/docs/widget-themes#backgrounds). 6. Under **Text effects**, pick a preset: **None**, **Soft**, **Hard**, **Neon** or **Outline 2px**. Each tile shows its effect. Open **Adjust** to set a **Shadow**, an **Outline** or a **Glow** by hand. 7. Parts that draw a box — a chat line, an alert card, a goal bar’s track and fill — also take a **Fill** (solid or gradient), a **Border**, **Corners** and a **Frame** ([Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames)), and every part has **Spacing** folded underneath. Open **Box** and find **Frame**, below **Border colour**: press **Image** and choose a picture, and it is drawn round that one box instead of the theme’s frame. On a layer, a box with no frame of its own says **Uses the theme’s frame** while the theme has one for it. To switch that frame off for the box, press **None**: the layer keeps a **None** of its own, the frame goes completely, no picture and no thick edge are left, and the box goes back to its plain border. **Reset to theme** hands the theme’s frame back. When you edit the theme’s own parts in **Theme · Shared**, the box says the same while the theme has a frame for it. **None** then keeps that one box free of the theme’s frame in every overlay using the theme, **Image** gives it a frame of its own, and **Use the theme’s frame** takes either choice back. 8. Press **Publish**, review the named changes and confirm Publish. ![A Label layer’s Panel Part under Box. Frame uses an image, Corner size 32 and Frame width 8, with local override reset controls.](https://bloopbot.com/docs/screenshots/widget-frame-part.jpg) _A Label layer’s Panel part, opened under Parts: under Box, Frame has Image chosen with its picture, Corner size 32 and Frame width 8, and Reset to theme marks it as this layer’s own._ ![Part · Name is open with Back to parts, pink-to-blue gradient text and the Outline 2px effect selected.](https://bloopbot.com/docs/screenshots/widget-parts-effects.jpg) _The chat box’s Name part open: gradient text from pink to blue, with the Outline 2px preset chosen._ ![The Message Part’s Font chooser searches for ban and lists Bangers and matching Google Fonts, with each name drawn in its own font.](https://bloopbot.com/docs/screenshots/widget-parts-font-picker.jpg) _Font opens every Google Font: searching “ban” lists Bangers and the rest, each in its own face._ Each field names its source: **Local override**, **From My theme**, or **Widget default** when the theme has no value for it. In the shared theme editor, a theme’s own part value says **Defined in My theme**. Selecting a part outlines it on a matching layer in the canvas; if the theme has no matching layer here, Studio says so. On a layer, a part style belongs to that layer, field by field, just like its other fields: a dot and **Reset to theme** mark each field it changed, the reset icon under the part (**Reset this part to theme**) hands the whole part back, and the header counts the changed part fields with the rest. To style a part for every overlay using the theme, open the shared theme editor and **Parts**: choose the kind under **Style the parts of**, then open a part as above. ## 9. Highlight the name in an alert Parts that show a `$(name)` or another `$(…)` value — an alert’s **Title** and **Subtitle**, a label’s **Text**, a goal bar’s **Label** — can draw each value in a style of its own, the way a viewer’s name stands out in an alert. 1. Open the **Highlighted values** part and give it a colour, a font or an effect. 2. An alert’s **Title** and **Subtitle** highlight their values straight away: **Highlight values** is on for them. On a label or a goal bar, open the part and turn **Highlight values** on. 3. Test the alert, or publish. The viewer’s name now draws in the highlight style and the rest of the title keeps its own. ![The editor canvas with a follow alert playing: the viewer’s name in the title is drawn in a warm yellow with a neon glow, the rest of the title in the theme’s text colour.](https://bloopbot.com/docs/screenshots/widget-parts-highlight.jpg) _A follow alert on the canvas: the viewer’s name in the highlight colour, with a neon glow, inside the plain title._ ![The published overlay as OBS shows it: chat lines whose names are outlined pink-to-blue gradient text and whose messages are in Bangers, beside a follow alert with the follower’s name highlighted.](https://bloopbot.com/docs/screenshots/widget-parts-live.jpg) _The published overlay as OBS shows it: each chat name in its outlined gradient, each message in Bangers, and the follower’s name highlighted in the alert._ Custom CSS still has the last word: a rule in **Overlay CSS** for the same part — `.w-chat-name { color: #ff6ad5; }`, say — wins over a part style, just as it wins over the rest of the theme ([Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay#custom-css)). ## 10. Make chat lines, rows and media move A theme also decides how things come and go: chat lines, the rows of an event list, and files a **Play media** flow shows. Until you choose, each keeps its usual motion — a chat line slides up, an event row slides down, media fades. 1. Open the theme entry under **Layers**, then **Motion** in the **Theme · Shared** editor. 2. Under **Chat lines**, **Event list rows** or **Media**, pick a tile for **Coming in** and one for **Going out**. Point at a tile to watch it play first. The first tile, for example **Slide up**, is the usual motion. 3. Set **Direction**, **Duration** and **Easing** underneath, as for [an alert](https://bloopbot.com/docs/alerts#motion). 4. Under **Idle motion**, pick **Float**, **Pulse**, **Shimmer** or **Breathe glow** to keep every layer gently moving while it’s on screen, and a **Speed** — **Slow** unless you change it. 5. Press **Publish**, review the named changes and confirm Publish. ![A theme’s Motion for chat lines: the Coming in tiles, Slide up first as the usual motion and Bounce chosen, with Direction left, Duration 0.4 s and Easing Smooth.](https://bloopbot.com/docs/screenshots/widget-theme-motion.jpg) _A theme’s Motion: chat lines bounce in from the left, with the tile grid and its direction, duration and easing._ A layer can change any of these for itself: select it and open **Motion · Layer**. An alert’s **Idle and letters** is there; its card entrance, exit and timing stay under **Layout & timing · Shared design**. A dot and **Reset to theme** mark each one it changed, as for its other fields. A chat box warns when its lines come in and go out for longer than its **Message lifetime** lets them stay. A media file’s way in and way out share its time on screen: when the two are longer than the file is shown, both play faster so the file is still gone on time. ## 11. Make letters move Most text parts can move letter by letter. Open a part under **Parts** and pick under **Letters**: **Wave**, **Wiggle**, **Bounce**, **Pulse**, **Tada**, **Rubber band** and **Jelly** loop while the text is shown; **Typewriter** types it in once. On the **Highlighted values** part it moves just the `$(…)` values — the viewer’s name in an alert — and a layer’s **Motion** section offers that one directly. A chat box’s **Name** can; its **Line** and **Message** can’t, since a busy chat would be hundreds of moving letters — style those with a line entrance instead. Letters stay still in text written in right-to-left or joined scripts, such as Arabic or Hebrew, so it always reads correctly, and in any part longer than 200 letters. Screen readers still read the whole text. A computer set to reduce motion sees fades instead of movement, still letters and no idle motion. OBS never asks for reduced motion, so your stream shows what you chose. ## How many themes you can keep How many themes your channel can keep depends on your plan: **1** on Free, **5** on [Free+](https://bloopbot.com/docs/unlock-free-plus), **15** on Plus, and on Pro as many as you like. Your themes together can take up to 8 MB, room for thousands of ordinary themes. Every style control, every theme and every setting on this page works on every plan; only the number of themes differs. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#limits) lists yours as **Widget themes** under Limits. The Theme tab says how many you have, for example **1 of 1 theme on your plan**, and the Marketplace review explains what happens when you add a theme at your limit. A theme you delete in the Theme tab still counts until you publish: delete it and publish, and its place is free for a theme you add, which then joins the others instead of swapping one out. At your limit, adding a theme from **Marketplace** still works: it swaps in. 1. Choose **Add a theme → Browse marketplace** in the **Theme** tab, then open the theme you want. Its review says how many themes your plan holds, for example **Your plan holds 1 theme**, and that the new theme takes your Active theme’s place in your draft, with the old one kept in History. 2. Press **Add**. The new theme is Active in your draft, and nothing on stream changes yet. 3. Look your overlays over, then press **Publish**. ![Capsule’s Marketplace review on Free: the new theme takes My theme’s place in the draft, keeps the old theme in History, and waits for Publish.](https://bloopbot.com/docs/screenshots/studio-add-theme-swap.jpg) _At the Free limit: Capsule’s review swaps it into your draft in place of My theme._ When what you add brings flows as well as a theme, such as a full pack, the review asks instead: **Swap themes** is chosen, and **Add without the look** adds everything except the theme. At your limit the Theme tab offers no **Duplicate**: a copy would have nowhere to go. Delete a theme you no longer use and publish, or swap one in from **Marketplace**. Adding a theme from the Marketplace at your limit swaps it into your draft the same way ([Add a theme from the Marketplace](https://bloopbot.com/docs/widget-themes#catalogue)). Swapping is restorable. **History** in the top bar lists the version you published before the swap; **Restore to draft** puts its themes back, and publishing restores the old look. A restore keeps any theme you added since that version while your plan has room for it — under a new name, such as **Capsule 2**, if the version has a theme with the same name — so delete one yourself in the Theme tab if you don’t want it. ## A worked example A cosy daytime look and a high-contrast look for competitive nights, on a Plus channel: 1. Choose **Add**, search for **Scoreboard**, press **Add** on its row, then **Add** in its review. In the **Theme** tab, open **Scoreboard**, select the pencil icon (**Rename**) and call it **Ranked nights**. 2. With **Ranked nights** open, set the accent to your team colour under **Appearance**. 3. Press **Publish**, review the named changes and confirm Publish. A new theme is not Active, so **My theme** stays marked **Active** and your usual look stays on stream; **Ranked nights** is saved for later. 4. On a ranked night, open **Ranked nights** and press **Switch & publish**, then review and confirm Publish. Every overlay that follows the Active theme — your gameplay overlay, your alerts, your chat box — changes in OBS at once. 5. Your starting soon overlay is pinned to **My theme**, so it keeps the cosy look either way. ## What you should see - The Theme tab listing every theme, the Active one first and marked **Active**, and the overlay’s own theme marked **This overlay**. - The canvas previewing a theme as soon as you open it, before anything is published. - After confirming **Switch & publish**, every overlay that follows the Active theme changing in OBS within a few seconds, with no change to its Browser Source — and pinned overlays staying as they were. - A changed layer field showing a dot and **Reset to theme**, and every other field of that layer following the theme. - A theme’s chat line background behind every chat line and event card on the overlays that use it, once published. - A theme’s frame picture drawn round each panel, chat line or alert card you gave one, with its corners as drawn and its sides stretched or tiled, on the canvas as you edit and in OBS once published. - **This overlay uses** always available in **Overlay settings · Local**, including when your channel has one theme. - A part you style — a chat name in a Google Font, an alert title with an outline — looking the same on the canvas and, once published, in OBS, with every other part as it was. - An alert’s viewer name drawn in the **Highlighted values** style once that part has a style. - Chat lines, event rows and media coming and going with the theme’s motion once published, and a layer with idle motion gently moving in OBS. ## If something looks wrong - A theme change shows on the canvas but not in OBS: theme edits wait in your draft like any edit. Press **Publish**, review the named changes and confirm Publish. - A theme you add takes your Active theme’s place instead of joining it: your channel is at its plan’s theme limit, so it swaps into your draft. Publish to keep it. To keep both, delete a theme you no longer use in the Theme tab and publish first, then add. - The editor says **Your add changed the draft**: a theme or overlay you added changed your draft while the editor also held changes of its own. **Load theirs** shows the draft with what you added; **Keep mine** saves your other changes on top of it, and keeps what you added. - The duplicate icon (**Duplicate**) is missing from a theme’s buttons: your channel is at its theme limit, so a copy would have nowhere to go. - The bin icon (**Delete**) is greyed out: that theme is Active. Make another theme Active first. - One layer ignores a theme change: it overrides that field. Select it and press **Reset to theme** beside the field, or the reset icon (**Reset all to theme**). - One overlay ignores the Active theme: it is pinned. Open **Overlay settings · Local** → **This overlay uses** and choose **Active theme**. - Your custom CSS stops a theme colour showing: the overlay’s **Overlay CSS** is drawn after the theme and wins. Remove the rule from **Overlay CSS**, or move it into **Theme CSS**. - The chip reads **Not saved — fix the highlighted fields** after editing a theme: a value was refused, and the message sits beside the field. Fix it and the draft saves again. - **Video** is greyed out in a theme’s backgrounds: a theme takes colours, gradients and images only. Put the video on the overlay itself or on one layer’s panel. - A frame shows on the canvas but not in OBS: it is waiting in your draft. Press **Publish**, review the named changes and confirm Publish. - A frame does not show at all: check that **Image** is chosen and a picture is picked, that **Frame width** is not 0, and that the picture is not marked **Missing file** (it was deleted from your media library; pick it again). A layer can also switch the theme’s frame off for itself with **None**: select it and press **Reset to theme** under the frame. The **Layer appearance · Local** section only lists the frames a layer’s type draws, so a layer without a chat line frame shows no such control. - Every logo or picture on your overlays suddenly wears the frame: an **Image** layer takes the theme’s **Panel frame** like any panel. Select the layer and press **None** under **Panel frame** to keep that one plain. - A frame round a **Circle** is square: a frame picture is drawn round the layer’s box and does not bend with rounded corners. Use a **Box** with its own **Border** instead, or press **None** on the circle. - The frame’s corners look squashed or stretched: **Corner size** does not match the corners in your picture. Set it to their size in pixels, and set **Frame width** near the same number so the corners are drawn at the size you made them. A blank **Corner size** cuts a third in, which suits a picture whose corners are about that big. - The frame’s sides look blurry or badly repeated: try another choice under **Sides**. **Stretch** suits a plain edge; **Tile, fitted** or **Tile, spaced** suit a pattern. - A frame is hidden by, or clashes with, a background: the background is drawn under the frame and shows through its see-through parts and its middle. Set the background to **None** or a plain colour, lower its **Opacity**, or use a frame picture whose see-through parts are meant to show it. If the middle of your frame covers the panel, untick **Draw the middle of the picture**. - A frame picture is refused, or the picker does not list it: a frame needs a PNG, JPEG, GIF or WebP picture. SVG pictures, videos and sounds are not accepted, and the picker lists images only. Save the art as a PNG or WebP with a see-through middle and upload it again. - A background image shows as nothing: the file was deleted from your media library, or is still uploading. Pick it again under the background’s **Image**. - A background hides the panel colour you chose: the background is drawn over it. Lower the background’s **Opacity**, or set it to **None**. - A part style shows on the canvas but a rule in **Overlay CSS** undoes it: custom CSS is drawn last and wins. Take the rule out, or make the change in **Parts** instead. - Highlighted values look like the rest of the title: the **Highlighted values** part has no style yet, or the part’s **Highlight values** switch is off. Give the part a colour, and check the switch. - A Google Font shows as a plain font in OBS: the OBS computer could not reach Google Fonts. The part draws in its **Fallback font** until it can. - A part’s font is refused with **Use at most 8 Google Fonts**: a theme’s parts can use up to 8 different Google Fonts, and so can the layers of one overlay. The editor counts them under **Font** as you get close. Pick a font another part already uses, or clear one. - Letters with an effect look spaced out or break oddly: each letter is drawn on its own, so very tight **Letter spacing** can crowd them. Loosen it a little, or choose **None** under **Letters**. - Letters on gradient text lose their colour while they move: a gradient is painted across the whole part and does not follow each moving letter. Use a solid colour on a part whose letters move. - Motion shows in the editor but not on the preview in your browser: your computer is set to reduce motion, so you see fades. OBS shows the motion. - **Gradient text cannot share a part with a fill**: gradient text is painted where a fill would go. Remove the fill, or style the part around it — a chat **Line** holds the **Name**, for example. --- # Control OBS from flows Run a flow when you switch scenes, go live, record, save a replay, show or hide an overlay or close OBS, and let flows switch scenes, save replays, record and stream, with nothing to install. Updated 6 October 2026 ## What you need You need a Bloopbot [overlay open in OBS as a Browser Source](https://bloopbot.com/docs/widgets-in-obs#obs), the same one you already use for alerts or chat; if you have none yet, add one there first, then come back. Every Bloopbot overlay can tell Bloopbot what OBS is doing, so there is nothing to install: no plugin, no password and no extra connection. Flows can start from what OBS does straight away; to let flows make OBS do something, such as switch scenes, you change one setting on that Browser Source (see [Page permissions](https://bloopbot.com/docs/control-obs-from-flows#permissions)). - **Your own HTML overlay counts too.** A [custom overlay](https://bloopbot.com/docs/custom-widgets#obs-link) built on Overlay SDK 1.2 or later works with OBS the same way, unless whoever made it turned that off. - **One overlay is enough.** Several overlays, or several scenes with the overlay in each, report the same thing; each OBS event starts a flow once. - **Keep one overlay running.** A source that OBS has shut down while its scene is off screen reports nothing, so keep **Shutdown source when not visible** unticked on at least one overlay's Browser Source, or put an overlay in every scene. - **It works on every plan**, Free included. - **It is OBS Studio's own feature.** It needs OBS Studio with its built-in browser. Other streaming apps may not offer it; if yours does not, the flow never starts and nothing else is affected. Open a flow's node library from **Flows**, **+ New flow**, then **Start blank**, and search for `OBS`. The OBS triggers and actions sit under **OBS**. ## 1. What can start a flow | Trigger | It runs when | | --- | --- | | **OBS changed scene** | You switch scenes in OBS. Name a scene to run only for a change to that scene. | | **OBS started streaming** | You press Start Streaming in OBS. This is the moment OBS starts the stream, which can be a little before Twitch shows you live. | | **OBS stopped streaming** | You press Stop Streaming in OBS, a little before Twitch shows you offline. | | **OBS started recording** | OBS starts recording. | | **OBS stopped recording** | OBS stops recording. | | **OBS paused recording** | You pause a recording. | | **OBS resumed recording** | You resume a paused recording. | | **OBS saved a replay** | OBS saves a clip from its replay buffer, from its own button, a hotkey or anything else. | | **OBS started virtual cam** | OBS starts its virtual camera. | | **OBS stopped virtual cam** | OBS stops its virtual camera. | | **OBS overlay shown/hidden** | One of your overlays is shown or hidden in OBS. Pick the overlay and whether you want it shown, hidden or either. | | **OBS closing** | You close OBS. Use it for steps that do not need OBS, such as a chat message or a variable. | > **OBS started streaming is not Stream starts or ends** > > **Stream starts or ends** runs when Twitch reports the stream live or offline, and it works without OBS. **OBS started streaming** and **OBS stopped streaming** run when OBS itself starts or stops, so use them for things that belong to the moment you press the button, and the Twitch trigger for things that need Twitch to agree you are live. ## 2. Post to chat when you switch scenes This flow says something in chat when you switch to your **BRB** scene. 1. Open **Flows**, press **+ New flow**, then **Start blank**. 2. In **Add a node**, search for `OBS` and add **OBS changed scene**. This is the trigger. 3. Select it and open **Only when it changes to**. Pick **BRB** from the list of your scenes. If the list shows a text box instead, type the scene's name as OBS shows it. Capitals and the spaces around the name do not matter, so `brb` matches a scene called **BRB**; two scenes whose names differ only in capitals both match. 4. Add a **Send a chat message** action and connect it to the trigger's **next** output. Type `Be right back! Back in a few minutes.` 5. Give the flow a name such as “BRB message”, press **Save**, then turn it on. 6. Press **Test fire** to see the run without sending anything. The test acts as if OBS changed to your BRB scene. 7. Switch to your BRB scene in OBS. The message appears in chat. With **Only when it changes to** left on **Any scene**, the flow runs for every scene change. To answer several scenes differently, make one flow for each scene. ## 3. Run a flow when an overlay is shown or hidden **OBS overlay shown/hidden** runs when one of your overlays appears on screen in OBS or goes away: for example to turn a webcam border off when your BRB overlay shows. It uses the overlay's own Browser Source, so it works for every overlay you have open in OBS, not only one. 1. Add **OBS overlay shown/hidden** as the trigger of a new flow. 2. In **Overlay**, type the overlay's name as it appears under **Overlays** (a custom overlay's name works too), in any case. Leave it empty to run for every overlay. 3. In **Run when it is**, pick **Shown**, **Hidden** or **Shown or hidden**. 4. Add your steps. `$(overlay)` is the overlay's name and `$(state)` is `shown` or `hidden`, so `$(overlay) is now $(state)` reads naturally in a message. A flow only runs when the overlay is shown or hidden, and only once Bloopbot knows how it was before. OBS says nothing about an overlay until you first show or hide it, so the first show or hide after OBS starts, or after you add the source, does not run the flow; every one after it does. Refreshing the source does not run it either, and the next time you show or hide the overlay it runs as usual. - **Shown includes Studio Mode's Preview.** With Studio Mode on, an overlay counts as shown as soon as its scene is in **Preview**, before you transition it on air, so a flow set to **Shown** can run before viewers see the overlay. - **Keep Shutdown source when not visible unticked.** With **Shutdown source when not visible** ticked, OBS closes the overlay each time it is hidden and opens it fresh each time it is shown, so Bloopbot never sees it change and this trigger never runs, shown or hidden. - **Alerts in several scenes.** Leaving the setting unticked does not make alerts play twice: Bloopbot plays an alert only in the copies of an overlay that OBS is showing, and holds it while they are all hidden ([alerts in more than one scene](https://bloopbot.com/docs/alerts#several-scenes)). An overlay that still has it ticked cannot be watched by this trigger. ## 4. Use the scene in a message `$(obs.scene)` is the scene OBS is on. Use it in any text field of any flow, not only flows that start from OBS: for example, a command that answers what you are doing. 1. Make a **Chat command** flow with the command `!scene`. 2. Add a **Send a chat message** action with the text `We're on the $(obs.scene) scene right now.` 3. Open the **Insert…** menu under the text box and look under **Your OBS** to add the token without typing it. The variable is read when the flow starts. It is empty, never the words `$(obs.scene)`, when no overlay is open in OBS, or before OBS has told Bloopbot which scene it is on (see the permissions below). In a flow that starts from **OBS changed scene**, `$(scene)` is the scene it changed to. `$(obs.scene)` is the same scene in that run, because Bloopbot notes the new scene before the flow starts. ## 5. Make OBS do something These actions make OBS act from any flow. Each needs the overlay's **Page permissions** raised in OBS first, as the table in [Page permissions](https://bloopbot.com/docs/control-obs-from-flows#permissions) shows. | Action | What it does | | --- | --- | | **Switch OBS scene** | Switches OBS to the scene you pick. The step waits up to 5 seconds for OBS to show the scene. | | **Set OBS transition** | Sets the transition OBS uses for the next scene switches, such as **Cut** or **Fade**. | | **Save OBS replay** | Saves the last moments from OBS's replay buffer as a clip on your computer. It waits up to 5 seconds for OBS to save it. The replay buffer must be running: if OBS says it is off, the step fails straight away without asking OBS. | | **Start OBS replay buffer** | Starts the replay buffer, so **Save OBS replay** has something to save. | | **Stop OBS replay buffer** | Stops the replay buffer. | | **Start OBS recording** | Starts recording, as OBS's **Start Recording** button does. | | **Stop OBS recording** | Stops the recording. | | **Pause OBS recording** | Pauses the recording; **Resume OBS recording** carries on in the same file. | | **Resume OBS recording** | Resumes a paused recording. | | **Start OBS stream** | Starts streaming, with no confirmation box. | | **Stop OBS stream** | Ends your stream, with no confirmation box. | | **Start OBS virtual cam** | Starts OBS's virtual camera. | | **Stop OBS virtual cam** | Stops OBS's virtual camera. | **Switch OBS scene** and **Set OBS transition** offer the scenes and transitions OBS reported in a list. If the list shows a text box instead, type the name as OBS shows it; capitals do not matter. The other actions have nothing to set. A scene switch usually shows in OBS within about half a second of the step starting, once the overlay has **Advanced access to OBS**. Every action other than **Switch OBS scene** and **Save OBS replay** counts as done once OBS has been told, after about a second. OBS does not confirm the others, so look at OBS to check them the first time. Only one **Switch OBS scene** and one **Save OBS replay** wait for OBS at a time on your channel, counting flows your viewers can start apart from your own. If another of the same step from the same kind of flow is still waiting, the step fails at once with _OBS is still busy_, rather than queueing, so a reward that viewers redeem many times in a row cannot pile up. Your viewers' flows never make your own Stream Deck button or mods-only command fail this way. A switch or replay usually finishes in well under a second, so this only happens when OBS is slow to answer. **Test fire** never reaches OBS: the **Run log** says what the step would do, and nothing changes in OBS. To check a step for real, run the flow from its real trigger, or add a **Run button** trigger and press **Run**. ## 6. Switch to BRB from chat, mods only This flow lets you and your moderators type `!brb` to switch OBS to your **BRB** scene. 1. In OBS, open the properties of the Browser Source that shows your Bloopbot overlay, set **Page permissions** to **Advanced access to OBS (Change scenes, Start/Stop replay buffer, etc.)**, and press **OK**. 2. In Bloopbot, open **Flows**, press **+ New flow**, then **Start blank**. 3. Add a **Chat command** trigger and type `brb` as its command. 4. Add a **Who can trigger** check, set **At least** to **Moderators and up**, and connect the trigger to it. 5. Add **Switch OBS scene**, pick **BRB** in **Scene**, and connect the check's passing path to it. 6. Add a **Send a chat message** action, type `Could not switch: `, then add **Why it failed** from the **Insert…** menu under the text box. Connect the **error** output of **Switch OBS scene** to it. 7. Name the flow, press **Save**, then turn it on. 8. Type `!brb` in your chat. OBS switches to **BRB**, and the flow's **Run log** shows _OBS switched to BRB_. If OBS does not switch, the chat message and the **Run log** say why: see [If an OBS step fails](https://bloopbot.com/docs/control-obs-from-flows#step-fails). ## 7. Page permissions and more than one OBS Each Browser Source has a **Page permissions** setting in its properties in OBS. It decides what the overlay page may read and do in OBS, and only you can change it there. Its default, **Read access to OBS status information**, is enough for every trigger on this page but for none of the actions. To raise it: 1. In OBS, right-click the Browser Source that shows your Bloopbot overlay and choose **Properties**. 2. Scroll down to **Page permissions** and open the list. 3. Pick the level the table below gives for the actions you want, then press **OK**. ![A Browser Source's properties in OBS with the Page permissions list open. Its six options read No access to OBS, Read access to OBS status information, Read access to user information (current Scene Collection, Transitions), Basic access to OBS (Save replay buffer, etc.), Advanced access to OBS (Change scenes, Start/Stop replay buffer, etc.), ticked, and Full access to OBS (Start/Stop streaming without warning, etc.).](https://bloopbot.com/docs/screenshots/obs-page-permissions.jpg) _OBS's Browser Source properties with the Page permissions list open: the six levels from No access to OBS up to Full access to OBS, with Advanced access to OBS ticked._ The table gives each option's full text as the dropdown shows it; elsewhere this guide uses the part before the brackets. | To use | Set Page permissions to at least | | --- | --- | | Every OBS trigger | **Read access to OBS status information** (the default) | | The scene list in the pickers, and `$(obs.scene)` before the first change | **Read access to user information (current Scene Collection, Transitions)** | | **Save OBS replay** | **Basic access to OBS (Save replay buffer, etc.)** | | **Switch OBS scene**, **Set OBS transition**, **Start OBS replay buffer**, **Stop OBS replay buffer** | **Advanced access to OBS (Change scenes, Start/Stop replay buffer, etc.)** | | Recording, streaming and the virtual camera actions | **Full access to OBS (Start/Stop streaming without warning, etc.)** | In the flow editor, select an OBS action step and it tells you when the overlay open in OBS has too little: _Your OBS source allows Read access to OBS status information — set Page permissions to Advanced access to OBS_. Change the setting in OBS and select the step again (or come back to the editor tab), and the warning goes away. If no overlay is open in OBS, the step only notes that and says what level it needs, since there is nothing to check. Each setting includes the ones above it. Give the overlay only the level your flows need: at **Full access to OBS**, any flow that can reach the stream actions can start or end your stream. - **What you will see.** At **Advanced access to OBS**, a flow that runs **Switch OBS scene** moves OBS to the scene in about half a second. At **Read access to OBS status information** the same step fails and the **Run log** says _Your overlay in OBS may not switch scenes_ with the level it has and the one it needs; raise the setting and run the flow again. - **Changing a source's settings is safe.** When you change a Browser Source's properties, including **Page permissions**, OBS rebuilds the source, and the link to Bloopbot picks up again by itself within a few seconds. You do not need to restart OBS or touch the flow. - **Treat the overlay's URL like a password.** The URL of an overlay also lets whoever holds it open that page and report OBS events, or act as your OBS link, so do not share it or show it on stream. Making a new URL for the overlay ([Make a new OBS URL…](https://bloopbot.com/docs/widgets-in-obs#obs)) stops the old one working. - **Scene names.** At a level below **Read access to user information**, scene changes still start flows and still say which scene, but the pickers are text boxes and `$(obs.scene)` is empty until the first change. - **Two sources, or two computers.** For scenes, streaming, recording, replays, the virtual camera and every action, Bloopbot uses one overlay page in OBS at a time: the one with the highest Page permissions, and the first one to report among equals. Another page takes over when the first falls silent. A second OBS, such as one on a second computer, is ignored while the first one is open, unless its overlay has the higher Page permissions. **OBS overlay shown/hidden** hears every overlay open in OBS. ## 8. Who can start or stop your stream **Start OBS stream**, **Stop OBS stream**, **Stop OBS recording**, **Start OBS virtual cam** and **Stop OBS virtual cam** never run in a flow that your viewers can set off, so nobody in chat can start or end your stream or turn your camera on. To go live from a flow, start it from a mods-only command, a **Stream Deck button**, a control panel, a timer or one of the OBS triggers. - **Viewers can set off** a flow that starts from a follow, a sub or gift sub, bits, a Power-up, a channel points reward, a raid, a hype train, a poll, a prediction, a goal, a giveaway, a store purchase, a video request, the jar, the Stream Boss, a ban or timeout, or the moderation filters. - **Another flow's step counts too.** A flow that starts when a variable changes, a countdown ends, the credits finish, a wheel lands or viewers are pulled from your queue counts as one viewers can set off, because a viewer's flow may have caused it. - **Chat commands and keywords** count unless a **Who can trigger** check set to **Moderators and up** or **Broadcaster only** stands between the trigger and the step, with the step on its passing path. It is about the flow, not the person: a moderator typing a command anyone may use is refused too. - **These are fine:** mods-only commands, **Stream Deck button**, the **Run button** trigger (which your control panels use), **On a web request**, **On a timer**, **From your schedule**, **Stream starts or ends**, **Stream info changes**, **Ad break starts**, **Shield mode on or off**, **VIP added or removed**, **Mod added or removed**, and the OBS triggers, apart from the case below. - **An event right after a viewer's flow counts as theirs.** A flow that viewers can set off may switch your scenes, save replays, start a recording, change your title or category, run an ad, turn Shield mode on or make someone a VIP or a moderator, and OBS or Twitch then reports what happened. For a short time after it does, the trigger that report starts counts as one viewers can set off: every OBS trigger for 10 seconds after any OBS step; **Stream info changes** for 15 seconds after **Set title or category**; **Ad break starts** for 10 seconds after **Run a commercial**; **Shield mode on or off** for 10 seconds after **Shield mode**; **VIP added or removed** and **Mod added or removed** for 15 seconds after **VIP** or **Moderator**. - **So a viewer cannot reach a stop through another trigger.** A viewer's **Switch OBS scene** to **Ending** cannot end your stream through an **OBS changed scene** flow that stops it, and a viewer's new title cannot stop your recording through a **Stream info changes** flow. Bloopbot cannot tell what caused an event, so the same change made by you in that time counts too: make it again a moment later. With no viewer's flow before it, every such event is yours. - **A bot that repeats chat counts as a moderator.** Another bot that is a moderator in your channel, such as Nightbot or StreamElements, and repeats what a viewer typed counts as a moderator, so it can run a mods-only command. Don't let such a bot echo viewer text that starts with your command prefix. - **A web request is always yours.** **On a web request** counts as yours whoever calls its address: you, a tipping service such as Ko-fi, or another flow's web request step. Anyone you give the address to, and anything a tip can set off, can therefore stop your stream through it, so keep stream-stopping steps out of flows that tips or other services start. The same goes for two things a viewer's flow can do: call one of your control panels' links from a web request step (it presses that panel's button as you), or turn on a timer or schedule flow with **Turn a flow on or off**. Both count as yours, so keep stream-stopping steps out of those flows too. When you save such a flow, the editor warns you on the step: its card says _Won’t run when viewers start it_, and selecting it shows why and what to use instead. **Test fire** shows the step refused. In a real run, the step fails with _Viewers can start this flow, so it may not start or stop your stream, stop your recording, or turn the virtual camera on or off_ in the **Run log**, or, after a viewer's flow set the event off, _A viewer's flow set off the event this run started on a moment before_. Switching scenes, saving replays and starting a recording are not limited. ## If a flow does not run - **Check the overlay is open in OBS.** The overlay's Browser Source must be in your scene collection and not shut down; an overlay open only in a normal browser tab is not OBS. - **Refresh the source.** Right-click the Browser Source and choose **Refresh**, or press **Refresh** in its properties, then change scene again. - **Check the scene's name.** In **Only when it changes to**, a scene that does not exist in OBS any more is listed as **not in OBS now**. Pick the scene again or retype it. - **Use Test fire** on the flow. If the test works and the real scene change does not, the flow is fine and Bloopbot is not hearing OBS: check the two points above. - **Expect no run for another scene.** A flow with **Only when it changes to** set starts no run at all when you change to a different scene, so nothing appears in its Run log. That is what the setting is for. ## If an OBS step fails A failed OBS step takes its **error** output, and the **Run log** shows why on the step. With nothing connected to **error**, the steps after it do not run. The step's **Why it failed** value in the **Insert…** menu holds the same reason, so a chat message can say it. - **OBS is not connected.** No Bloopbot overlay is open in OBS. Open one as a Browser Source and keep it running. - **Your overlay in OBS may not …** The overlay's **Page permissions** are too low for that action. The message names the level it has and the one it needs; change it in the Browser Source's properties. - **OBS refused to …** OBS's own check said no, usually because the Page permissions were lowered a moment ago. Check the setting again. - **OBS has no scene called …** The scene was renamed or deleted in OBS. Pick it again in **Scene**. - **OBS did not switch to … within 5 seconds.** OBS was busy, or the overlay page stopped hearing it. Refresh the Browser Source and try again. - **OBS's replay buffer is not running.** OBS says its replay buffer is off, so there is nothing to save. Start it in OBS, or add **Start OBS replay buffer** to a flow that runs first. - **OBS did not save a replay within 5 seconds.** The replay buffer stopped a moment ago, or OBS was busy. Check the replay buffer is running and try again. - **OBS is still busy with another scene switch (or replay) …** Another flow's **Switch OBS scene** (or **Save OBS replay**) of the same kind, yours or your viewers', was still waiting for OBS. Try again in a moment, or space out what starts them. - **This version of OBS cannot …** Your OBS is older than that action. Update OBS. - **Viewers can start this flow …** See [Who can start or stop your stream](https://bloopbot.com/docs/control-obs-from-flows#viewers). - **Bloopbot could not note that a viewer's flow took this step …** A flow viewers can set off tried a step that sets off another trigger (an OBS step, a new title, an ad, Shield mode, a VIP or moderator change), and Bloopbot could not record that it was theirs, so it skipped the step rather than let a flow of yours act on it. Try again in a moment. --- # Author a custom graphic in Studio Write HTML, CSS and TypeScript or JavaScript beside a live preview, connect channel data, and share your design in a pack. Updated 22 October 2026 ## Before you start Write a custom widget when you want your own layout, animation or canvas drawing inside an overlay. It is kept on your **Widgets** page and can go on any overlay ([Reuse your widgets in every overlay](https://bloopbot.com/docs/your-widgets)). You need an overlay open in Studio and some HTML, CSS or JavaScript knowledge, or a [connected AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant) to help write the source. Your graphic can fill the overlay or sit beside built-in layers. Upload any pictures, sounds or videos to your [media library](https://bloopbot.com/docs/choose-and-upload-media) first. Declare any channel variables you want to display on **Variables**. This guide uses a raid card with a colour setting; it needs no media or variables. ## 1. Open code beside the preview 1. Open **Overlays**, then **Open in Studio** on your overlay. 2. Choose **Add**, then press **New widget** at the foot of **Add**. It is separate from the categories and stays visible when you search. Studio places your new widget as a layer called **Custom widget**. 3. Select its layer and press **Edit widget code** in the **Widget** section. 4. Use the **HTML**, **CSS** and **TypeScript** tabs to change the card (a graphic made before TypeScript shows **JavaScript**; see [Write TypeScript](https://bloopbot.com/docs/author-custom-graphics#typescript)). The preview sits beside the code on wide screens and below it on narrow screens. Drag the divider to resize either side. Hide either pane for more room; the source, preview clock and draft stay active. Choose stacked or side-by-side panes, or show one tab at a time. Use **Find** (Ctrl/⌘ F), **Format** (Alt/Shift/F), font size, line wrapping and full screen from the editor toolbar. Completions, hover types, argument help and problems in your script come from the Bloopbot SDK and the libraries you enable. The starter already has a card, an **Accent colour** setting and a raid animation. For a first edit, change the text inside the HTML card or its padding in CSS. **Auto-run** refreshes the preview after a short pause in typing. Turn it off and choose **Run code** when you prefer to run changes yourself. In a short desktop window, choose **Tabs** under **Code layout** for more room to write. The preview and playback controls fit beside the code; scroll inside the preview for test events and **Console**, or inside a **Data & settings** panel for its lower fields. **Back to Studio** stays at the top. ![Custom graphic code workspace in a short desktop window, with a code tab beside the preview and playback controls.](https://bloopbot.com/docs/screenshots/graphics-short-window.jpg) _The graphic workspace in a 450px-high window, using Tabs with playback beside the code._ Changes save to your Studio draft. They reach every overlay that shows this widget when you publish. **Back to Studio** closes the workspace; Escape does the same. The draft does not reach OBS until you publish. ![Studio’s expanded code workspace with TypeScript on the left, the Script language choice in the toolbar, and a raid card, playback and event simulation on the right.](https://bloopbot.com/docs/screenshots/studio-graphics-code.jpg) _TypeScript beside the graphic preview, with playback, a sample raid and Output._ ## 2. Connect data and expose settings Open **Data & settings** in the workspace. Use the subtabs to switch between **Widget**, **Controls**, **Data**, **Appearance** and **Runtime**. One panel appears at a time; the subtabs stay above it, and unfinished inputs stay when you switch. **Widget** holds the widget’s name, icon and where it appears in Add; those changes apply immediately. The other declarations save to your draft until you publish. **Try your settings** in the Widgets-page preview uses sample values only; each placement keeps its own values. 1. In **Runtime**, under **Libraries**, enable **GSAP**, **PixiJS**, **Three.js** or **Phaser**. Pinned versions are bundled with the graphic and included when its marketplace pack is installed. With GSAP ticked, **GSAP plugins** lists the free plugins: **SplitText**, **CustomEase**, **CustomWiggle**, **CustomBounce**, **MorphSVG**, **Physics2D**, **DrawSVG**, **MotionPath**, **ScrambleText** and **Text**. Tick one and use it by name, for example `new SplitText("#name", { type: "chars" })` to animate a name letter by letter. PixiJS and Three.js have add-ons the same way: **PixiJS add-ons** offers **Filters** (glow, bloom, CRT, glitch, shockwave and more), **Animated GIFs** and **Advanced blend modes**; **Three.js add-ons** offers **Post-processing** (bloom, glitch, film grain), **Loaders** for 3D models you upload and SVG shapes, **Geometries** such as rounded boxes and 3D text, and **Sky, water and light**. Two boxes marked **Bloopbot**, **Theme motion** and **Letter effects**, are covered in [Use your theme's motion and letters](https://bloopbot.com/docs/author-custom-graphics#motion-and-letters). Your graphic only loads what you tick, so OBS downloads nothing it does not use. [Graphics libraries](https://bloopbot.com/developers/graphics-libraries) has a working example for each one. To show a picture from another website, use `bloop.loadImage()` (see [Show images from a website](https://bloopbot.com/docs/author-custom-graphics#remote-images)). Other remote requests stay blocked. 2. In **Appearance**, under **Fonts**, add each font family your text uses, such as `Creepster`, and load it in CSS: a Google Fonts `@import`, or a font file you uploaded (see [3D models and fonts](https://bloopbot.com/docs/author-custom-graphics#models-and-fonts)). The graphic waits until listed fonts load before it handles its first event, so the first alert lays out text in the right font. Measure or split text inside your event handler rather than when the code first runs. It waits at most three seconds; a font that never loads is named in **Output**. 3. In **Data**, under **Events**, tick only the events your code reads. Selecting **follow**, **sub**, **resub**, **gift**, **cheer** or **raid** queues or reuses a matching flow. The starter already selects **raid** and reads it with `bloop.onEvent("raid", handler)`. 4. In **Data**, under **Variables**, select declared channel variables. Read their current values with `bloop.getVariables()` or receive updates with `bloop.onVariables(handler)`. 5. In **Appearance**, under **Media**, give a library file a name such as `portrait`. Read its local URL as `bloop.assets.portrait`. 6. In **Controls**, under **Exposed settings**, type a **Setting name**, choose its **Type** and choose **Add setting**. Read it as `bloop.settings.name`. These settings appear in the layer’s settings, so you, and anyone who adds your pack, can change them without editing code. [Build a richer settings form](https://bloopbot.com/docs/author-custom-graphics#controls) explains every type. For example, a number variable named `wins` can fill a score: ``` bloop.onVariables(values => { document.querySelector("#score").textContent = String(values.wins ?? 0); }); ``` Add an element with `id="score"` to HTML and select **wins** under Variables first. Channel variable names use lowercase letters, digits and underscores. A flow can change that variable when a command or event happens; the graphic displays it. ![Studio's Data & settings tab with GSAP ticked, the SplitText plugin ticked under GSAP plugins, and Creepster listed under Fonts, beside the raid card preview.](https://bloopbot.com/docs/screenshots/studio-graphics-bindings.jpg) _Choose the bundled libraries and GSAP plugins in Data & settings → Runtime. Add fonts in Appearance._ Choose **Back to Studio** when you have finished declaring data. In the layer’s settings, **Triggered by flows** sits below **Graphic**. If the starter’s raid says **Needs a flow**, choose **Set up flow**. Publish the queued flow to switch it on. The [Custom graphics API](https://bloopbot.com/developers/graphics) covers every method, the manifest and limits. Source runs in its own sandbox and receives the data you selected. It cannot read the dashboard, cookies or storage. Remote scripts, media, fetch, sockets and nested players are blocked; Google Fonts stylesheets and font files are allowed, and pictures from other websites load through `bloop.loadImage()`. Bind other media through the library. Your Spin wheels, leaderboards, alerts, chat emotes and video players reach a graphic only when you tick them under [Capabilities](https://bloopbot.com/docs/author-custom-graphics#capabilities). ## Give your graphic more to work with A graphic gets only the events, variables and media you tick in **Data & settings**. Anything more is a **capability**: reading the Spin wheels or leaderboards you pick, playing your alerts, showing chat emotes and profile pictures, playing a YouTube video or Twitch clip, or standing in for a built-in such as a countdown. Open the **Data** subtab and tick each one under **Capabilities**. Anyone who adds your graphic from the marketplace sees the list before they add it. This example shows a line such as **12 wins today** that follows a channel variable. It assumes a number variable named `wins` (see [Variables](https://bloopbot.com/docs/variables)). 1. In the code workspace, open **Data & settings** and scroll to **Capabilities**. 2. Under **Read your data**, tick **Fills $(…) text with your variables and channel data**. 3. Under **Exposed settings**, add a **Text** setting named `headline`. Tick **Fills $(…) text with your variables and channel data** on the setting and give it the default `$(var.wins) wins today`. 4. In **HTML**, add `

`. In **TypeScript**, fill it: ``` const headline = document.querySelector("#headline"); const draw = () => { headline.textContent = bloop.template(String(bloop.settings.headline)); }; bloop.onVariables(draw); draw(); ``` The preview shows the line with the current value of `wins`. Once you publish, the line changes in OBS whenever a flow changes `wins`, and anyone using your graphic can rewrite the line in its layer controls, using any `$(var.…)` they like. A variable the line names but your channel lacks shows as nothing. ![Studio's Data & settings tab scrolled to Capabilities, with Fills $(…) text with your variables and channel data ticked, beside the graphic's preview.](https://bloopbot.com/docs/screenshots/studio-graphics-capabilities.jpg) _Studio's Capabilities list with Fills $(…) text ticked._ The list has four groups: - **Read your data**: the alert designs, Spin wheels, giveaways and leaderboards your **Record** settings pick, and `$(…)` text. Adding a **Record** setting ticks the one it needs for you. - **Show and play**: your alerts and the media your flows play, as an alert or Media layer would; chat emotes, badges and Twitch or Kick profile pictures; YouTube videos and Twitch clips. - **Stand in for a built-in**: the graphic becomes that feature's layer. Tick **Runs as a countdown your flows and Studio start, pause and reset**, and a flow's **Control a countdown** step finds it by the layer's name, as it finds a Countdown layer. A **Button** setting with the **Action name** `countdown.start`, `countdown.pause` or `countdown.reset` then works in the layer's settings like the Countdown panel's buttons. A graphic that ticks **Runs as a slideshow your flows move** can add a **Button** with the **Action name** `slideshow.next`, which moves that layer on one picture, on every OBS source, as a flow's **Control a slideshow** step does. Publish the layer first: the button moves the published layer. A graphic that ticks **Shows your Twitch goal as it fills** is sent your Twitch goal as it begins, moves and ends, and stands in for the Goal bar: Studio lists it under **Goal bar** in the **Add** tab when its **Listed under** is **Automatic**. - **Tell Bloopbot**: when end credits or a minigame scene finish, or what a Media share video did. A graphic that plays YouTube videos or Twitch clips is placed at its own size, without scale, rotation or motion, like the Clip player. The player stays inside the layer and plays at the layer's **Sound volume**. In Studio a box shows where the video will play; the video itself plays in OBS. On the marketplace, a listing's **Graphics can** line names every capability in these words, and the review before you add it repeats them. When an update asks for more, the review says **New in this version** and names what is new. ## Write TypeScript New graphics start in TypeScript. TypeScript is JavaScript with types, so every example in this guide works as written, and you can add types where they help, such as `(event: { name: string })` or `const label: string = "Hi"`. 1. In the workspace toolbar, **Script** shows **TypeScript** or **JavaScript**. The script tab and its editor follow it. 2. Type as usual. Completions, hover types and argument help work in both. A wrong type is marked as a warning: it never stops the preview, a save or **Publish**. 3. A mistake the code can't run with, such as `const total: = 1`, stops the preview. The console under the preview names it with its line, for example _TypeScript: Unexpected "=" TypeScript:3_. Choose it to jump to that line, fix it, and the preview runs again. Studio, OBS and the marketplace run the JavaScript Bloopbot makes from your TypeScript, so the graphic behaves the same everywhere, and errors in the console point at your TypeScript lines. To switch a graphic you made before, choose **TypeScript** under **Script**: your JavaScript already is TypeScript and stays as written. Switching back to **JavaScript** keeps the code too, so remove any types first or the preview reports them. ## Build a richer settings form Every setting you add under **Exposed settings** appears in the layer’s settings, drawn the same way as the built-in layers’ settings. Choose its **Type**: - **Text**, **Colour**, **Number**, **On/off** and **Choice** hold one value. A number can show as a slider with a unit, such as `px`. A choice can show as buttons side by side, and with **Several can be chosen** your code gets a list. Tick **Allows theme colours** on a colour, and whoever uses the graphic can pick the theme's accent, panel or text colour instead of a fixed one; your code then receives `theme:accent`, `theme:panel` or `theme:text`. Tick **Must not be blank** on a text setting when the graphic needs words there, and **Whole numbers only** on a number for counts and sizes. **Shown divided by** lets your code keep a number in its own units while the form shows another: 1000 shows milliseconds as seconds, and 0.01 shows 0 to 1 as a percentage. A choice where several can be chosen can also ask that **At least one must be chosen**. - **Font** offers every Google Font. The graphic loads the one chosen before its first event, so `card.style.fontFamily = bloop.settings.font` just works. - **Gradient** is a colour fade with two to four stops, ready for CSS: `card.style.background = bloop.settings.fill`. - **Media file** picks pictures, sounds, videos or font files from your media library, one or several. Your code gets a local address for each, the way `bloop.assets` does. When you save, Bloopbot checks each file is a kind the setting accepts. For a long list, such as a slideshow, tick **Load on demand**: your code gets each file's id and loads it with `bloop.files.load(id)`, so the setting can hold more than the 32 MB a graphic loads before it starts. - **Record** picks one of your alert designs, wheels, giveaways or leaderboards, and **Variable** one of your variables. Your code gets its id or key. Set **Holds** on a variable setting to offer only number, text or on/off variables. On an alert design or a wheel, tick **Show the alert design editor here** (or **Show the wheel editor here**) and the layer’s settings show an inline design or wheel editor in place of the picker: the design menu, **Preview**, **Plays on**, **Text**, **Media & sound** and **Alert queue settings**, with the design’s **Motion** available in the layer’s **Motion · Layer** section; or the wheel’s name and segments. Edits change the design or wheel itself, everywhere it shows. **Test on stream…** appears when the graphic says it shows your alerts. - **List** repeats a set of settings, such as a platform and a handle for each social. Under **Settings in each item**, add what every item holds; under **Starting items**, add the items it begins with. Your code reads an array: `bloop.settings.socials.forEach(social => ...)`. - **Group** folds settings under a heading. It only changes the layout; read its settings by their own names. - **Button** runs your code when it is pressed. Give it an **Action name**, such as `replay`, and handle it: ``` bloop.onAction("replay", () => { bloop.timeline().fromTo("#card", { y: 40, opacity: 0 }, { y: 0, opacity: 1, duration: .6 }); }); ``` In the layer’s settings, a button plays this graphic in the Studio canvas and on every OBS source showing the overlay. Another graphic with a button of the same name stays still. **Simulate** lists each graphic's buttons too. Publish first, so OBS has the button as well. Open **Show only when** under a setting to hide it until another setting has a value you choose, for example a message that only matters when **At zero** is **Show a message**. Every condition you add must hold. **Presets** are buttons above the settings that fill in several values at once. Change the settings under **Try your settings**, type a **Preset name** and choose **Save current values**. A preset fills in only the values it saved. ![A custom graphic’s declared controls: Sliding preset, Fade or Slide, Clock size, Caption, two editable Social entries and a Replay action.](https://bloopbot.com/docs/screenshots/studio-graphics-controls.jpg) _A graphic's declared controls: a Style choice, the Sliding preset, a Look group, a Socials list with two items and a Replay button._ ![A graphic’s Content panel keeps its inline raid alert design editor: Preview, Test as a raid and Test on stream, the queue reply Playing now on your overlay, Plays on, Title, More message options, Media & sound with Media source, Volume, Layout and Alert queue settings.](https://bloopbot.com/docs/screenshots/studio-graphics-record-editor.jpg) _A graphic's alert design setting showing the design's own editor: the design menu, Preview with Test on stream, Plays on and Text._ ## Play sounds Add the sound file under **Media**, for example as `whoosh`, then play it from your code: ``` bloop.onEvent("raid", () => { bloop.timeline() .from("#card", { y: 40, opacity: 0, duration: .6 }) .call(() => bloop.sound("whoosh", { volume: .8 }), [], .2); }); ``` `bloop.sound` follows the preview: when you move **Preview time** or Studio rebuilds a moment, sounds in that moment stay quiet instead of replaying or stacking, and they play when the preview plays. Each sound's `volume` (0 to 1) is multiplied by the layer's **Sound volume**, which you set in the layer's **Graphic** section in Studio without opening the code. **Sound volume** is there for a sealed graphic too. The Studio canvas starts with sound off; your OBS Browser Source plays it. ## Run alerts one at a time When several events arrive together, `bloop.queue` shows them one after another. Your handler starts one event and returns how long it lasts, in milliseconds or as the timeline it built: ``` bloop.queue(event => { if (event.type === "raid" && !bloop.settings.show_raid) return 0; document.querySelector("#name").textContent = event.name ?? "Raid party"; return bloop.timeline() .fromTo("#card", { y: 40, opacity: 0 }, { y: 0, opacity: 1, duration: .6 }) .to("#card", { opacity: 0, duration: .4 }, "+=4"); }, { gapMs: 500 }); ``` The next event waits for the timeline to finish plus `gapMs`. Up to 50 events wait their turn; pass `max` to change that, or `events: ["raid"]` to queue only some of your declared events. The queue runs on the preview clock, so seeking replays it exactly. ## Draw on a canvas `bloop.canvas()` adds a canvas that matches the layer's real size on screen, so drawings stay sharp in OBS whatever the overlay's scale: ``` bloop.canvas({ draw: ({ context, width, height, timeMs }) => { context.clearRect(0, 0, width, height); context.fillStyle = bloop.settings.accent; context.fillRect(0, height - 20, width * ((timeMs / 3000) % 1), 20); }, }); ``` `draw` runs on every frame of the preview clock and after every resize, so pausing and seeking show the same drawing. Draw in the layer's own units; the canvas handles the pixel density. Pass `context: "webgl"` or `"webgl2"` for WebGL, or `width` and `height` for a fixed size. ## Liquid, glow and glitch effects SVG filters work inside a custom graphic. Put the filter in your HTML and apply it in CSS: ```
…
``` Blur with a colour matrix makes blobs merge like liquid. `feTurbulence` with `feDisplacementMap` makes a wobble or melt, and `feMorphology` or `feComponentTransfer` make glows and glitches. Animate `stdDeviation` or `scale` from a timeline. An `feImage` can only use a file from **Media** or `bloop.loadImage()`, not a web address. ## 3D models and fonts Upload a 3D model as a `.glb` file (up to 8 MB; textures packed inside the file) or a font as a `.woff2`, `.woff`, `.ttf` or `.otf` file, then name it under **Media** in Data & settings, for example `trophy` or `spooky`. To show the model, tick **Three.js** and its **Loaders** add-on, then load it from `bloop.assets`: ``` new GLTFLoader().load(bloop.assets.trophy, (gltf) => scene.add(gltf.scene)); ``` To use the font, point an `@font-face` at it in CSS with `url(asset:spooky)`, and list the family under **Fonts** so the first alert waits for it: ``` @font-face { font-family: "Spooky"; src: url(asset:spooky); } #name { font-family: "Spooky", sans-serif; } ``` Compressed models (Draco or KTX2 textures) and `.gltf` files with separate textures are not accepted; export a plain `.glb` from Blender or your 3D tool. ## Match your overlay's theme A graphic can follow your theme, so it changes with every other layer when you switch themes or restyle the overlay. 1. In the code workspace's **CSS**, use your theme's colours instead of fixed ones: `.card { color: var(--w-text); background: var(--w-panel-fill); border-radius: var(--w-radius); }`. `var(--w-accent)` is the theme's accent colour. 2. For the theme's font, add `font-family: var(--w-font-family);` to the rule. A graphic keeps its own font until you do. 3. Give the pieces you may want to restyle a class that starts with `w-`, such as `class="w-title"`. A rule in the overlay's **Custom CSS** that names it, like `.w-title { text-transform: uppercase; }`, then reaches inside the graphic and wins over the graphic's own rule, as it does for every other layer. 4. Publish ([step 4](https://bloopbot.com/docs/author-custom-graphics#share)). Changing the theme later restyles the graphic in OBS straight away, without restarting it. Custom CSS written for the rest of the overlay, such as a rule for every `img`, does not reach inside a graphic: name one of its `w-` classes instead. ## Let your theme style its parts Your theme can style a graphic's pieces one by one, as it styles a chat name or an alert's title, without any CSS. Say which pieces those are, and they appear in the theme's **Parts**. 1. In the code workspace's **HTML**, give each piece a class that starts with `w-`, such as `

New follower

`. 2. Open **Data & settings** and find **Parts**. Type the class without `w-` under **Part id** (`card`), a name under **Label** (`Card`), and select **Add part**. Add `title` the same way. 3. Tick **Draws a box** on a part with a background, such as `card`: the theme can then give it a fill, border, corners and a picture frame. Tick **Holds text** on a part whose words may move, such as `title`: the theme's **Letters** can then animate it. 4. Choose **Back to Studio**, then open the theme entry below **Layers**. In **Theme · Shared**, open **Parts** and choose **Custom graphic** in **Style the parts of**. Your parts are listed by their labels: open **Card** and pick a fill under **Box**, then use **Back to parts**, open **Title** and pick **Wave** under **Letters**. The canvas shows each change. 5. Publish ([step 4](https://bloopbot.com/docs/author-custom-graphics#share)). The theme keeps one style per part name, so every custom graphic that declares `card` gets the same card look, as every chat box gets the same chat name. To restyle a single graphic, select it and open **Parts · Layer** instead. Part fields identify **Local override**, the named theme source or **Widget default**, with resets for local values. A graphic gets the styles of the parts it declares and nothing else. A graphic can declare up to 24 parts. Studio refuses a part id the theme uses itself, such as `layer`, and says why. ## Use your theme's motion and letters Under **Libraries** you also see boxes marked **Bloopbot**. They are Bloopbot's own code, not a third-party library, and they load only when ticked. Two of them let your graphic move the way the rest of your overlay does. - **Theme motion** plays the entrances and exits your theme chose in its **Motion** section (see [Make chat lines, rows and media move](https://bloopbot.com/docs/widget-themes#motion)) on an element of your graphic. Change the theme and your graphic comes and goes differently, with no code change. A computer set to reduce motion sees a fade of the same length instead. - **Letter effects** animates your own text letter by letter, with the same effects a theme's **Letters** offer: **Wave**, **Wiggle**, **Bounce**, **Pulse**, **Tada**, **Rubber band** and **Jelly** loop, and **Typewriter** types the text in once. To try both: 1. In **Data & settings**, under **Libraries**, tick **Theme motion** and **Letter effects**. 2. In **HTML**, put a name in the starter card, for example `

Waiting for a raid

`. 3. In **TypeScript**, add `bloop.letters('#name', 'wave');` to make the name's letters wave. 4. Add `bloop.playMotion(document.getElementById('name')!, bloop.theme.tokens.motion?.rowIn, 'in', { fallback: 'slide' });` to bring the name in with your theme's event-row entrance. Without one, the graphic slides it in. 5. Choose **Run code** and watch the preview. Switch to another theme to see the entrance change. The expected result is a name that comes in the way your theme's event rows do and then waves letter by letter. Both follow the preview clock, so pausing or seeking the preview holds them in place. Letters stay whole for text in right-to-left or joined scripts, such as Arabic or Hebrew, in any element longer than 200 letters, and for a viewer who asked for reduced motion; screen readers still read the whole text. Each box adds a small file that OBS downloads only for graphics that tick it. For every effect, option and the other Bloopbot libraries, see [Graphics libraries](https://bloopbot.com/developers/graphics-libraries) and the [graphics API](https://bloopbot.com/developers/graphics). ## Show images from a website Use `bloop.loadImage(url)` when the picture depends on what happens on stream, such as a trading card someone just pulled. Bloopbot fetches the image for the graphic and gives back a local address you can use in an ``, in CSS or as a texture: ``` const card = document.querySelector('#card'); bloop.onVariables(async ({ card_image }) => { if (!card_image) return; try { card.src = await bloop.loadImage(card_image); } catch (error) { console.warn(error.message); } }); ``` Here a flow finds the card with a **Web request** step (on Free+ or a paid plan) and a **Read JSON** step, then sets the `card_image` variable to the image link, for example `https://assets.tcgdex.net/en/swsh/swsh3/136/high.png`. Tick that variable under **Variables** so the graphic receives it. The link must start with `https://`. Images can be PNG, JPEG, GIF, WebP or AVIF, up to 8 MB each, and a graphic can load as many different images as it needs. Each image is kept for a day, so showing it again is instant; ask `bloop.loadImage()` again each time you show an image rather than saving an old address for later. SVG files are not accepted. When an image can't be loaded, the promise rejects and the reason appears in **Output**. The website never sees your viewers or your OBS: Bloopbot fetches the image itself. KLIPY selections are delivered directly from KLIPY instead, retaining the provider’s original URL and bypassing this image cache; see [Choose a GIF, sticker or clip](https://bloopbot.com/docs/choose-and-upload-media#klipy). ## Give a message a flow Under **Flow messages**, enter a name such as `celebration` and press **Add message**. Bloopbot queues a **Run → Send to overlay** flow, or reuses a flow already sending that name. Choose **Back to Studio**. **Triggered by flows** in the layer’s settings shows whether it is queued, On, Off or missing, just below **Graphic**. Each selection needs an enabled flow to reach OBS. After publishing, open the linked flow to change its trigger and values. For example, replace Run with Follow to send your named celebration on a follow. ![Triggered by flows in a custom graphic’s main Content panel, with raid and celebration flows queued for Publish.](https://bloopbot.com/docs/screenshots/custom-widget-flows.jpg) _Check the flow behind each selected alert and named message before publishing._ Add an element with `id="viewer"` to your HTML and handle that message: ``` bloop.onEvent("custom", event => { if (event.name !== "celebration") return; document.querySelector("#viewer").textContent = event.data.viewer ?? "Celebration!"; }); ``` In the flow's **Send to overlay** action, leave **Message format** as **Named message**, set **Message name** to `celebration`, and add a **Values** row named `viewer`. Enter the viewer text or insert a value available from your trigger. Named message values are text. Only declared names reach this graphic. Removing a subscription leaves its flow available for other widgets. To send an alert event instead, choose **Follow alert**, **Sub alert**, **Resub alert**, **Gifted subs alert**, **Cheer alert** or **Raid alert** under **Message format**. Choosing a different alert replaces **Values** with the fields for that type. The rows stay editable, and **Undo** restores the previous format and values together. Use the matching trigger so its values are available. | Alert | Prefilled Values | | --- | --- | | Follow | `name` = `$(user)` | | Sub | `name` = `$(user)`, `tier` = `$(tier)` | | Resub | `name` = `$(user)`, `tier` = `$(tier)`, `months` = `$(months)`, `message` = `$(message)` | | Gifted subs | `name` = `$(gifter)`, `amount` = `$(count)`, `tier` = `$(tier)` | | Cheer | `name` = `$(user)`, `amount` = `$(bits)`, `message` = `$(message)` | | Raid | `name` = `$(user)`, `viewers` = `$(viewers)` | ![Send to overlay with Gifted subs alert selected and editable name, amount and tier rows filled from the gift trigger.](https://bloopbot.com/docs/screenshots/overlay-format-values.jpg) _Choosing an alert format fills Values with the viewer and event fields; you can then edit each row._ Opening an existing action keeps your saved values. Choosing **Named message** keeps the current rows and message name; edit or remove the rows to suit your named message. ## Say what a message carries In **Data & settings**, under **Flow messages**, open **Fields it reads** beneath a message and add each value your graphic reads from `event.data`. Type a **Field name**, choose what it **Holds** (**Text**, **Number** or **One of…** with its allowed values, one per line or separated by commas), and add it. Fields are optional: a message without them works as before. For a message called `beanboozled` whose graphic reads `event.data.result` and `event.data.total`, add `result` as **One of…** `safe, boozled` and `total` as **Number**. Once a message declares fields, the flow editor helps whoever builds its flow. On the **Send to overlay** step, **Message name** suggests your message, and choosing it fills in one empty value per field. Short notes under **Values** say what the graphic expects: a value is missing, nothing reads it, it is not one of the allowed values, or it is not a number. The notes are advice: the flow still saves and the message is still delivered. A value with an inserted token, such as the viewer's name, is only checked for being there, because its text is known when the flow runs. Values always reach the graphic as text, so turn `total` into a number with `Number(event.data.total)`. ## 3. Test a chosen moment 1. Under **Simulate an event**, choose **raid**. The sample fields start as `{"name":"Sample raider","viewers":42}`; edit them if you want different values. Once your graphic has [examples](https://bloopbot.com/docs/author-custom-graphics#examples), they come first in this list, under **Your examples**, and the platform's samples follow under **Samples**. 2. Press **Play preview**. Studio sends the selected event as playback starts, plays the animation, then starts the next cycle with that event again. Choose **Send event** to try the event immediately while paused. **Pause preview** stops the shared clock; turn off **Loop and repeat event** for one-shot playback. 3. Move **Preview time** to revisit a moment. The graphic reruns its code and replays the recorded events up to that time. 4. Choose **Reset preview** to clear sample events and start again. **Preview length** in Data & settings sets the time range, up to 60 seconds. 5. For a graphic that has no natural end, such as a clock, a ticker or a looping background, open **Preview length** and choose **No timeline** instead of a length. The preview then plays on with no end: the time beside the controls keeps counting (as minutes and seconds past a minute), nothing pauses or loops it at a set time, and **Preview time** reaches back to a moment the preview has already played: within the first ten minutes, and not before the oldest of the latest 256 events Studio keeps. Press **Pause preview** to stop it and **Play preview** to carry on from where it stopped; **Reset preview** starts again from zero. Playing from zero starts over with the selected event, and there is no loop box, because there is no end to loop at. If you send an event after moving **Preview time** back, the moments after it are dropped, and the time range ends there. Choose **Length** to go back to a preview of a set length, at any point while it plays. The Studio canvas and OBS play your graphic the same way whichever you choose. ![Studio's Data & settings tab at Preview length with No timeline chosen instead of Length, beside the preview, whose time counts up in seconds with no end to the scrubber.](https://bloopbot.com/docs/screenshots/studio-graphics-no-timeline.jpg) _Preview length with No timeline chosen: the time keeps counting and the scrubber has no end of its own._ For a named message, choose **Flow message: celebration**, enter values such as `{"viewer":"PixelPal"}`, then press **Send message**. The workspace and canvas both filter messages by their declared names. A message with [declared fields](https://bloopbot.com/docs/author-custom-graphics#message-fields) shows one box per field instead, already filled with a sample: the first allowed value, `3` for a number, or a viewer name. Allowed values are suggested, but you can type anything, such as `gross` when only `safe` and `boozled` are declared, to see how your graphic copes. **Add value** tries an extra value, and **Edit as JSON** switches to typing the whole message. Each event choice fills **Fields (JSON)** with sample values for that type: a gift has `name`, `amount` and `tier`; a cheer has `name`, `amount` and `message`; a raid has `name` and `viewers`. You can edit the JSON before sending or playing it. Choosing a different event replaces it with that event’s sample. A named message starts with text values such as `{"viewer":"PixelPal"}`. If you remove the selected event from Data & settings, the simulator switches to the first remaining choice and its sample values. The main Studio canvas has the same **Simulate** event and sample-value controls, so you can try declared graphics events without opening the code workspace. Both simulators play in the canvas until you explicitly choose to send a supported test to OBS. ![Studio’s Simulate panel has gift selected and editable name, amount and tier sample JSON ready to send to the custom graphic on the canvas.](https://bloopbot.com/docs/screenshots/studio-graphics-simulation.jpg) _Choosing gift in the Studio canvas Simulate panel fills its editable sample name, amount and tier._ With **raid** selected in the starter graphic, the name should change to _Sample raider_ and the card should animate. These events stay in the preview; they do not trigger Twitch, a flow or an OBS test. **Output** shows script and loading errors. Use `bloop.timeline()` for GSAP animations, `bloop.schedule()` for delays and `bloop.onTick()` for canvas updates. CSS animations also follow the preview clock. Native timers and a library's independent ticker keep their own clock and cannot reproduce a paused or sought preview. For PixiJS, stop its ticker and render from `onTick`. For Three.js, render from `onTick` and dispose the renderer from `onDispose`. Phaser starts its own game loop; stop `game.loop` after boot, then advance `game.step(timeMs, deltaMs)` from `onTick` for repeatable seeking. Set `hideBanner: true` in the Phaser game config to keep its startup banner out of Output. With **No timeline** there is nothing to scrub, so a graphic does not need `bloop.timeline()` or `onTick` for its animations. Native timers, `requestAnimationFrame`, plain GSAP tweens and a library's own ticker, such as PixiJS's or Phaser's, all work, and the preview leaves a library's ticker running. CSS animations and `element.animate()` (Web Animations) still follow the graphic's clock, with or without a timeline: Bloopbot takes them over, so pausing the preview holds them. Three things depend on the graphic's own clock either way: - **A rebuild replays on the graphic clock.** When Studio rebuilds the graphic (you change the code, resize the layer or an OBS source reconnects), work on the graphic clock catches up to where it was, while native timers start again from zero. - **A hidden preview holds its moment; a live overlay keeps its jobs running.** Studio pauses the preview clock while its tab is hidden and resumes from that moment when shown again. On the live overlay, drawing pauses while the source is hidden, but the graphic clock keeps schedules, events and reports running. Native timers and a library's own ticker follow the browser's background limits instead. - **Pause pauses only the graphic clock.** **Pause preview** stops `bloop.timeline()`, `bloop.schedule()`, `onTick`, CSS animations and Web Animations, but not native timers, `requestAnimationFrame` loops or a library's ticker. So an ambient, looping visual can use native timers with No timeline. Anything time-critical, such as a heartbeat, a countdown or a sequence of events, stays on `bloop.schedule()` and `bloop.onTick()`. ## Give it examples and a demo Examples show your graphic doing what it does, with data you chose: a big raid, a gift of fifty subs, a poll halfway through. They travel with your graphic in packs, bundle files and marketplace listings, sealed ones included, so whoever adds it can press **Play example** and see it working before any real event arrives. Examples play only in Studio and in previews: they never reach OBS, Twitch or your flows. 1. In the code workspace, open the **Examples** tab, beside **Data & settings**. 2. Under **Example events**, press **New example**. Give it a **Name**, such as _Huge raid_, and choose what it **Plays**: one of the events or flow messages you declared. 3. Edit **Fields (JSON)**. It starts from the platform's sample of that event, such as `{"name":"Sample raider","viewers":42}`; change it to `{"name":"PixelPal","viewers":500}`. Press **Save example**. Studio checks it against what a real event of that kind carries and says what to fix, such as a negative number of viewers. A flow message's values are text, and a field you declared as a number or a list of values must hold one. 4. If your graphic reads records, add them under **Example records**: choose the kind (an alert design, a wheel, a giveaway, a leaderboard or the song now playing), its id or name as your settings name it, and the JSON your graphic gets from `bloop.records.get`. Without one, the platform's sample answers. 5. Under **Example variable values**, fill in the channel variables your graphic reads, such as a score of `42`. Leave one empty to use the channel's own value. 6. Under **Demo**, press **Add step** for each example to play, in order. Choose its **Example** and how long to **Wait before** it, in seconds. Set **Hold at the end** and tick **Start over at the end** to loop it. A demo lasts up to 60 seconds, and one that starts over lasts at least half a second. 7. Press **Play example**. The preview starts your graphic over with your example records and values, then plays each step at its time, past the preview length if it needs to. Press **Pause** to hold both the next step and the loop; **Play** resumes from that moment. Steps also wait while the preview is loading or the tab is hidden. Press **Stop** to put the graphic back as it was. ![Studio's code workspace on the Examples tab: Small raid and Huge raid examples with their row buttons, Example records and variable values, and a two-step demo (Huge raid 1.5 seconds after Small raid, a 2 second hold, Start over at the end) with Stop, beside the preview showing the huge raid.](https://bloopbot.com/docs/screenshots/studio-graphics-examples.jpg) _The Examples tab: two raid examples and a looping two-step demo playing, with Stop, beside the preview showing the huge raid._ Each example row has buttons to send it to the preview at once, edit, move, or delete it; deleting one also removes its demo steps, and renaming one keeps them. An example for an event you no longer declare stays, marked as not reaching your graphic. Back in Studio, the canvas's **Custom graphics** tools show **Play example** for each graphic that has examples. It plays the demo on the canvas only, even when **Also play on the live overlay in OBS** is ticked. Without demo steps, **Play example** plays the first example of each event. Several graphics can play their examples at the same time: start one, then another, and each **Stop** ends only its own graphic's example. Your marketplace listing's screenshots and video, and an [assistant's previews](https://bloopbot.com/docs/author-custom-graphics#assistant), show your demo too, frozen just after its last step, with your example records and values. When you share the listing you can also [choose which example](https://bloopbot.com/docs/publish-to-the-marketplace#plays) each screenshot and the video shows. Bloopbot's own widgets use the same examples: a code copy of the Poll, Event list, Clip player or Media share player starts with theirs. Examples are shared with your graphic, so never put a key or anything private in them. Bloopbot refuses any text in them that contains `$(secret.…)`, but it can't recognise a key you paste in yourself. If you change a flow message's fields so an example no longer fits them, Studio removes that example (and its demo steps) and says so at the top of the **Examples** tab. An overlay always loads: an example that stopped fitting is left out, never the graphic. ## 4. Publish and share 1. Choose **Back to Studio**, place and size the layer on the canvas, and check the whole overlay. 2. Press **Publish** when you want your existing OBS Browser Source to use the new graphic. Review the queued flows and choose **Create and switch on** for each subscription you want active. A skipped or switched-off flow will not trigger the graphic. For a Run flow, open it and press **Run** to send the message to OBS; **Test fire** stays simulated. 3. To share it, open **Marketplace**, then **Made by you**, and choose **Share…**: tick the widget under **Widgets** to list it on its own ([List a widget on its own](https://bloopbot.com/docs/publish-to-the-marketplace#widgets)), or tick an overlay that shows it, which brings the widget along. To share flows and overlays together, add them to a pack first ([Create packs](https://bloopbot.com/docs/create-packs)). 4. A **Bundle file (.bloop.zip)** of a pack carries the widgets its overlays show, too. A flow-only share link does not carry overlays. A listing or a file carries the widget's code, settings, data declarations, [examples](https://bloopbot.com/docs/author-custom-graphics#examples), icon, where it is listed and bound media. Include the flows that send its messages, trigger its alerts and drive its variables. Whoever adds it gets the widget on their **Widgets** page, their own media references and missing channel variable declarations; a compatible variable they already have keeps its value. An update asks before replacing a widget they changed. Only share source and media you have permission to distribute. Installing a graphic runs its JavaScript with the channel data its manifest selects. Review its source and declarations in Studio before publishing it to OBS. A [sealed graphic](https://bloopbot.com/docs/author-custom-graphics#sealed) has no source to review: you see who made it and what you can change, and the marketplace review has already read its code. ## Sealed graphics A sealed graphic is one whose creator keeps the code private. Other streamers who add it can use it without opening, copying or resharing its HTML, CSS or JavaScript. [Seal one you made](https://bloopbot.com/docs/author-custom-graphics#seal-yours) or [use one you added](https://bloopbot.com/docs/author-custom-graphics#sealed-use). ## Seal one you made 1. Add your overlay to a marketplace listing with **Share…**, as in [Publish to the marketplace](https://bloopbot.com/docs/publish-to-the-marketplace). 2. On the last step, choose **No redistribution**, then tick **Seal source**. The box stays off for any other licence, because a remixable listing has to show its source. 3. Choose **Submit for review**. The reviewer reads your full source before approving, because buyers can't. A listing that copies another creator's sealed code is held for review. Declare an **Accent colour** or any other setting under **Exposed settings** before you share. Those settings are all a buyer can change, so put every choice you want them to have there. Updating your listing later keeps what each buyer already changed. If you remove a setting, the buyer's update review names it before they confirm. ## Use a sealed graphic If you made the listing, [add it again to restore a graphic you deleted](https://bloopbot.com/docs/the-marketplace#restore). Your restored copy includes the approved code: select its name or **Edit** on your **Widgets** page, or select its layer in Studio and choose **Edit widget code**. Edit and publish it as usual. The marketplace version changes only when you submit a new version; other streamers' copies stay sealed. Add another creator's sealed graphic like any other marketplace item. In Studio, selecting its layer shows a locked card instead of **Edit widget code**, and its page on **Widgets** says its code is sealed. ![Studio's locked card for a sealed graphic: the creator's name, the Accent colour setting, flow messages, variables and a preview, with no code.](https://bloopbot.com/docs/screenshots/studio-sealed-graphic.jpg) _Studio's locked card for a sealed graphic: the creator's name, the Accent colour setting, flow messages, variables and a preview, with no code._ 1. Read the line at the top: **Made by** the creator, and that the source is sealed. 2. Change the settings the creator offers, such as **Accent colour**. The preview below updates as you go. 3. Under **Flow messages** and **Variables**, choose the messages and channel variables you want the graphic to react to. 4. Move and resize the layer on the canvas, then **Publish**. Your OBS Browser Source keeps its address. If the creator gave the graphic [examples](https://bloopbot.com/docs/author-custom-graphics#examples), press **Play example** in the canvas's **Custom graphics** tools to see it play them. The card's **Capabilities** list shows what the graphic may do; you can't change it. You can't change the code, fork it, download it, add it to your own pack or share it again. An assistant you have connected can read the graphic and change the same settings, but never the code. Messages in Output refer to the prepared version, so their line numbers won't match anything you can open. What OBS runs is a compressed copy that carries a hidden mark for your channel. Sealing keeps casual copying away; it can't stop someone determined who is willing to dig through what a browser downloads, and a leaked copy can be traced back to the channel it came from. If the creator withdraws the graphic, or your access to it ends, OBS shows nothing in its place and Studio says why. Your settings stay saved. ## Ask an assistant to author it Allow your connected assistant to read and edit overlays. Ask it to discover **graphics**, edit the complete Studio draft and render a preview before publishing. You can give it a concrete brief: ``` Create a custom graphic in Studio: a transparent raid card with an editable accent colour. Use the graphics layer and bundled GSAP. Subscribe only to raid. Render a preview at 500 ms with a sample raid from PixelPal, then leave the source in the draft for me to review. ``` An assistant can supply sample event fields, variable values and a timestamp for a rendered preview, or up to twelve timestamps to see the motion as a strip of frames. Those are simulated values. It can also write your graphic's [examples and demo](https://bloopbot.com/docs/author-custom-graphics#examples), and its previews play the demo, or just one example, or nothing, for each graphic you name. If you change Studio while it works, its old draft revision is refused; ask it to reread the draft. ## If it does not look right - **Blank preview:** read Output, check your element IDs, and choose Run code after fixing the source. An undeclared event or a timeline without GSAP reports an error. - **Your Custom CSS does not change the graphic:** name one of the graphic's own classes that start with `w-` in the rule ([Match your overlay's theme](https://bloopbot.com/docs/author-custom-graphics#theme)). Rules for `img`, `div` or other page-wide selectors stay outside it. - **The preview stops with a TypeScript error:** the console under the preview names the line; choose it to jump there. A type problem is only a warning and never stops the preview, a save or **Publish**. - **The console says compiling took longer than 2 seconds:** very long or deeply nested code can take a long time to compile, so Bloopbot stops it and pauses compiling for your channel for a minute. Simplify that part, then run the code again. Studio also asks you to wait a moment if you run code many times in a minute. - **A variable is missing:** declare it on Variables, select it in Data & settings and use its lowercase key. Viewer variables are unavailable to graphics. - **Media is missing:** choose an existing library file for its binding. Graphics load at most 8 MB per file and 32 MB total; larger files need a smaller version even if the library accepted them. - **Seeking differs from playback:** use the SDK clock methods and stop independent tickers. Preview history keeps the latest 256 events; reset before a fresh test. - **The first alert has the wrong font or spacing:** add the family under **Fonts** and check **Output** for a font that did not load. - **A sound repeats or plays while you scrub:** play it with `bloop.sound` rather than your own audio code. **Sound volume** at 0 silences the graphic. - **Alerts overlap:** hand them to `bloop.queue` and return each one's length. - **A canvas looks blurry:** create it with `bloop.canvas()` so it follows the layer's real size. - **`GlowFilter` or `EffectComposer` is not defined:** tick its add-on under **Libraries**. **Output** names any library that could not load. - **Output's line numbers in OBS look wrong:** OBS runs a compressed copy of your code; check errors in Studio, where line numbers match the editor. - **A save is refused:** the workspace lists the setting field and reason. Repair the label, default, options or value before publishing. - **A live alert or message never appears:** check Triggered by flows, publish the queued flow and make sure it is On. Its message name or alert format must match the graphic’s subscription. - **A sealed graphic is blank:** Studio's card says whether its licence is no longer active on your channel or its version is gone. Add it again from the marketplace, or ask its creator. - **A button does nothing:** your code must call `bloop.onAction("name", handler)` with the button’s **Action name**, and OBS only runs a button once you have published it. - **Output says reading records "is not declared by this graphic":** tick that record kind under [Capabilities](https://bloopbot.com/docs/author-custom-graphics#capabilities), then pick the wheel, giveaway, alert or leaderboard in the **Record** setting. A graphic only reads the records its settings pick. - **A save says a setting needs a capability:** tick the capability the message names, or untick the setting's **Fills $(…) text** box. A **Button** whose **Action name** starts with `countdown.` needs **Runs as a countdown your flows and Studio start, pause and reset**. - **A setting is missing from the layer controls:** check its **Show only when** conditions; a hidden setting keeps its value. - **OBS has the older graphic:** close the workspace and Publish the Studio draft. Keep the existing overlay Browser Source URL. ## Arrange a custom alert If your widget’s alert-design setting shows the design editor, choose **Picture layout → Free**, then **Arrange card**. Drag the **Move card** handle at its top-left, or an empty part of the card’s background, to move it inside the widget, or drag a picture or text part to move that part. The card’s edge handles resize it. You can also set **Card position → X** and **Y** in the panel. Press **Done**, then **Publish** when you are ready to use the layout on stream. The arrangement belongs to the chosen alert design, so other layers showing that design change too. **Undo** restores the previous arrangement. See [Place each part of the card](https://bloopbot.com/docs/alerts#free-layout) for keyboard controls and resizing. A widget you write yourself needs to draw and report the shared alert design using the [custom alert arrangement contract](https://bloopbot.com/developers/graphics#capabilities). On a built-in alert, open **Widget code · Built-in**, then **Edit code** for an example that already does this. Confirm **Edit a copy** to make your own version. --- # Connect your own HTML overlay Create a named custom overlay, choose what it may read, and add its private URL to an OBS Browser Source. Updated 21 October 2026 ## 1. Create an overlay and choose its data For HTML, CSS and JavaScript authored inside Studio and shared in a pack, use a [Custom graphic layer](https://bloopbot.com/docs/author-custom-graphics). Use the separate custom overlay below when you want to draw your own HTML file in OBS. For an overlay designed inside Bloopbot, copy its URL instead (see [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs)). You need access to **Overlays**, OBS on your streaming computer and a file you can save there. 1. Open **Overlays** and expand **External HTML overlays** below your designed overlays. Its **Custom overlays** section holds the named HTML sources you host yourself. 2. Enter a name such as _Starting soon data_ and press **Create overlay**. Each named overlay gets its own private connection. 3. Under **Data access**, select the event types your page needs. Enter any variable names and specific records it may read, one per line, Enter any **Flow message names**, such as `celebration`, then press **Save access**. A new overlay has no access until you choose it. ![The Data access form for a named custom overlay, with celebration selected and matching Follow and message flows queued for Publish.](https://bloopbot.com/docs/screenshots/custom-overlay-panel.jpg) _The Data access form for a named overlay: select event types and enter variable names and specific records._ Selecting **follow** queues or reuses a **Follow → Send to overlay** flow. Named messages queue or reuse a **Run → Send to overlay** flow when you save access. Under **Triggered by flows**, check that every selected alert and message has a flow. Choose **Review and publish flows**, review the whole channel draft (including any Studio edits), and choose **Create and switch on**. After publishing, the link opens the flow so you can change its trigger and values. Off or skipped flows do not send messages. Removing a subscription leaves the flow running for any other widgets that use it. For example, a follower animation needs the **follow** event and its enabled flow. An alert design also needs **stage.alert** and the matching `alert_design:name` record. Use `nowplaying:current` for the current song. The [developer guide](https://bloopbot.com/developers/overlays) lists all event types, record kinds and SDK methods. ## 2. Save the file and connect OBS 1. Press **Download starter HTML**. The file is a transparent example and contains no credential. Save it on the computer that runs OBS; a file on another computer is unavailable to OBS. 2. Enter that file's full path under **Starter file path on your streaming computer** and press **Save path**. For example: `/Users/you/overlays/bloopbot-overlay.html`. 3. Select the copy icon (**Copy OBS URL**). In OBS, add a **Browser Source**, paste the address into its URL field, set it to 1920 × 1080, and leave **Shutdown source when not visible** unticked so the overlay keeps working with OBS while its scene is off screen (see [Let it work with OBS](https://bloopbot.com/docs/custom-widgets#obs-link)). Alerts from your alert queue then play only where OBS shows the overlay, and wait while it is hidden ([alerts in more than one scene](https://bloopbot.com/docs/alerts#several-scenes)). 4. Keep the scene visible. Select the refresh icon (**Refresh status**) on the named overlay. The heading should show a connected source. For alerts, press **Test published output…** on an alert layer after connecting your source. The copied URL is private, although the page does not display it. Anyone who has it can read the data you chose for this overlay, and a page opened with it can also report what OBS is doing and act as your channel's OBS link, which can start your flows. Treat it like a password: keep it out of screenshots, public repositories and shared files. The rotate icon (**Rotate private URL…**) makes the old one stop working, and with it any page using it; paste the new URL into every OBS source that used it. A downloaded starter subscribes to the selected events and message names. Download it again after changing access. For a message, use `overlay.onEvent("custom", handler)` and check `frame.name`; your flow’s Values arrive in `frame.data`. You can edit the HTML to draw your own design, or build with the npm package. The [developer guide](https://bloopbot.com/developers/overlays) includes both ways. Grant each event or record that your code requests. If a request is not granted, the SDK reports it as a diagnostic and continues with the allowed data. ## Let it work with OBS Your own overlay can tell Bloopbot what OBS is doing and switch scenes for your flows, the same way a designed overlay does (see [Control OBS from flows](https://bloopbot.com/docs/control-obs-from-flows)). There is nothing to set up: an overlay page built on Overlay SDK 1.2 or later does it on its own when it runs in an OBS Browser Source. The starter you download now uses 1.3.2. 1. Check the script line in your HTML file. It ends in `overlay-sdk-1.2.0.js` or a later version. An older version never works with OBS this way; change the number, save the file and refresh the source in OBS. 2. To let flows switch scenes or save replays, open the Browser Source's properties in OBS and raise **Page permissions** to the level the [OBS guide's table](https://bloopbot.com/docs/control-obs-from-flows#permissions) gives for that action. 3. For this overlay to keep working with OBS while its scene is off screen, untick **Shutdown source when not visible** on its Browser Source. Or keep a designed Bloopbot overlay open in OBS as well. Once it works with OBS, alerts from your alert queue play only in the copies OBS is showing, as on a designed overlay ([alerts in more than one scene](https://bloopbot.com/docs/alerts#several-scenes)). For example, after step 2 at **Advanced access to OBS**, a flow with **Switch OBS scene** to _BRB_ switches OBS to _BRB_ through this overlay, and a flow that starts on **OBS changed scene** runs when you switch scenes yourself. If several overlays are open in OBS, Bloopbot uses one of them at a time, so nothing runs twice. To keep one overlay out of it, ask whoever made the page (or your AI assistant) to start it with `createOverlay(subscriptions, { obs: false })`. That page then never reports OBS's events and never acts on OBS. **OBS overlay shown/hidden** cannot watch it either. ## Build an overlay from the brief Select a named overlay and select the copy icon (**Copy AI brief**). The brief names that overlay's selected data and leaves out its private URL. 1. Paste the brief into your AI assistant and describe the overlay you want. 2. Save the HTML it gives you on your streaming computer. 3. Enter its full path, save it, then copy the new OBS URL into your Browser Source. 4. Check the scene in OBS. For an alert, choose **Test published output…** on an alert layer and confirm **Play it on stream**. This queues a test on your overlay; it does not send a Twitch event. The flow editor's **Test fire** checks the flow's decisions separately. Its simulation does not send an alert to OBS. The SDK's local simulation also stays on your computer and never opens a live connection. ## Fix missing or duplicate output If nothing appears, make the OBS scene visible, check the saved file path and select the refresh icon (**Refresh status**). A zero count means the source is not connected to this named overlay. If it connects but an event is missing, check both **Data access** and the event names requested by your code. For alerts, grant **stage.alert** and the relevant `alert_design:name` record. If an event never appears, check **Triggered by flows**: publish queued flows and switch Off flows on in the flow editor. Check the Send to overlay message name or alert format matches your subscription. The current starter reconnects automatically after a connection stops receiving traffic. Keep its state handler so your page can show when it is reconnecting; download a fresh starter when updating an older page. If an event appears twice, check for duplicate OBS Browser Sources and multiple enabled flows responding to the same event. Test one source and one event path at a time. After changing access, the source reconnects with the new grants. After rotating the private URL, every OBS source using the old URL needs to be updated. --- # Put a countdown on stream Show a Be right back or Starting soon countdown, or a stopwatch, and start it from the editor or with !brb in chat. Updated 22 October 2026 ## Before you start You need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source; a countdown is one more layer on it. A Countdown layer counts in one of three ways: - **For a length of time** — five minutes of Be right back, say. - **To a time of day** — Starting soon, down to 20:00. - **Count up** — a stopwatch: how long you have been live, or on this boss. The clock runs on Bloopbot, not in OBS. Every overlay that shows a Countdown layer of the same name shows the same time, and refreshing a Browser Source, or closing OBS and opening it again, keeps the time it had. ## 1. Add a Countdown layer 1. Open **Overlays** and open the overlay you use for your break or starting scene, then choose **Add** and drag a **Countdown** tile from **Chat & info** onto the canvas. Or press **Browse templates** on the Overlays page and add **Starting soon** or **Be right back**, which come with a countdown already placed. 2. On an existing overlay, choose **Add** on the left and drag the **Countdown** tile from **Chat & info** onto the canvas, or open it and press **Add** to drop it in the middle. 3. The layer is called **BRB**. Its name is what chat commands and flows use to reach it, so keep it, or give it a name of its own under **Layer name** — **Starting soon**, **Intermission**. Rename a layer while its countdown runs and the layer lets go of it: it shows its idle look under the new name, and the running countdown carries on under the old one until it ends or you reset it. 4. In the layer’s **Settings**, choose what it **Counts**: **For a length of time** with its **Length** in minutes, **To a time of day** with the time it **Counts to**, or **Count up**. 5. Choose what it shows **At zero**: **Show a message** (the **Message** field, such as _Back any second_), **Stay at 0:00**, or **Hide the layer**. 6. Give it a **Heading** if you want one, such as _BE RIGHT BACK_, and set its **Alignment** and **Clock size**. It is drawn in your overlay’s theme, like every other layer. 7. Press **Publish** to put the layer on stream. ![The Countdown layer BRB selected in the overlay editor: the Content tab shows the For a length of time mode, what happens at zero, clock size and Start, Pause and Reset, with BRB running on the canvas.](https://bloopbot.com/docs/screenshots/countdown-layer.jpg) _A Countdown layer called BRB selected in the editor: its Content tab shows what it does at zero, its size and Start, Pause and Reset under On stream._ Until it is started, a layer counting a length of time shows that whole length; the others show 0:00. ## 2. Start, pause and reset it from the editor Select the layer, open **Content**, and use the buttons under **On stream**: 1. The play icon (**Start**) starts the countdown on every overlay that shows a layer with this name. On a paused countdown, it carries on from where it stopped. 2. The pause icon (**Pause**) stops it where it is. A paused countdown stays paused until you start or reset it, even across a restart of OBS. 3. The reset icon (**Reset**) takes it back to how the layer looks before it is started. The line under the buttons says what happened: _BRB is running: 5:00._ These buttons act on stream straight away — there is nothing to publish, and they work on a layer you have not published yet, which then shows the running countdown once you do. ## 3. Start it from chat with !brb The **Mod commands** pack holds **Be right back: !brb**. Open **Flows**, press **Marketplace**, and add that flow on its own — see [Use templates and flow packs](https://bloopbot.com/docs/templates-and-packs#install) — then turn it on. A mod, or you, types `!brb 5` in chat. The Countdown layer called **BRB** starts at five minutes and the bot says _Be right back! Back in 5:00._ `!brb` on its own starts the layer’s own length, and `!brb 10` while it is running starts it again at ten minutes. `!brb` is made for a layer that counts **For a length of time**. A number after it always counts down that many minutes, whatever the layer is set to count; `!brb` on its own starts the layer the way it is set, so on a **Count up** layer the reply reads _Back in 0:00_ — change the reply to suit, or point the command at a layer that counts a length of time. The flow is four steps you can change: the **Chat command** trigger, a check that only mods run it, **Control a countdown**, which names the layer to control and the minutes to use, and the **Chat message** that answers. Point it at another layer by changing its **Countdown layer** field, or copy it for a `!starting` command. If no Countdown layer has that name, the flow says so in chat instead. **Control a countdown** can also **Pause**, **Reset** or **Add time** — a number of minutes, or a negative number to take time off, such as a `!more 2` command that adds two minutes. ## 4. Do something when it ends A flow that starts with the **Countdown ends** trigger runs once when a countdown reaches zero. Leave **Only this countdown** blank to run for any of them, or name one, such as **BRB**. The trigger offers `$(name)`, the countdown that ended. For example, to say you are back: 1. Open **Flows**, press **+ New flow**, and choose the **Countdown ends** trigger. Set **Only this countdown** to _BRB_. 2. Add a **Chat message** step: _We're back — thanks for waiting!_ 3. Save the flow and turn it on. The widgets reach zero on their own clock, exactly on time; the flow follows within a few seconds. A countdown you pause or reset before zero never ends, so the flow does not run for it, and a count-up never ends at all. The flow runs at most once for each time a countdown ends — never twice, even if the moment is handled twice. On a rare hiccup at that exact moment it can be missed, so a countdown that ends on screen without your flow running is not something to fix in the flow. ## Counting to a time of day **To a time of day** counts to the next time the clock reads the time you set — later today, or tomorrow if that time has passed. It uses your channel’s time zone: the one you pick when you add a stream on the **Schedule** page, or, if you have never picked one, the time zone of the browser you first opened your dashboard in. If neither is known, the editor’s **Start** uses the time zone of the computer you press it on, and a flow uses UTC. Once started, a countdown is fixed to that moment: changing a time zone later does not move it. ## Style it with custom CSS A Countdown layer draws a panel, a heading and the clock, which your overlay’s custom CSS can style by these names: | Selector | What it is | | --- | --- | | `.w-countdown` | The layer’s panel. | | `.w-countdown .w-caption` | The heading above the clock. | | `.w-countdown-time` | The clock, or the message at zero. | | `.w-countdown[data-state="running"]` | The panel while it counts. The other states are `idle`, `paused` and `ended`. | For example, `.w-countdown[data-state="paused"] .w-countdown-time { opacity: 0.5; }` dims the clock while it is paused. [Style parts with custom CSS](https://bloopbot.com/docs/arrange-your-overlay#custom-css) shows where to put it. ## What you should see - Before it starts: the layer’s length, such as **5:00**, or **0:00** for the other two ways of counting. - Once started: the clock counting down, or up, on every overlay with a layer of that name, all showing the same time. - At zero: your message, **0:00**, or nothing, as the layer says, and any **Countdown ends** flow running a few seconds later. ![A countdown panel as OBS shows it: a dark rounded panel with the heading BE RIGHT BACK above a large clock reading 1:00.](https://bloopbot.com/docs/screenshots/countdown-overlay.jpg) _The BRB countdown as OBS shows it, just after !brb 1._ ## If something looks wrong - **!brb** answers _No Countdown layer is called "BRB"_: no published overlay has a Countdown layer with that name. Check the layer’s name under **Layer name** and press **Publish**, or change the flow’s **Countdown layer** field to match. - The countdown does not move in OBS: check that the Browser Source uses the overlay’s current URL and its scene is visible. A countdown that was paused stays paused — press **Start**. - Two overlays show different times: they are showing layers with different names. Give them the same name to share one countdown. - The countdown shows the wrong time of day: see [Counting to a time of day](https://bloopbot.com/docs/countdown-timer#clock) for which time zone it uses. - The **Countdown ends** flow did not run: check it is turned on and that **Only this countdown** matches the layer’s name. A countdown paused or reset before zero does not end. - The buttons under **On stream** say countdowns are not available: a Countdown layer may not be available on your channel yet. - A button, or **!brb**, answers _Countdowns are busy or unreachable right now_: nothing changed. Try again in a moment. --- # Show a leaderboard on stream Rank your top loyalty points, cheerers, gifters or a number you keep, with the #1 spot highlighted, and keep it updating live. Updated 22 October 2026 ## Before you start You need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source; a leaderboard is one more layer on it. A Leaderboard layer ranks one of three things: - **Loyalty points** — your all-time [loyalty](https://bloopbot.com/docs/loyalty-and-regulars) leaderboard. - **Cheers & gifts** — bits, gifted subs, or both, for the current stream or across the last 90 days. - **A number you keep** — the top viewers by a per-viewer [variable](https://bloopbot.com/docs/variables) a flow keeps, such as a raid-boss damage counter. It updates on its own as the numbers change — there is nothing to refresh, and no button to press. ## 1. Add a Leaderboard layer 1. Open **Overlays** and open the overlay you want it on, then choose **Add** and drag a **Leaderboard** tile from **Goals & games** onto the canvas: **Top loyalty points**, **Top cheerers** or **Top gifters**. **Be right back**, **Stream ending** and **Subathon** on the Overlays page’s **Browse templates** come with **Top gifters** already placed. 2. On an existing overlay, choose **Add** on the left and drag the **Leaderboard** tile from **Goals & games** onto the canvas, or open it and press **Add** to drop it in the middle. 3. In the layer’s **Settings**, choose what it **Ranks**: **Loyalty points** (your all-time balances, nothing else to set), **Cheers & gifts** (asks what it **Counts** — **Cheers (bits)**, **Gifted subs**, or **Cheers + gifts** — and **Over** which stretch: **This stream** or **All-time (last 90 days)**), or **A number you keep** (asks for the per-viewer **Variable** to rank). 4. If you chose **A number you keep** and have not declared a variable yet, see [Variables](https://bloopbot.com/docs/variables) — it needs to be a number variable with scope **per viewer**, such as a boss-fight damage counter each viewer adds to. 5. Give it a **Heading**, such as _Top Supporters_, choose how many **Rows shown** (3 to 10), and turn **Show avatars** and **Highlight #1** on or off. 6. Press **Publish** to put the layer on stream. ![The Leaderboard layer Top cheerers selected in the overlay editor: its Content tab shows Ranks set to Cheers & gifts, counting Cheers (bits) over This stream, plus heading, rows shown, Show avatars and Highlight #1.](https://bloopbot.com/docs/screenshots/leaderboard-layer.jpg) _A Leaderboard layer selected in the editor: its Content tab ranks Cheers & gifts, counting cheers over this stream._ ## 2. Try it before you go live With the layer selected, open **Simulate** in the top bar and press **Test leaderboard**. It plays a short demo ranking — made-up names, never a real viewer — including a reshuffle, so you can see the **#1** highlight move before anyone is watching. The test plays on the canvas only, unless you tick **Also play on the live overlay in OBS** — then viewers see it too, for about 15 seconds. A few seconds after its last reshuffle your real ranking comes back on its own, so the made-up names never stay on stream. Nothing about the test reaches Twitch or changes any real data. ## Style it with custom CSS A Leaderboard layer draws a panel, a heading and a list of rows. To restyle them without CSS, use **Parts** — each of the names below is a part there, from **Panel** to **Empty message** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)). Your overlay’s custom CSS can style them by these names: | Selector | What it is | | --- | --- | | `.w-leaderboard` | The layer’s panel. | | `.w-leaderboard-title` | The heading. | | `.w-leaderboard-row` | One row. | | `.w-leaderboard-row[data-rank="1"]` | The highlighted #1 row, when **Highlight #1** is on. | | `.w-leaderboard-rank` | A row’s place, such as _#2_. | | `.w-leaderboard-avatar` | A row’s avatar image, when **Show avatars** is on. | | `.w-leaderboard-name` | A row’s name. | | `.w-leaderboard-value` | A row’s number. | | `.w-leaderboard-empty` | The _No one yet_ line, while nobody ranks. | For example, `.w-leaderboard-row[data-rank="1"] { transform: scale(1.05); }` makes the top row stand out a little more, and `.w-leaderboard-empty { visibility: hidden; }` keeps the panel blank instead of saying _No one yet_. [Style parts with custom CSS](https://bloopbot.com/docs/arrange-your-overlay#custom-css) shows where to put it. ## What you should see ![A Top Cheerers leaderboard as OBS shows it: RetroRae highlighted at #1 with 500, then ByteBaron with 300 and QuietMouse with 100, each with a Twitch avatar.](https://bloopbot.com/docs/screenshots/leaderboard-overlay.jpg) _A Top Cheerers leaderboard in OBS, with the #1 row highlighted._ - Your top rows, most first, with the number each one ranks by — below zero too, if a variable can go there. - The **#1** row drawn differently, if **Highlight #1** is on. - An avatar beside each name, if **Show avatars** is on and Twitch or Kick has a picture for that account. - The list updating on its own as cheers, gifts, points or the variable change — no refresh needed. - _No one yet_ under the heading while nobody ranks for what it counts. ## If something looks wrong - The layer says _No one yet_: nobody ranks yet for what it counts — no loyalty points, no cheers or gifts this stream, or nobody has a value for the chosen variable. It fills in as soon as someone does. - **This stream** shows an old ranking after you go live again: it starts over empty at the start of each stream; give it a moment to catch the first cheer or gift. - The made-up names from a test are still showing: they go away on their own a few seconds after the test’s last reshuffle. If they stay, refresh the Browser Source in OBS. - **A number you keep** shows nothing: the variable it names may not exist, or may not be a number variable with scope **per viewer**. Check it under [Variables](https://bloopbot.com/docs/variables). - No avatars show: Twitch or Kick may not have a profile picture for that account, or **Show avatars** is off. - The list looks the same for a while: give it a few seconds — it checks for changes automatically rather than the instant one happens. An **All-time (last 90 days)** board catches up within about half a minute. --- # Add a Twitch emote wall to OBS (7TV, BTTV, FFZ) Show the emotes your Twitch chat sends, 7TV, BTTV and FFZ included, floating, bouncing or bursting across an OBS Browser Source, every one or only the combos, with nothing to install. Updated 12 November 2026 ## The short answer To add a 7TV emote wall to OBS, put an **Emote Wall** layer on a Bloopbot overlay and paste that overlay's URL into an OBS **Browser Source**. The wall shows every emote your Twitch chat sends, moving across your stream: Twitch's own emotes and your channel's 7TV, BTTV and FFZ emotes, animated ones included. Bloopbot looks your channel up on 7TV, BTTV and FFZ by itself, so there is no emote setting to switch on, no file to download and no plugin or desktop app to install. It works the same in OBS on Windows, Mac or Linux, and it is on every plan, Free too. From nothing to emotes on stream: 1. Sign in to Bloopbot with your Twitch account and open **Overlays**. 2. Press **New overlay**, give it a name and press **Create overlay**. The editor opens on its **Add** tab. 3. Drag an **Emote Wall** tile from **Chat & info** onto the canvas: **Floating up**, **Bouncing** or **Combos only**. 4. Press **Publish**. 5. Open **OBS URL** in the editor's top bar and select the copy icon (**Copy OBS URL**). 6. In OBS, add a **Browser Source** to your scene, paste the URL, and set Width to **1920** and Height to **1080**. Send an emote in your chat and it crosses the screen. The rest of this guide covers each setting, combos, testing without going live, and emote rain from a flow. ## Before you start You need your Twitch channel connected to Bloopbot ([Get started](https://bloopbot.com/docs/getting-started)) and OBS, or another streaming app that takes a Browser Source. If you already have an overlay in OBS, an Emote Wall is one more layer on it: start at [step 1](https://bloopbot.com/docs/emote-wall#add). If you do not, [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source in full. An Emote Wall shows the emotes in your chat as they are sent. It never shows the words of a message or who sent it. It works on its own: you do not need a chat box on the same overlay, or anywhere else. ## 1. Add an Emote Wall layer 1. Open **Overlays** and open the overlay you want it on, then choose **Add** and drag an **Emote Wall** tile from **Chat & info** onto the canvas: **Floating up**, **Bouncing** or **Combos only**. 2. On an existing overlay, choose **Add** on the left and drag the **Emote Wall** tile from **Chat & info** onto the canvas, or open it and press **Add** to put it over the whole canvas. Drag its edges to keep emotes to one part of the screen. 3. In the layer’s **Settings**, pick its **Motion**: **Float up** (each emote drifts up from the bottom and fades), **Bounce** (emotes drop in and bounce where they land) or **Burst** (emotes pop up anywhere and fly apart). 4. Set **On screen for** (2 to 30 seconds per emote), **Size** (0.5× to 4×) and **Most on screen at once** (1 to 150). Past that number, the oldest emote makes way for the newest, so a spammed emote never floods the screen. 5. Leave **One of each emote per message** on to show _Kappa Kappa Kappa_ as one Kappa, or turn it off to show all three. 6. Press **Publish** to put the layer on stream. ![The Emote Wall layer selected in the overlay editor: Twitch emotes float up the canvas, and the Content tab shows Float up, On screen for, Size, Most on screen at once, One of each emote per message and Only show combos.](https://bloopbot.com/docs/screenshots/emote-wall-layer.jpg) _An Emote Wall layer selected in the editor, set to Float up in its Content tab on the right._ ## 2. Show only the combos Turn on **Only show combos** to keep the wall quiet until chat gets going. Two more settings appear: 1. **Sent at least** — how many times an emote has to be sent, 2 to 50. 2. **Within** — in how many seconds, 1 to 60. For example, _3 times within 10 seconds_: the first two _PogChamp_s show nothing, the third one appears, and every further _PogChamp_ appears too for as long as chat keeps sending it that fast. Each emote counts on its own, and with **One of each emote per message** on, one message counts once however many times it repeats the emote. ## 3. Try it before you go live With the layer selected, open **Simulate** in the top bar and press **Test emotes**. It sends a few chat messages made only of Twitch's own emotes — _Kappa_, _\<3_, _:D_, _SeemsGood_ and _LUL_ — and with **Only show combos** on, it sends each one enough times, fast enough, to reach your combo. The test plays on the canvas only, unless you tick **Also play on the live overlay in OBS** — then viewers see it too, and a chat box on the same overlay shows the test messages as well. Nothing about the test reaches Twitch chat. ## 4. Rain emotes from a flow A flow can make emotes rain down your Emote Wall whenever you like: on a new sub, a raid, a channel points reward or a chat command. The **Rain emotes** step drops a burst of emotes on the wall, a few at a time, and they move, size and fade the way the layer's own settings say. The quickest start is the **Emote rain on a sub** flow in the **Alerts** pack: 1. Open **Flows**, press **Marketplace**, and search **Alerts**. 2. Install **Emote rain on a sub** (or the whole pack) — see [Use templates and flow packs](https://bloopbot.com/docs/templates-and-packs#install) — and switch it on. If you already use **Alerts**, choose **Review updates** in the pack and select it; your other alerts stay as they are. 3. The next time someone subscribes, 30 emotes rain down every Emote Wall on your overlays. To build your own, for example a `!rain` command your mods can use: 1. Open **Flows**, press **+ New flow**, and choose the **Chat command** trigger. Name the command _rain_, and add a **Who can trigger** check set to moderators if only mods should use it. 2. Add a **Rain emotes** step (under **Overlay**) and fill in its fields, described below. For this command, set **Emotes** to `$(query)`, whatever the mod typed after `!rain`. 3. Save the flow and turn it on. The **Rain emotes** step has three fields: - **Emotes**: the emote names to rain, separated by spaces, such as _Kappa LUL catJAM_. You can use variables here. Leave it empty to rain the emotes in the message that started the flow (the emotes in the chat line, or in a resub message), or, when there is no message, a few Twitch favourites: _Kappa_, _LUL_, _Kreygasm_, _SeemsGood_, _HeyGuys_ and _VoHiYo_. - **How many**: how many emotes fall on each Emote Wall, from 1 to 100. - **Emote Wall layer**: optional. The name of one Emote Wall layer, as it is called in your overlay, when you only want the rain there. Leave it empty to rain on every Emote Wall. With **Emotes** set to `$(query)`, a mod types `!rain LUL catJAM` — or just `!rain Kappa` — and the wall fills with them. The names can be Twitch's own global emotes, your channel's BTTV, FFZ and 7TV emotes, and any Twitch emote in the message that started the flow, including your channel's own sub emotes when a subscriber types them. **Test fire** in the flow editor shows what the step would rain in the **Run log** without putting anything on your overlay. To see the rain itself, send the command in your chat, or use the flow for real, with the overlay open in OBS. What you should see: every open overlay with an Emote Wall layer — in every scene and on every computer — rains the same emotes at the same moment, a few at a time over a second or two. A wall set to **Most on screen at once** keeps to that number, so a large rain on a small setting recycles its oldest emotes as new ones fall. **Only show combos** does not hold a rain back: combos are about chat. An overlay opened after the rain has fallen does not replay it. If a rain does not show: - The **Run log** says _Add an Emote Wall layer to an overlay first._ — the channel has no Emote Wall layer yet, or its overlay was never published. Add one as in [step 1](https://bloopbot.com/docs/emote-wall#add) and press **Publish**. - It says _No Emote Wall layer is called …_ — the **Emote Wall layer** field does not match any layer's name. Check the spelling, or leave the field empty. - It says _None of these are emotes the Emote Wall knows_ — none of the names in **Emotes** is an emote it can show. Emote names are case-sensitive: _kappa_ is not _Kappa_. A Twitch emote that is neither a global emote nor in the message that started the flow cannot be found by name; a BTTV, FFZ or 7TV emote must be in your channel's set or that site's global set. - The run log shows the rain but nothing appears: check the overlay is open as a Browser Source in OBS, and that you pressed **Publish** after adding the Emote Wall layer. ## 7TV, BTTV and FFZ emotes The wall shows your channel's 7TV, BetterTTV (BTTV) and FrankerFaceZ (FFZ) emotes, and each site's global ones, beside Twitch's own. Nothing needs setting up: Bloopbot looks your channel up on all three sites. - Animated emotes play as they fly, from all four sites. - A 7TV overlay emote, the kind that sits on top of another such as a hat or rain, is drawn over the emote before it in the message, the way 7TV shows it in chat. - Viewers do not need the 7TV, BTTV or FFZ browser extensions to see them: the emotes are part of your stream's picture. - An emote you add on 7TV, BTTV or FFZ can take up to about ten minutes to start showing. - An emote shows only when it is in your channel's own set on that site or in its global set, the same as in a [chat box](https://bloopbot.com/docs/chat-box). ## Style it with custom CSS Each flying emote is one part, **Emote**, which you can give a fill, a border or rounded corners under **Parts** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)). Your overlay’s custom CSS can style it by these names: | Selector | What it is | | --- | --- | | `.w-emotewall` | The layer’s box that emotes fly across. | | `.w-emotewall-emote` | One flying emote. | | `.w-emotewall-emote[data-anim="rise"]` | An emote using **Float up**; also `bounce`, `explode`, and `fade` under reduced motion. | | `.w-emotewall-img` | The emote’s picture. | | `.w-emotewall-zw` | A 7TV overlay emote stacked on the one before it. | For example, `.w-emotewall-img { filter: drop-shadow(0 0 8px gold); }` gives every emote a golden glow. [Style parts with custom CSS](https://bloopbot.com/docs/arrange-your-overlay#custom-css) shows where to put it. ## What you should see ![An Emote Wall as OBS shows it: Twitch emotes from chat — Kappa, SeemsGood, :D, a heart and PogChamp — floating up the screen, with no text or names.](https://bloopbot.com/docs/screenshots/emote-wall-overlay.jpg) _Emotes from chat floating up an overlay in OBS._ - Each emote chat sends, moving the way **Motion** says, for as long as **On screen for** says. - Animated emotes playing as they fly. - A 7TV overlay emote (such as a rain or a hat) drawn on top of the emote before it, not on its own. - With **Only show combos** on, nothing until an emote reaches the combo, then that emote each time it is sent. - If your computer asks apps to reduce motion, each emote fades in and out in the middle of the layer instead of moving, and animated emotes hold still. ## What it does not do - It does not show text, names, badges or cheers — only emotes. - A message a moderator deletes, or a user whose messages are cleared, does not pull their emotes back off the wall: they are gone within **On screen for** anyway. Your chat box is where moderation shows. - It does not replay emotes sent before the overlay was opened, or a rain that fell before then. When OBS reloads the Browser Source, the wall starts empty. - A BTTV, FFZ or 7TV emote shows only when it is in your channel's own set or that site's global set, the same as in a chat box. Twitch emotes always show. ## If something looks wrong - Nothing appears when chat sends emotes: check the overlay is open as a Browser Source in OBS and **Publish** was pressed. The wall only listens to chat while it is open somewhere. - Only some emotes appear: **Only show combos** may be on, or **Most on screen at once** may be low for a busy chat. - A 7TV, BTTV or FFZ emote never shows: it is not in your channel's set on that site (on 7TV, check it is in the emote set your channel is using), or you added it in the last ten minutes. See [7TV, BTTV and FFZ emotes](https://bloopbot.com/docs/emote-wall#third-party). - One particular emote never shows: its picture could not be loaded from the site that hosts it. Other emotes keep working. - Emotes fade in the middle instead of moving: your computer is set to reduce motion, and the wall follows it. - Emotes appear in only part of the screen: the layer's box is smaller than the canvas. Select it and drag its edges out. --- # Highlight a chat message on stream Let your mods put one chat message up big on your overlay with !hl, and take it down with !hl off. Updated 29 October 2026 ## Before you start You need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source; a Chat highlight is one more layer on it. A **Chat highlight** layer shows one chat message at a time — the viewer’s badges and name, then their message with its emotes — for a few seconds, and nothing the rest of the time. Your mods choose which message from chat: - **Reply** to a viewer’s message with `!hl` to show that message. - Type `!hl @viewer` to show that viewer’s latest message. - Type `!hl off` to take it down early. The commands come from the **Mod commands** pack, and only moderators (and you) can use them. ## 1. Add a Chat highlight layer 1. Open **Overlays** and open the overlay you want it on, then choose **Add** and drag the **Chat highlight** tile from **Chat & info** onto the canvas. **Chat** and **Alerts & pop-ups** on the Overlays page’s **Browse templates** come with one already placed. 2. On an existing overlay, choose **Add** on the left and drag the **Chat highlight** tile from **Chat & info** onto the canvas, or open it and press **Add** to drop it in the middle. 3. In the layer’s **Settings**, give it a **Title** (the small line above the message, such as _HIGHLIGHTED_; leave it empty for none) and a **Text size**. 4. Choose whether it shows the viewer’s badges (**Show badges**), draws their name in their own Twitch colour (**Name in the viewer’s colour**), and lets animated emotes move (**Animate emotes**). A displayed message from Twitch, Kick or YouTube keeps its platform's mark before the name; there is nothing to set for it. 5. Press **Publish** to put the layer on stream. ![The Chat highlight layer selected in the overlay editor: its Content tab shows Title set to HIGHLIGHTED, Text size, Show badges, Name in the viewer’s colour and Animate emotes.](https://bloopbot.com/docs/screenshots/chat-highlight-layer.jpg) _A Chat highlight layer selected in the editor, with its title, text size and switches under Content → Settings._ Nothing shows on stream until a mod highlights a message: the layer is empty the rest of the time. ## 2. Install the !hl commands 1. Open **Flows**, press **Marketplace**, and search **Mod commands**. 2. Install **Chat highlight: !hl** and **Chat highlight: !hl off** (or the whole pack), and switch both on. If you already use **Mod commands**, choose **Review updates** in the pack and select the two Chat highlight flows. Your other commands stay as they are. Each is one small flow you can open and change: a **Chat command** trigger, a **Who can trigger** check set to moderators, and the **Highlight a chat message** step. In **!hl**, the step’s **Show for (seconds)** is 20 — change it to keep messages up longer or shorter (3 to 600 seconds). If there is nothing to show, the bot answers the mod in chat with the reason, such as _No recent message from bob._ ## 3. Highlight a message 1. In Twitch chat, hover a viewer’s message, choose **Reply**, and send `!hl`. Or type `!hl @viewer` — for example `!hl @pixel_alice` — to show that viewer’s latest message. 2. The message appears on your Chat highlight layer within a second or two, and leaves on its own after the display time. 3. Type `!hl off` to take it down sooner. Highlighting another message replaces the one that is up. ![A Chat highlight as OBS shows it: the title HIGHLIGHTED, the viewer name Pixel\_Alice, and their message “that clutch was unreal” with a Kappa emote.](https://bloopbot.com/docs/screenshots/chat-highlight-overlay.jpg) _A highlighted message as OBS shows it: the viewer’s name, then their message with a Twitch emote._ Every overlay with a Chat highlight layer shows the same message, and refreshing a Browser Source, or opening OBS again, keeps it on screen for the rest of its time. ## Moderation takes it down When a mod deletes the highlighted message in Twitch, times out or bans the viewer who wrote it, or clears chat, the highlight comes down at once. A message that was already deleted is never shown in the first place. ## Try it before you go live With the layer selected, open **Simulate** in the editor’s top bar and press **Test highlight** to see a sample message for eight seconds, or **Test !hl off** to see one taken down. The tests use a made-up viewer and play on the canvas only, unless you tick the box to play them on the live overlay in OBS too. Nothing reaches Twitch. A flow’s **Test fire** is simulated as well: its run log says what it would highlight and changes nothing on your overlay. ## Use it in your own flows **Highlight a chat message** is an ordinary flow step, in the **Overlay** group of the node library. Its **Do** setting either shows a message or takes the highlight down. Which message it shows, in this order: 1. The message the trigger replied to, when a mod replied. 2. Otherwise, the latest message of the viewer named in **Viewer** — `$(1)` is the name typed after the command. 3. Otherwise, on a trigger that carries a message — **Any chat message**, **When chat mentions** — that message. A command’s own message (`!hl` itself) is never shown. For example, a **When chat mentions** flow on the word _clip it_ with **Highlight a chat message** after it puts every “clip it” message up on stream. The step takes its **error** path when there is nothing to show, with the reason in `$(from..message)`. ## Style it with custom CSS Use **Parts** to restyle the layer without CSS — **Panel**, **Title**, **Name** and **Message** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)). Your overlay’s custom CSS can use these names: | Selector | What it is | | --- | --- | | `.w-chathighlight` | The panel. It has `data-state="shown"` while a message is up. | | `.w-chathighlight-title` | The title line. | | `.w-chathighlight-badge` | A badge image. | | `.w-chathighlight-name` | The viewer’s name. | | `.w-chathighlight-message` | The message. | | `.w-chathighlight-emote` | An emote image in the message. | The message slides in when it appears; if your computer is set to reduce motion, it fades in instead. ## If nothing shows - **The bot answers “No recent message from …”.** Bloopbot remembers the last 50 chat messages, for ten minutes, while an overlay with a Chat highlight layer (or a chat box) is open in OBS. Open the overlay first; messages sent while nothing was open cannot be found by name. A reply still works, because the reply itself carries the message. - **The bot answers “Reply to a message with the command, or name a viewer.”** A bare `!hl` has nothing to show: reply to a message, or add a name. - **Nothing happens at all.** Check that both flows are switched on under **Flows**, and that the person typing is a moderator or you. - **Emotes show as words.** An emote whose picture cannot be loaded is shown by its name instead. --- # Make your chat box react to chat Put a chat widget in OBS, then pin, badge or hide a message from a flow as it happens. Updated 31 October 2026 ## Before you start This action draws on a **Chat** layer — the chat box you put in OBS. If you do not have one yet, create an overlay on **Overlays** that starts with **Chat** (or add a Chat layer to one you already have) and paste its URL into an OBS **Browser Source** (1920 × 1080, transparent background), following [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs). When you add **Chat** to an overlay that is already open in OBS, the overlay may refresh once after you publish. This lets its emote images load without refreshing the Browser Source yourself. - A chat box that is actually open. A pin or a badge is only published while a chat widget is connected somewhere; with none, the flow still runs and its run log says **no chat widget is connected**. - The flow editor: add or open a flow under **Flows**. These are canvas nodes, so switch the flow to **Canvas**. - For the command examples below, the bot needs moderator access to your channel: [make your bot a moderator](https://bloopbot.com/docs/getting-started#moderator) by copying the `/mod` command from the **Make your bot a mod** step of Set up your bot or the **Not a mod** bar and sending it in your Twitch chat. The pin and the badge themselves need no Twitch permission. None of this is Twitch moderation. A hide changes your chat box only; what does reach Twitch is covered in the [hide walkthrough](https://bloopbot.com/docs/chat-box#hide) and in [moderation helpers](https://bloopbot.com/docs/moderation). ## Show your chats together If you have [added Kick to your Twitch channel](https://bloopbot.com/docs/bloopbot-on-kick#connect), your chat box shows both chats in one list. YouTube live-chat messages join the same list when your YouTube account is connected in **On stream › Cloud stream** and one of its broadcasts is live with chat enabled. Each line is marked with where it was said: Twitch's, Kick's or YouTube's mark, in front of the viewer's badges and name. Two settings on the Chat layer decide what you see. 1. Open your overlay on **Overlays** and select the **Chat** layer. 2. In its **Settings**, turn **Show platform icons** on or off. On is the default. 3. Set **Show chat from** to **All connected chats**, **Twitch only**, **Kick only** or **YouTube only**. **All connected chats** is the default. 4. Press **Save**. To see it without waiting for chat, open **Simulate**, the arrow beside **Editor preview** in the editor's top bar, and choose **Test YouTube live chat**: it draws sample Twitch, YouTube and Kick lines on the canvas only. This does not connect to YouTube or post a real message. Expected result: with both settings at their defaults, every line has its platform's mark. Turn the icons off and the lines stay without marks. Pick **Kick only** and Twitch's lines no longer appear, and the other way round for **Twitch only**. A change applies to the lines that arrive after you save it; lines already on screen stay until they fade or scroll off. YouTube lines always identify their platform. Twitch and Kick lines get marks when their channel carries another connected chat. A chat box on a Twitch channel with no Kick added, and one on a channel you signed up for with Kick, normally shows no marks because every line there comes from the same place. **YouTube only** hides these unmarked lines too. A pinned or [highlighted](https://bloopbot.com/docs/chat-highlight) message keeps its mark. Bloopbot's own replies in Kick chat appear in the chat box too, and **Hide known bots** hides them, the same as it hides your bot's replies on Twitch. YouTube support here is **receiving live chat**. Video comments after a broadcast, sending replies, YouTube moderation and triggering flows or points from YouTube messages are not included. Recent history can appear when a chat first connects; it does not run commands or effects. A YouTube deletion or ban removes the matching lines without clearing your other platforms. Disconnecting YouTube clears its displayed messages. If YouTube lines are missing, check that the intended YouTube account is connected, its broadcast is actually live, chat is enabled and **Show chat from** includes YouTube. Keep the overlay or app chat open. A newly live broadcast can take about a minute to appear; a quota pause or expired permission can delay it. The canvas simulation checks the look, not the live connection. ## Where the action lives In a flow, open **Canvas**, then **Browse the library** and search — or type “pin”, “badge” or “hide” into **Add a node**. One node does all three: **Pin, badge or hide chat**, in the **Overlay** group, beside **Show alert**, **Play media** and **Alert queue**, because it draws on an overlay rather than post to chat. Add it once, then pick the choice you want in its **Do** setting. | Choice in Do | What it does | | --- | --- | | **Pin a message on the chat box** | Keeps one message on the screen and highlighted until you unpin it | | **Badge a message** | Draws a short text badge beside one message | | **Hide a message from the chat box** | Takes one message off the chat box | Whichever choice you pick, the node takes the flow’s **next** path and does exactly one thing. It has no message-id field: a Twitch message id is not something you can type, and no `$(…)` token resolves to one, so the action targets the message the run itself is about — the next section. Changing the choice later keeps whatever you already filled in. ![The node library with “chat box” typed into the search field: no triggers or conditions match, and the Then… column shows one action, Pin, badge or hide chat.](https://bloopbot.com/docs/screenshots/chat-node-library.jpg) _Searching the library for “chat box” finds the one node: **Pin, badge or hide chat** in the **Then…** column._ ## Which message the action acts on Every choice reads the same rule, in this order: 1. The message the trigger replied to, when it replied to one. A moderator replies to a viewer’s message and runs `!pin`: the pin lands on the viewer’s message, not on the command. 2. Otherwise the message the trigger event itself carries — a keyword, any chat message, or the **moderation-action** trigger. 3. Otherwise the message that woke the run. > **The moderation-action trigger carries no reply** > > A moderation-action event holds the message the filter acted on and no reply information at all, so the first rule above can never apply to it: a filter flow using this action always targets the message the filter is holding. > **Delete the message is a different action** > > Do not swap **Hide a message from the chat box** for **Delete the message**, and expect them to do the same thing. Delete removes a message in Twitch for everyone (the bot must be a moderator); Hide takes it off your chat box only. Their targets differ on a reply-driven run too: Delete removes the moderator’s own command message, while the chat-box action — pinning, badging or hiding — acts on the message it replied to. The two sit next to each other in the library, so pick the one you mean. ## Pin a message a moderator asked for A worked example: a `!pin` command a moderator runs as a reply. 1. Open **Flows**, press **Marketplace**, and add the **Simple command** flow, or open any flow that already has a **Chat command** trigger. A reply drives it either way. 2. Set **Command** to `pin` (**Prefix**, under **More options**, already reads `!`), then switch the flow to **Canvas**. Delete the template’s **Chat message** action if you do not want the bot to answer. 3. Search the node library for **Pin, badge or hide chat** and add it, then set its **Do** field to **Pin a message on the chat box**. Leave **Pin it** on so the node pins; turn it off and the same node unpins instead. 4. Add **Who can trigger** between the trigger and the pin, set its **At least** field to moderators, and connect the passing path to the pin. 5. Press **Save**. 6. Have a moderator reply to a viewer’s message in Twitch chat with `!pin`. Expected result: that viewer’s message stays on the chat box while new messages arrive — a pin survives both the **Messages on screen** limit and a message lifetime — and the widget draws it highlighted in your theme’s accent colour, so it stands out from the messages around it. One chat box keeps at most three pinned messages, so a fourth pin releases the oldest. Run the flow again with **Pin it** off to take the pin away. ![A Chat command trigger connected to the Pin, badge or hide chat action on the flow canvas, beside its inspector: Do is set to Pin a message on the chat box and the Pin it switch is on, reading “Turn this off to take the pin off the message instead.”](https://bloopbot.com/docs/screenshots/chat-pin-node.jpg) _The chat-box action on the canvas with the pin choice in use, and **Pin it** on in the inspector._ > **Test fire is a dry run** > > Test fire records **would pin the message on the chat box** in the run log and changes nothing in OBS or Twitch. Only a real trigger — a moderator actually typing `!pin` — reaches your overlay. ## Badge a message A badge is a short piece of text drawn just before the message. Two common uses: a loyalty rank on every message, and a marker for a viewer’s first message. 1. Add **Pin, badge or hide chat** from the **Overlay** group, then set its **Do** field to **Badge a message**. Run it on a flow that gets chat — a chat-command trigger, **When chat mentions**, or the **Any chat message** trigger. 2. In **Badge**, write what should be shown, for example `Rank $(rank)`. Variables work here exactly as they do in a chat message; the editor’s **Insert…** menu offers loyalty values such as `$(rank)`. 3. Leave **Only the viewer’s first message** off for a badge on every message. 4. Save, then type anything in your own chat to see it. To mark first-time chatters instead, turn **Only the viewer’s first message** on: the badge is drawn only when the message is that viewer’s first in your channel, and nobody else gets one. Expected result: the badge appears beside the message within about a second. It is text — at most 24 characters, never a link and never an image — and badging the same message twice replaces the badge instead of adding a second one. ![The Pin, badge or hide chat action selected on the flow canvas, with Do set to Badge a message, the Badge field reading Rank $(rank), a rank badge on the card’s Badge field, and the Only the viewer’s first message switch off.](https://bloopbot.com/docs/screenshots/chat-badge-node.jpg) _A rank badge: `Rank $(rank)` in the **Badge** field, with the first-message switch below it._ ## Hide a message your flow decided against Set the chat-box action’s **Do** to **Hide a message from the chat box** when your own flow has decided a message should not be on your overlay — an AI moderation step flagged it, a keyword matched, or a rule of yours fired. It takes the message off the chat box at once, and a chat widget that connects later is never handed it. 1. Build the flow that makes the decision. The **AI chat moderation — delete and warn** template is one ready-made choice; a chat command or a keyword trigger is a simpler one. 2. On the branch that means “keep this off the box”, add **Pin, badge or hide chat** from the **Overlay** group and set its **Do** to **Hide a message from the chat box**. 3. There is nothing else to set for a hide — leave the other fields alone — so connect it and press **Save**. 4. Let a real message take that path. Expected result: the message disappears from the chat box immediately. The run log reads **hidden**, or **hidden (no chat widget is connected)** when no widget is open — the removal is recorded either way, so a widget that connects afterwards does not draw the message. > **A hide is not a Twitch delete** > > It changes only what your chat box shows: the message stays in Twitch chat and in every viewer’s own client, and nobody is timed out or banned. If the message should go from Twitch as well, use **Delete the message** (the bot must be a moderator) or the moderation actions in [moderation helpers](https://bloopbot.com/docs/moderation) — and remember Delete targets the message the run holds, not the one a reply answered. ## Check it works On screen, the change lands within about a second. If it does not, start with the flow’s **Run log**; its detail line says exactly what happened: | Run-log detail | What it means | | --- | --- | | `pinned` / `unpinned` | The instruction reached the chat box | | `badged with "Rank 3"` | The instruction reached the chat box | | `hidden` | The removal was recorded and sent to the chat box | | `no chat widget is connected` | No chat box is open anywhere; a pin or a badge was not sent | | `hidden (no chat widget is connected)` | Nothing is open, but the removal was still recorded | | `no message to pin` / `to badge` / `to hide` | The trigger carries no message — a timer, a remote trigger, a reward redemption | | `the label was empty` | The badge’s text expanded to nothing, such as `$(rank)` with no loyalty configured | **Test fire** is simulated: it records **would pin…**, **would badge…** or **would hide…** and never reaches OBS or Twitch. The chat box’s own editor has scripted tests that do reach the canvas: open **Simulate**, the arrow beside **Editor preview** in the editor’s top bar, and use **Test a pin**, **Test a badge** and **Test a hide**. Each draws a sample message and then the instruction that acts on it, with the option to send the same sequence to OBS so you can confirm the connected Browser Source picks it up. ![The Simulate popover open over a chat overlay’s canvas: Test events offers Test chat, Test a delete, Test a clear, Test a pin, Test a badge and Test a hide, with the “Also play on the live overlay in OBS — viewers will see it” box unticked, then Sample values with Send to OBS…; below it the canvas draws two sample messages, one badged, with the chat layer selected.](https://bloopbot.com/docs/screenshots/chat-widget-tests.jpg) _Simulate on a chat box. **Test a pin**, **Test a badge** and **Test a hide** each draw a sample message and then act on it; leave the OBS box unticked to keep the test on the canvas._ - Nothing changes and the log says **no chat widget is connected**: no chat box is open anywhere. Open the OBS scene with your chat widget, or stop hiding it, and try again — no flow is broken. - The log says **pinned** or **badged** but nothing changes: the only chat widget open may be an [Emote Wall](https://bloopbot.com/docs/emote-wall), which shows chat's emotes but never pins, badges or hides. Open your chat box in OBS too. - A pin or badge draws nothing: the message was already off the screen, pushed out by newer messages or never drawn. The bot cannot see inside your chat box, so there is nothing to act on — raise **Messages on screen** in the chat widget’s settings, or act sooner. - A hide did nothing in Twitch: correct. Hide is your chat box only; use **Delete the message** for Twitch. - Two different results from one chat line: check for another flow listening to the same command or event. - **No marks, or Kick lines missing, in a chat that should show both.** Check the Kick card on **Connections** says **Connected**, that **Show platform icons** is on and that **Show chat from** is **All connected chats**. A change in the Kick connection reaches the chat box within about 15 seconds. ## What these actions do not do - A pin and a badge are screen state. A chat widget that reconnects starts unpinned and unbadged, and the flow sets them again the next time it runs — nothing about them is stored in Bloopbot. - A chat box keeps at most three pins. A fourth releases the oldest, and a pinned message is exempt from **Messages on screen** and from a message lifetime while it is pinned. - The target is always the message a run is about. A trigger with no message in hand — a timer, a remote button you set up, a reward redemption — does nothing and says so in the run log rather than failing. - A hide removes the one message the run holds, not every message from that viewer: there is no per-viewer “hide this person” switch and no undo. - Nothing in this guide reaches Twitch. Pinning, badging and hiding never delete, time out or ban anyone. - These three choices work on a chat box you created in Bloopbot. A chat box you built yourself as an HTML file cannot receive them. ## Keep platform removals in sync Messages deleted successfully by Bloopbot on Twitch or Kick disappear from your chat box too, including its saved scrollback. A timeout or ban clears that viewer's displayed messages. Reloading or reconnecting the Browser Source should not restore removed lines. Twitch moderator deletions and Kick ban or timeout events are followed too. Kick does not send Bloopbot individual-message deletion events, so a message deleted directly in Kick may remain in the overlay. Use Bloopbot's **Delete message** action when that removal must reach both. See [moderation helpers](https://bloopbot.com/docs/moderation#overlay-removals). --- # Play a streamer’s clip when you shout them out Add a Clip player to your overlay, and !so plays one of that streamer’s most-viewed clips on stream after the shoutout. Updated 15 October 2026 ## Before you start You need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source; the Clip player is one more layer on it. The clip comes from Twitch and plays with its sound, so the streamer you shout out needs at least one public clip on Twitch. ## 1. Add a Clip player 1. Open **Overlays**, open the overlay you use in OBS, and choose **Add** at the top of the left panel. 2. Under **Chat & info**, open **Clip player** and choose **Add**. It lands in the middle of the canvas as a dashed card at the player’s size, so you can place and style it before any clip plays. 3. Drag it where you want it. 4. In **Content**, write the **Heading**. `$(name)` becomes the streamer’s name, so _Go check out $(name)!_ reads _Go check out PixelPal!_. Switch **Show heading** or **Show clip title** off if you want only the clip. 5. Set **Player width** anywhere from 400 to 1920 pixels. The height follows at 16:9, and never under 300. 6. Keep the layer’s name, **Clip player**: the shoutout finds the layer by that name to show and hide it. If you rename it, change the name in the flow too ([step 2](https://bloopbot.com/docs/shoutout-clips#install)). 7. Choose **Publish**. ![Studio's Add tab with the Clip player row under Chat & info, beside the canvas showing the Clip player's placeholder card: the heading Go check out PixelPal!, a dashed box at the player's size with a clip icon, and a sample clip title.](https://bloopbot.com/docs/screenshots/shoutout-clips-add.jpg) _The Clip player tile under Chat & info, and its placeholder card on the canvas._ ![A Clip player selected in Studio, with its toolbar under it on the canvas and its settings beside: Show heading, Heading set to Go check out $(name)!, Show clip title, Player width 640 and Scale fixed at 1, with the note that the player keeps its own size.](https://bloopbot.com/docs/screenshots/shoutout-clips-panel.jpg) _A Clip player’s Content tab: the heading, the clip title, Player width, and Scale fixed at 1._ **Scale** shows 1 and can’t be changed, and the layer has no resize or rotate handles: the player keeps its own size, because Twitch stops a clip playing by itself when its player is scaled or covered. Use **Player width** to make it bigger or smaller. The layer’s **Style** and **Parts** still dress the panel round the clip — its background, frame, heading and title — but the player itself can’t be styled. ## 2. Turn on the !so shoutout The Starter pack’s **Shoutout** flow plays the clip. When you or a moderator type `!so pixelpal`, it shouts PixelPal out in chat, sends Twitch’s own shoutout, shows your Clip player, then plays one of PixelPal’s clips on it. When the clip ends, the flow hides the Clip player again. If more shoutouts are waiting their turn, it stays shown until the last of their clips has played. Twitch only takes its own shoutout while you are live, so offline the flow skips it and the **Run log** says so. Viewers can’t use it: the flow checks for moderators and you first. [Add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns) shows how to change who can. [The Twitch shoutout command](https://bloopbot.com/docs/twitch-shoutout-command) covers `/shoutout`, its limits and shouting out raiders automatically. **If you don’t have Shoutout yet:** 1. Open **Flows**, press **Marketplace**, and add **Shoutout** on its own (it is in the **Starter** pack). It arrives paused. 2. Switch it on. **If you added Shoutout before 7 October 2026**, the **Starter** pack shows **Update ready** under **Marketplace → Installed**: 1. Open **Marketplace**, then **Installed**, and open **Starter**. 2. If you haven’t changed your **Shoutout**, choose **Update**: it gets the clip and the show and hide steps in place, and stays on or off as it was. 3. If you have changed it, the row asks “Keep your version?”. **Use the new one** replaces it with the new Shoutout and keeps your version in the flow’s **History**. **Keep mine** leaves it exactly as it is; to add the steps to it yourself, see [Use the step in your own flow](https://bloopbot.com/docs/shoutout-clips#your-own-flow). [Update what you added](https://bloopbot.com/docs/the-marketplace#update) explains updates in full. Without a Clip player on your overlay, `!so` works as it always has: the shoutouts go out and no clip shows. ![The Starter pack’s Shoutout flow on the flow canvas: the !so command, a Who can trigger check set to moderators and up, Shout out a streamer, Show a layer for Clip player with its next and error both leading to Play a shoutout clip, then from Played and No clip a second Show a layer for Clip player, with dashed data wires from the trigger’s Who typed it and Word 1 into Shout out a streamer’s fields and Word 1 into Play a shoutout clip’s Whose clip, and one from the clip step’s Busy for to its Hide again after.](https://bloopbot.com/docs/screenshots/shoutout-clips-flow.jpg) _Starter’s Shoutout: the !so command, the moderator check, Shout out a streamer, Show a layer for Clip player, Play a shoutout clip, then Show a layer again with Hide again after wired to how long the Clip player is busy._ **Your Clip player can stay hidden in the editor.** Press its eye in Studio so the placeholder card is out of your way: the shoutout still shows the layer for each clip and hides it afterwards. After the first `!so`, the layer stays hidden between clips even if its eye is on in Studio. **If your Clip player has another name**, or sits in a group you want shown with it, open **Shoutout** and change **Layer or group** on both **Show a layer** steps to that name. A group’s name shows and hides every layer in it, such as a frame round the player. ## What viewers see Nothing, until a shoutout plays a clip. Then the heading, the clip and its title appear together, the clip plays with its sound, and the layer hides again a moment after the clip ends. Now and then Twitch won’t hand over a clip’s video; that clip plays in Twitch’s own player instead, which Twitch keeps muted. - The clip is picked at random from the streamer’s ten most-viewed clips of the past year, or of all time when they have none from the past year. When they have more than one, the next `!so` for them on your channel plays a different one. - One clip plays at a time. A `!so` while a clip is playing waits its turn, up to three of them; a shoutout past that plays no clip, though the chat shoutout still happens. - Every Clip player on your overlays plays the same clip at the same moment. - An OBS source that you open or refresh while a clip is playing waits for the next one. ## Keep it playing: Twitch’s rules When a clip plays in Twitch’s own player, Twitch only lets it start by itself when the player is plainly visible. Keep it that way: - Leave the layer unscaled and uncovered: no other layer on top of it, and no custom CSS that moves, fades or scales it. - In OBS, leave crop and filters off the overlay’s Browser Source. ## Hear the clip in OBS The clip’s sound is part of the overlay’s Browser Source. For your viewers to hear it, tick **Control audio via OBS** in that Browser Source’s properties. OBS then mixes the source’s sound into your stream and recording. With **Control audio via OBS** ticked, you won’t hear the clip yourself until OBS monitors it: 1. In OBS, open **Advanced Audio Properties** from the Audio Mixer’s gear or three-dot menu (or from **Edit → Advanced Audio Properties**). 2. Find the overlay’s Browser Source in the list and set its **Audio Monitoring** to **Monitor and Output**. Until monitoring is on, OBS sends that sound only to your stream and recording. Your viewers hear it; this only lets you hear it too. With **Control audio via OBS** off, which is OBS’s default, the page’s sound goes to your computer’s own audio output instead. Your viewers only hear it if OBS also captures your Desktop Audio. ## Try it without going live 1. In the overlay editor, open **Simulate** and choose **Play one of my clips**. It picks one of your own clips the same way `!so` picks one. 2. If the canvas isn’t at actual size, Studio asks: “Twitch only starts a clip in a canvas at actual size, as OBS shows it. Show the canvas at actual size while it plays? It goes back afterwards.” Choose **Show actual size and play**. While the clip plays, the canvas is drawn at one screen pixel per overlay pixel whatever your zoom, and scrolled to your Clip player. The Simulate panel closes for the run so nothing covers the player, and a line above the canvas tells you it is playing until the clip is done. Nothing is drawn over the overlay meanwhile. When the clip ends, the canvas goes back to your zoom and where you had scrolled to. Your zoom setting is never changed. Choose **Cancel** to leave the canvas as it is. 3. To play it in OBS too, tick **Also play on the live overlay in OBS** before you choose **Play one of my clips**. Viewers will see it. The canvas is only a preview of where the clip sits; OBS shows the real thing. The canvas plays sound only while its speaker button is on. ## Use the step in your own flow The step is **Play a shoutout clip**. Its one field, **Whose clip**, takes a name or a variable: `$(1)` is the first word after a command, and `$(raiderlogin)` the raiding channel on a **Raid** trigger. A leading `@` is ignored. It leaves by **Played** once the clip is playing or waiting its turn, and by **No clip** when the name isn’t a Twitch account, the streamer has no public clips, Twitch doesn’t answer, or three clips are already waiting. The run log says which. When Twitch refused the clip’s file and it plays muted in Twitch’s own player, the run log says why. Connect a **Chat message** to **No clip** to say so in chat. **Test fire** plays no clip: the run log says whose clip it would have played. Both ways out hand on **Seconds the Clip player is busy** (its card calls it **Busy for**): how long until this clip, and every clip waiting before it, has played. On **No clip** it is how long the clips already playing or waiting have left, and at least 1 second. To show and hide the player the way Starter’s **Shoutout** does: 1. Put a **Show a layer** step for _Clip player_ before **Play a shoutout clip**, with **Hide again after** empty. Connect both its **next** and its **error** to **Play a shoutout clip**, so a clip still plays if no layer has that name. 2. After **Play a shoutout clip**, add a second **Show a layer** step for _Clip player_. Connect both **Played** and **No clip** to it. 3. On the canvas, drag a [data wire](https://bloopbot.com/docs/data-wires) from **Busy for** in **Play a shoutout clip**’s tray to the second step’s **Hide again after**. The field then reads _Busy for, from Play a shoutout clip_; its **×** button takes the wire out so you can type a time again. The first step shows the player before the clip arrives, because a hidden layer isn’t on the page to receive it. The second keeps it shown exactly as long as it has clips to play, then hides it. ## Troubleshooting - **No clip plays, and the run log says they have no public clips.** That streamer has no clips Twitch shows publicly. The chat shoutout still went out. - **In Studio, the clip plays with no sound.** The canvas’s sound starts off. Turn it on with the speaker button beside the zoom, then play the clip again. OBS plays it with sound. - **A clip plays silently.** It played in Twitch’s own player, which Twitch mutes when it starts by itself, because Twitch refused to give that clip’s file or the file wouldn’t play in the browser. When Twitch refused, the run log’s **Play a shoutout clip** line says why. The next shoutout asks Twitch again. - **You hear the clip but viewers don’t.** Your Browser Source has **Control audio via OBS** off, so its sound goes to your computer’s audio output and not into your stream. Tick **Control audio via OBS** in the Browser Source’s properties ([Hear the clip in OBS](https://bloopbot.com/docs/shoutout-clips#sound)), or have OBS capture your Desktop Audio. - **Viewers hear the clip but you don’t.** Your Browser Source has **Control audio via OBS** ticked: set its **Audio Monitoring** to **Monitor and Output** ([Hear the clip in OBS](https://bloopbot.com/docs/shoutout-clips#sound)). - **You added the Clip player while OBS had the overlay open, and it stays empty.** The overlay reloads itself once when it finds a Clip player it wasn’t ready for. If the player is still empty, refresh the overlay’s Browser Source. - **It doesn’t start in OBS.** The clip is playing in Twitch’s own player, and something covers the player or it is scaled: move other layers off it, remove custom CSS that moves or scales it, and leave crop and filters off the Browser Source. - **`!so` shouts them out, but no clip plays and the run log has no Play a shoutout clip step.** Your **Shoutout** is an older version: update **Starter**, or add the step yourself (step 2). - **The clip plays in the run log, but the Clip player never shows in OBS, and Show a layer says no layer or group has that name.** Your Clip player isn’t called _Clip player_, and its eye is off in Studio. Change **Layer or group** on both **Show a layer** steps in **Shoutout** to the layer’s name. - **The Clip player stays hidden although its eye is on in Studio.** The shoutout hid it after its last clip, and Studio’s eye doesn’t undo that. The next `!so` shows it again. To show it now, run a flow with a **Show a layer** step for it ([Show or hide layers from a flow](https://bloopbot.com/docs/arrange-your-overlay#flow-show-hide)). - **Nothing happens when a viewer types !so.** Only moderators and you can use it. - **Simulate says your channel has no public clips yet.** Make a clip of your stream, then try again. --- # Put a Stream Boss on your overlay Let cheers, Power-ups, subscriptions, gifts and raids chip away at a boss; the knockout viewer becomes the next challenger. Updated 22 October 2026 ## Before you start You need an [overlay in OBS](https://bloopbot.com/docs/widgets-in-obs). A Stream Boss is one layer on that overlay. The **Stream Boss** flow pack controls the fight; the layer reads its three [variables](https://bloopbot.com/docs/variables) and draws the result. The layer never awards damage by itself. The pack starts with _The Boss_ at **1,000 / 1,000 HP**. Each bit cheered or spent on a Power-up takes one HP, a new subscription takes 100 HP, a gifted-sub event takes 100 HP, and each raider takes one HP. You can change any damage amount by editing that pack member in **Flows**. ## 1. Install the Stream Boss flows 1. Open **Flows**, press **Marketplace**, and press **Add** on the **Stream Boss** pack. 2. Review the three proposed channel variables — `boss_name`, `boss_hp`, `boss_max_hp` — and confirm the install. Keep their scope as **channel**; the layer reads one shared boss for everyone. 3. On your Flows page, open the pack to see its six members. New members start paused, so switch on the ones you want to run. **Boss: damage from cheers**, **Power-ups**, **subscriptions**, **gifted subs** and **raids** each do one job. **Boss: new challenger** starts with the **Boss defeated** trigger and crowns the viewer whose damage first takes HP to zero or below; keep that member on for the fight to continue. > **Start with your own HP** > > Open **Variables** to change the starting name and HP values before the fight. Set `boss_hp` and `boss_max_hp` to the same positive number. ## 2. Add the Stream Boss layer The pack adds a **Stream Boss** overlay with the layer in the top-right corner. Copy its URL from **Set it up** into OBS, and use the steps below only to change its look or to put the layer on an overlay you already use: 1. Open **Overlays** and the overlay you want to show during the fight. 2. Choose **Add** on the left, then drag **Stream Boss** from **Goals & games** onto the canvas, or open it and press **Add** to place it in the middle. 3. In the layer’s **Settings**, optionally choose a **Portrait image** and a transparent **Boss frame** from your media library. With no portrait image, the circle shows the current boss’s first letter. The chosen portrait image stays in place when the boss changes; change it here whenever you want different art. 4. Choose whether to **Show HP numbers**. The bar itself always shows the remaining fraction. 5. Press **Publish**. The live layer then follows the pack’s variables as viewers take part. ![The Stream Boss layer selected in the overlay editor: the canvas shows PixelPal with a partly filled HP bar, and the Content tab offers a portrait image, a boss frame and Show HP numbers.](https://bloopbot.com/docs/screenshots/stream-boss-layer.jpg) _The Stream Boss layer selected in Studio, with portrait and HP controls in its Content tab beside a sample boss._ The editor’s preview shows your boss as it is now, from your channel’s `boss_name`, `boss_hp` and `boss_max_hp`. Until those variables exist it shows _PixelPal_ at **650 / 1,000 HP**, so you can place the layer even before the first real fight. That sample does not change your variables or reach Twitch. ## 3. Try a knockout During a stream, a 250-bit cheer takes a default boss from 1,000 to 750 HP. Four such cheers take it to zero; the fourth cheerer becomes the new boss. Their HP refills and the maximum grows to 1,100. Later knockouts add another 100 to the maximum each time. The bar flashes briefly when HP falls. The boss name and HP update as the variables change; you do not need to refresh OBS. The pack handles cheers, Power-ups, new subscriptions, gifted-sub events and incoming raids. A gifted-sub event takes 100 HP by default even if several subscriptions were gifted together. ![The published Stream Boss layer after a knockout: PixelPilot's portrait initial appears beside a full HP bar and 1,100 / 1,100 HP.](https://bloopbot.com/docs/screenshots/stream-boss-overlay.jpg) _The published Stream Boss after a knockout, with PixelPilot as the challenger and a full 1,100 HP bar._ ## React to a knockout **Boss defeated** is a trigger in the flow editor’s node library, under **Overlay**. It runs once each time the boss’s HP reaches zero or below: the hit that takes it from above zero, never the hits that land on a boss already down. The pack’s **Boss: new challenger** uses it, and you can start your own flows from it too. Its tokens: - `$(user)` — the viewer who landed the knockout. It is blank when nobody can be named, for example an anonymous gift. - `$(boss)` — the name of the boss that was defeated, before the new challenger takes over. - `$(maxhp)` — that boss’s maximum HP. For example, to celebrate in chat: 1. In **Flows**, create a flow and pick **Boss defeated** as its trigger. 2. Add **Chat message** after it with `$(user) defeated $(boss) and all $(maxhp) HP!` 3. Save and switch the flow on. When a 250-bit cheer from PixelPilot knocks out a 1,000 HP _The Boss_, chat reads _PixelPilot defeated The Boss and all 1000 HP!_ Use **Test fire** in the flow editor to try it on a sample knockout: it is a dry run, so nothing reaches chat or Twitch and no variable changes. Boss defeated needs the pack’s `boss_hp` variable, and only a flow’s damage can land a knockout. Setting `boss_hp` to zero yourself under **Variables** does not run it. ## Style the layer Use **Parts** to style the **Panel**, **Portrait**, **Boss name**, **HP track**, **HP fill** and **HP numbers** separately ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)). Your overlay’s custom CSS can also use `.w-boss-panel`, `.w-boss-portrait`, `.w-boss-name`, `.w-boss-track`, `.w-boss-fill` and `.w-boss-readout`. ## If something looks wrong - The live layer says _No boss yet_: install the **Stream Boss** pack and check that its `boss_name`, `boss_hp` and `boss_max_hp` variables are declared for the channel. - A cheer does not move the bar: check that **Boss: damage from cheers** is on in **Flows**, and that the published overlay is the one you added the layer to. - A **Boss defeated** flow did not run: check it is switched on, and that HP went from above zero to zero or below through a damage flow. A boss already at zero has to be refilled before it can be defeated again. - The new boss says _Anonymous_: the knockout came from an anonymous gift, so there is no viewer name to show. You can set `boss_name` under **Variables** if you want a different name. - The bar stays empty or full: check that `boss_max_hp` is a positive number and `boss_hp` is a number. If you changed their starting values, reset or set the current values too. - The portrait does not change with the name: the portrait file is artwork you picked in the layer’s **Settings**. Leave it empty for an initial that follows the name. --- # Spin a wheel on stream Make a Spin Wheel with your own segments and odds, put it on your overlay, spin it from chat with !spin, and have chat told where it lands. Updated 14 November 2026 ## What you can do A Spin Wheel is a wheel of segments on your overlay — challenges, prizes, the next game — that spins when a flow tells it to. Bloopbot picks where it lands, fairly, and every screen showing the wheel spins the same spin and stops on the same segment at the same moment. When it stops, a flow can say the result in chat or do anything else a flow can do. You make the wheel in the overlay editor, give it as many segments as you like up to 24, and decide how likely each one is. Your moderators spin it by typing `!spin`, or you can spin it from a channel points reward or a Stream Deck key. ## Before you start - You need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) shows how to add one as a Browser Source. - Spinning a wheel comes with every channel's overlays: the **Spin a wheel** step is part of **Hosted overlays** in **Plan & billing**. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) explains the page. ## Get help with your setup Optional **Help me** reuses your saved wheel. Review the segments and weights, its actual spin trigger and its landed response before use. A real spin selects an outcome and can start another flow; it is not required to finish setup. ## 1. Make a wheel 1. Open **Overlays** and open the overlay the wheel should appear on, then choose **Add** and drag the **Wheel** tile from **Goals & games** onto the canvas. 2. In an existing overlay, choose **Add** on the left and drag **Wheel** from **Goals & games** onto the canvas, or open it and press **Add**. 3. Select the Wheel layer. In its settings on the right, press **New wheel**. It starts with six example segments. 4. Rename it under **Wheel name** — flows find a wheel by this name, so something short like `Challenges` works best. 5. Change the segments: each row is a colour, a label and a **weight**. A bigger weight is a bigger slice and a better chance, and the percentage beside each row is its chance of landing there. **Add segment** adds one, and the bin icon (**Remove segment**) removes one. A wheel has 2 to 24 segments. 6. Press **Publish**. Studio saves the wheel and its layer in the draft while you edit; Publish puts both on stream together. ![A Wheel layer selected in the overlay editor: the Challenges wheel on the canvas, and its Content tab on the right with four segments, each showing a colour, label, weight and chance, and Publish guidance.](https://bloopbot.com/docs/screenshots/spin-wheel-panel.jpg) _A Wheel layer selected in Studio: the Challenges wheel on the canvas, and its Content tab with four segments, their weights and each one’s chance._ The canvas shows the wheel as you edit it. To watch it spin, open **Simulate** in the top bar and press **Test spin** under **Test events**. A test spin picks its own segment on the canvas; it runs no flow and nothing is said in chat. > **Draft changes stay in Studio** > > The canvas previews the wheel's new name and segments before Publish. Browser Sources on stream, including ones you open or refresh, and flows that spin the wheel keep the last published record until you press **Publish**. **Discard** restores that published record in Studio. ## 2. Choose how it looks The Wheel layer's panel also has: - **Wheel** — which of your wheels this layer shows. One overlay can hold several Wheel layers, each showing a different wheel. - **Show the wheel’s name** — the name above the wheel. - **Show where it lands under the wheel** — the landed segment's label under the wheel after a spin. - **Keep the result up for** — how long the landed segment stays lit, 0 to 60 seconds. After that the wheel stays where it stopped. Size the wheel by dragging its corners on the canvas, like any layer; [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay) covers placement. The pointer sits at the top and the wheel takes your overlay theme's accent colour for its rim and cap. Press **Publish** to put the layer on stream. ## 3. Spin it from chat The **Mod commands** pack has two flows for the wheel. Open **Flows**, press **Marketplace**, and add **Spin the wheel (!spin)** and **Say where the wheel lands**, each on its own. They arrive paused; switch them on. - **Spin the wheel (!spin)**: a moderator types `!spin` and your wheel spins for 6 seconds. With several wheels, they type the wheel's name after it: `!spin Challenges`. If the wheel is still spinning, chat is told to wait for it to land. - **Say where the wheel lands**: when a wheel stops, chat hears _🎡 The Challenges wheel landed on Hydrate!_ Only one spin runs on a wheel at a time. A `!spin` while it is still turning is refused rather than queued, so a burst of commands spins it once. You can also spin from the dashboard: **On stream** › **Wheels** has a **Spin** button on every wheel. Press it to spin the wheel on your overlay without a flow or a chat command; the same spin shows on every screen, and **Say where the wheel lands** and any **Wheel lands** flow of yours react to it as they do to `!spin`, with whoever pressed the button as the spinner. A wheel that is still turning, or has fewer than two segments, says so instead of spinning. Moderators you have [ticked on Team](https://bloopbot.com/docs/editors#tick) get the **Wheels** page too, with the **Spin** button but no way to change a wheel. ## 4. Build your own spin flows Two steps in the node library do everything the wheel does: - **Spin a wheel** (an action): set **Wheel** to the wheel's name — leave it blank to spin your only wheel — and **Spin for (seconds)**, from 3 to 20. It follows **busy** when the wheel is still spinning, and **error** with the reason in `$(from..message)` when there is no such wheel. - **Wheel lands** (a trigger): runs once when a wheel stops. **Only this wheel** narrows it to one wheel by name. Its tokens are `$(segment)` (the label it landed on), `$(index)` (its number, 1 for the first segment), `$(wheel)` (the wheel's name) and `$(user)` (who spun it, when a viewer did). To let viewers spin it with channel points, make a flow that starts from **On a reward redeemed** and adds **Spin a wheel** — [Reward redemptions](https://bloopbot.com/docs/reward-redemptions) shows how to pick the reward. To spin it from a Stream Deck key, start the flow from a webhook as [Webhooks](https://bloopbot.com/docs/webhooks) describes. A **Wheel lands** flow can do more than talk: put **Set a variable** after it to count how often a challenge came up, or **Show alert** to play an alert for a jackpot segment, with a **Check a value** step that looks at `$(segment)` first. ## A worked example: challenge wheel 1. In your main overlay, add a Wheel layer and make a wheel called `Challenges` with four segments: **Hydrate** (weight 3), **Stretch** (weight 3), **Sing a line** (weight 2) and **Ten push-ups** (weight 1). The panel shows their chances: 33.3%, 33.3%, 22.2% and 11.1%. 2. Press **Publish** to put the wheel and its layer on stream together. 3. Install **Spin the wheel (!spin)** and **Say where the wheel lands** from **Mod commands**, and switch them on. 4. A moderator types `!spin`. The wheel spins on your overlay, slows, and stops on **Sing a line**, which lights up with its label under the wheel. 5. As it stops, chat reads _🎡 The Challenges wheel landed on Sing a line!_ ## What you should see - The wheel on your overlay, at rest, with the segments you published. - On `!spin`, a spin of the length the flow set, landing on one segment, with that segment lit and its label underneath for as long as **Keep the result up for** says. - The same spin on every Browser Source and preview showing the wheel, landing at the same moment — including one you open or refresh halfway through the spin. - One chat line per spin from **Say where the wheel lands**. ![The Challenges wheel on the overlay after a spin: one segment lit under the pointer and its label, Sing a line, under the wheel.](https://bloopbot.com/docs/screenshots/spin-wheel-landed.jpg) _The Challenges wheel after a spin: the segment under the pointer is lit and its label is shown under the wheel._ If your system asks for reduced motion, the wheel does not spin: it moves straight to where it lands and lights that segment. ## Troubleshooting - The layer draws nothing: it has no wheel chosen, or the wheel it showed was deleted. Select the layer and pick a wheel under **Wheel**. - `!spin` says there is no wheel: the name after `!spin` does not match any wheel. Wheel names ignore capitals but must otherwise match. - `!spin` asks which wheel: you have more than one, so name the one you mean after `!spin`. - Nothing happens on `!spin` from a viewer: the built-in command is for moderators and you. [Permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns#permissions) shows how to open it to more people — add a cooldown if you do. - The segments on stream are old: check the Studio preview, then press **Publish**. If you pressed **Discard**, Studio restores the last published wheel. - Studio says a wheel was deleted elsewhere: reload Studio to pick up the current wheel list, then make your edit again. - A spin was refused as still spinning long after it stopped: a spin stays busy until its result has been reported, which takes at most a few seconds after it lands. - To see or tidy all your wheels at once, open **On stream** › **Wheels**. Each wheel lists the overlays that show it — including one whose change is not published yet, marked _(unpublished)_ — with a link into the editor. A wheel no overlay shows can be deleted there with the bin icon (**Delete**); one still on an overlay cannot, so remove its Wheel layer or pick another wheel for it first. ![On stream › Wheels: the Challenges wheel with its segment colours and labels, and Edit in Main linking to the overlay that shows it.](https://bloopbot.com/docs/screenshots/spin-wheels-page.jpg) _On stream › Wheels: each wheel with its segments and a link into the overlay that shows it._ --- # Show a support jar and supporter ticker Let cheers, subscriptions and your own flows fill a jar, and scroll recent supporters and your own lines across your stream. Updated 22 October 2026 ## Before you start You need an [overlay in OBS](https://bloopbot.com/docs/widgets-in-obs). The **Support Jar** and **Supporter ticker** are separate layers, so you can put either one on an overlay or use both together. They show cheers, subscriptions and gifted subscriptions from the current stream. Bloopbot does not count tips in these layers. The jar fills from real supporter events, and your flows can drop more into it: an avatar, an emote, a bit gem or a sub badge. It keeps its pile if you refresh the Browser Source, and starts empty when a new stream begins. The ticker shows the newest supporters and amounts, plus any lines your flows add; after you go offline it keeps the last stream’s supporters until the next one starts. ## 1. Add the Support Jar 1. Open **Overlays** and the overlay you use while streaming. Choose **Add** and drag **Support Jar** from **Goals & games** onto the canvas. For a supporters ticker already in place, add **Just chatting** or **Subathon** from **Browse templates** on the Overlays page. 2. Resize and place the jar. In its settings, under **Settings**, edit its **Heading**, choose **Items in the jar** from 10 to 60, and choose whether to **Show item count**. 3. Press **Publish**. New cheers drop bit gems into the jar. Subscriptions show your channel's starter subscriber badge when Twitch supplies one, or a star when it does not. Gifts show gift icons. Older items leave as the pile reaches your cap. ![The overlay editor with a Support Jar selected, showing the jar on the canvas and its heading, item cap and count controls in the Content tab.](https://bloopbot.com/docs/screenshots/support-jar-layer.jpg) _The Support Jar selected in Studio, with its heading, item cap and count controls in the Content tab._ The items bounce into place as they arrive. If a viewer prefers reduced motion, the items settle without the drop animation. ## 2. Add the supporter ticker 1. On the same overlay or another one, choose **Add** and drag **Supporter ticker** from **Chat & info** onto the canvas. 2. In its settings, set its **Heading** and **Scroll speed**. Turn **Cheerers and bits**, **Subscribers** and **Gifted subs** on or off to choose what crosses the screen. 3. Press **Publish**. A cheer shows the supporter and number of bits; a gift shows how many subs were gifted. The newest events lead the list. ![The overlay editor with a Supporter ticker selected and its speed and supporter type controls visible in the Content tab.](https://bloopbot.com/docs/screenshots/supporter-ticker-layer.jpg) _The Supporter ticker selected in Studio, with scroll speed and supporter types in the Content tab._ The ticker stops scrolling for viewers who prefer reduced motion, keeping the names visible in place. ## 3. Empty the jar mid-stream The **Mod commands** pack includes **Empty the support jar (!emptyjar)**. Add that flow on its own from **Flows → Add** and switch it on. A moderator can then type `!emptyjar` in chat. The jar clears on every overlay and stays empty across a refresh until new cheers or subscriptions arrive. The ticker and [End credits](https://bloopbot.com/docs/arrange-your-overlay#end-credits) keep the supporter history. You can use **Empty support jar** in another flow instead, such as a channel point redemption. The node clears only the jar; it never deletes a contribution or sends a message to Twitch. ## 4. Drop things into the jar with a flow Cheers and subscriptions fill the jar on their own. Use the **Drop into the jar** action when you want something else to add to it, such as channel point redemptions, follows or raids. The quickest start is **Channel points fill the jar** in the **On-screen numbers** pack: every channel point redemption drops the viewer’s avatar into the jar. The pack’s **On-screen numbers** overlay has a **Support Jar** layer ready for it, beside its goal and win tally. **Drop** can add one of these: - **The viewer’s avatar**: the profile picture of the viewer who started the flow. - **An emote from their message**: the first emote in the chat message, cheer message or reward text that started the flow. - **An emote by name**: type it in **Emote name**, for example `Kappa` or `$(1)` for the word after a command. It finds the same Twitch global emotes **Rain emotes** knows by name (such as `Kappa`, `LUL`, `SeemsGood`, `BibleThump` and `<3`), your channel’s 7TV, BTTV and FFZ emotes, and any Twitch emote in the message that started the flow. - **A bit gem** or **A sub badge**: the same items cheers and subscriptions drop. 1. Open **Flows**, press **Marketplace**, and add **Channel points fill the jar** on its own. It arrives paused. 2. Open it. To fill the jar from one reward only, select the **On a reward redeemed** trigger and pick that reward. 3. Select **Drop into the jar** and choose what **Drop** adds. 4. Set **How many**, from 1 to 50, and switch the flow on. For example, a `!hype` command with **An emote by name** set to `SeemsGood` and **How many** set to 5 drops five SeemsGood emotes each time a moderator types it. Expected result: during a stream, the items drop into the jar on every overlay that shows it. They stay through a refresh and leave when the jar is emptied or a new stream starts. The jar keeps the newest 150 items, and each jar layer shows the newest of them up to its **Items in the jar**; when more arrive, the oldest leave first. Dropped items are not supporters, so they never appear in the ticker, a leaderboard or [End credits](https://bloopbot.com/docs/arrange-your-overlay#end-credits). The jar belongs to the stream, so **Drop into the jar** only drops while you are live. The flow’s **Test** button shows what it would drop without touching the real jar. ## 5. Add your own lines to the ticker The **Add to the ticker** action puts a line of your own text in the Supporter ticker, ahead of the supporters: a welcome, a sponsor message or an announcement. **Stays** decides how long a line lasts: - **Once through**: the line crosses the ticker one time on the overlays that are open. A refresh does not bring it back. - **For a number of minutes**: the line stays in the loop for the **Minutes** you choose, from 1 to 120, including after a refresh. 1. In any flow, add **Add to the ticker** after the trigger. 2. Type the **Text**, up to 200 characters. Variables work, for example `Welcome to the stream, $(user)!` after **New follower**. 3. Choose how long it **Stays**, and the **Minutes** if it stays for a number of minutes. 4. To show it on one ticker only, type that layer’s name in **Only this ticker**. Leave it blank for every Supporter ticker. Expected result: the line scrolls on every matching ticker straight away, in front of the supporters, and leaves by itself when its time is up. Lines are not supporters: they never appear in a leaderboard or [End credits](https://bloopbot.com/docs/arrange-your-overlay#end-credits), and the ticker keeps its newest 10 lines at a time. ## 6. Run a flow when the jar empties or fills Two triggers follow the jar itself. Each runs once for each moment, however many overlays show the jar. - **Jar is emptied** runs when the jar empties: a flow such as **Empty the support jar (!emptyjar)** emptied it, or a new stream started. **When** narrows it to one of those. Its tokens are `$(reason)` (`flow` or `stream`) and `$(items)` (how many items it held, 0 for a new stream). - **Jar is full** runs when the jar reaches **Full at (items)**, from 1 to 150. Match the jar layer’s **Items in the jar** to run when the jar looks full. It runs once, and again only after the jar is emptied or a new stream starts. Its token is `$(items)`, the number of items in the jar. For example, a flow with **Jar is full** at 40, then **Chat message** saying `The jar is full! Emptying it for round two`, then **Empty support jar**, turns the jar into a repeating goal. Test either trigger with the flow’s **Test** button. It runs the flow with a made-up moment and does not change the real jar. ## Try the look Select either layer in Studio and open **Simulate**. **Test jar** drops a few made-up items; **Test ticker** shows made-up supporters. These tests draw only on the canvas unless you choose **Also play on the live overlay in OBS**. They do not add supporters, trigger a Twitch event or clear the real jar, and the live view returns automatically after the test. ![A published Support Jar holding a bit gem, the channel's starter subscriber badge and a gift icon from the current stream.](https://bloopbot.com/docs/screenshots/support-jar-overlay.jpg) _A published Support Jar with a bit gem, the channel's starter subscriber badge and a gift icon after simulated stream events._ ![A published supporter ticker showing recent cheers, subscriptions and gifts.](https://bloopbot.com/docs/screenshots/supporter-ticker-overlay.jpg) _A published supporter ticker listing recent cheers, subscriptions and gifted subs._ ## Style the layers Use **Parts** to style the jar, its heading, each item, and its count; or the ticker panel, heading, names and amounts. [Style one part at a time](https://bloopbot.com/docs/widget-themes#parts) explains the controls. Custom CSS can target `.w-jar`, `.w-jar-title`, `.w-jar-item`, `.w-jar-badge`, `.w-jar-count`, `.w-ticker`, `.w-ticker-title`, `.w-ticker-name` and `.w-ticker-amount`. ## If something looks wrong - The jar or ticker stays empty: they count cheers and subscriptions from the current stream. Make sure the overlay was published and is the Browser Source you opened in OBS; the first event after going live fills it. - The jar refills with old items after `!emptyjar`: check that the **Empty the support jar (!emptyjar)** flow is on and the command came from a moderator. A fresh cheer or subscription after the command correctly adds a new item. - A name appears in the ticker but not the jar: the ticker keeps recent history, while the jar can be cleared and caps its pile at the **Items in the jar** number. - A subscription shows a star: Twitch may not supply a channel subscriber badge, or its image may be temporarily unavailable. The star still represents that subscription. - Nothing scrolls: the device may be set to reduce motion; the names remain readable without movement. - **Drop into the jar** takes its error path: the run log says why. The jar only fills while you are live; **The viewer’s avatar** needs a trigger with a viewer, such as a redemption or a command; and a Twitch emote by name, other than the common globals such as `Kappa` and `SeemsGood`, only works when that emote is in the message that started the flow. 7TV, BTTV and FFZ emotes on your channel work by name anywhere. - A dropped item is missing from the ticker or credits: that is expected. Only real cheers and subscriptions are supporters. - A ticker line never appears: check **Only this ticker** matches the layer’s name exactly as it is shown in Studio, or leave it blank. - A **Once through** line did not come back after a refresh: that is expected. Choose **For a number of minutes** for a line that should survive a refresh. - **Jar is full** did not run: it runs only when the jar crosses its number, so a jar already past that number waits until it is emptied. Check that **Full at (items)** is no higher than 150 and the flow is on. --- # Show alerts on stream Put follow, sub, cheer, raid and other alerts on your overlays, make them move, choose what plays each one, test it, play media and control the alert queue live. Updated 22 October 2026 ## Before you start In guided setup, choose **Alerts** and reuse the overlay you want. **Help me** explains only that task; existing external alerts can stay in place. Saving a Studio draft, publishing it and loading its Browser Source are separate steps. On a phone, keep the selected task and resume on your streaming computer. ![Optional Alerts help keeps the selected overlay and explains publishing, Browser Source setup and resuming on a streaming computer](https://bloopbot.com/docs/screenshots/onboarding-output-handoff.jpg) _Keep the same output task while moving from your phone to the streaming computer._ You need an overlay in OBS: [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to a Browser Source, and everything below happens in that overlay’s editor. Alerts come with every channel, and so do the **Show alert**, **Play media** and **Alert queue** steps that drive them. So does a media library for their pictures and sounds: every channel can upload 200 MB, paid plans hold more, and the **Media storage** line under Limits in [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows yours. > **Pebble can build your first alert with you** > > A new channel using [guided setup](https://bloopbot.com/docs/getting-started#guided-setup) chooses its alerts and overlays rather than receiving one automatically. A channel using the earlier setup starts with **My alerts**, an overlay already made and published, and Pebble’s **Set up your bot** tutorial puts it on stream and sends a test with **Test published output…** ([Get started](https://bloopbot.com/docs/getting-started#first-overlay)). Pebble’s **Your first overlay** tutorial walks through steps 1 and 5 of this guide on the real pages: choosing a follower or sub alert, publishing and **Test published output…**. A channel with subscriptions can also start **Add a sub alert** from [Tutorials](https://bloopbot.com/docs/tutorials). Once an alert is on a published overlay, Pebble’s **Give an alert its own sound** tutorial (Tutorials → Give an alert its own sound) walks you through choosing a sound for one alert, the **Sound** field in the alert workspace: choosing the file, hearing it with **Test in editor** and moving **Alert volume**, **Publish** and a **Test published output…** that you check in your streaming app. - An **alert layer** is where one alert draws on an overlay. It shows one **alert design**: the look, text, picture and sound of that alert. - A design belongs to your channel, not to one overlay, so you can place it on as many overlays as you like and change it from any of them. - Every alert, and every file a flow plays, waits its turn in one **alert queue** and plays one at a time, so nothing overlaps or talks over anything else. - A real alert needs its Twitch event — a follow, a raid. Every test in this guide works without going live, and says whether viewers will see it. - Sub, resub, gift sub and cheer alerts need those features available on your Twitch channel and permission for Bloopbot to receive their events. Eligible channels can unlock subscriptions and Bits through monetization onboarding before becoming Affiliate. [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate) explains onboarding, permissions and live checks. Alert previews and tests work without that Twitch status. ## 1. Add an alert to an overlay 1. Open **Overlays** and click the overlay that should show the alert. 2. Choose **Add** on the left of the editor. Choose the **Alerts** filter to show one row per alert type: **Follow alert**, **Sub alert**, **Resub alert**, **Gift sub alert**, **Cheer alert**, **Raid alert**, **Redemption alert** and **Custom alert**. An alert already placed on this overlay is marked with a dot, and its details say **On this overlay**. 3. Drag a layer’s name onto the canvas to drop it where you let go, or press the **Add** icon beside it to add it in the middle. Select its name to open the details. 4. Bloopbot places the design, reusing an existing one when available, then checks what plays it. A matching flow is kept, including one that is paused, customized or conditional. When no matching flow exists, it queues the missing flow; the top bar reads **Publish · 1 flow** while one is waiting. You choose what happens to it when you publish ([What Publish sets up](https://bloopbot.com/docs/alerts#what-publish-sets-up)). 5. Press **Publish**, review the changes, keep **Create and switch on** if a new flow is listed, and press **Publish** in the dialog. The editor says **Published — ready for your Browser Source.** with how many flows it created, and your overlay in OBS has the layer. ![The Add tab’s compact Alerts rows, with Follow alert and Raid alert marked as on this overlay and an Add button beside each alert.](https://bloopbot.com/docs/screenshots/alerts-add-gallery.jpg) _Add → Alerts: compact rows with a direct Add button for each alert type. Follow and Raid are already on this overlay._ To add every alert at once, or the alert flows, open **Overlays** and press **Add alerts**. **Add alerts** opens on the right of your overlays with **Alerts & pop-ups** (every alert type in one slot, with polls and a highlighted message), any alert designs from other streamers, and the alert packs, such as **Alerts** and **Stream events**. Press **Add** on a row, read its review and press its button: an overlay arrives with **Add the OBS source** to do next, and a pack’s flows arrive paused. To put a single alert type on an overlay, drag its name from the editor’s **Add** tab, as above. ![Your overlays with Add alerts docked on the right: Search alerts, the All, Overlays, Alert designs and Packs filters, then Overlays with Alerts & pop-ups, Overlay · Over your game, and Packs with Alerts, Stream events and Cosy Alerts, each with Add.](https://bloopbot.com/docs/screenshots/alerts-add-door.jpg) _Add alerts: Alerts & pop-ups, then the alert packs._ On **Overlays**, an overlay with an alert layer and no flow that puts alerts on screen shows an **Alert flows** row on its card: _No flow puts alerts on this overlay yet._ Press **Add** on it to open the Alerts pack’s review on the right, then press its button to add the flows, paused. The row then offers **Switch on**, and it goes away once an alert flow is on. Adding a type your channel already has a design for reuses that design and checks its flows separately. It can queue missing behavior without making another design; an existing matching flow keeps its graph, conditions and on/off state. If other flows choose the design from a variable, review them before adding another. **Custom alert** makes a new design named `custom-1` (then `custom-2`, and so on) with no flow, for a flow of your own to play with **Show alert**. **Redemption alert** asks for a reward only when no matching flow already supplies its behavior: choose it under **Plays on** (step 4). The same design can sit on several overlays at once — raids big in the middle of your gameplay scene and small in a corner of your chatting scene. The layers share the design; only their place and size on each canvas differ. ## 2. Change how the alert looks Click the alert on the canvas, or its row under **Layers**. Its settings open in one workspace on the right. **Shared alert design** names the channel or theme that owns the design. Message, media, layout and timing change every placement using that design; **View placements** lists the other overlays that place it. Each overlay’s theme decides which version it uses. ![A Follow alert selected in Studio: Shared alert design, Channel design / follow, Message, Picture / GIF / Video, Sound, Test in editor and Test published output visible together.](https://bloopbot.com/docs/screenshots/alerts-layer-panel.jpg) _A Follow alert selected: its shared design, message, media, sound and tests in one workspace._ Start with **Message**, **Picture / GIF / Video** and **Sound**, then **Test in editor** to hear and see your draft. Open the smaller groups only when you need them: - **More alert options · Shared design** below the tests has **Alert volume**, **More message options** and **Media source**. Open **More message options** inside it for **Subtitle** and **Show the viewer’s message**. Message and Subtitle can use `$(name)`, `$(amount)`, `$(months)`, `$(tier)`, `$(message)` and `$(viewers)`. - **Media source**, inside **More alert options · Shared design**, chooses an avatar, library media or no picture. The picture chooser stays available when **Their avatar** is selected; choosing a file switches to library media. - **Layout & timing · Shared design** has **Picture layout**, **Image size**, **Arrange card** and the design’s entrance, exit and word timing. - **Layer appearance · Local** changes this placement’s typography, colours, background, spacing and frame. - **Parts · Layer** styles one piece of this layer’s card at a time. - **Motion · Layer** has this layer’s idle and letter effects. The alert’s entrance and exit stay in **Layout & timing · Shared design**. The design name in the header is a menu. **Show a design** switches this layer to another design; **Duplicate design** makes a separate copy and selects it for this layer. Choose that deliberately before changing a shared design when only this placement should differ. **Rename design…** and **Delete design…** are covered in step 4. A design name is lowercase letters, numbers, `-` or `_`. Your changes save to your draft as you make them. OBS keeps showing the published design until you press **Publish** — see [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay), step 5. ## 2a. Arrange the picture and words **Picture layout** controls where the alert's image, avatar or video sits relative to its words. You can set it even before choosing a picture. 1. Select the alert layer and open **Layout & timing · Shared design**. 2. Set **Picture layout** to **Beside** for the usual side-by-side card, **Above** for a stacked card, or **Text over image** to put the words on top of the picture. **Text over image** adds a shadow behind the words so they stay readable. 3. Set **Image size** from 32 to 512 px. This changes the picture inside the card, not the alert layer's size on the canvas. 4. For a custom arrangement, choose **Manual**. Enter pixel offsets for **Image left/right**, **Image up/down**, **Words left/right** and **Words up/down**. Positive numbers move right or down; negative numbers move left or up. Manual starts from the Beside layout. To place every part of the card yourself, by dragging, choose **Free** instead ([Place each part of the card](https://bloopbot.com/docs/alerts#free-layout)). 5. Watch the canvas preview, then press **Publish** to update OBS. ![Picture layout set to Above and Image size set to 192 pixels in the alert editor.](https://bloopbot.com/docs/screenshots/alerts-layout.jpg) _Picture layout set to Above, with a 192 px image._ For example, a raid alert with a 192 px avatar **Above** its title makes a tall card. If the words cover a face in **Text over image**, switch to **Manual** and move the words to one side. The offsets apply to the design wherever that design appears. ## Place each part of the card **Free** puts the picture, the title, the subtitle and the viewer’s message each where you want them, in a card of the size you choose. 1. Select the alert layer and open **Layout & timing · Shared design**. 2. Set **Picture layout** to **Free**. The canvas switches to **Arrange card** at once, and every part starts where your current layout drew it, so nothing jumps. You can also press **Arrange card** in the panel, or on the canvas toolbar, whenever the layout is already **Free**. 3. The card on the canvas is frozen as viewers see it mid-alert, filled with a sample name, amount and message and your design’s own picture (or the first frame of its video). It does not come in, go out or time out while you arrange it. 4. Click a part to select it, then drag it. It snaps to the card’s edges and centre lines and to the other parts; hold **Alt** while you drag to place it freely. The arrow keys move the selected part 1 px, and **Shift** with an arrow 10 px. 5. Drag a part’s handles to resize it. The title, subtitle and message change width only; the picture changes width and height, and holding **Shift** while you drag a **corner** keeps its shape. From the keyboard, **Alt** with an arrow key resizes the selected part. 6. Drag the **Move card** handle at its top-left, or an empty part of the card’s background, to move the whole card inside the layer. Its parts move with it. With the card selected, arrow keys move it 1 px, or 10 px with **Shift**. Drag its right, bottom or bottom-right handle to scale the whole card: its picture, words, spacing and effects grow or shrink together, keeping their proportions. **Alt** with the arrow keys also scales the selected card. **Card position** in the panel gives you exact **X** and **Y** offsets. 7. To change the space available for the card’s contents, use **Layout size** in the panel: **Layout width** and **Layout height** change its box while keeping the parts at their arranged sizes. For exact part positions and sizes, use the selected part’s **X**, **Y** and **Width** (and **Height** for the picture). A number applies when you press **Enter** or leave the field; **Escape** puts the old number back. 8. Press **Long** in the **Arrange card** bar above the canvas to fill the card with a long name and message, and **Play** to watch the alert come in once with its motion and sound. The card is frozen again afterwards. **Short** returns to the short sample. 9. Press **Done** (in the bar above the canvas or in the panel) or **Esc**, then **Publish** to update OBS. ![Arrange card with the held raid card and its title selected, alongside Card position, Layout size with Layout width and Layout height, and the title’s X, Y and Width fields.](https://bloopbot.com/docs/screenshots/alerts-free-arrange.jpg) _Arrange card with the title selected, and its X, Y and Width in the panel._ Custom widgets that draw an alert design get the same **Free** layout and **Arrange card** controls in their alert-design setting. Moving the card changes that design’s internal layout; the overlay layer stays where it is. If a custom widget shows **Card size** with **Width** and **Height**, its card handles change the box’s size. The widget’s author needs to add whole-card scaling before those handles can scale its contents too. Every change is one step of **Undo**. **Reset to Beside** in the panel starts the parts again from where the **Beside** card puts them. Switching to another layout keeps your arrangement, so choosing **Free** again brings it back. The arrangement belongs to the design, not the layer: every alert layer showing that design changes with it, and the panel names the other layers and overlays that show it. To give one alert an arrangement of its own, make a **Duplicate design** from the design menu first. When a name, subtitle or message is too wide for its box, it shrinks until it fits, down to 60% of its size. If it still does not fit, it stays at 60% and wraps onto more lines, and its box grows downward. The words always sit above the picture, and the theme’s padding does not move parts placed with **Free**. ![The same card with the Long sample: a long name shrunk to fit the title’s box and a long viewer message wrapped onto more lines.](https://bloopbot.com/docs/screenshots/alerts-free-long.jpg) _The Long sample: a long name shrunk to fit the title’s box, and a long message wrapped._ ## 2b. Make it move Open **Layout & timing · Shared design** in the alert’s panel to decide how the card arrives, how it leaves and when its words appear. An alert you made before keeps the motion it had until you change it. 1. Under **Coming in**, point at a tile to watch it play, then click the one you want: **Fade**, **Slide**, **Zoom**, **Bounce**, **Flip**, **Rotate**, **Roll**, **Light speed**, **Back**, **Blur**, **Drop**, **Pop**, **Wipe** or **None**. 2. Set how it plays underneath. **Direction** (up, down, left or right) appears for the effects that travel — a slide, a bounce, a wipe. **Duration** runs from 0.1 to 3 seconds. **Easing** is **Smooth**, **Snappy**, **Bouncy** or **Linear**. 3. Do the same under **Going out**. 4. Under **Words**, pick how the title and message come in on their own — or leave **With the card** — and set a **Text delay**: how long after the card is in before the words appear. 5. Check the bar above the tiles. It shows the alert’s time **On screen** as **In**, **Hold** and **Out**, with a mark where the words come in. 6. Press **Test in editor** to watch it on the canvas, then **Publish**. ![Layout & timing · Shared design in the alert inspector: Picture layout Beside and Image size 128 pixels above On screen 6 seconds, an In 1.5 s / Hold 3 s / Out 1.5 s bar with words at 2 s, and Coming in set to Bounce, direction down, duration 1.5 s and Smooth easing.](https://bloopbot.com/docs/screenshots/alerts-motion.jpg) _Layout & timing: On screen for 6 s, Bounce in over 1.5 s, and an In, Hold and Out bar marking where the words appear._ **On screen** is the alert’s whole time on screen, the way in and the way out included. So coming in, the text delay, the words coming in and going out have to fit inside it together; the bar shows the words’ own entrance in yellow after the delay. If they don’t fit, the bar turns red and says so — for example **Coming in, the text delay, the words coming in and going out take 4s, longer than the alert is on screen (3s)** — and the design is not saved until you show it for longer or shorten one of them. A **Typewriter** letter effect is not part of that sum: how long it types depends on the words each alert gets, so a long name keeps typing into the hold, and stops where it is if the alert starts going out first. To make the letters of the viewer’s name wave, select the alert layer and open **Motion · Layer**, then **Idle and letters**. Under **Letters**, pick **Wave** — or **Wiggle**, **Bounce**, **Pulse**, **Tada**, **Rubber band**, **Jelly**, or **Typewriter**, which types the name in once the words have arrived. Letters stay still in names written in right-to-left or joined scripts, such as Arabic or Hebrew, and in any text longer than 200 letters, so they always read correctly. It moves the **Highlighted values** part, so the name moves and the rest of the title stays still; any other text part can have its own letter effect under **Parts · Layer** ([Style one part at a time](https://bloopbot.com/docs/widget-themes#parts)). **Idle motion** in the same section keeps the layer gently moving while it’s on screen. A computer set to reduce motion shows every alert fading in and out over the same time, with still letters. OBS does not ask for reduced motion, so your stream shows the motion you chose. ## 2c. Put a frame around the card An alert card can wear a picture frame: a gold edge for a sub alert, a neon outline for a raid. The frame goes round the card itself, and the picture you choose under **Picture / GIF / Video** stays inside it. 1. Select the alert layer and open **Layer appearance · Local**, then **Background & spacing**. **Alert card frame** is there, under the card’s background. 2. Press **Image**, then **Choose picture** or **Upload**. Use a PNG or WebP with a see-through middle, so the card’s colour and words show inside the frame. **None** takes the frame off. 3. Set **Corner size** to the size of your picture’s corners in pixels, **Frame width** to how thick you want it drawn (16 to start with, and up to 64), and **Frame outset** to move it outwards. **Sides** decides whether the sides stretch or tile. [Put a frame around panels, chat lines and cards](https://bloopbot.com/docs/widget-themes#frames) explains each control. 4. Press **Test in editor** to see the card with its frame, then **Publish**. On the alert layer the frame is that layer’s own, so a raid can wear a bigger frame than a follow. Set **Alert card frame** on the theme instead, under **Look** → **Background & spacing**, and every alert card wears it; a layer can still change it or choose **None**, and **Reset to theme** hands it back. While the card wears a frame, its **Frame width** replaces the card’s **Border width**, including one set on the **Card** part under **Parts**. The **Card** part can also take a **Frame** of its own, which keeps its own width. To take the theme’s frame off the card, press **None** there (it says **Uses the theme’s frame** until you choose): the frame goes completely, and the plain border comes back with no thick edge left behind. The same works on the theme’s own **Card** part, where **None** keeps the card free of the theme’s frame in every overlay using the theme, and **Use the theme’s frame** takes it back. ![A follow alert on the canvas wearing the theme’s alert card frame: a gold and plum picture drawn round the card, its corners unstretched.](https://bloopbot.com/docs/screenshots/widget-frame-alert.jpg) _A follow alert on the canvas wearing the theme’s alert card frame: a gold and plum picture drawn round the card, its corners unstretched._ ## Choose alert media and sound Select the alert layer. Its picture and sound fields are near the top of the workspace: 1. Under **Picture / GIF / Video**, press **Choose media** to browse pictures and videos together, or **Upload** to add one. KLIPY offers GIFs, stickers and clips. Preview your choice, then press **Use media** (or **Use GIF**, **Use sticker** or **Use clip** for KLIPY). Choosing another file replaces the current media. 2. Leave **Sound** empty to hear the video's own audio. To replace it, press **Choose sound**, preview an MP3, OGG or WAV, then **Use sound**. The selected sound plays and the video is muted. Remove the sound to return to the video's audio. A picture has no audio of its own. 3. Open **More alert options · Shared design** below the tests to set **Alert volume**, then press **Test in editor**, then **Publish** when you are happy. Test turns on canvas sound so you can hear the alert. Use **Mute preview** to quiet it again; testing does not change your saved preview-sound preference. The picker's mute button controls only its own preview. For example, choose a celebration clip and leave Sound empty to hear its soundtrack. Add an airhorn as Sound to play the same clip silently with the airhorn instead. If the video stays silent after Test, check **Alert volume** and whether the video contains an audio track. **Test published output…** uses the published choices and plays sound on the live stage; listen through your streaming app. ![Picture / GIF / Video selects party.webm, Sound selects airhorn.wav, and the help explains that the sound replaces video audio.](https://bloopbot.com/docs/screenshots/alerts-media-sound.jpg) _Picture / GIF / Video with a celebration video, and an optional Sound field that replaces its audio._ ## 3. Show the viewer’s avatar Open **More alert options · Shared design** below the tests, then **Media source**. It offers **Their avatar**, **From library** or **None**. **Their avatar** shows the Twitch or Kick profile picture of whoever the alert is about: the follower, subscriber, cheerer or redeemer; the raiding channel for a raid; and the gifter for gifted subs. ![Avatar options inside More alert options · Shared design: Media source is Their avatar, Shape is Circle, Fallback is avatar-fallback.png, and Whose avatar is Gifter rather than Recipient.](https://bloopbot.com/docs/screenshots/alerts-design-avatar.jpg) _A gift sub design showing their avatar: circle-shaped, with a fallback picture and the Gifter / Recipient switch._ 1. Choose **Their avatar**. 2. In **More alert options · Shared design**, pick a **Shape**: **Circle** or **Rounded square**. 3. Pick a **Fallback** from your media library for when there is no avatar to show, or leave it on **None** for no picture. 4. On a design that plays on **Gifted subs**, **Whose avatar** appears: **Gifter** or **Recipient**. For a gift of several subs at once, Recipient shows the first person who got one. 5. Publish. A flow’s **Show alert** step has an **Avatar of** field. Leave it blank for whoever triggered the flow, or give a viewer’s name, with or without `@` (their Kick name on a Kick channel) — a shoutout command sets it to `$(1)` so the card shows the channel being shouted out. - The fallback shows straight away, with no wait, for an anonymous gift, a name Twitch does not know, a picture that will not load, or when Twitch takes longer than half a second to answer. An alert never waits for a picture. - Someone who has just changed their picture may appear with the old one for up to an hour. - Choose **From library** to replace the avatar with your own picture or video, or **None** to show just the words. - Tests from the alert panel show your own Twitch picture. Alerts sent by a script with a write key show the fallback. ## 4. Choose what plays it **Plays on** keeps a compact summary below the tests. An enabled raid flow appears under **On:**; a paused flow is named with **turned off**, and a queued flow with **created when you publish**. **(with conditions)** means the flow checks the event before showing the alert. **Other flows may play this design** warns that a flow chooses its design from a variable, so review that flow before assuming this alert has no behavior. **No flow plays this yet** means no matching behavior was found. 1. Press **Review**, or **Set up** when no flow is listed, to open the flow controls. Each row names its flow and offers **Open flow**. Press **Choose what plays it…** to choose events. 2. Tick each event that should play this design: **Follow**, **Sub**, **Resub**, **Gifted subs**, **Cheer**, **Raid** or **Channel points redemption**. For a cheer, type a number in **Minimum bits** before you tick it, or leave it empty for any cheer; a raid has **Minimum raiders**; a redemption needs its reward chosen first. 3. Each tick queues an ordinary flow named after the design — **Alert: raid**, or **Alert: custom-1 on cheer** for a design named after something else — and its row reads **created when you publish**. Untick it to take it back. Unticking a flow that is already live turns it off when you publish. 4. To have only your own flows play the design — a command, a timer, a webhook — leave every event unticked. That is **Only when a flow plays it**. 5. Press **Done**, then **Publish**. Each event is a trigger in the flow editor’s node library, and the flow a tick adds starts on it: **New follower**, **New subscriber**, **Resub message**, **Gifted subs**, **Bits cheered**, **Incoming raid** or **On a reward redeemed**. Power-ups have their own trigger, **Power-up used**: see [React to Twitch Power-ups](https://bloopbot.com/docs/power-ups). Start a flow of your own on the same trigger to do more on that event — a thank-you in chat for every raid, say — beside the alert. ![The Choose what plays it… popover for a design named custom-1: “Tick an event to make it play custom-1…”, then unticked boxes for Follow, Sub, Resub, Gifted subs, Cheer with 500 typed as its minimum, Raid with a Minimum raiders box, and Channel points redemption with a box for the reward’s name; yellow warnings that Follow, Gifted subs and Raid already play other designs; the Only when a flow plays it line; and Done.](https://bloopbot.com/docs/screenshots/alerts-plays-on-picker.jpg) _Choose what plays it: every event unticked on a custom design, 500 typed as the cheer minimum, and warnings where another design already plays that event._ A yellow line such as “Raid also plays raid — ticking this shows both” means another design already plays on that event. Tick it anyway and both alerts play, one after the other. The setup action reads the latest flows and queued changes before adding behavior. It reuses an existing custom, paused or conditional flow without resetting its configuration; changes queued here take effect only at Publish. The picker only ticks flows that do nothing but show this alert. Anything else — a chat command, extra checks, a thank-you in chat — is a row with **Open flow**, and you change it on the Flows page like any flow. Starting from Flows instead? The **Alerts** pack in the [flow marketplace](https://bloopbot.com/docs/templates-and-packs) installs the same kind of flows, plus **Show an alert from chat**: a moderator’s `!alert raid Ada` plays the `raid` design for Ada without a chat reply. ## What Publish sets up When your draft has flows waiting — an alert you added, or an event you ticked under **Plays on** — **Publish** opens a review before it sets them up. Every Publish opens this review, even for one changed part; it names what changes and which overlays a shared design can affect. 1. Press **Publish** (it reads **Publish · 2 flows** while two are waiting). 2. **Publish your overlay** lets you choose the changed parts to publish and lists each new flow with what it does, such as “Plays the raid alert on a raid.” For each, pick **Create and switch on**, **Create switched off** or **Don’t create**. **Don’t create any flows** sets them all at once; press it again to go back. 3. **Changes to your flows** lists what Publish will do to flows you already have — a rename after you renamed a design, or turning a flow off after you deleted one. Change those where you made them. 4. Review the affected overlays, then press **Publish**, or **Cancel** to change nothing. Unticked parts stay in your draft. A flow waiting for an alert you are leaving in the draft offers **Later** or **Don’t create**. ![Publish review names the changed overlay and shared alert design, with Create and switch on selected for the new Follow alert flow](https://bloopbot.com/docs/screenshots/studio-publish-review.jpg) _Publish lists the flows it will set up, and you choose what happens to each._ A flow you choose not to create is gone from your draft. The alert then plays on nothing until you tick an event under **Plays on**, or play it with **Show alert** in a flow of your own. A flow created switched off appears on the Flows page, ready to switch on. Once you press **Publish** in the dialog, the status line at the bottom says how many flows it created, created switched off, or didn’t create, such as “Created 2 flows, 1 not created.” If a switched-on flow still points to an alert design that is not published, Publish shows a result listing the affected flows and designs. Your overlay update reached OBS, but those alerts will not appear there yet. Add a **Custom alert** for each missing design, rename its design to the name shown, then publish again. Or choose a design you have already published in the flow or group that plays it. ![Published overlay result listing three switched-on raid flows and their missing alert designs, with steps to make the alerts show in OBS](https://bloopbot.com/docs/screenshots/studio-publish-missing.jpg) _Publish names the alert flows and designs that still need attention before those alerts can appear in OBS._ ## 4a. Make a variation for some events A variation is a copy of an alert design that plays only when a rule matches. The original design plays when it does not. Start with a design that already has an alert flow in **Plays on**. The **Variation** button (with a plus icon) is available on the original design's simple alert flows and flows made by this variation tool. 1. Select the original alert layer and find **Plays on**. Press **Variation**. 2. If the design has more than one alert flow, choose the **Flow** to change. 3. Under **When**, choose **Random chance**, **Subscription tier**, **Bits at least**, **Months at least**, **Gift count at least**, **Raid viewers at least** or **Specific viewer**. The choices depend on the flow's event. Enter the threshold, percentage or viewer login. 4. Press **Add variation**. Studio copies the design as it appears on this overlay, including its theme's picture, sound and words, places a new alert layer, and queues a branch in the selected flow. The new design and branch wait together for **Publish**. 5. Select the copied layer to change its words, picture or motion, then press **Publish**. Use **Open flow** in **Plays on** to see the branch and edit it further. ![Add variation controls for Alert: sub, with Subscription tier selected and Tier 1 including Prime chosen.](https://bloopbot.com/docs/screenshots/alerts-variation.jpg) _Add a subscription variation for Tier 1, which includes Prime._ For example, on a Cheer alert choose **Bits at least** and enter `1000`, then give the copied design a larger picture. Cheers of 1000 bits or more show that copy; smaller cheers show the original. For a rare alternative, choose **Random chance** and enter `10`: about one in ten matching events shows the copy. The flow editor calls this check **Random chance**. Its true path shows the copy, and its false path shows the original. A simulated **Test** can take either path; it does not send a real Twitch event. **Subscription tier** offers Tier 1 (including Prime), Tier 2 and Tier 3. Twitch's subscription event does not distinguish Prime from paid Tier 1 here, so a Tier 1 variation matches both. A gift's **Specific viewer** checks the gifter's login; anonymous gifts have no gifter login to match. To remove a variation, select its copied layer, choose **Delete design…**, then press **Publish**. Studio removes that branch from the alert flow; the original design still plays. If another flow also plays the copied design, the delete dialog lets you turn that flow off or move it to the Trash. If **Variation** is missing, open the flow and check whether it has other steps or edits outside the variation branch. You can build your own conditional path on the [Flows](https://bloopbot.com/docs/flow-basics) page. If Studio says it could not place the copied layer, remove another layer and add a **Custom alert** layer showing the new design before you publish. If the variation is still showing the original, check its rule and that the new layer was published; a chance rule may simply have taken its false path. **Renaming** a design (**Rename design…** in the header’s menu) renames it on every overlay that shows it, and the flows that play it by name follow when you publish — their rows read **renamed to this design when you publish**. **Deleting** one (**Delete design…**) that flows still play lists them and offers **Turn them off** or **Move them to the Trash**, so no flow is left playing a design that is gone. It all happens when you publish, and a layer that showed the design then draws nothing until you pick another. If the delete dialog says **Finding what plays this design…**, wait for the flow information to load. You can cancel at any time. Deletion choices appear once both the live flows and your draft have been checked. If that check fails, the dialog explains the problem; reload the page to try again. Nothing is deleted while the information is unavailable. ## 5. Test it There are two tests in the alert panel, and they reach different places: | Test | Where it plays | What it plays | | --- | --- | --- | | **Test in editor** (or **Test** on the layer’s toolbar) | The editor’s canvas only. Nothing reaches OBS. | The design in your draft, with sample words and your bot account’s name | | **Test published output…** | The published overlay’s real alert queue; visible sources may show it to viewers. It asks first: **Play it on stream**. | The published design, with your bot account as the sample viewer (a viewer called Ada when no bot account is linked). It joins your real alert queue, waits its turn and shows on the Live page as **Test · raid**. It never posts to Twitch chat. | | **Simulate** in the top bar → **Test events** | The canvas, and OBS as well if you tick **Also play on the live overlay in OBS** | A test for every alert type on this overlay | | **Test fire** in the flow editor | Nowhere: it is a dry run | The flow on a made-up event. Its Run log shows whether the checks passed and says it “would play” the alert. | **Test published output…** answers in a sentence under the button: **Playing now on your overlay.**, **Queued — number 2 in line.**, or one of the notes under [If something looks wrong](https://bloopbot.com/docs/alerts#troubleshoot). That reply reports queue state, not proof that OBS displayed or played the alert. Watch and listen in your streaming app. It plays the design itself, whether or not a flow plays it, so the conditions in a flow are not checked by it — use the flow’s **Test fire** for those. [Test alerts and check OBS delivery](https://bloopbot.com/docs/alerts-in-obs) covers checking the Browser Source itself. Open **Published output** below the tests to check the selected overlay’s published revision and source load history. The disclosure also shows the latest recorded channel test for this design. Opening it only reads evidence; it does not publish changes, connect a source or send another test. Press the refresh icon (**Refresh output evidence**) for a new check. If the check fails, retry there; any older result is marked as the last check. **Source connection** and **Visible or audible playback** remain **Unknown**. “OBS or Streamlabs fetched revision …” is historical load evidence, not a current connection or a last-loaded time. “A surface accepted the test frame” means a surface accepted it; the receipt does not identify which overlay or published version received it. Watch and listen in OBS to confirm the result. If the output changed during the check, refresh before comparing revisions. For sub, resub and gift sub alerts, `$(tier)` shows **Tier 1**, **Tier 2** or **Tier 3** with Bloopbot’s preset flow. Use `$(tier)` by itself in your title or subtitle, for example `$(name) subscribed at $(tier)`. The preview and direct alert tests use **Tier 1**; **Arrange card → Long** uses **Tier 3**. ## 6. Play images, videos and sounds A **Media** layer is where a flow’s **Play media** step shows an image or a video, and plays a sound. Media waits its turn in the same queue as your alerts, so a sound never plays over an alert. 1. Add a **Media** layer from **Add** and put it where the pictures should appear. Its **Fit** is **Fit inside the box** or **Fill the box**. 2. At an alert's Media or Sound field, press **Choose media** or **Choose sound** to preview files you already have, or **Upload** to add one, preview it, then press Use to apply it. You can also drop files into the editor's **Media** tab or upload on the **Media** page in the sidebar. PNG, JPEG, GIF and WebP pictures and MP3, OGG and WAV sounds can be up to 5 MB each; WebM clips can be up to 25 MB. Every channel can upload 200 MB; paid plans hold more, and the **Media storage** line under Limits in [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#limits) shows how much yours holds. 3. In a flow, add **Play media** and choose its **File**, **Seconds on screen** (1 to 60; a video or a sound stops when the time is up) and **Volume**. 4. Publish the overlay, and switch the flow on. ![Studio’s Media tab with Upload files, the current folder, search and files showing the flows that play them.](https://bloopbot.com/docs/screenshots/alerts-media-library.jpg) _The Media tab: each file shows which flows play it. The play icon plays it in the editor only._ Each file in the list says what plays it — **Played by Airhorn**, or **No flow plays this** — so you can see what a file is for before you delete it. For example, a chat command `!airhorn` with one **Play media** step playing `airhorn.wav` for 3 seconds plays the sound on every open overlay that has a Media layer, in its turn after any alert already playing. Media reaches only overlays with a Media layer. An alert design can also speak. A flow’s **Speak text** step with the design’s name in **Alert design** shows the card with the viewer’s name and message and plays the words out loud instead of the design’s sound, for as long as the speech runs. Make sure the design shows its message. [Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech#step) covers it, and spoken messages wait in the same queue as your alerts. ## 7. Control the queue while you are live The **Live** page has an **Alerts** card. It says what the queue is doing — **Idle**, **Playing** (with what is on screen, who or what sent it and the seconds left), **Paused**, **Waiting for an overlay with alerts in OBS**, **Held: your overlay is hidden in OBS** (the alerts play when you show it again, within two minutes), or **Held: no open overlay shows what’s waiting** — and lists **Up next**. ![The Alerts queue on Live: a test raid playing, five alerts up next, and Pause, Skip, Replay and Clear controls.](https://bloopbot.com/docs/screenshots/alerts-live-card.jpg) _The Live page’s Alerts card: a raid playing, its seconds left counting down, and two more tests up next._ An alert whose design no open overlay has a layer for is held rather than shown. The card counts it beside the queue (**0 in queue · 2 held**) and names each design, for example **2 alerts held: no open overlay shows the design kittypaws-follow**. Add a layer for that design to an overlay you have open and publish, or change the flow so it plays a design your overlay shows. A held alert plays as soon as an overlay that shows it opens, and is dropped after ten minutes. ![The Alerts queue on Live with two alerts held: the status reads Held: no open overlay shows what’s waiting, the heading 0 in queue · 2 held, and a line says 2 alerts held: no open overlay shows the design kittypaws-follow, with what to do about it.](https://bloopbot.com/docs/screenshots/alerts-live-held.jpg) _The Alerts card holding two alerts whose design, kittypaws-follow, no open overlay shows._ - **Skip** ends what is on screen, and the next one starts. - **Pause** holds the queue: new alerts wait until you press **Resume**. - **Replay** plays the last one again. - **Clear** throws away everything waiting, held alerts included; what is on screen finishes. A flow can do the same with the **Alert queue** step. Its **Do** field is **Skip what’s on screen**, **Pause the queue**, **Resume the queue**, **Replay the last one** or **Clear the queue** — for example a `!skipalert` command for your moderators, behind a **Who can trigger** check. An alert that has waited ten minutes without playing is dropped rather than shown late. ## If your alerts are in more than one scene OBS keeps a Browser Source running while its scene is hidden, and tells your overlay when it is shown or hidden. Bloopbot uses that: only the copies OBS is showing play an alert, sound and all. A copy in a hidden scene plays nothing, then or later. 1. In OBS, open the properties of each Browser Source that holds an alert or Media layer. 2. Leave **Shutdown source when not visible** unticked, and press OK. A source OBS shuts down cannot tell Bloopbot anything, and cannot [work with OBS](https://bloopbot.com/docs/control-obs-from-flows) either. 3. After OBS starts, click through each scene that has the overlay once. OBS only reports a change, so until a copy has been shown or hidden Bloopbot does not know where it is, and that copy plays every alert. When every copy that shows an alert is hidden, for example while your Be right back scene is up, the alert waits. It plays as soon as you show a scene with one of those overlays, in the order the alerts came in. An alert that waited more than two minutes is dropped instead, so hiding your alerts for a while never plays a backlog when you come back. Two things still play an alert at once, because Bloopbot cannot tell whether they are on screen: a browser tab with the overlay's URL open, and an app other than OBS showing it. With Studio Mode on, a scene in Preview counts as shown, so an overlay in both Preview and Program plays in both. An alert that arrives while no open overlay shows its design waits in the queue and plays as soon as one does. ## A worked example: raids big, follows small Your gameplay scene should show a raid across the middle of the screen and a follow tucked into the top-right corner, and your chatting scene should show the same raid alert. 1. Open your **Gameplay** overlay, choose **Add**, open **Raid alert** and press **Add**. It lands in the middle of the canvas. Drag the handle on its right edge until it spans about half the canvas. 2. Choose **Add** again — adding an alert switches the left panel to **Layers** — and drag **Follow alert** into the top-right corner of the canvas. The line at the bottom of the settings panel shows where it is, for example `x 566 y -361 w 640`. 3. Press **Publish**. The dialog lists **Alert: raid** and **Alert: follow**, both set to **Create and switch on**. Press **Publish** in it: “Published — ready for your Browser Source. Created 2 flows.” 4. Open your **Just chatting** overlay and add **Raid alert** there too. Studio reuses the raid design and its matching flow; **View placements** in its panel now includes Gameplay. Publish the new placement. 5. With the Gameplay scene visible in OBS, select the raid layer and press **Test published output…**, then **Play it on stream**. Do the same for the follow. 6. Leave **Shutdown source when not visible** unticked on both Browser Sources. Switch to **Just chatting** and test the raid again: it plays there, and not on the hidden Gameplay scene. ![The canvas of an overlay with two alert layers playing over a sample game backdrop: a wide raid card reading “Ada is raiding” with “with 42 viewers” across the middle, and a small follow card reading “Ada just followed” in the top-right corner, each drawn inside its own layer.](https://bloopbot.com/docs/screenshots/alerts-two-layers-canvas.jpg) _Raids big across the middle, follows small in the corner: each alert card draws inside its own layer._ ## What you should see - Under **Plays on**, an **On:** summary for the raid; **Review** opens the **Alert: raid** row and **Open flow**. On the Flows page, **Alert: raid** and **Alert: follow** are switched on after you create them with **Create and switch on**. - **Test published output…** answering **Playing now on your overlay.**, with playback checked separately in your streaming app. - The Live page’s **Alerts** card reading **Playing** with **raid · Ada · Test · raid**, and the follow under **Up next** until the raid has finished. - One alert at a time, with the queue’s gap between them. - An alert coming in, holding and going out with the motion you picked, within the time **On screen** says. - If you gave the card a frame, the picture drawn round it with its corners as you made them, in the test on the canvas and in OBS once published. - A real raid on your channel playing the raid design on every overlay that shows it, once — only the scene on screen plays it. - With both scenes hidden (say your Be right back scene is up), **Test published output…** answering **Queued. Every overlay in OBS with the raid design is hidden right now. It plays when you show one, within two minutes.**, and the raid playing when you switch back. ## If something looks wrong - The layer draws nothing and its panel says **This layer shows the … design, which doesn’t exist any more**: the design was deleted. Pick another from the design menu in the panel’s header, then publish. - **Publish** stops and the alert layer says it **shows the … design, which only … has**: the overlay uses one theme, and the design belongs to another. Pick one of the overlay's own designs from the design menu, or pick that other theme under **This overlay uses** in the overlay's style, then publish. - A banner says **Your old Alert box was retired. Its settings weren’t carried over — add alert layers from Add.** Nothing of the old one plays any more, so add a layer for each alert type you want, then publish. - A flow is marked as needing attention because it used the old Overlay card step: its message says that action was retired and names the **Alerts** pack. Add the **Alerts** pack from **Overlays → Add alerts** or **Flows → Add**, or replace the step with **Show alert**. - Nothing plays on a real event: **Plays on** reads **No flow plays this yet**, or its flow is turned off. Open **Set up** or **Review**, then choose the event under **Choose what plays it…** and publish, or review and switch on the existing flow through **Open flow**. - **Test published output…** says **OBS does not have the raid design yet. Publish, then test again.** The design is only in your draft. - It says **Queued, but no overlay open in OBS right now shows the raid design**: no open overlay has a layer for that design. Make the scene with it visible in OBS; the alert plays as soon as one is open. - The Alerts card reads **Paused**: press **Resume**. It reads **Waiting for an overlay with alerts in OBS**: open the scene that holds your alert layers, or press **Resume**. It reads **Held: your overlay is hidden in OBS**: show the overlay in OBS, and what was held plays; an alert held for more than two minutes is dropped. - The Alerts card says **alerts held: no open overlay shows the design …**: no overlay you have open has a layer for that design, often because a flow names a design your overlay doesn’t use. Add an alert layer for it and publish, or pick one of your overlay’s designs in the flow’s **Show alert** step. Press **Clear** to drop what is held now. - A design will not save and the timing bar in **Layout & timing · Shared design** is red: coming in, the text delay, the words coming in and going out are longer than **On screen**. Make **On screen** longer, or shorten a duration or the delay. - The letters of the name don’t move: the **Highlighted values** part is not used by the title, or its **Letters** is **None**. Check the title uses `$(name)`, and pick a letter effect under **Idle and letters**. - An alert only fades, whatever you picked: the computer showing it is set to reduce motion. OBS never is, so check on stream. - A sound plays twice: OBS has just started and you have not clicked through the scenes with the overlay yet, the overlay is also open in a browser tab or another app, or Studio Mode shows it in both Preview and Program. Click through those scenes once, or close the extra copy (see [several scenes](https://bloopbot.com/docs/alerts#several-scenes)). - An alert that came in while your overlay's scene was hidden never played: it waited more than two minutes, or another overlay that shows the same design was on screen and played it then. - An alert card shows no frame: check that **Image** is chosen under **Alert card frame** with a picture, that **Frame width** is not 0, and that the layer has not switched the theme’s frame off with **None**. Publish first if it shows on the canvas but not in OBS. - The frame’s corners look squashed or stretched: **Corner size** does not match the corners in your picture. Set it to their size in pixels, with **Frame width** near the same number. - On a **Free** card the words look small: they shrank to fit their box. Select the part in **Arrange card** and make it wider, or give it a shorter template. - A part of a **Free** card is missing: its box is off the card (select it with the Tab key in **Arrange card**, or check its **X** and **Y**), or the design has no subtitle, or it does not show the viewer’s message. - Two different alerts play for one event: two designs both play on it. Their **Plays on** lines show it; untick one. --- # Test alerts and check OBS delivery Choose the right test for an alert, check that the Browser Source shows it, and watch the alert queue on the Live page. Updated 21 October 2026 ## Choose the test that matches your source Every alert test starts from the alert itself: open **Overlays**, open the overlay and click its alert layer. The panel has two tests, and they go to different places. > **Pebble can check it with you** > > Pebble’s **Set up your bot** tutorial (and **Your first overlay**, for channels linked earlier) ends with **Test published output…**. Watch and listen in your streaming app to check the result; the tutorial uses the overlay’s playback reports to follow your progress. If you put the stream step off, **Put your alerts on stream** under Next steps on **Overview** picks it up. If it doesn’t, Pebble says what it can see: nothing open yet, or something open that isn’t this overlay. Start it from [Tutorials](https://bloopbot.com/docs/tutorials). | You want to check | Use | Reaches OBS? | | --- | --- | --- | | How the design looks | **Test in editor** in the alert panel, or **Test** on the layer’s toolbar | No — the editor’s canvas only, with your draft | | That OBS shows it | **Test published output…**, then **Play it on stream** | Yes, through the real alert queue — viewers may see it. It uses the published design; check the result in OBS | | Every alert on one overlay | **Simulate** in the top bar → **Test events** | Only if you tick **Also play on the live overlay in OBS** | | That your flow’s checks pass | **Test fire** in the flow editor | No — a dry run | | Your own HTML widget | **Test published output…** on any alert layer (below) | Yes, to every connected source that takes alerts | None of these posts to Twitch chat. [Show alerts on stream](https://bloopbot.com/docs/alerts) covers setting alerts up; this guide is about checking that they arrive. ## Send an alert to a custom overlay 1. On **Overlays → Custom overlays**, choose the named overlay. Grant **stage.alert** and the matching `alert_design:name` record under **Data access**. Your page must subscribe to `stage.alert` with the [Overlay SDK](https://bloopbot.com/developers/overlays). 2. Keep its OBS scene visible, then press the refresh icon (**Refresh status**). The named overlay should show a connected source. 3. Open an overlay design, select an alert layer and press **Test published output…**, then **Play it on stream**. 4. Watch OBS. The test joins the alert queue and reaches your custom overlay. It does not send a Twitch event or run the flow. See [Connect your own HTML overlay](https://bloopbot.com/docs/custom-widgets) for setup. Grant and subscribe to other event types separately when your page draws them. ## Test a hosted overlay 1. In OBS, make the scene with the overlay’s Browser Source visible. Its URL comes from **OBS URL** in the editor’s top bar. 2. In the editor, check the chip in the top bar reads **Published**. For pending designs, press **Publish**, review the named changes and affected overlays, then confirm Publish. Unticked parts stay in your draft: OBS uses only published designs. Published does not confirm that the source is showing in OBS. 3. Select the alert layer, press **Test published output…** and confirm with **Play it on stream**. 4. Read the sentence under the button and watch OBS. **Playing now on your overlay.** reports the queue’s playback state; it does not prove that OBS displayed or played it. Check your streaming app. **Queued — number 2 in line.** means other alerts were ahead of it. **Queued, but no overlay open in OBS right now shows the raid design** means no open Browser Source has a layer for that design: check the scene is visible and the source has the current URL. **OBS does not have the raid design yet** means it is only in your draft — publish, then test again. The alert workspace’s **Published output** disclosure separates that queue reply from the selected overlay’s evidence. It shows the published overlay revision, historical load marks and latest channel test for the design. **Source connection** and **Visible or audible playback** stay **Unknown**: a historical OBS load does not prove a connection now, and an accepted test frame does not identify its receiving overlay or version. Use **Refresh output evidence** to check again, or retry a failed check, then confirm the picture and sound in OBS. The **Live** page’s **Alerts** card shows the same test as **Test · raid**, playing or up next, **Waiting for an overlay with alerts in OBS** while nothing that shows alerts is open, **Held: your overlay is hidden in OBS** while the overlay is open but its source is hidden, and **alerts held: no open overlay shows the design …** when the overlays you have open have no layer for that design. ## Check the behaviour separately A test from the alert panel plays the design itself: it does not run the flow, so the flow’s checks — a minimum number of bits, a moderators-only command — are not tested by it. Use the flow editor’s **Test fire** for those: it runs the flow on a made-up event and its Run log says whether it “would play” the alert, without sending anything to Twitch or your overlay. To change what plays an alert, use **Plays on** in the alert panel, or **Open flow** on one of its rows. > **Nothing arrives in OBS** > > Make the OBS scene visible and check the Browser Source URL against **OBS URL** in the editor. OBS may close a source whose scene is hidden. After you make a new URL, paste it into every source that used the old one. --- # Trigger alerts, sounds and replies with channel points Make a Twitch channel points reward or a Kick channel reward play a sound, show an alert, request a song or answer in chat, with no extension to install, and decide whether the points are kept. Updated 12 November 2026 ## The short answer To play a sound when someone redeems a Twitch channel points reward, make a flow in Bloopbot that starts on **On a reward redeemed** and give it a **Play media** step with your sound. The sound plays through a Bloopbot overlay you add to OBS as a Browser Source, from your own media library, so there is no Twitch extension or desktop app to install. The same flow can show an alert, reply in chat, read the viewer's message out loud or queue a song instead. Responding to rewards is included on every plan, Free too. From a new reward to a sound on stream: 1. On Twitch, make the reward in your channel's **Channel Points → Manage Rewards**. 2. In Bloopbot, open your overlay in **Overlays**, add a **Media** layer from **Add** and press **Publish**. If the overlay is not in OBS yet, [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) puts it there as a Browser Source. 3. Open **Flows** and choose **+ New flow**, then **Start blank**. Add **On a reward redeemed** and pick your reward in its **Reward** field. 4. Add a **Play media** step after it. Under **File**, press **Upload** to add an MP3, OGG or WAV sound (up to 5 MB), or **Choose media** to pick one you already have. 5. Set **Seconds on screen** and **Volume**, then save the flow and switch it on. 6. Redeem the reward yourself on Twitch to hear it. The rest of this guide covers each step, replying in chat, keeping or refunding the points, rewards on Kick and what to check when nothing plays. ## Before you start > **Pebble can walk you through an alert** > > Once you’ve finished **Set up your bot** (or **Your first overlay**), Pebble’s **Channel points alert** tutorial makes a reward pop up on stream every time it’s redeemed: it adds a redemption alert, picks the reward and publishes. Enable Channel Points and create a reward in your Twitch Creator Dashboard, then start it from [Tutorials](https://bloopbot.com/docs/tutorials); Affiliate status isn’t required. For this flow, make a reward on Twitch, in your channel’s **Channel Points → Manage Rewards**. Bloopbot watches it and does something when it is redeemed. Keep your channel connected on [Connections](https://bloopbot.com/docs/permissions-and-cooldowns) so Bloopbot can read the list. To play a sound or show an alert you also need an overlay open in OBS: [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) sets one up. Twitch Channel Points are not the same as Bloopbot loyalty points. Viewers spend Twitch Channel Points on a reward; Bloopbot loyalty points are the separate balance on the [Loyalty page](https://bloopbot.com/docs/loyalty-and-regulars). Eligible channels can unlock Channel Points by completing Twitch’s monetization onboarding before becoming Affiliate. Bloopbot also needs Twitch to allow it to read your rewards and receive redemptions; having Channel Points in Twitch’s dashboard does not guarantee every reward operation is available to other apps. [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate) explains onboarding, permissions and live checks. Kick has channel rewards too, and they work the same way. [Rewards on Kick](https://bloopbot.com/docs/reward-redemptions#kick) lists what is different. ## Get help with your setup Optional **Help me** explains your actual reward-response flow. A blank reward in **On a reward redeemed** matches every reward, so review its scope. Twitch Channel Points are separate from Bloopbot loyalty points. **Test fire** is a dry run; setup never creates or spends a real redemption. ## 1. Start a flow that watches a reward 1. Open **Flows** and choose **+ New flow**, then **Start blank**. 2. In **Add a node**, search for `reward` and add **On a reward redeemed**. This is the trigger: it decides which flows start when someone spends points. 3. Give the flow a name you will recognise later, such as “Hydrate alert”. The trigger node is where the reward is chosen. Everything after it happens because of that redemption. ## 2. Pick the reward Select the trigger and open its **Reward** field. Bloopbot lists the rewards your channel has, with what each one costs, so you pick from what actually exists instead of typing. Choose yours and save. - The name is what the flow matches on, so a reward renamed on Twitch stops matching. The field keeps showing the old name marked **(not on Twitch now)** — pick the new one to repair the flow. - A saved reward that is no longer on Twitch stays selectable, so opening a flow never silently repoints it at a different reward. - Leave the field on **Any reward** to run for every reward your channel has — useful for a log or a thank-you. - If the list is not there the field says why, and you can type the reward’s name exactly as it appears on Twitch. A channel with no rewards yet is told to make one on Twitch; a channel Bloopbot is not allowed to read is not sent anywhere it cannot fix. ## 3. Say something back Add a **Send a chat message** action and connect it to the trigger’s **next** output. The **Insert…** menu on that action offers what the redemption carried: | Token | What it says | | --- | --- | | `$(user)` | Who redeemed it | | `$(reward)` | The reward’s name | | `$(cost)` | What it cost in Channel Points | | `$(query)` | The text the viewer typed, for rewards that ask for it | For example: ``` Thanks for the $(reward), $(user)! ``` > **Not every reward asks for text** > > A reward only carries `$(query)` when it is set up on Twitch to ask the viewer for a message. On the others that token comes out empty, so leave it out of the reply. ## 4. Keep or refund the points Add a **Fulfil or refund reward** action and connect it after your reply. In **Mark the redemption as**, choose **Fulfilled** to leave the points spent, or **Cancelled (refund the points)** to give them back. Both choices usually belong in the same flow on different branches: keep it when everything went as expected, refund it when it did not — [screening the typed-in text](https://bloopbot.com/docs/text-screening) is the worked example. If you save a flow for a picked reward and nothing in it fulfils or refunds the redemption, Bloopbot adds a **Fulfil or refund reward** step set to **Fulfilled** after the flow's last step, and the save message says so. It does this once, the first time you save that trigger with a reward picked. Move the step, switch it to a refund or delete it. If you delete it, the trigger shows a warning and the step is not added again. A trigger left on any reward never gets one, and neither does a reward you made on Twitch, for the reason below. > **Twitch lets Bloopbot complete only the rewards it made** > > Marking a redemption fulfilled or refunded is something Twitch allows only for a reward Bloopbot created. Bloopbot creates a reward only when you import a flow and choose **Create it on Twitch, switched off** for one of its rewards ([Share, import and restore flows](https://bloopbot.com/docs/sharing-flows#import)); a reward you made in your own Twitch dashboard never qualifies. When you pick a reward you made on Twitch, the **Reward** field says so. If the flow has this step anyway, the step skips that reward: the run log reads _skipped: the reward was made on Twitch_, the rest of the flow runs as normal, and the redemption waits in your Twitch reward queue for you to action there. For a reward that does not need reviewing, switch on **Skip Reward Requests Queue** for it on Twitch: Twitch then completes each redemption straight away, and the step reads _already fulfilled by Twitch_. Points can't be refunded for such a reward. Everything else in this guide — starting a flow, replying, reading what the viewer typed — works for every reward. The **Check reward text before it goes on stream** template tells a viewer their flagged message was held back before attempting a refund. Its **Held back** exit means the message stayed off screen, not that points returned. A skipped or failed refund leaves the reply in chat and the redemption for you to check in Twitch. [Screen a reward’s typed-in text](https://bloopbot.com/docs/text-screening#redemption) explains the flow and updating an older copy. ## Rewards on Kick A reward you made on Kick starts the same **On a reward redeemed** trigger, and the same tokens work in the flow: `$(user)`, `$(reward)`, `$(cost)` and `$(query)`. What differs: - **Which rewards you can pick.** On a Kick channel the **Reward** field lists your Kick rewards. On a Twitch channel with [Kick added](https://bloopbot.com/docs/bloopbot-on-kick#connect) it lists both, grouped under **Twitch rewards** and **Kick rewards**, and the Kick logo shows beside a Kick reward you have chosen. A saved reward Kick no longer lists reads **(not on Kick now)**. - **Which redemptions start the flow.** Open **More options** on the trigger and set **Platform** to **Twitch and Kick**, **Twitch only** or **Kick only**. The default is both. A Twitch channel with a reward of the same name on both platforms starts on both, unless you pick one platform. - **Reconnect for rewards.** A Kick connection made before rewards were supported can't read your rewards. The field then says **Reconnect Kick to show your Kick rewards.** Choose **Reconnect Kick** on [Connections](https://bloopbot.com/docs/bloopbot-on-kick#reconnect), then reload the flow editor. Until then you can type the reward’s name exactly as it appears on Kick. - **Accept or reject, not refund.** On Kick the same step is called **Accept or reject reward**. **Accepted** completes the redemption. **Rejected** declines it, and Kick decides whether the points go back to the viewer: Bloopbot can't refund them itself. Which of the two happens follows the platform the redemption came from, so one flow can handle both. - **Only rewards Bloopbot created.** As on Twitch, Kick lets Bloopbot accept or reject only a reward Bloopbot created, when you import a flow and choose to create its reward. For a reward you made in your Kick dashboard the step fails with a sentence saying so, and the redemption waits in your Kick queue. - **Importing creates the reward on your channel’s platform.** On a Kick channel, **Create it, switched off** makes the reward on Kick, with Kick’s limits: a name of up to 50 characters and at most 50 rewards on the channel. At the limit the import tells you to delete one on Kick first. On a Twitch channel the reward is made on Twitch, even with Kick added. - **Already handled.** If a redemption was already accepted or rejected on Kick (for example by you, a moment earlier), the step finishes quietly and the run log reads _already closed_. ## Play a sound or show an alert A reward can play a sound, a picture or a short video on stream, the way a sound-alert extension does, but from your own media library and through your own overlay. 1. Open your overlay in **Overlays** and add a **Media** layer from **Add**, where pictures should appear. Sounds play from it too. Press **Publish**. 2. In the reward’s flow, add a **Play media** step after **On a reward redeemed**. Under **File**, press **Choose media**, or **Upload** to add an MP3, OGG or WAV sound (up to 5 MB). 3. Set **Seconds on screen** (1 to 60; a sound stops when the time is up) and **Volume** (0 to 100), then save the flow and switch it on. For example, a reward called _Airhorn_ with **Play media** set to `airhorn.wav` for 3 seconds plays the horn on every open overlay that has a Media layer. Media waits its turn behind any alert already on screen, so two redemptions in a row never play over each other. To show a full alert card for the redemption instead, with the viewer’s name and avatar, add a **Redemption alert** layer to the overlay and tick **Channel points redemption** for it under **Choose what plays it…**, picking the reward first. [Choose what plays it](https://bloopbot.com/docs/alerts#plays-on) walks through it, and [Play images, videos and sounds](https://bloopbot.com/docs/alerts#media) covers the Media layer in full. A reward can also read the viewer’s words out loud: the **Text to speech** pack makes a **Speak a message** reward for you, and the **Speak text** step does the same for a reward of your own. [Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech) shows how. A reward can also queue a song on your Spotify: see [take requests with channel points](https://bloopbot.com/docs/song-requests#channel-points). ## Check it works 1. Press **Save**, then **Test fire**. The dry run uses a realistic example redemption — “Hydrate!” by Thirstygamer — so the branches your conditions check take a real path. Because the example is always “Hydrate!”, a flow set to another reward stops at its trigger with _a different reward (Hydrate!)_; leave **Reward** on **Any reward** while you test, then pick your reward again before you switch the flow on. 2. Expand the **Run log** and confirm which nodes ran and what each decided. A **Play media** step reads _queued_. **Request a song** reads _dry run_: the example carries Thirstygamer as the viewer and records a simulated request. Nothing here reaches Twitch or Spotify: a test fire never fulfils or refunds a real redemption and never spends real points. 3. Redeem the reward yourself in Twitch to confirm the live path. The flow’s row on Flows shows when it last ran and how it ended. > **A dry run is not a live check** > > A green test fire proves the wiring, not the connection. The real redemption is the only thing that proves your channel and permissions are working. ## Troubleshooting - Nothing happened when the reward was redeemed: the flow is paused, the reward was renamed on Twitch since you picked it (the field shows it as **not on Twitch now**), or another flow already handles that reward — check **Needs attention** on Flows for what stopped. - Every reward starts the flow: the **Reward** field is on **Any reward**. - The flow ran but no sound played: the overlay with the **Media** layer is not open in OBS, or it was not published after you added the layer. The run log shows the step as queued even when no overlay is open to play it. - The sound plays twice: OBS has just started and you have not clicked through the scenes with the overlay yet, the overlay is also open in a browser tab, or Studio Mode shows it in both Preview and Program. Click through those scenes once, or close the extra copy, as in [alerts in more than one scene](https://bloopbot.com/docs/alerts#several-scenes). - The sound never played: the overlay's scene was hidden in OBS for more than two minutes after the redemption. Media waits while every overlay with the **Media** layer is hidden, and plays when you show one. - Channel Points are missing from your Twitch dashboard: Twitch offers Channel Points to Affiliates, Partners and channels that have finished its monetization onboarding. [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate). - The points are not refunded, or the redemption sits in your Twitch queue: that is the step 4 limitation — Twitch will not let Bloopbot complete a redemption for a reward you made yourself, so the step skips it and the run log says so. Action it in Twitch, or switch on **Skip Reward Requests Queue** for the reward on Twitch. - Kick rewards are missing from the **Reward** field: reconnect Kick, as [Rewards on Kick](https://bloopbot.com/docs/reward-redemptions#kick) describes. - The list is missing from the **Reward** field: read the reason it shows. For missing permission, choose **Re-authorize** on **Connections**, then reload. For unavailable rewards, check Channel Points and monetization onboarding in Twitch’s Creator Dashboard; reconnecting does not change feature availability. You can type the exact reward name, but that does not make Twitch deliver events it has refused. --- # Let viewers send text-to-speech Have Bloopbot read your viewers’ messages out loud on stream, from a channel points reward, a cheer or a resub message, with a voice you choose, and learn what is left out, the daily limit and how to skip a message. Updated 14 November 2026 ## What you can do Text-to-speech lets a viewer type a message and hear it read out loud on your stream. A viewer redeems a **Speak a message** channel points reward, cheers 100 bits or more with a message, or shares a resub message, and Bloopbot turns the words into speech in the voice you chose. It plays on your overlay in OBS, in turn with your alerts, alone or inside one of your alert designs. Moderators and you can stop a message with `!skiptts`. Everything runs as flows, so you can change any of it. The **Text to speech** pack gives you four ready-made flows, and the **Speak text** step lets you read out anything else: a command, a store purchase, a raid message. ## Before you start - **Free+ or a paid plan.** Text-to-speech comes with [Free+](https://bloopbot.com/docs/unlock-free-plus) and every paid plan, with a [daily limit on characters](https://bloopbot.com/docs/text-to-speech#limits) that grows with the plan. On Free the **Speak text** step shows locked and cannot be added; join the Bloopbot Discord to put your channel on Free+, which costs nothing. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows what your channel holds. - **An overlay in OBS.** Speech plays on your overlay, so you need one open as a Browser Source: [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) takes you from **New overlay** to the source. Speech on its own plays on a **Media** layer; speech inside an alert design plays on an **Alerts** layer. [Play images, videos and sounds](https://bloopbot.com/docs/alerts#media) shows how to add a Media layer. - **For the reward and for cheers:** Channel Points and Bits need to be available on your Twitch channel. [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate) explains the checks. - **Hear it in OBS.** Speech is part of the overlay Browser Source's sound. [Hear the videos in OBS](https://bloopbot.com/docs/media-share#player) explains **Control audio via OBS** and **Monitor and Output**; the same two settings decide who hears the speech. ## Get help with your setup Optional **Help me** explains the saved speech flow, published voice and current feature access. Setup guidance does not use your AI credits, but generating speech still needs the speech feature, voice access and its normal allowance. **Test fire** previews what the flow would do without generating speech; it does not prove audio played on stream. ## Add the Text to speech pack 1. Open **Flows** and press **Marketplace**. 2. Press **Add** on the **Text to speech** pack. Its review opens in the panel. 3. The review asks about the **Speak a message** reward. Leave **Make it for me** chosen, and Bloopbot creates it on Twitch: 500 points, with a box where the viewer types what the bot should say (_Type what the bot should say_), and the text required. Change its cost, cooldown and limits in Twitch's channel points settings. It arrives switched off; switch it on there when you are ready. 4. Press the review’s button. The four flows arrive paused. Open each one to read its message, then switch on the ones you want. ![The Text to speech pack in Add to Flows: its review says it adds four flows, and the Speak a message reward is made for you, with Make it for me chosen.](https://bloopbot.com/docs/screenshots/tts-pack-review.jpg) _The Text to speech pack’s review in Add to Flows: four flows, and the Speak a message reward Bloopbot makes for you._ The pack’s flows all speak in Bryce’s voice to start with. Choose another in [the Speak text step](https://bloopbot.com/docs/text-to-speech#step). | Flow | What it does | | --- | --- | | **Speak a message with points** | A viewer redeems **Speak a message** and types their words. A message the AI check finds unfit to read is not spoken, chat says why, and the points are refunded. | | **Cheer to speak** | A cheer of 100 bits or more with a message has it read out. A message that is not read out keeps its bits, and chat says so. | | **Read resub messages** | When someone shares a resub message in chat, it is read out. | | **!skiptts skips the speech** | Moderators and you type `!skiptts` to end the message being read out. | ![Speak a message with points on the canvas: the reward trigger, the AI text check, Speak text, a chat message and a refund when a message is not read out.](https://bloopbot.com/docs/screenshots/tts-points-flow.jpg) _Speak a message with points: the reward, the AI text check, Speak text, and the refund when a message is not read out._ When a viewer redeems **Speak a message**, the reward and its words reach the **AI: text OK to show?** check, then **Speak text**; the flow carries on straight away, and the audio plays a few seconds later. If nothing can be read out (nothing is left of the message after cleaning, the daily limit is used up, or the voice is not in your plan), chat hears why, for example _PixelPal, I couldn’t read that out (daily speech limit reached)._, and the points are refunded. **Refunds only work for a reward Bloopbot created.** Twitch only lets Bloopbot give points back for a reward Bloopbot made, so if you pick a reward of your own instead of **Make it for me**, a message that is not read out keeps the viewer’s points. **Bits can’t be refunded.** A cheer that is not read out keeps its bits, and the pack’s chat message says so; say it on your stream before viewers cheer to speak. ## Try it without going live 1. Open **Speak a message with points** in the editor and press **Test fire**. 2. Open the run log. The **Speak text** step reads _would speak "…" as Bryce_, with the cleaned text, and the flow leaves by **Spoken**. A test fire cleans the text and finds the voice, and stops there: nothing is spoken, no characters are used and nothing reaches OBS. To hear it, redeem **Speak a message** yourself on stream, or from your own account in a quiet moment, with your overlay open in OBS. That is a real redemption: it uses points and characters, and a refused message refunds the points. ## The Speak text step **Speak text** is in the node library under **Overlay**. It turns text into speech and plays it on your stream. Its fields: | Field | What it does | | --- | --- | | **Text** | What to say. It starts as `$(input)`, the words a viewer typed with a reward; use `$(message)` for a cheer or a resub message. You can mix in your own words and any variable. | | **Voice** | Which voice speaks. Pick one from the list ([Pick a voice](https://bloopbot.com/docs/text-to-speech#voices)), or type a voice name or a variable. Blank uses the default voice. | | **Speed** | From 0.5 to 2. 1 is normal speed; lower is slower. | | **Alert design** | Optional. The name of one of your alert designs to speak inside, such as `redemption`. Blank plays the voice alone. | The step leaves by **Spoken** as soon as the speech is asked for. It never waits for the audio, so the rest of the flow runs straight away. It leaves by **Not spoken** when nothing could be asked for, and **Why nothing was said** carries the reason for a later step to use, as `$(from.speak.reason)` (the step’s id is in the name; use the **Insert…** menu). Wire **Not spoken** to a chat message and a **Fulfil or refund reward** step to give a viewer their points back, as the pack does; leave it unwired and the flow just stops there. A step that reaches the audio but whose speech then fails (the service is busy, or cannot make that audio) shows a line under the step in the run log a moment later, _speech failed:_ followed by the reason, and puts one item on **Flows → Needs attention**, at most once an hour. The characters of a message that failed after it was accepted are not given back. **Speak inside an alert design.** Type the name of one of your alert designs in **Alert design**, for example `redemption`. The card shows the viewer’s name and what was said, stays up as long as the speech plays (the design’s own time, or the speech and half a second, whichever is longer), plays the speech instead of the design’s sound, and keeps a video in the design muted. Make sure the design shows its message. [Show alerts on stream](https://bloopbot.com/docs/alerts) explains designs. With no design, the speech plays on its own on the overlay’s Media layer. Speech waits its turn in the same queue as your alerts, so a message never plays over an alert. A single run can put at most five things on the stream (alerts, media and speech together). > **A name that is not a design** > > A variable that turns into chat text is not a design name. Bloopbot plays the speech on its own and says so in the run log. ## Pick a voice The step’s **Voice** field lists the voices: a picture (or the first letter of the name), a name, a region and a category each. The region says where the voice comes from, such as **US** or **UK**, and the category groups voices, such as **Everyday**. The voice marked **default** speaks when the field is blank, and the pack’s flows ask for **Bryce**. ![The Speak text step’s inspector: Text, Voice with the list of voices, each with a picture, a name, a region and a category, Speed and Alert design.](https://bloopbot.com/docs/screenshots/tts-speak-step.jpg) _The Speak text step’s fields, with the voice list below: a picture, a name, a region and a category for each voice._ - **Locked voices.** A voice that needs a higher plan than yours is shown locked, with the plan that unlocks it (_Needs Plus_), and cannot be picked. A step that names one anyway does not speak: it leaves by **Not spoken** with _that voice needs Plus_. The voices that came first are in **Everyday** and open to every plan that has text-to-speech. - **A voice that went away.** If the voice a step names is not available any more, or a variable holds a name that is not a voice, the step speaks with the default voice and the run log says so. - **One voice per step.** Viewers cannot choose a voice. Use a variable to change the voice, for example one per reward, or a second step for a second voice. An AI assistant can read the same list: [Connect an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant) explains what it can see. It can write the step with a voice from your plan, but it cannot add or change voices. ## What gets cleaned Before a message is counted or spoken, **Speak text** cleans it, in this order: 1. Links are removed. 2. Cheermotes are removed, so a cheer of `Cheer100 nice shot` reads _nice shot_, not _cheer one hundred_. 3. The words in your **Moderation** blacklist are removed, even when spelled with look-alike letters. A message that a blocked phrase spans (`buy * followers`) is dropped whole. [Set up chat moderation](https://bloopbot.com/docs/moderation) shows the blacklist. 4. Square brackets are removed and the words inside stay, so a viewer cannot hand the voice any special instructions. 5. A character repeated more than three times is cut to three (digits are left alone, so `1000000` stays a number), and so is a word or emote repeated more than three times in a row. 6. The rest is cut to **300 characters**, at the end of a word. If nothing speakable is left (no letter or digit), the step leaves by **Not spoken** with _nothing left to say_. What viewers see in an alert card and on the Live page is the cleaned text too. ## Screen messages with AI on Pro The pack puts the **AI: text OK to show?** check in front of every **Speak text** step. It asks whether the words are fit for your stream: a slur, sexual content, someone’s personal information, harassment or something that would embarrass you. It uses the **Shown on stream** bar, which is the strictest. [Screen viewer text with AI](https://bloopbot.com/docs/text-screening) explains the check. The check comes with Pro. How its three answers behave in the pack: - **Safe.** The message is read out. - **Unsure.** The check could not answer, because your plan does not include it, the daily AI allowance is used up or the AI could not be reached. The message is read out after the step’s own cleaning. **On Free+ and Plus, every message takes this path**, so the cleaning, your blacklist and `!skiptts` are what protect your stream. Watch the first messages, and keep a moderator ready with `!skiptts`. - **Flagged.** The message is not read out. For a reward, chat says why and the points are refunded. For a cheer, chat says the message will not be read out and bits can’t be refunded. A resub message is simply skipped. Wire the check’s three outputs yourself if you want a different rule, for example to read out nothing when the check is unsure. ## Daily limits Each channel has a daily limit on how many characters can be turned into speech, counted after cleaning and across all your flows. It resets at midnight UTC. | Plan | Characters a day | | --- | --- | | Free+ | 5,000 | | Plus | 20,000 | | Pro | 100,000 | A message is at most 300 characters, so Free+ reads out at least 16 full-length messages a day, and usually far more. A message that would pass the limit is not read out at all: the step leaves by **Not spoken** with _daily speech limit reached_, and the pack refunds a points message. Messages that come in after the limit try again the next UTC day. **Plan & billing** lists **Text-to-speech characters a day** among your channel’s limits. ## Skip a message - **On the Live page.** The **Alerts queue** card lists speech as _TTS · Bryce · the first words of the message_, in the queue like an alert. **Skip** ends what is on screen, and **Replay** plays the last one again from its saved audio for a day. ![The Live page’s Alerts queue card playing a spoken message, labelled TTS, the voice and the first words, with Skip and Replay.](https://bloopbot.com/docs/screenshots/tts-live-queue.jpg) _The Live page’s Alerts queue card with a spoken message playing: TTS, the voice and the first words, with Skip and Replay._ - **In chat.** Moderators and you type `!skiptts`. It ends whatever is on your overlay at that moment, a spoken message or anything else in the queue. It is its own command so it does not clash with `!skip`, which belongs to other packs. - **Refunds.** A message you skip after it started is not refunded: it was read out. Points for a message that was _not_ read out are refunded by the pack when Bloopbot made the reward. Bits are never refunded. ## Build your own A **Speak text** step can follow any trigger. For example, start a flow from **New follower** and set **Text** to `Welcome to the stream, $(user)!` to greet each follower out loud. Anything a viewer typed reaches the voice, so put the **AI: text OK to show?** check in front of a step that reads their words, as the pack does: [Screen viewer text with AI](https://bloopbot.com/docs/text-screening) shows how. ## Voice credits Every voice is made from recordings its authors released for others to use. Two of the first voices need a credit, and Bloopbot gives it here: - **Alba** is made from the University of Edinburgh CSTR Alba corpus, released under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Source: [datashare.ed.ac.uk/handle/10283/3270](https://datashare.ed.ac.uk/handle/10283/3270). - **ARU 03**, **ARU 06** and **ARU 10** are made from the University of Liverpool Acoustics Research Unit speech corpus, released under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Source: [the Acoustics Research Unit speech corpus](https://www.liverpool.ac.uk/architecture/research/acoustics-research-unit/speech-corpus/). If you credit your tools on a stream panel or in a video description, add _Voices: Alba (University of Edinburgh CSTR Alba corpus, CC BY 4.0) and ARU (University of Liverpool Acoustics Research Unit speech corpus, CC BY 4.0)_ when you use them. ## Troubleshooting - **The Speak text step is locked.** Your channel is on Free. Join the Bloopbot Discord to put it on Free+ ([Unlock Free+](https://bloopbot.com/docs/unlock-free-plus#join)), or upgrade on **Plan & billing**. - **Nothing is heard in OBS.** Check that an overlay with a **Media** layer (or an **Alerts** layer for a design) is open as a Browser Source, that it is published, and that **Control audio via OBS** is ticked and the source is monitored ([Hear the videos in OBS](https://bloopbot.com/docs/media-share#player)). The Live page’s alerts card says **Waiting for an overlay with alerts in OBS** when none is open. - **The reward does not appear on Twitch, or points requests never arrive.** Check monetization onboarding and that Channel Points are available in Twitch’s Creator Dashboard. The reward arrives switched off: switch it on in Twitch’s channel points settings. - **Chat says _nothing left to say_.** The message was only links, cheermotes, blocked words or symbols. - **Chat says _daily speech limit reached_.** The day’s characters are used up. It starts again at midnight UTC, or upgrade for a bigger limit. - **Chat says _that voice needs Plus_.** The voice in the step is above your plan. Pick one without a lock. - **Points did not come back.** Twitch only lets Bloopbot refund a reward Bloopbot created. Choose **Make it for me** when you add the pack, or create the reward again that way. - **A line says _speech failed_ under the step in the run log.** The speech service did not answer in time or could not make the audio. Try again in a few minutes; the message is not queued again. It also shows on **Flows → Needs attention**. - **Nothing happens when a viewer types `!skiptts`.** Only moderators and you can use it. --- # React to Twitch Power-ups Start a flow when a viewer uses a Power-up, built into Twitch or one you made, pick which one from your channel's own list, and thank them in chat or on stream. Updated 4 October 2026 ## Before you start Power-ups are what viewers buy with Bits instead of cheering: Twitch's own **Message effect**, **Celebration** and **Gigantify an emote**, plus the custom Power-ups you make on Twitch. Start a flow on **Power-up used** to answer them with a chat message, a sound, an alert or anything else a flow can do. Responding to Power-ups is included on every plan, Free too. Power-ups need Bits on your channel. Eligible channels can unlock Bits through Twitch’s monetization onboarding before becoming Affiliate. [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate) explains onboarding, permissions and live checks. Keep your channel connected on [Connections](https://bloopbot.com/docs/permissions-and-cooldowns) so Bloopbot can read your custom Power-ups. > **Cheers and Power-ups are separate triggers** > > **Bits cheered** runs only for cheers. A Power-up never starts it, so a cheer flow and a Power-up flow never both answer the same Bits. ## 1. Start a flow on Power-up used 1. Open **Flows** and choose **+ New flow**, then **Start blank**. 2. In **Add a node**, search for `power-up` and add **Power-up used**. This is the trigger: it decides which flows start when a viewer uses a Power-up. 3. Give the flow a name you will recognise later, such as “Power-up thanks”. ## 2. Pick the Power-up Select the trigger and open its **Power-up** field. It lists: - **Any Power-up**, to run for every Power-up; - **Built into Twitch**: **Message effect**, **Celebration** and **Gigantify an emote**; - **Your custom Power-ups**: the ones your channel has made on Twitch, read from Twitch when you open the editor, with what each costs in Bits. ![The Power-up used trigger's Power-up field open as a list: Any Power-up, the three Power-ups built into Twitch, and the channel's custom Power-ups Hydrate (50 bits) and 10 squats (300 bits).](https://bloopbot.com/docs/screenshots/power-up-picker.jpg) _The Power-up field: Any Power-up, the three built into Twitch and the channel's own custom Power-ups with their Bits._ A custom Power-up is matched by its name, whatever its capitals. If you rename it on Twitch, the field shows the old name marked **(not on Twitch now)**; pick the new name to repair the flow. If the field cannot read your custom Power-ups it says why, and you can type the name exactly as it appears on Twitch. ## 3. Say something back Add a **Send a chat message** action and connect it to the trigger’s **next** output. The **Insert…** menu on that action offers what the Power-up carried: | Token | What it says | | --- | --- | | `$(user)` | Who used it | | `$(powerup)` | The Power-up’s name, such as _Gigantify an emote_ or your custom Power-up’s name | | `$(bits)` | How many Bits it cost | | `$(query)` | The text the viewer typed, for a custom Power-up that asks for it | | `$(emote)` | The emote it used: the one gigantified, or the one a custom Power-up unlocked | | `$(kind)` | `power_up` for one built into Twitch, `custom_power_up` for one you made | For example: ``` $(user) spent $(bits) Bits on $(powerup)! Thank you! ``` To play a sound or show something on stream instead, add a **Play media** or **Show alert** step after the trigger, as in [Play a sound or show an alert](https://bloopbot.com/docs/reward-redemptions#sound). ## Check it works 1. Press **Save**, then **Test fire**. Choose the sample: **Power-up: Bitsybot gigantifies an emote** or **Custom Power-up: Bitsybot redeems Hydrate**. A test fire is a dry run, so nothing reaches chat or Twitch. 2. The samples are a gigantified emote and a custom Power-up called _Hydrate_. A flow set to a different Power-up stops at its trigger with _a different Power-up (…)_; leave **Power-up** on **Any Power-up** while you test, then pick yours again before you switch the flow on. 3. Use the Power-up yourself on Twitch to confirm the live path. The flow’s row on Flows shows when it last ran. ## Troubleshooting - A cheer flow stopped answering Power-ups: that is expected. **Bits cheered** runs only for cheers; start a flow on **Power-up used** for Power-ups. - Nothing happened when a Power-up was used: the flow is paused, the Power-up was renamed on Twitch since you picked it, or the field names a different Power-up. Check **Needs attention** on Flows for what stopped. - Your custom Power-ups are not listed: read the reason under the field. For missing permission, choose **Re-authorize** on **Connections**, then reload. A channel with no custom Power-ups yet is told to make one on Twitch. - `$(query)` or `$(emote)` comes out empty: only a custom Power-up that asks for text carries `$(query)`, and only Power-ups that use an emote carry `$(emote)`. --- # Twitch predictions, polls and hype trains in chat Start, lock and resolve Twitch predictions and polls from a Bloopbot flow, announce winners in chat, cheer on hype trains, and drop stream markers in your VOD. Updated 15 October 2026 ## What you can do A Twitch prediction is a question viewers bet Channel Points on before the answer is known. Bloopbot can start one from a flow, lock it, resolve it with the winning outcome or cancel it with a refund, and say who won in chat. See [start a poll or prediction from a flow](https://bloopbot.com/docs/polls-and-predictions#start). When you run a poll or prediction on Twitch, or chat starts a hype train, Bloopbot can react in chat and on your overlay: announce the poll winner, say who won the prediction and how many points were in play, cheer each hype train level. A flow can also **start** a poll or prediction for you — from a chat command, a channel points reward or a Stream Deck key — and lock or settle it later. And a flow can drop a [marker in your VOD](https://bloopbot.com/docs/polls-and-predictions#markers) when something worth finding again happens. ## Before you start - Eligible channels can unlock polls, predictions and hype trains through Twitch’s monetization onboarding before becoming Affiliate. Check that the feature is available in Twitch’s Creator Dashboard. Bloopbot reacts to real events and can start polls and predictions only when Twitch also allows that operation for other apps. - These steps are listed under **Twitch** in **Plan & billing**, as **Polls & predictions** and **Hype trains**. They are not available on every channel yet; a step your channel does not include shows a lock in the node library. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) explains the page. - Bloopbot needs your permission for polls, predictions and hype trains on Twitch. A channel connected before these were added shows **Update available** on **Connections**; choose **Re-authorize** there. Until then, a flow that needs one is listed in **Flows → Needs attention** as blocked. - [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate) explains onboarding, permissions and live checks. Re-authorizing grants missing permission; it does not unlock a feature that is unavailable on your channel. ## 1. Install the ready-made reactions The **Stream events** pack has a flow for each moment. Open **Flows**, press **Marketplace**, and add **Stream events**, or just the flows you want on their own — they arrive paused. | Flow | Posts in chat | | --- | --- | | **Poll results** | The winner when a poll ends, whether it ran its full time or you ended it early | | **Poll: progress nudge** | A reminder to vote with the current tally, at most every 30 seconds | | **Prediction: opened** | That predictions are open, with the question | | **Prediction: resolved** | The winning outcome, how many took part and the points wagered | | **Prediction: cancelled** | That it was called off and points are refunded | | **Hype train cheer** | A rallying line when a hype train starts | | **Hype train: level up** | The new level and progress, at most every 20 seconds | Open each one, reword its message if you like, **Save**, and switch it on. ## 2. Choose the moment Each flow starts from one trigger, and a field on it picks the moment: - **Twitch poll changes** — **When it**: **Starts**, **Gets a vote**, **Ends** or **Any of these**. With **Ends**, **Outcome** narrows it: **Finished (completed or ended early)**, **Completed normally**, **Ended early** or **Archived**. - **Twitch prediction changes** — **When it**: **Starts**, **Gets a bet**, **Locks**, **Ends** or **Any of these**. With **Ends**, **Outcome** tells **Resolved (winner paid out)** from **Cancelled (points refunded)**. - **Hype train** — **When it**: **Starts**, **Gets a contribution**, **Ends** or **Any of these**, plus **At least level** to wait for a bigger train. Zero means any level. ![The When this happens step of the Prediction: resolved flow: When it set to Ends and Outcome set to Resolved (winner paid out).](https://bloopbot.com/docs/screenshots/prediction-trigger.jpg) _The Prediction: resolved flow’s trigger: When it is Ends, and Outcome is Resolved (winner paid out), so a cancelled prediction does not claim a winner._ **Gets a vote**, **Gets a bet** and **Gets a contribution** fire on every single one, so put a cooldown after them, as the nudge and level-up flows do — [Add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns#cooldown) shows how. ## 3. Use the details in your message The **Insert…** menu on a chat message offers what each trigger carries. In a poll, `$(winner)` is whoever is leading so far, so it is only final when the poll **Ends**. In a prediction, `$(winner)` stays empty until it resolves. | Trigger | Tokens | | --- | --- | | Poll | `$(title)`, `$(choices)` with their votes, `$(winner)` (the leader so far), `$(winnervotes)`, `$(totalvotes)` | | Prediction | `$(title)`, `$(outcomes)` with their backers, `$(totalusers)`, `$(totalpoints)`, and once it resolves `$(winner)` | | Hype train | `$(level)`, `$(total)`, `$(progress)` and `$(goal)` for this level, `$(topuser)`, `$(lastuser)` | For example, **Prediction: resolved** says: ``` "$(title)" is settled — $(winner) wins! $(totalusers) players, $(totalpoints) points total. ``` ## 4. Start a poll or prediction from a flow Add **Run a Twitch poll** or **Run a Twitch prediction** as an action — for example after a `!vote` command that only moderators can use. **Run a Twitch poll**: set **Do** to **Start a poll**, then **Question**, **Choices** (one per line, two to five) and **Runs for**, from 15 seconds to 30 minutes (1 minute to start with). Questions are cut to 60 characters and choices to 25. **Run a Twitch prediction**: set **Do** to **Start a prediction**, then **Title**, **Outcomes** (one per line, two to ten) and **Open for**, from 30 seconds to 30 minutes (2 minutes to start with). Titles are cut to 45 characters and outcomes to 25. The other choices in **Do** act on the poll or prediction the flow was started by — a flow whose trigger is **Twitch poll changes** or **Twitch prediction changes** — or on the one the same run started a step earlier: - Polls: **End the poll** stops it and shows the result; **Archive the poll** removes it without results. - Predictions: **Lock the prediction** stops new bets; **Resolve it (pick the winner)** pays out, with **Winning outcome** set to the outcome’s number (1 is the first line), its exact name, or a token; **Cancel it (refund)** gives everyone their points back. A run can start or change up to five polls, predictions or markers. > **A flow cannot settle a prediction started by another run** > > To resolve a prediction later — say, from a mod’s `!winner 2` — use a flow triggered by the prediction itself, or resolve it on Twitch. A separate command flow has no prediction to act on and stops with an error in its Run log. ## Mark a moment for your highlights The **Stream marker** step drops a marker in your VOD at the moment it runs, so you can find that moment again in Twitch’s highlight editor after the stream. Add it after any trigger: a raid, a hype train reaching a level, a `!mark` command your moderators use. - **Note** is optional. It shows next to the marker in the highlighter, and it can use tokens from the trigger, such as `$(raider)`. Bloopbot keeps the first 140 characters and drops the rest. - **Stream markers** is listed under **Twitch** in **Plan & billing**. If your channel does not include it yet, the step shows a lock in the node library. - Placing a marker needs your Twitch permission to manage your broadcast. A channel connected before markers were added shows **Update available** on **Connections**; choose **Re-authorize** there. For example, to bookmark every sizeable raid and welcome the raider: 1. Start a flow with **Incoming raid** and set **Minimum raiders** to `10`, so smaller raids never run it. 2. Add **Stream marker** and set **Note** to `Raid: $(raider) with $(viewers) viewers`. 3. Add **Shout out a streamer** after it and set **Who** to `$(raiderlogin)`. Leave **Twitch shoutout too** on to send Twitch’s own shoutout as well as the chat line. 4. Connect the marker’s **error** branch to the shoutout too, so the raider still gets their shoutout if Twitch turns the marker down. 5. **Save**, and switch the flow on. **Test fire** plays a made-up raid from Roadtriprachel with 42 viewers. The Run log shows the marker the step _would_ place, with its note, and nothing reaches Twitch. Limits worth knowing: - Bloopbot asks Twitch for the marker whenever the step runs; it does not check first whether you are live. When Twitch refuses (for example because you are offline, or your channel doesn’t save past broadcasts) the step fails and the Run log carries Twitch’s answer. - A failed step ends the run there unless its **error** branch is connected, which is why step 4 above wires it to the shoutout. Going over the per-run limit below always ends the run. - Markers count towards the same limit as polls and predictions: one run can start or change up to five of them in total. ## Show them on your overlay The **Event stack** widget shows real Twitch polls, predictions and hype trains as they happen, with no flow needed — [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) shows how. If you would rather give the vote its own spot instead of stacking it with hype trains and ad breaks, the **Poll** widget is the same live poll and prediction — title, options with bars, the countdown and the result — as a single card of its own; it shows nothing at all while neither is running, and picks up the most recently started one if a poll and a prediction are ever live together. ![The Poll layer selected on its overlay, showing a running poll titled "Test poll: what breaks first?" with three option bars, their vote counts and percentages, and a countdown.](https://bloopbot.com/docs/screenshots/poll-widget-test.jpg) _The Poll widget just after a poll starts: title, three option bars at 0 votes each, and a 20-second countdown._ Its **Keep the result up for** setting decides how long the card stays up showing the final tally (or the winning outcome) before it clears, and its **Test poll** and **Test prediction** buttons, in the editor's Simulate popover, play a scripted poll or prediction through the widget so you can see it without anything running on Twitch. To put one on screen without anything running on Twitch, the Overlay topic has **Overlay poll card**, **Overlay prediction card** and **Show a hype train**, which draw on the widget from numbers your flow gives it and step aside while a real one is running. These cards and the widget’s simulated tests need no Twitch monetization or Affiliate status. ## Check it works 1. Press **Test fire** in the flow. It plays a realistic made-up event: the poll _What should we play next?_ (Elden Ring 12, Hollow Knight 7), the prediction _Do we win this one?_ (Yes and No), or a hype train that Lasthyper started. 2. A trigger with more than one moment has a picker next to **Test fire** — choose **Default moment**, or the start, a vote, a lock or the end, to test each path. For **Poll results**, the Run log shows the bot _would_ post _Poll over! "What should we play next?" — Elden Ring wins with 12 of 19 votes._ 3. A test never reaches Twitch. **Run a Twitch poll** and **Run a Twitch prediction** show what they _would_ start or end, and no poll, prediction or points change on your channel. 4. For a live check, run a short poll on Twitch during a stream and watch the result land in chat. ## Troubleshooting - Nothing happens when a poll ends: check the flow is switched on and read **Flows → Needs attention**. If it says permission is missing, choose **Re-authorize** on **Connections**. If permissions are present, check that polls are available on Twitch; access in Twitch’s dashboard and delivery to other apps can differ. - Both _resolved_ and _cancelled_ lines post for one prediction: a flow’s **Outcome** is set to **Any**. Set **Resolved (winner paid out)** on one and **Cancelled (points refunded)** on the other. - The winner is wrong or empty: in a poll, a flow that runs before **Ends** gets whoever is leading at that moment; in a prediction, `$(winner)` is empty until it resolves. Set **When it** to **Ends** (and, for a prediction, **Outcome** to **Resolved (winner paid out)**). - Chat is flooded during a hype train: the flow fires on every contribution. Add a cooldown, or use **At least level**. - Starting a poll or prediction fails: read Twitch’s answer in the **Run log**. One may already be running, or the feature may be unavailable to your channel or to other apps. Check monetization onboarding and the feature in Twitch’s Creator Dashboard; re-authorize only when permission is missing. - A marker step fails: the Run log carries Twitch’s answer. Check you were live when it ran, that your channel saves past broadcasts, and that **Connections** does not show **Update available**. - A step shows a lock: your channel does not include that capability yet. Your other flows carry on as before. --- # Smarter song requests with AI Find a song from a description with !findsong, or let AI match requests, screen out trolls and check a song policy. Updated 14 October 2026 ## Before you start For flows that queue tracks, set up [song requests](https://bloopbot.com/docs/song-requests) first; if no request flow is on yet, the **Song requests** page’s **Song request flows** row adds them ([Check the request flows](https://bloopbot.com/docs/song-requests#flows)). Only want a suggestion? [Find a song from a description](https://bloopbot.com/docs/song-requests-ai#find-song-from-description) needs Spotify linked, but does not need request flows enabled. Each capability below is its own AI feature, so your channel may include one and not the other; check [Plan & billing](https://bloopbot.com/docs/what-your-plan-includes): | Feature | What it adds | | --- | --- | | Smarter song matching | A **Find a song** step that picks the right track out of several near-identical results. | | Song policy | An **AI: song fits my rules?** step for troll screening and your own plain-English policy. | | Intent trigger + Judge & route nodes | Both together are what let a request work with no `!sr` in front of it at all — see [“No command at all”](https://bloopbot.com/docs/song-requests-ai#no-command) below. | > **These are steps in a flow, not a page of switches** > > There is nothing to switch on for any of this outside the flow itself. Each capability here is a step you add to a flow and set up right there on it — which means any trigger can drive it, a chat command, a channel-points reward or a Stream Deck button, and you can always see what your channel actually does by looking at the flow. ## Start from the template 1. Open **Flows**, press **Marketplace**, and find **Smart !sr (find, check, queue)**, in the **AI helpers** pack. 2. Install it. You get the same shape as the plain `!sr`, with the AI in it: `!sr` → an **Only if** step that stops a bare `!sr` quietly → **Can they request a song?**, which checks your five song variables and answers a refusal with one line, replying with `$(from.rules.reason)` → **Find a song** with the AI picking the track → a second **Can they request a song?** on the found track, which skips a song already in the queue quietly → **AI: song fits my rules?**, which skips a troll upload quietly → **Request a song**. Nothing found, or Spotify not answering, gets one “couldn’t find that song” line. 3. Reword the two lines, or add the replies you want, the same as in any other flow. Two changes people often make to their copy: 1. **Say why a troll upload was skipped.** Add a **Chat message** such as `@$(user) that looks like a troll upload, so I’m skipping it.` and wire **AI: song fits my rules?**’s **troll** output to it. 2. **Add your own song policy.** Type a rule into the screen’s **Your song policy** box, such as “chill music only, no screamo”, and wire its **breaks policy** output to a line of your own — see [Screen out trolls and enforce your own rules](https://bloopbot.com/docs/song-requests-ai#policy). Already have an `!sr` flow? Either replace it with this one — pause the old one, or both will answer the same command — or drop a **Find a song** step in front of your existing **Request a song** and open the song box and choose that step’s **Track** value from the **Insert…** menu — or [drag a data wire](https://bloopbot.com/docs/data-wires) from its `uri` value onto the song box. > **Why the rules come first** > > **Can they request a song?** refuses everything a request can be refused for before anybody knows which track it is: requests switched off, a blocked viewer, a cooldown, a full queue, their own limit. None of it is AI and none of it costs anything. It goes first so someone who was never going to be allowed to queue anything can’t spam `!sr` and spend your AI on it. Keep it at the front if you rebuild this flow yourself. > **The one thing it cannot answer first** > > Before the search nobody knows which track the request is about, so “that one is already in the queue” waits for the second check, on the track **Find a song** settled on. It costs nothing — no AI, no Spotify call — and keeps a repeat from reaching the screening step. Keep it in front of **AI: song fits my rules?** when you rebuild this flow. ## Let AI pick the right track This section describes **Search for → A title or Spotify link**, the default mode. A sentence that describes a song instead is a different case, covered at the end of this section; [Find a song from a description](https://bloopbot.com/docs/song-requests-ai#find-song-from-description) is the same artist search offered as a suggestion-only command. Normally a song request queues Spotify’s first search result. The **Find a song** step looks at the top few results instead and asks the AI judge which one the viewer actually meant, from their own wording — the original rather than a karaoke cover, the artist they named rather than the loudest upload. Its **Pick the track the viewer meant (AI)** switch is on by default. Turn it off and the step takes Spotify’s first hit, exactly as a plain song request always has. A Spotify link is never sent to the judge, because a link already names one track. The step hands the track forward as data the rest of the flow can use: `uri`, `title`, `artist`, `album`, `explicit`, `duration`, the `confidence` behind the pick, and the runner-up it found — the `alt_uri` value in the **Insert…** menu, with its `alt_title`, `alt_artist`, `alt_album`, `alt_duration` and `alt_explicit` beside it. > **What the Unsure branch carries** > > A judge that is unreachable, unsure, or not confident enough leaves the step by **Unsure** carrying Spotify’s first result — so wiring **Unsure** to the same place as **Found** gives you exactly the behaviour you had before any of this existed, and **Smart !sr** is wired that way. In this title/link mode, that includes a channel without Smarter song matching: the step still searches and still hands on a track, going by **Found**, exactly as with **Pick the track the viewer meant (AI)** switched off. It is a branch of its own so you can tell “the AI picked this” from “nobody asked the AI”, and the run log says which happened. Artist-description search is the one case with no such fallback — see “No first-result guess in artist mode” under [Find a song from a description](https://bloopbot.com/docs/song-requests-ai#find-song-from-description). **When the request describes a song instead of naming it.** “That Bowie astronaut song” is not a title, so the search in **Smart !sr** and **Plain-English song requests** usually finds nothing for it: **Smart !sr** answers with its “couldn’t find that song” line, and **Plain-English song requests** stays quiet, because nobody typed a command. [Find a song from a description](https://bloopbot.com/docs/song-requests-ai#find-song-from-description) is the command for a description: it picks the artist out of the words, searches that artist’s tracks and suggests the one that matches, without queuing it. ## A smarter !wrongsong The next-best candidate comes out of **Find a song** as the `alt_uri` pin, so “that’s the wrong song, give me the other one” is a flow you build and can read rather than something the bot quietly remembered. The **Wrong song (swap to the runner-up)** template is exactly that: `!wrongsong` and the song they meant → find it → check there really is a runner-up → check it is not already in the queue and not a troll upload → take back what they last asked for → queue the runner-up that **Find a song** offers on the **Insert…** menu instead. The two checks are the same ones **Smart !sr** uses, pointed at the runner-up. If the runner-up is already queued or looks like a troll upload, the flow ends quietly and nothing changes: the viewer keeps the song they asked for. > **It looks before it removes** > > The find comes first on purpose. A bare `!wrongsong` with nothing after it, a channel without the feature, or a judge that can’t answer all mean there is no second guess to swap to — and every one of those paths falls back to the ordinary `!wrongsong`, which takes the song out and says so. Nobody ever loses a request to a step that then found nothing to replace it with. ## Request a song with no command at all Install **Plain-English song requests**, also in the **AI helpers** pack, and someone can type “can you play Space Oddity by David Bowie” — no `!sr` — to request it. **AI: chat means…** notices the request, **AI: pick out a detail** picks title-and-artist words already in the sentence, and **Find a song** searches for those words, the same as above. > **Extraction plus literal search** > > The sentence is read in two steps — Extraction plus literal search: the title picker pulls out the words it takes for a song title, and the search looks those up literally. A sentence with no title in it, such as “that Bowie astronaut song?”, is not requested; for that, a viewer can use [Find a song from a description](https://bloopbot.com/docs/song-requests-ai#find-song-from-description) below, which suggests a match without queuing it. Installed this template when it still had a second row for descriptions? Your installed copy is not automatically upgraded to the simpler one, so add **Plain-English song requests** again from **Flows → Add** — it arrives as a paused copy you can review — then pause or delete the copy it replaces. Because it uses **AI: chat means…**, it needs the Intent trigger feature too, and because **AI: pick out a detail** is a Judge & route node, it needs that feature as well — so this template asks more of your channel than **Smart !sr** does. Without Intent trigger it never starts; without Judge & route nodes it cannot extract a title. **AI: pick out a detail** is its own step, not tied to songs — set **What to pick out** to a username, a game or category name, a number, or describe your own in plain English, and any trigger can drive it. The template uses it to read **Text** (`$(message)`) and pick out **A song title**, then points **Find a song**’s search box at that step’s value, picked from the **Insert…** menu or drawn there as a [data wire](https://bloopbot.com/docs/data-wires). It screens the track with an **AI: song fits my rules?** step of its own, set up the same way as **Smart !sr**’s — a request with no command in front of it is not a request that skips the rules. Nobody typed a command here, so nobody is waiting on a reply: before anything is picked out or searched for, the template checks your song variables with **Can they request a song?**, and every way a request can end without a song — turned down by your limits, no title in the sentence, nothing found, already in the queue, a troll upload — is left unwired, so it simply stops. Wire one to a quiet chat line yourself if you would rather it said something, such as `@$(user) $(from.rules.reason)` on the first check’s **Refused** output. Two smaller templates in the same pack cover the other things people say without a command: **Plain-English “what song is this?”** answers someone asking what is playing, and **Plain-English “take my song off”** takes back the request of whoever asked — only ever their own, and it says so, so a misread sentence costs one request and no more. ## Find a song from a description Remember the artist and a clue, but not the title? **Find a song from a description** adds `!findsong`: it replies with a possible Spotify match and never queues a song. The song-request templates search for a title; this is the command for a description, and it only ever suggests, so you see the match before anything is queued. Before you start, check **Connections → Spotify** shows **Connected** — [the Spotify linking guide](https://bloopbot.com/docs/song-requests) covers linking — and check [Your plan](https://bloopbot.com/docs/what-your-plan-includes) includes both **Judge & route nodes** and **Smarter song matching**. These AI features may not be available on your channel yet. This command does not need **Intent trigger** or **Song policy**: it only suggests, so it does not screen or approve a request. 1. Open **Flows → Add**, find **Find a song from a description**, in the **AI helpers** pack, and add that flow on its own. Do not reinstall the whole pack: existing installed flows stay unchanged, and extra copies can answer twice. 2. Open **Canvas** and inspect the command’s path: `!findsong` → cooldown → **AI: pick out a detail** → **Find a song** → a chat reply. Keep the cooldown before both AI steps: it waits **5 seconds across the channel** and **20 seconds per viewer**. There is no **Request a song** action. 3. Check the extraction step: **Text** is `$(query)` and **What to pick out** is **A music artist**. In **Find a song**, keep **Search for** set to **A description of an artist’s song**, **What to search for** at `$(from.artist.value)`, **Original song description** at `$(query)`, and **Pick the track the viewer meant (AI)** on. The artist narrows the search; the full original clue tells the judge what to pick. 4. Review the three replies — the suggestion, the one asking for an artist and a clue, and the miss — press **Save**, then enable the flow. Make sure only one enabled flow answers `!findsong`. 5. In Twitch chat, type `!findsong that Bowie astronaut song?`. Keep the text after the command to at most **32 words and 500 characters**, including a named artist and a clue to one song. Inspect the reply and the flow’s **Run log**. Expected result: if Spotify returns Space Oddity among the candidates and the judge confidently matches the clue, chat may reply “Possible match: Space Oddity by David Bowie” with its Spotify URI. That is a possible result, not a guarantee. **Nothing is queued.** If it is the song you want and your channel’s request flows are enabled, send `!sr` followed by the returned URI; that separate request still goes through your normal request checks. > **One artist search, not the whole catalogue** > > The artist picker chooses a literal 1–6 word span from your message; it cannot invent an artist you did not name. For the example, a successful pick of “Bowie” leads to one Spotify search for `artist:"Bowie"`, with at most ten tracks. Jev ranks those candidates against the **full original clue**, not just “Bowie”. This is not a full discography search, a semantic web search or a lyrics search. There is no hardcoded music lookup and no generative model writing a title. If the right song is outside those ten results, the command cannot suggest it. > **No first-result guess in artist mode** > > Artist-description search always needs **Smarter song matching**, even if you turn its AI switch off. An unsure, unavailable or incomplete judgment supplies no track: it asks you to retry instead of presenting Spotify’s first hit. The default **A title or Spotify link** mode keeps its existing behaviour, including its first-result fallback. > **Test fire is only a simulation** > > Test fire does not call Spotify or Jev, and does not send a live chat reply; it cannot prove the lookup works. An enabled command sent in Twitch chat is the live path: it can reach Jev, Spotify and chat. Only try it when you want that reply posted. If the result is not what you expected: - “I could not tell which song you mean”: a bare `!findsong`, no named artist, text over the input limit, or a judge that was not confident. Retry with a full artist name and one specific clue, and check both required features in Plan & billing. Missing AI answers and uncertainty never become a first-hit suggestion. - “No match in the tracks I checked”: the search returned no usable match, or Spotify did not answer — not proof that the song does not exist. Check Spotify is still Connected on Connections, try a clearer artist name, or use a known title or Spotify link in your request flow. The Run log shows whether the search failed. - No reply at all? A search asked for again within a cooldown stops without a reply: wait 5 seconds, or 20 for your own next search. Otherwise check the flow is enabled, the command name is unchanged and its reply branches are connected. ## Screen out trolls and enforce your own rules The **AI: song fits my rules?** step runs two independent checks on a track before anything queues — never a timeout or a ban, just a branch you decide what to do with: - **Screen troll / meme / earrape uploads** — joke uploads, shock edits and bait tracks. On by default. A real song that happens to also be a meme still passes. - **Your song policy** — write your rules in plain English, one per line, e.g. “Nothing explicit” on one line and “No screamo” on the next. Each line is checked on its own, and a track that breaks any of them leaves by the **Breaks policy** branch. Leave it empty and that check is never asked. One **How strict** picker covers both: **Only the obvious ones**, **Balanced** (the default, and the safe starting point) or **Strict — turns down anything borderline**. Each branch is yours to wire: reply in chat, queue it anyway, log it quietly, or leave it unconnected so nothing happens at all. The step hands on **The rule it breaks**, so a reply can say which one: wire **Breaks policy** to a **Chat message** such as `@$(user) that song breaks a channel rule: $(from.check.broken_rule)`, picking the value from the **Insert…** menu. The track it checks includes whether Spotify marks it explicit, so a “Nothing explicit” rule is judged on that flag rather than guessed from the title. > **Length limits are a Check a value step** > > The judge can’t compare numbers reliably, so don’t write “no songs over six minutes” as a policy line. Add a **Check a value** step after **Find a song** instead: pick **Find a song**’s **Length in seconds**, choose **At most**, and type `360`. Wire its **false** output to a reply such as “that one’s over six minutes”, or leave it unwired to skip long songs quietly. > **Write the policy for a viewer, not a filter** > > The judge reads your policy the way a person would. “No screamo” works; you don’t need boolean logic or a list of banned artists. ## The Unsure branch matters Every AI step has an **Unsure** output. On a channel that doesn’t include the feature, that is the branch every request leaves by: the step is skipped rather than run, so a step that _checks_ a track simply doesn’t check it, and the request carries on with the track the flow already has. **Find a song**, in its default title/link mode, is different: it is never skipped for missing the feature. With or without Smarter song matching, it searches and hands a track on — by **Found** when it is entitled and confident, and still by **Found** (Spotify’s first result) the moment the feature is unavailable, exactly as with its AI switch off. Artist-description search is the one exception: it needs Smarter song matching to run at all, and supplies no track when unavailable or when the judge is unsure — see [the description guide](https://bloopbot.com/docs/song-requests-ai#find-song-from-description). Leave **Unsure** unwired on a _checking_ step and your song requests quietly stop being screened, and the editor puts a warning on the step if you do. ## Troubleshooting - Still queuing the first search result in title/link mode? Check your channel includes Smarter song matching and that **Pick the track the viewer meant (AI)** is on. In that mode, a low-confidence pick carries the first result on Unsure, which Smart !sr queues. Artist-description search never uses that fallback and the !findsong template never queues. - A genuine request turned down as a troll? Move **How strict** down a step, or switch troll screening off on the step. - Policy turning down things it shouldn’t? Check **The rule it breaks** in the Run log, then reread that line for anything stricter than you meant — the judge follows each rule literally. Two rules on one line are judged as one, so split them onto their own lines. - Nothing queues at all? Check the **Unsure** branch is wired on every _checking_ step (**AI: song fits my rules?** and the like) — a check without Song policy takes that branch, and an unwired branch stops the request. For artist-description search, also check that your channel includes Smarter song matching: that mode needs it to find a track. Title/link **Find a song** still hands a track on when matching is unavailable. - AI parts silent but requests still work? That is the intended fallback: a judge outage or a missing Song policy feature skips the screen, and the request carries on with the track already found. Title/link **Find a song** still searches without Smarter song matching, using the first result. Artist-description mode needs matching and asks for a clearer clue when it cannot settle on a track. - A request that describes a song isn’t found? The request templates search for a title. Use `!findsong` for a description — [Find a song from a description](https://bloopbot.com/docs/song-requests-ai#find-song-from-description) — and request the suggestion it gives with `!sr`. - Want the newer, simpler version of a template you installed earlier? An installed flow does not change by itself. Open **Flows → Add**, open the same flow’s review again and press its button — you get a paused copy — then pause or delete the older one; [templates and packs](https://bloopbot.com/docs/templates-and-packs) explains how copies work. - A troll upload or a repeat request gets no reply? That is how the template is drawn: those checks stop quietly. [Start from the template](https://bloopbot.com/docs/song-requests-ai#template) shows how to wire a line of your own to them. --- # Put now-playing on stream Show the current song and the requests coming up next in OBS. Updated 22 October 2026 ## Before you start This needs your song requests working: Spotify linked to the channel and the request flows on. If a song typed in chat does not reach the queue yet, start with [letting chat request songs](https://bloopbot.com/docs/song-requests). Nothing here needs a new Twitch permission, and it never posts to chat: the widget reads what your linked Spotify is playing and the request queue you already have. ## 1. Add a widget with a Now playing layer 1. Open **Overlays** and press **Browse templates**. 2. Press **Add** on **Now playing**, read its review and press **Add**. 3. Click the new **Now playing** card in **Your overlays** to open it. 4. The editor opens on the canvas, with the panel drawing the song that is playing right now and the requests queued behind it. Select the layer to open its settings on the right. Already have an overlay you want it on? Open it, choose **Add** on the left, and drag the **Now playing** tile onto the canvas, or open it and press **Add** to drop it in the middle — every type is offered on every overlay. ![Now playing 2 selected in Studio with its settings and track-first panel.](https://bloopbot.com/docs/screenshots/now-playing-widget-v2.jpg) _A Now playing layer selected in the editor: the canvas draws the track and the queue exactly as OBS will show them, with its Content tab open on the right._ **Now playing 2** gives the current track more room and groups the queue in the same panel. Select the layer, open **Content**, press **Preview new look**, then **Use new look** and **Publish**. Existing version 1 widgets keep their current look until you choose the new one. The screenshot shows version 2. The settings under the layer’s **Settings** shape the list under the track: - **Show up next** — the requests queued behind the current song. Turn it off to show the current track alone. - **Songs to show** — how many of them, from 0 to 5; 0 hides the list. - **Show who requested each song** — the viewer’s name beside the track and each request. - **Show how many songs are queued** — add the queue count, including the current track. This is off by default. **Theme** controls the colors, fonts, corners and spacing. Open **Parts · Layer** for the heading, track title, artist, requester and queued-song text. Studio, Capsule, Scoreboard and Minimal each keep the same song information; Minimal removes the panel background for content over your scene. The heading **Now Playing** and a refresh every five seconds are built in. Changes go into your draft; press **Publish** to put them on stream. ## 2. Put it on stream 1. In the widget’s editor open **OBS URL** — in the bar along the top, beside **Publish** — and select the copy icon (**Copy OBS URL**). You can also use the copy icon (**Copy URL**) beside the widget in the widget list. 2. In OBS, add a **Browser Source** to the scene that should show the song and give it a name you will recognise. 3. Paste the URL into the URL field, leave **Local file** off, and set the size to **1920 × 1080**. 4. Place the source where you want the song to appear, and keep its scene visible while you check it. > **Keep the URL private** > > A widget URL carries its access key: anyone who has the URL can open that widget. If you rotate the key, paste the new URL into every source that used the old one. ## A worked example You want the song and the queue in the bottom-left corner of your scene, under your camera. Add a **Now playing** widget, copy its URL and paste it into a **Browser Source** sized 1920 × 1080. In the widget’s editor, drag its box on the canvas to the corner you want — the box moves with it — and press **Publish**. A viewer types `!sr Sandstorm` in chat: the request is accepted, the song starts, and within five seconds the widget reads **Now Playing**, **Sandstorm**, **Darude**, with the requests queued behind it numbered underneath. ![Now playing 2 showing Sandstorm by Darude, requested by PixelPal, above three queued songs.](https://bloopbot.com/docs/screenshots/now-playing-panel-v2.jpg) _What the widget draws: the current track on top, then the requests coming up next with who asked for each._ The box you move is the widget’s own size and position on a 1920 × 1080 canvas, which is why a 400-wide box suits a corner. ## What you should see - The heading **Now Playing**, the song Spotify is playing, its artist and, when a viewer requested it, who asked for it. Your own music shows too, with no requester. - An **Up next** list: as many requests as **Songs to show**, numbered, each with its requester unless you turned that off. - **No song playing** when nothing is playing or Spotify is paused — the empty state, not an error. - No artwork, playback timer or player controls. - A new request appearing within about five seconds of being accepted, with nothing to do in OBS. ## If you already pasted the old URL into OBS The old `/overlay//nowplaying` address still works, so a stream showing it right now does not go blank. What moved is the page that managed it: the old **Overlay** page has been retired, and its address now takes you to the channel’s **Overlays** page instead. There, a card names the token your old link uses and offers **Rotate token** and **Revoke token** on it. To move over, create the **Now playing** widget above and paste its URL into the Browser Source in place of the old one: one copy-and-paste, and nothing else in your scene changes. ![The card on a channel’s Overlays page headed “Your old now-playing overlay”: the Overlay page has moved, the URL already in an OBS Browser Source still works, the token is shown masked, and Rotate token and Revoke token sit beside a link to how to put now-playing on stream.](https://bloopbot.com/docs/screenshots/overlay-retired-notice.jpg) _The card on the Overlays page that replaced the old Overlay page: it names the URL you already have, shows the token masked, and rotates or revokes it._ ## If nothing shows - Nothing is playing, or Spotify is paused. The widget shows a track only while Spotify is actually playing one. - Spotify is not linked, or the request flows are off — see [letting chat request songs](https://bloopbot.com/docs/song-requests). - The songs missing from **Up next** were queued in Spotify itself. The current track follows Spotify, but **Up next** lists only the requests made in your channel, not Spotify’s own queue. - The Browser Source is in a scene that is not visible, or sits behind a full-screen capture. Keep the scene visible while you check it. - You rotated the old token: the URL already in OBS stops working and the source shows an invalid-token message. Rotate or revoke from that card on Overlays, then paste the widget URL into the source. - The source is the wrong size: a 1920 × 1080 source is what the editor’s canvas shows, so the widget lands where you put it. --- # Let viewers share videos Viewers ask for a YouTube video with a channel points reward or bits, you, your editors or a moderator approve it on the Media share page, and it plays on your overlay. Updated 14 November 2026 ## What you can do Media share lets viewers ask for a YouTube video to watch together on stream. A viewer redeems your **Share a video** channel points reward with a link, or cheers 500 bits with a link in the message, and the video waits on your **Media share** page. Nothing plays until you, your editors or a moderator press **Play**; approved videos then play one at a time on the **Media share player** layer of your overlay. ## Before you start - The **Media share** pack has the four flows: one takes requests with channel points, one takes them with bits, one refunds skipped points requests, and one lets moderators skip with `!skipvideo`. It also brings the overlay with the player on it. - To play videos on stream you need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) shows how to add one as a Browser Source. - Channel Points and Bits need to be available on your Twitch channel. Eligible channels can unlock them through monetization onboarding before becoming Affiliate; Bloopbot also needs permission and Twitch support for the reward operations and events it uses. [Check which Twitch features your channel can use](https://bloopbot.com/docs/flow-basics#twitch-affiliate) explains the checks. ## Get help with your setup Optional **Help me** explains intake and playback separately. Pausing the player does not stop the intake flow from accepting submissions; pause that flow too when you want requests to stop. Reviewing setup does not submit or play viewer media. ## Add the pack and its reward 1. Open **Flows**, press **Marketplace**, and choose the **Media share** pack. 2. Its review asks about the **Share a video** reward. Leave **Make it for me** chosen, and Bloopbot creates it on Twitch: 1,000 points, with a box where the viewer pastes a link (_Paste a YouTube link_). It arrives switched off; switch it on in Twitch's channel points settings when you are ready. Change its cost there too. 3. Add the flows. They arrive paused; switch on **Share a video with points** and **Refund skipped video requests**. The pack also brings a **Media share** overlay with the player on it ([Put the player on your overlay](https://bloopbot.com/docs/media-share#player)). When a viewer redeems **Share a video** with a link, the video is checked and waits on your Media share page, and chat hears _Thanks PixelPal, your video is waiting for approval._ When it is turned down — too long, not allowed outside YouTube, already waiting — chat hears why, such as _PixelPal: That video is longer than 5 minutes._, and Bloopbot refunds their points if it made the reward (see the note on refunds below). The refund is tried even if Twitch drops chat's reply. ![The Share a video with points flow on the flow canvas: On a reward redeemed for Share a video, Request a video with its Queued, Refused, No link and error outputs, a thank-you chat message on Queued, and on Refused or No link a chat message with the reason followed by Fulfil or refund reward, which cancels and refunds the points. Dashed data wires run from the trigger's Redeemer into both chat messages.](https://bloopbot.com/docs/screenshots/media-share-flow.jpg) _Share a video with points: the reward, Request a video, a thank-you, or why not and a refund._ Viewers can paste a `youtube.com/watch` link, a `youtu.be` link, a Shorts link, an embed link (`youtube.com/embed/…` or `youtube-nocookie.com/embed/…`), or the video's 11-character id. If a viewer pastes more than a link, the first link counts, and a word, emoji or full stop stuck to the end of it is ignored. The checks live on the **Request a video** step in the flow: open it to change **Max length** (5 minutes to start), **Min views** (1,000), **Allow music** (off) or add **Blocked words**. **Refunds only work for a reward Bloopbot created.** Twitch only lets Bloopbot give points back for a reward Bloopbot made, so if you pick a reward of your own instead of **Make it for me**, a turned-down or skipped request keeps the viewer's points. If you want refunds, choose **Make it for me**, or create the reward again that way. ## Take bits requests too Switch on **Cheer bits to share a video**. A cheer of 500 bits or more with a YouTube link in the message asks for that video, and it waits on the page like any other. A cheer with no link passes quietly. Change the amount on the flow's **Bits cheered** trigger. **Bits can't be refunded.** A bits request that is turned down, skipped or removed keeps its bits, and chat says so when one is turned down. The pack's description says it too, so say it on your stream before viewers cheer for a video. ## Approve videos on the Media share page 1. In the dashboard sidebar, open **Viewers** › **Media share**. You, your editors and the moderators you have [ticked in on Team](https://bloopbot.com/docs/editors#tick) can use the page, and each can do everything on it; only you and your editors see the button that adds the **Media share** pack. 2. **Waiting** lists every request with its title, channel, length, who asked, how they paid and when. The open-in-new icon (**Open on YouTube**) opens the video in a new tab so you can check it first. The page never shows a thumbnail or plays a video itself. 3. Press the play icon (**Play**) to approve a video. It joins **Up next**, and plays as soon as nothing else is playing. The bin icon (**Remove**) turns a request down. 4. In **Up next**, the arrows move a video up or down the play order, and the bin icon takes it out. 5. **Now playing** shows the video on stream, who asked for it, how they paid, and how far in it is. **Skip** ends the video the page shows and plays the next; if that video has already ended by the time you press it, nothing is skipped, so two people pressing **Skip** at once end one video, not two. `!skipvideo` in chat skips whatever is playing at that moment. **Pause** lets the current video finish and holds the rest; **Resume** carries on. 6. **History** keeps the last 7 days: what played, what was skipped or removed, and what failed to play. ![The Media share page: Now playing shows How to fold a paper crane requested by PixelPal with points, 0:00 of 3:34, with Skip; Up next holds one video with move up, move down, Open on YouTube and Remove buttons; Waiting holds one from a cheer of 500 bits with Open on YouTube, Play and Remove buttons; History is empty. No thumbnails.](https://bloopbot.com/docs/screenshots/media-share-page.jpg) _The Media share page: a video playing, one up next, one waiting from a cheer of 500 bits._ The page refreshes on its own every few seconds. At most 50 requests can wait at once; the 51st is turned down with _The request queue is full_. ## Put the player on your overlay The **Media share** pack brings a **Media share** overlay with one player on it, at the right edge. In the pack's **Set it up**, press **Copy URL** and paste it into a Browser source in OBS ([Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs)); it shows nothing until a video plays, so it can sit on top of any scene. To put the player on an overlay you already use instead: 1. Open **Overlays**, open the overlay you use in OBS, and choose **Add** at the top of the left panel. 2. Under **Media**, open **Media share player** and choose **Add**. It lands in the middle of the canvas as a dashed card at the player's size. Studio never plays a real video; the card is where it will be. 3. Drag it where you want it, and set **Player width** (480 to 1920 pixels; the height follows at 16:9). **Show requester** puts _Requested by_ and the viewer's name above the player; **Show title** puts the video's title below it. **Volume** sets how loud videos play, from 0 to 100. 4. Choose **Publish**. ![A Media share player selected in Studio: the canvas shows its dashed placeholder card reading Approved videos play here, with Requested by PixelPal above and a placeholder line below, and the Content tab shows Player width 854, Show requester, Show title, Volume 60 and Scale fixed at 1 with the reason.](https://bloopbot.com/docs/screenshots/media-share-player.jpg) _The Media share player on the canvas, and its settings with Scale fixed at 1._ **Scale** shows 1 and can't be changed, and the layer has no resize or rotate handles: YouTube's rules say its player is shown whole — never scaled, covered, hidden while it plays or smaller than 480 by 270. Keep other layers off it, and leave crop and filters off the Browser Source in OBS. Nothing shows between videos. Only one Media share player plays at a time, even if several of your overlays have one, so a video never plays twice over itself. The first one open in OBS plays; any other shows _Playing in another source_. If that one closes, another takes over and starts the current video again from the beginning. Refreshing the source that plays moves on to the next video. Hiding the player on a published overlay, with its eye in Studio or a visibility rule, stops the video; showing it again starts that video from the beginning. **Hear the videos in OBS.** The video's sound is part of the overlay's Browser Source. For your viewers to hear it, tick **Control audio via OBS** in that Browser Source's properties. OBS then mixes the source's sound into your stream and recording. With that ticked, you won't hear the video yourself until OBS monitors it: in OBS, open **Advanced Audio Properties** from the Audio Mixer's gear or three-dot menu (or from **Edit → Advanced Audio Properties**), find the overlay's Browser Source, and set its **Audio Monitoring** to **Monitor and Output**. With **Control audio via OBS** off, which is OBS's default, the page's sound goes to your computer's own audio output instead, and your viewers only hear it if OBS also captures your Desktop Audio. ## What you're responsible for Every video that plays is on your stream, so you are responsible for it. Spoken viewer messages are a different tool: they are read out by a synthetic voice, with no approval step, and are cleaned and limited as [Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech#cleaned) describes. Twitch's rules on music and copyright apply to it as they do to anything else you show. - Music videos are the usual cause of copyright strikes on Twitch. That's why **Allow music** is off: YouTube's Music category and music.youtube.com links are turned down unless you switch it on. - Every request waits for you, your editors or a moderator. Open a video with **Open on YouTube** before you press **Play** if you aren't sure what it is. - Viewers can only share videos their owners allow to be played outside YouTube, and never age-restricted videos, livestreams or premieres. ## Build your own video request flows Two steps and one trigger in the node library, under **Media share**, do everything the pack does: - **Request a video** — checks the YouTube video in **Link** and puts it on your Media share page to wait for approval. `$(input)` is what a viewer typed with a reward, `$(message)` a cheer’s message, and the first YouTube link in it counts. Its rules are **Max length** (30 to 1800 seconds, 300 to start), **Min views** (0 to 10,000,000, 1,000 to start), **Allow music** (off to start) and **Blocked words** (a comma list matched against the title, whatever its capitals). It leaves by **Queued**, by **Refused** with the reason in `$(from..reason)` — such as _That video is longer than 5 minutes_ — or by **No link** when the text has no YouTube link at all. - **Skip the video** — skips the video playing, and the next approved one plays. It leaves by **Skipped**, or **Nothing playing**. And one trigger: - **Video request ended** — runs when a request ends: it played, was skipped or removed, or failed to play. **Outcome** picks which (Skipped and Removed to start) and **Paid with** picks channel points, bits or anything else. Its tokens are `$(title)`, `$(requester)`, `$(outcome)`, `$(source)` and `$(bits)`. A request paid with channel points carries its redemption, so **Fulfil or refund reward** after it can give the viewer their points back when Bloopbot made the reward. Any flow can read media share without a step: `$(data.mediashare.current_title)` is the video playing, `$(data.mediashare.current_requester)` who asked for it, and `$(data.mediashare.waiting)` and `$(data.mediashare.approved)` how many wait. The pack also has **!skipvideo skips the video**: moderators and you type `!skipvideo` in chat to skip what plays. ## Try it without going live 1. In the overlay editor, open **Simulate** and choose **Queue a test video**. A Creative Commons short film from _Test viewer_ joins **Waiting** on your Media share page. 2. With the overlay open in OBS, press **Play** on it on the Media share page. It plays in OBS, with its sound. 3. Press **Skip** to end it. The canvas in Studio shows the placeholder card the whole time; only OBS plays the video. ## Troubleshooting - **Twitch refuses to create the reward, or points and Bits requests never arrive.** Check monetization onboarding and that Channel Points or Bits are available in Twitch’s Creator Dashboard. Read any reason shown by the reward picker or **Flows → Needs attention**. Choose **Re-authorize** on **Connections** only for missing permission; reconnecting does not change what Twitch allows other apps to do on your channel. - **Chat says _Video requests aren't available on this channel yet_, and the page says the same.** Video requests can't be checked on your channel yet. Nothing you set changes that. - **Chat says _Video requests aren't available right now_.** YouTube didn't answer the check, or the request couldn't be saved. Try again in a few minutes. The request ends as turned down, so a points request is refunded when Bloopbot made the reward. - **A request is turned down.** Chat says why: too long for your **Max length**, too few views for your **Min views**, a music video while **Allow music** is off, a blocked word in its title, not allowed outside YouTube, age-restricted, a livestream or premiere, already waiting, or 50 requests already waiting. - **The page says _No Media share player is open_.** Approved videos wait until an overlay with a Media share player is open in OBS; then the next one starts there. - **An overlay shows _Playing in another source_.** Another Browser Source with a Media share player is playing. Remove the player from the overlays you don't want to play, or close them in OBS. - **A video is marked _Failed to play_ in History.** Its owner doesn't allow it to be played outside YouTube, or YouTube stopped it. With points, the viewer gets their points back when Bloopbot made the reward. - **Points don't come back.** Twitch only lets Bloopbot refund a reward Bloopbot created: choose **Make it for me** when you add the pack, or create the reward again that way. - **You hear the video but viewers don't, or the other way round.** See [Hear the videos in OBS](https://bloopbot.com/docs/media-share#player): **Control audio via OBS** and **Monitor and Output** decide who hears what. - **Nothing happens when a viewer types !skipvideo.** Only moderators and you can use it. --- # Create a clip with your own title Make a clip from a flow, choose its title and share the link in chat. Updated 9 October 2026 ## Before you start You need to be live on Twitch, with clips enabled for your channel. Clips are made as you, on your own Twitch account, so they are yours and follow your channel's clip settings. If **Connections** shows **Update available** for Twitch, choose **Re-authorize** there; until you do, your [bot account](https://bloopbot.com/docs/bot-account) makes the clips. The ready-made **Clip it** flow allows moderators and you to use `!clip` and includes a cooldown. ## 1. Open the clip flow 1. Open **Flows**, press **Marketplace**, and add **Clip it** on its own (it is in **Starter**). If you already have it, open your copy from **Flows**. 2. Switch to **Canvas** and select **Create a clip**. 3. In **Title**, type the name you want on each clip. Leave it empty to let Twitch choose the title. 4. To choose how long each clip is, open **More options** and type a number of seconds in **Length (seconds)**, from 5 to 60. Leave it empty to let Twitch make its usual 30-second clip. 5. Choose **Save**, then turn on the flow if it is paused. ![The Create a clip settings panel, with the Title field containing That dragon dodge and an Insert… menu on its label row, and the More options fold opened to show the optional Length (seconds) field, empty, with its note that 5 to 60 seconds are allowed and blank means Twitch’s 30.](https://bloopbot.com/docs/screenshots/flow-clip-title.jpg) _The Create a clip step has an optional Title field and, under More options, an optional Length in seconds._ ## 2. Let a moderator name the moment Enter `$(query)` in **Title** to use everything typed after the command. For example, when a moderator types `!clip That dragon dodge`, the clip is titled “That dragon dodge”. Typing `!clip` alone leaves the title to Twitch. The **Insert…** menu beside the field offers other flow values, such as `$(user)` for the person who used the command. To keep everyone else from making clips, leave the ready-made **Who can trigger** check connected before **Create a clip**. [Add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns) explains those checks. ## 3. Check the result Use **Test fire** and expand the **Run log**. When the test reaches **Create a clip**, its line shows the title it would request. The ready-made **Clip it** flow checks for a moderator first, and the default test viewer is turned away at that check. A test does not create a Twitch clip or post in chat. While you are live, use the command as a moderator in Twitch chat to check the real result: the bot replies with the clip link, and the clip uses your title. If the flow says you are not live, try again during a stream. If Twitch refuses the clip, check that clips are enabled for your channel. If **Connections** shows **Update available** for Twitch, choose **Re-authorize**. Twitch can also refuse a title that fails its moderation checks; try a different title. A blank **Title** uses Twitch’s default. To clip a moment from a stream that is already over, see [Find your best moments with Highlights](https://bloopbot.com/docs/highlights). --- # Find your best moments with Highlights Let Highlights look through your past streams for the moments worth sharing, watch them, make Twitch clips of the best ones and optionally clip automatically after every broadcast. Updated 14 November 2026 ## What Highlights does After a stream ends, the best moments are hard to find again: you were busy playing. **Highlights** looks through your saved broadcast for you. It listens for the places where something happened, such as laughter, a shout or chat suddenly going wild, writes down what was said and what chat did, and rates each moment from **Quiet** up to **Standout**. The best ones appear on your **Highlights** page, ready to watch, clip or dismiss. Nothing is posted for you unless you choose it. A Twitch clip is made only when you press **Make Twitch clip**, or when you turn on the automatic flow in [step 4](https://bloopbot.com/docs/highlights#auto). The optional microphone trial temporarily keeps private audio: [What is kept](https://bloopbot.com/docs/highlights#kept) lists exactly what it holds on to. ## Before you start - Highlights is an **add-on**, not part of a plan, and it may not be switched on for your channel yet. Without it, the **Highlights** page shows _Highlights is an add-on. Ask us to switch it on for your channel._ with a **Contact us** button. Once it is on, everything below works on any plan. - It reads your **past broadcasts as Twitch saved them**. Check that your Twitch channel keeps past broadcasts (in Twitch’s own stream settings); a stream Twitch did not save cannot be looked through. Broadcasts longer than 8 hours are skipped. - English works best. - To make Twitch clips you also need to give clip-making permission once, as described in [step 3](https://bloopbot.com/docs/highlights#clip). Looking for moments does not need it. ## Get help with your setup Optional **Help me** explains access and the automatic Highlights switch without processing a broadcast. Enabling automatic work can schedule eligible broadcasts; a switch being on does not prove processing succeeded or a clip exists. Review actual moments and make clips through the normal controls. ## 1. Switch it on 1. Open **Highlights** in the sidebar, under **Channel**. 2. Turn on the **Highlights** switch at the top right of the page. Highlights starts with your **last three saved broadcasts**. If your channel is live, they wait until you finish streaming. A message under the page header says _Highlights is on. Looking through your last 3 streams now._ After that, each new broadcast is looked through about ten minutes after it ends, and its moments are ready, usually, within the hour. The **Broadcast library** lists your streams with their title, date and status. Select a broadcast to review its moments beside the list (below it on a phone): | Status | What it means | | --- | --- | | Waiting its turn | The broadcast is in line to be looked through, waiting for your stream to end or for Twitch to finish updating its recording. | | Finding moments | It is being looked through now. Moments appear in the selected broadcast as they are found; the page checks again by itself every so often. | | Ready | Every moment has been found and rated. | | A sentence about the recording | Twitch’s recording was not available, would not be read, or was longer than 8 hours. | | _Something went wrong on our side. It will not be retried._ | Something failed on Bloopbot’s side while the broadcast was being looked through. It is not tried again. | | Stopped when you turned Highlights off | You switched Highlights off while the broadcast was still being looked through. | The switch is yours to flip at any time. Turning Highlights off stops broadcasts that were still being looked through, and keeps the moments found so far. ## 2. Read a moment Select a stream in **Broadcast library**. Its title and status appear above its moments, in the order Highlights ranked them. Selecting another stream changes the review pane; it does not restart processing or make clips. ![The Broadcast library lists two streams beside the selected broadcast, Chapter 7 in one sitting. Its moments show separate Broadcaster / mic and Stream / game (mixed) excerpts, times, ratings, chat and the watch, clip and dismiss actions.](https://bloopbot.com/docs/screenshots/highlights-page.jpg) _The Broadcast library beside the selected stream’s moments, with separate microphone and mixed stream dialogue and one moment still showing Rating…._ A moment shows: - **The time**, as hours, minutes and seconds into the broadcast. - **The rating**: **Quiet**, **Small**, **Decent**, **Strong** or **Standout**. It reads **Rating…** while a moment is still being rated, and **Not rated** if it could not be. - **Broadcaster / mic** shows a short excerpt from your separate microphone recording when the trial filter captured it and its timing was reliably matched for the whole moment. _No intelligible mic speech_ means the matched microphone window yielded no words. _No aligned mic recording for this moment_ means microphone evidence was unavailable; it does not mean you were silent. - **Stream / game (mixed)** shows words from the saved broadcast. It can include game dialogue, your own voice, other speakers and alerts. Up to three chat lines appear underneath. - **You marked this** (a bookmark) appears under the rating when you or an editor set a Twitch stream marker at that moment while you streamed; see [Mark moments while you stream](https://bloopbot.com/docs/highlights#mark). - **Viewers clipped this** (two people) appears under the rating when a viewer made a Twitch clip of that part of the broadcast, and links to their clip; see [When viewers clip it too](https://bloopbot.com/docs/highlights#viewer-clips). A broadcast with no moments says so: _Nothing stood out in this stream._ That is a normal result for a quiet stream, not a fault. ## 3. Watch it, clip it or dismiss it Each moment has buttons on the right; hover one to see its name. A moment that has not been clipped shows five, and a clipped one swaps **Make Twitch clip** for **Download clip**. - **Watch on Twitch** (the arrow out of a box) opens your broadcast on Twitch at the time shown, where the clip starts. Newly processed moments normally start five seconds before the detected reaction, with 25 seconds afterwards. Near the start or end of a broadcast, the window is shorter. - **Good clip** and **Not a good clip** (the thumbs up and thumbs down) are your yes or no to _Good clip?_ for that moment. Press one to answer; it stays lit so you can see your answer, and pressing it again takes the answer back. You do not have to answer. Your answers help improve which moments Highlights finds, and nothing else changes when you give one. See [What is kept](https://bloopbot.com/docs/highlights#kept). - **Make Twitch clip** (the film) opens a dialog where you trim the clip before Twitch makes it. **Title** starts as your stream’s title followed by _highlight_ (empty if Bloopbot cannot read your stream’s title); change it as you like, up to 140 characters. **Suggest titles with AI** (the sparkles, beside the field) asks an AI model for three titles in different moods, **Funny**, **Hype** and **Deadpan**, written from what was said and what chat typed (without usernames) and in the style of your channel's recent clip titles. They appear under the field; select one to put it in the field, then edit it as you like. Press the sparkles again for three new ones. If no title comes back, the dialog says why and leaves the field as it was. Clear the field and the clip is titled with your stream’s title followed by _highlight_. **Start** and **End** (whole seconds) begin at the moment’s own times, and each has **−1 s** and **+1 s** buttons that move that edge one second at a time. **Clip length** shows the result: a Twitch clip runs 5 to 60 seconds, can start up to 30 seconds before the moment and end up to 30 seconds after it, and stays inside the broadcast, so a button that would break one of those limits is unavailable. **Watch on Twitch at** opens your broadcast at the start you chose, so you can check the cut before you make it. Press **Make clip** to ask Twitch, or **Cancel** (or **Esc**) to leave the moment as it was. If Twitch refuses, the dialog stays open and says why. A moment that has been clipped shows **Clipped** instead, which opens the clip on Twitch. A moment is clipped at most once. When viewers already clipped the moment, this button reads **Make your own clip**; it does exactly the same. **Make Twitch clip** is unavailable while the moment still shows **Rating…**. - **Download clip** (the tray arrow) appears once a moment is clipped. It lists links to the clip's video file: **Landscape**, and **Portrait (vertical)** when Twitch has made one. Open a link to get the file. Your browser may play the video first; if it does, use the player's menu or your browser's **Save** command to keep it, then edit or post it yourself. Twitch makes these links on request and they stop working after a short while, so Bloopbot never keeps them: press **Download clip** again for fresh ones. Press the button again, or **Esc**, to close the list. If Twitch says it has no download yet, wait a moment and try again. - **Dismiss** (the cross) hides the moment and deletes the words and chat kept for it. ![The Make Twitch clip dialog: a Title field holding a picked AI title, the sparkles button beside it, and three AI title ideas labelled Funny, Hype and Deadpan under it, then Start and End times each with minus one second and plus one second buttons, the clip length, a Watch on Twitch link, and Cancel and Make clip buttons.](https://bloopbot.com/docs/screenshots/highlights-clip.jpg) _The Make Twitch clip dialog: three AI title ideas, Funny, Hype and Deadpan, under the title, the Hype one picked, Start and End times with −1 s and +1 s buttons, the clip length, a Watch on Twitch link, and Cancel and Make clip._ ![A clipped moment on the Highlights page with the Download clip button pressed. A small list under it offers Landscape and Portrait (vertical) links.](https://bloopbot.com/docs/screenshots/highlights-download.jpg) _A clipped moment with the Download clip list open, offering Landscape and Portrait (vertical) links._ A clip made this way is a normal Twitch clip on your channel. It is **public**, so anyone can watch it and see its title, which is the one in the dialog when you pressed **Make clip**. Read it before you do: if you asked the AI for a title, a filter checks it, but it can still be wrong or off. Delete a clip you do not want from Twitch’s own clip list. Editors can switch Highlights on and off, clip, download and dismiss. A moderator can open the page and read it, nothing more. ## Allow clip making Highlights finds moments without any extra permission, but a clip is made as you, on your Twitch account. The first time, a bar called **Allow clip making** sits under the page title. The channel’s owner presses **Allow clip making**, approves the permission on Twitch and comes back to the page. It only needs doing once. Editors and moderators see the bar but cannot give the permission, so ask the owner to open the page. ## If Twitch refuses a clip Twitch sometimes refuses a clip, for example when clips are turned off for your channel or for a broadcast Twitch will not clip. The moment then shows Twitch’s reason in its own words, next to **Watch on Twitch at this moment**, so you can still go and see it. Nothing is changed by a refusal; press **Make Twitch clip** again once the cause is fixed. ## 4. Clip the best moments automatically If you would rather have clips waiting after every stream, use the ready-made flow. 1. Open **Flows**, press **Marketplace** and open the **AI helpers** pack. 2. Add **Auto-clip the top 3 highlights** on its own (it is in the **AI helpers** pack). It is paused when you add it. 3. Open the flow and check the **Clip the top highlights** step. **How many** is 3 by default and can be 1 to 5. Under **More options**, **Clip title** replaces the title; leave it empty and each clip is titled with your stream’s title followed by _highlight_. A flow never uses the AI’s suggestions: they only start the title in the dialog when you clip by hand. 4. Turn the flow on. ![A Highlights are ready trigger connected to a Clip the top highlights step on the flow canvas. The step is selected, and its settings panel shows How many set to 3.](https://bloopbot.com/docs/screenshots/highlights-auto-clip-flow.jpg) _The Auto-clip the top 3 highlights flow: Highlights are ready, followed by Clip the top highlights with How many set to 3._ The flow starts with the **Highlights are ready** trigger, which runs once for each broadcast after all its moments are rated. It then runs **Clip the top highlights**, which clips the best moments of that broadcast, best first. The flow always uses each moment’s own times, not a trimmed window. A moment Twitch refuses does not stop the others. The step fails only when no clip at all could be made, for example before you have pressed **Allow clip making**, and the run log says why. > **Automatic clips are public** > > Once this flow is on, up to the number of clips set in **How many** (3 to start, up to 5) are posted to your Twitch channel after every broadcast without asking. Leave the flow off if you would rather choose clips yourself on the Highlights page. You can also build your own flow from **Highlights are ready**. Its **Moments** value says how many moments were found, and **Broadcast link** is the broadcast on Twitch, for example to post it in your Discord. The **Clip the top highlights** step only works right after this trigger. See [Create a clip with your own title](https://bloopbot.com/docs/clips) for live clips made while you stream. ## Mark moments while you stream You do not have to wait for Highlights to find the good parts. When something happens, put a **stream marker** on it with Twitch's own tools: - the **Add Stream Marker** quick action on Twitch's Creator Dashboard; - **/marker** in your chat, which works for you and for your channel's editors; you can add a few words after it if you like; - a Stream Deck or another tool that adds a Twitch stream marker; - a flow of your own: Bloopbot's **Stream marker** step drops a marker when a raid, a hype train or a `!mark` command runs (see [Mark a moment for your highlights](https://bloopbot.com/docs/polls-and-predictions#markers)). A marker counts whoever placed it: you, an editor, a flow or a tool. After the stream, Highlights reads the markers on that broadcast and makes sure each one gets a moment, even where its own listening heard nothing special. The moment ends at the marker and starts about 30 seconds before it, so mark a little after the thing you want to keep. A moment with a marker in it, or just after it, shows **You marked this**, and it always stays in the stream's list, even when more than twelve moments rate higher. It is rated like any other, and a marker does not raise the rating. ![A moment on the Highlights page with the label You marked this, with a bookmark icon, under its rating. Beside it are its dialogue and the watch, good clip, not a good clip, clip and dismiss buttons.](https://bloopbot.com/docs/screenshots/highlights-marked.jpg) _A Highlights moment rated Decent with the label You marked this under its rating, beside its dialogue and the Watch on Twitch, Good clip, Not a good clip, Make Twitch clip and Dismiss buttons._ Good to know: - Highlights needs nothing new from you: it reads the markers with the permission you gave when you connected your channel to Bloopbot. If your markers never show up, sign in again from **Connections** and process the next broadcast. - Twitch cannot place markers when your channel does not save past broadcasts, and a stream Twitch did not save has no moments at all (see [Before you start](https://bloopbot.com/docs/highlights#before)). - The words you type after **/marker** are never read or kept. Only the time of the marker is. - If Twitch cannot be reached when the broadcast is looked through, Highlights goes ahead without the markers rather than waiting, so that stream's moments are found as usual and just do not carry the label. ## When viewers clip it too Viewers clip your broadcast as it happens, and they often pick the same moments Highlights does. After a stream, Highlights looks at the clips viewers made of that broadcast, and usually makes sure the most-viewed ones get a moment, even where its own listening heard nothing special. A very busy stream can have more clips than it can look through, so the least viewed may be left out. The moment ends where the viewer's clip ends and covers the clip's length. A clip made after Highlights first looked through the stream, which is common, is picked up when the moments are about to be rated, so the label still shows, but the clip does not make a moment of its own then. A moment that a viewer's clip covers by at least half of the clip shows **Viewers clipped this** under its rating, and the words are a link to the clip on Twitch. If several clips cover the moment, the link goes to the one with the most views. Highlights rates the moment as it does any other and then lifts it by half a level, so among moments of a similar rating the ones your viewers picked come first. The lift only changes the order, never the rating shown: a moment still reads **Decent** or **Strong** as Jev rated it, and the order never ranks a moment above **Standout**. ![A moment on the Highlights page rated Strong with the label Viewers clipped this, with a two-people icon, under its rating, linking to the viewers' clip. Beside it are its dialogue and the watch, good clip, not a good clip, make your own clip and dismiss buttons.](https://bloopbot.com/docs/screenshots/highlights-viewer-clip.jpg) _A Highlights moment rated Strong with the label Viewers clipped this, with a two-people icon, under its rating, beside its dialogue and the Watch on Twitch, Good clip, Not a good clip, Make your own clip and Dismiss buttons._ You can still make your own clip of the moment. The clip button is then called **Make your own clip**, because a viewer's clip is already out there. Your own clip is a fresh one with the title and trim you choose. A clip you made yourself never counts as a viewer's clip, whether you made it on Twitch or Highlights made it for you. Good to know: - Highlights reads these clips with Bloopbot's own Twitch access to public clips; it needs nothing new from you. - Only clips that Twitch ties to the broadcast, with a place in it, made by someone other than you, count. Clips of other streams, and clips Twitch cannot place, are left out. - If Twitch cannot be reached when the clips are looked up, the stream's moments are found as usual and just do not carry the label. ## Optional microphone trial The Bloopbot OBS microphone filter is an early trial and may not be available for your channel yet. Highlights continues to work with your saved broadcast without it. The filter can give Highlights a separate copy of your microphone to help recognize reactions when game sound is loud. Detection quality is still being tested. If you already have the trial filter in OBS: 1. Open your microphone source’s **Filters** and select **Bloopbot Highlights microphone (spike)**. 2. Press **Sign in to Bloopbot**, approve microphone access in your browser and wait for **Signed in to Bloopbot for Highlights microphone access**. Sign in as the channel owner or an editor, with Highlights available and switched on. 3. Turn on **Allow microphone capture** and **Send microphone audio to Bloopbot for Highlights**. Both start off. Capture starts only while OBS is streaming. 4. To test phrase recognition, turn on **Test local wake phrase (does not create clips yet)**. **Wake phrase** starts as **Clip That** and accepts English words. Saying it currently tests recognition; it does not create a Twitch clip. 5. Turn the controls off or remove the filter to stop capturing. **Sign out of Bloopbot** revokes its microphone access. The trial filter remembers your sign-in securely in macOS Keychain or Windows Credential Manager and checks it again when OBS opens. You may need to sign in once after updating from an older trial filter. Access renews automatically, including during a long stream. Temporary connection failures retry without forgetting your sign-in. After 90 days without renewing access, or if access is revoked, sign in again. **Sign out of Bloopbot** removes the remembered login. There is no server URL or helper/model path to configure. The filter connects to Bloopbot and uses its bundled resources. Microphone audio is matched against the saved broadcast’s sound to account for stream delay. If there is no reliable match, Highlights uses the broadcast and chat alone. The two dialogue excerpts stay separate when Highlights rates a moment, so game characters’ lines are not assumed to be your speech. The mixed transcript is not a game-only recording, and game sound leaking into your microphone can still appear in the mic excerpt. Finished clips keep the broadcast’s audio. The bottom of OBS shows **Bloopbot Mic** so you can check the trial without opening Filters: - **Ready** means capture is enabled and waiting for you to stream. **Off** means capture or the filter is disabled; **No filter** means none is installed on a source. - **Sign in before streaming** means an enabled upload filter needs sign-in. Open your microphone’s **Filters** and press **Sign in to Bloopbot** before going live. **Check connection · retrying** means its saved sign-in could not be checked; check your internet connection and that your operating system’s credential storage is available. - **Active · Sending** means microphone audio is being captured and Bloopbot has recently accepted an upload. It can take a few seconds to appear after streaming starts. Hover the indicator to see how many filters are capturing and sending. - **Active · Local only** means capture is running with upload off. **Active · Sign in** or **Active · Signing in** means upload is waiting for sign-in. - **Waiting for audio** means streaming has started but the filter is not receiving microphone audio. Check that your microphone source and filter are enabled. - **Active · Upload pending** means no upload has been acknowledged in the last six seconds. **Active · Upload error** means the connection failed. Open the microphone's **Filters** to check sign-in and upload; capture can continue locally while upload is unavailable. - **Active · Upload paused · retrying** means you are still signed in, but upload is waiting for Twitch to recognize the stream or for a temporary connection problem to clear. It retries automatically. Your full local recording continues; microphone evidence missed during a pause may be absent from Highlights. This indicator describes microphone capture and upload, rather than whether Highlights has finished finding moments or made a clip. ## What is kept - **The words and chat for each moment**: short excerpts from the mixed broadcast and, when available, the aligned microphone, plus a few chat lines. They are kept for **90 days**, deleted when you dismiss the moment, and deleted with your channel. - **AI clip titles** are not kept: they are offered in the dialog only, and only the title you make the clip with becomes part of the clip on Twitch. Nothing about them is kept in the numbers below. Your channel's recent clip titles, read from Twitch to show the AI your channel's style, are not kept either. - **Ratings and times** of the moments belong to the same records and go with them. - **The time of each stream marker** on a broadcast: just the number of seconds into the stream, kept with the broadcast for **90 days** and deleted with it and with your channel. Marker text is never read. - **The viewer clips of a broadcast**: each clip's Twitch id, its length, where it ends in the broadcast and how many views it had. A clip's title is never kept, and the name of the viewer who made it is never read or kept. They are kept with the broadcast for **90 days** and deleted with it and with your channel. - **Numbers about each moment and your yes or no.** Separately, Bloopbot keeps a small record per moment: where it is in the broadcast, how strong the laughter, shouting, volume and chat signals were, the rating, whether you watched, clipped or dismissed it, and your **Good clip?** answer. It holds no words and no chat, survives dismissing the moment, is kept for up to **2 years** and is deleted with your channel. It is used to improve which moments Highlights finds. - **The broadcast’s audio is processed and discarded.** The broadcast itself stays with Twitch; Bloopbot stores no video. - **Optional trial microphone audio** is uploaded privately when you enable it. Unused uploads expire within 72 hours. Used uploads are removed once moment ranking starts or the job finishes; switching Highlights off deletes the channel’s microphone uploads. Revoked or expired access makes them unavailable and removes them during cleanup. - **The trial filter also keeps a local microphone copy** in its private OBS configuration folder. These trial recordings remain until you delete them. Signing out revokes upload access; disable capture or remove the filter to stop local recording. Each moment’s words and chat lines are sent to an AI model to be rated. When you press **Suggest titles with AI** in the clip dialog, that moment’s words and chat lines, with the titles of up to 10 of your channel's clips from the last 60 days, are sent to an AI model again, which suggests three short clip titles; a filter checks each one for links, slurs, swearing and the like, and a title it refuses is thrown away. Nothing is sent for a title until you press the button. Chat is sent as message text only, with no usernames. The model writes nothing else: no captions, descriptions or posts, and a title is never used unless you pick it and press **Make clip** in the dialog. It is public once a clip is made. Both uses count against Highlights’ own daily allowance, and neither runs while Bloopbot’s AI is switched off. Turning Highlights off stops new work and keeps the moments you already have. [AI features and what’s included](https://bloopbot.com/docs/ai-features) explains how Bloopbot’s AI steps are used and what they never do. ## Troubleshooting - **The page says Highlights is an add-on.** Your channel does not have it yet. Use **Contact us** on the page. - **No broadcasts appear after switching on.** Highlights only looks at broadcasts Twitch has saved. Check your Twitch stream settings keep past broadcasts, then switch Highlights off and on again. A new broadcast is usually picked up about ten minutes after it ends. If Twitch takes longer to list it, Bloopbot checks again every ten minutes for up to three days. Processing waits while your channel is live and checks the recording’s final duration before starting. - **A broadcast says Twitch’s recording wasn’t available.** Twitch had not listed, or had already removed, the recording. Check that your channel keeps past broadcasts. - **A broadcast says it is too long.** Broadcasts over 8 hours are skipped. - **Make Twitch clip says to press Allow clip making.** The channel’s owner has not given the permission yet; see [Allow clip making](https://bloopbot.com/docs/highlights#allow). - **The automatic flow ran but made no clips.** Open the flow’s run log. It names the reason, such as clip making not allowed or Twitch refusing every moment. --- # Reward viewers and recognise regulars Set up Bloopbot loyalty points and commands for your community. Updated 19 October 2026 ## Configure loyalty For a new [guided-setup channel](https://bloopbot.com/docs/getting-started#guided-setup), earning starts off; switch it on only if you want Bloopbot to award points. Channels using the earlier setup start with points on, and switching setup experiences preserves your existing choice. Open **Loyalty** to review what viewers earn, their watch time and balances. You can switch points off there at any time, then press **Save Changes**. The switch alone edits a draft; the status says **not saved** until you save. **Save Changes** stays in the bar above Master Settings while you review the page. Bloopbot loyalty points are separate from Twitch Channel Points. ![The Loyalty settings toolbar keeps Save Changes visible above Master Settings and explains that changes take effect only after saving](https://bloopbot.com/docs/screenshots/loyalty-save-controls.jpg) _Review Master Settings, then press Save Changes to apply an edited setting or toggle._ 1. Make sure your [bot account can read chatters](https://bloopbot.com/docs/bot-account#mod): connect it with Twitch’s requested permissions and make it a moderator in your channel. Until it is, payouts for watching are paused and the **Loyalty** page says so. 2. On **Loyalty**, review the points per interval and how often to award them. Keep the defaults if they suit you; press **Save Changes** when you actually edit a setting. If you previously switched points off, switch them back on. If you want points while your stream is offline, switch on **Offline earning**. 3. Later, during a real stream, have a viewer join chat and wait one eligible interval. Look them up under **Viewer Parameters** to check their balance and last payout. This verifies earning; you can prepare the balance command below right away. Watch time counts presence in chat at each payout, in whole earning intervals. With a 10-minute interval, a viewer who qualifies for a payout gains 10 minutes of watch time. This includes offline chat time when **Offline earning** is on. With that setting off (the default), only live intervals count. Switching it off leaves previously counted time in place. If a viewer appears with 0 points after chatting, that only confirms they joined the loyalty system. Check that points are enabled, your bot account can read chatters, the viewer is not on the ignore list, and the stream is live unless **Offline earning** is on. Then wait for the next interval. A chat command such as `!points` only answers when its flow is enabled below. > **Optional points-only lesson** > > In guided setup, choose **Loyalty & points**, press **Help me** and **Build one with Pebble** for **Set up loyalty points**. The lesson reviews your existing settings, reuses a balance command if you have one, and prepares only Check points when needed. Alerts, OBS, imports and gifting are not prerequisites. It never creates sample points or treats a zero balance as proof of earning. ![Points-only help explains the current earning interval and separates a balance-reading command from an actual payout](https://bloopbot.com/docs/screenshots/onboarding-rewards-help.jpg) _Points-only help explains the saved earning interval and keeps earning separate from reading a balance._ ## Give viewers a way to check points 1. Look in **Flows** for an existing balance command. Keep its name and custom reply if they already suit you. 2. If needed, on **Loyalty** press **Add** on the **Points commands** row. Review **Check points**, then press **Add 1 flow — paused**. It adds only the balance-reading command. 3. Open that flow and review its command trigger, **Read points & watch time** and **Chat message**. Use **Test fire** to preview the reply; it does not award points. 4. Use the flow’s **Live** switch when ready. A paused existing command can be opened from the row too; reuse it instead of adding another. The other **Loyalty** pack members are optional. Find them in **Marketplace** when you want watch time, a leaderboard or gifting. Review and enable only the ones you want; a points-only setup does not need them. `!points` (with no name, or `!points `) answers with a balance and, once someone has earned any, their rank — `@viewer PixelPal has 1,250 coins (Rank #2).` A viewer nobody has seen yet, or one who has spent down to nothing, gets `@viewer PixelPal has no points yet.` `!watchtime` answers the same way with the time they have watched. `!top` is the leaderboard, and `!give ` passes the full amount to another viewer, with one success or insufficient-points reply. If two gifts arrive together and only one is affordable, only that gift succeeds; the other reply shows the sender's remaining balance. A refused or failed transfer moves no points. The recipient's lifetime earned increases by the gift; the sender's lifetime earned stays the same. Mods have three commands, each its own flow: `!addpoints ` gives a positive amount by hand, `!setpoints ` sets a balance exactly (down to `0` if you set it lower), and `!removepoints ` takes an amount away — a balance never goes below zero, it just stops there. A usage line answers a command typed with no name or no amount; typing a name that is not a Twitch account, not a positive number, or (for `!give`) your own name, is refused without a reply, the same way a cooldown or a permission check refuses quietly elsewhere in Flows. A viewer joins the loyalty system when they first chat after loyalty is switched on, when they are paid for watching, or when someone gives them points. Chatting adds them with a 0 balance; points only arrive when an earning rule pays them. You don’t have to wait for the first payout: `!give`, `!addpoints`, `!setpoints` and `!removepoints` all work on any viewer, and add them if they aren’t in it yet: a Twitch viewer from a Twitch command, a Kick viewer from a Kick command or on a [Kick channel](https://bloopbot.com/docs/bloopbot-on-kick#viewers). `!addpoints newface 100` gives a viewer who arrived a minute ago 100 points, and `!removepoints` on someone new adds them with 0. The same goes for **Adjust balance** on the **Loyalty** page, which a moderator you have [let in on Team](https://bloopbot.com/docs/editors#tick) can use too, though not the settings. A viewer on your ignore list is never added by chat or these adjustments. > **Installed the Loyalty pack before this?** > > Older copies of those four flows skip anyone who isn’t in the loyalty system yet. Older **Give points** copies also use separate subtract and add steps. Open **Flows → Marketplace**, choose the **Loyalty** pack under **Update ready**, and review its update. A flow you haven’t changed updates in place, keeping its name and on/off state; for one you have changed, choose **Use the new one** to take the new flow or **Keep mine** to keep your edits ([Browse flow packs](https://bloopbot.com/docs/browse-flow-packs)). Nothing updates until you confirm. Afterwards, open **Give points** and check that it uses **Transfer points**. Keeping a customized old flow also keeps its separate writes; change those as described below. Point adjustments should keep their moderator checks. Inspect an Add points, Set points or Remove points flow before enabling it. > **Extend it** > > To add a "not found" reply `!give`, `!addpoints`, `!setpoints` or `!removepoints` stopped giving you, open the flow, find the check whose **false** (or **true**, for the self-gift check on `!give`) output is not wired to anything, and drag a **Chat message** off it. To let `!addpoints` also take points away with a negative amount, change its **is more than 0** check to whatever range you want to allow, the same way you would edit any other Only if step. > **Had the older Add points?** > > One flow used to answer both `!addpoints` and `!setpoints`. It still works exactly as it did. Adding the Loyalty pack again brings you the separate Add points and Set points flows alongside it, switched off. Once you have checked them and switched them on, pause or delete the old combined flow — with both running, `!addpoints` or `!setpoints` gets answered twice. If your old flow now only answers `!addpoints`, switch on the Set points flow. ## Give another viewer points in a flow Use **Transfer points** when one viewer gives their points to another. Points must be on, and the flow must have a viewer who triggered it, such as someone typing a command. A timer has no viewer to pay for it. The recipient must be a real viewer on that command's platform and must not be on your ignore list. 1. Open your gift flow, or add **Give points** from the Loyalty pack. 2. Add **Transfer points** from the node picker. Set **Give to** to the recipient's login, or `$(1)` for a command's first argument. 3. Set **Amount** to a positive whole number, or `$(2)` for the second argument. Plain digits work here; the built-in Give points flow uses **Read a number** first. 4. Connect **ok** to your success message. Connect **refused** to the response you want. For an insufficient-points reply, check that **Why it was refused** is `not_enough` and insert **Sender points, written out** from this transfer step. 5. If you are replacing a customized gift, remove both the old sender subtraction and recipient addition, then connect their surrounding steps to the transfer. **Set a variable** and **Spend points** each do their own work; two separate steps do not make one transfer. 6. Save, then use **Test fire** to inspect the branches. It simulates the transfer without moving points or checking whether the real balance can afford it. Check a real gift in chat and look up both viewers on Loyalty to verify their balances. For example, with 10 points, `!give friend 8` leaves the sender with 2 and gives Friend 8. Another gift of 8 is refused and reports 2. With points off, an ignored recipient, your own name, an unknown viewer or an invalid amount, the built-in command stops quietly. An error at the transfer step leaves both balances unchanged; open its run to see the error. ## Charge points in a flow Use the **Spend points** step to make something in a flow cost points — a command that redeems a perk, a wager in a minigame, a queue-skip item. It takes the cost off a viewer's balance and tells the flow whether it went through, so you can react either way. A spend never takes a balance below zero, and it is safe from two viewers spending at the same instant: if only one of them can actually afford it, only one succeeds. 1. Open the flow where something should cost points, or start a new one from **+ New flow**. 2. Add a **Spend points** step — search "spend" or "points" in the node picker. 3. Set **Cost** to how many points it should take: a number, or a variable like `$(1)` to let the command itself say it (`!wager 50`). 4. Leave **Whose points** on "The viewer who triggered this" for a command a viewer pays for themselves, or choose "A named viewer" to charge someone else's balance. 5. Wire the **ok** branch to whatever the cost buys — a chat reply, a redemption, a wheel spin, a queue entry. 6. Wire the **not\_enough** branch to a reply that says it didn't go through. **Example:** a `!hydrate` command that costs 50 points and posts a chat line either way. 1. Trigger: **Command**, name `hydrate`. 2. **Spend points**: Cost `50`, Whose points "The viewer who triggered this". 3. Off **ok**, add a **Chat message** and type `$(user) drank some water! -50 points, left.` — with a gap at the end. Drag **Balance** from the Spend points step's tray into that gap, or place the caret there and use **Insert…** instead: either way it becomes a chip reading **Spend points › Balance**, so the line reads `$(user) drank some water! -50 points, ` followed by that chip, then ` left.` 4. Off **not\_enough**, add a **Chat message**: `$(user) doesn't have 50 points yet.` Try it once as a viewer with enough points, then again as one without, to see both branches fire. **Balance** is always the number to show afterwards — the new balance on success, or the balance they still have when it fails — so the same dragged value reads correctly whichever branch runs, as long as you take it from the Spend points step itself. Loyalty points must be switched on ([Configure loyalty](https://bloopbot.com/docs/loyalty-and-regulars#points)) for a spend to succeed; with points off, or for a viewer the loyalty system has never seen, it takes the **not\_enough** branch too. To let viewers spend points on items you set up — from chat with `!buy` or from a web store — use the store instead of drawing each one: [Let viewers spend points in a store](https://bloopbot.com/docs/points-store). ## Award points per gifted sub or per 100 bits A fixed amount is one **Set a variable** step that adds to `loyalty_balance`. To give more for a bigger gift or a bigger cheer, put a **Do some maths** step in front of it: it works out a number from two others — times, divided by, plus or minus — and hands **The result** to the next step. It says nothing in chat and changes nothing on its own. **Example:** award 10 points per gifted sub, so a viewer who gifts 5 subs gets 50. 1. Press **+ New flow** and pick the **Gifted subs** trigger. 2. Add a **Do some maths** step — search "maths" or "per gift" in the node picker. Set **First number** to `$(count)` (how many subs were gifted), **Do** to **Times** and **Second number** to `10`. 3. Add a **Set a variable** step after it: **Variable** `loyalty_balance`, **Do** **Add**, **Write to** "The viewer who triggered this". Then drag **The result** from the Do some maths step's tray onto the Set a variable card and pick **Value**: it lands as `$(from..result)`. 4. Save the flow and switch it on. Expected result: a real eligible gift of 5 subs credits the gifter 50 points, and their lifetime total rises by the same amount. **Test fire** only previews the planned write; it does not change the real balance. An anonymous gift has no viewer to credit, so nothing is added. For **1 point per full 100 bits**, start from **Bits cheered** instead and use two maths steps: the first is `$(bits)` **Divided by** `100` with **Round down to a whole number** on, so 250 bits counts as 2; the second is **The result** of the first **Times** your amount. Round down before you multiply — 150 bits at 10 points per 100 is 10 points that way, and 15 the other way round. A cheer under 100 bits works out to 0. To skip the write entirely when there is nothing to add, put a **Check a value** step before **Set a variable**: **The result**, **More than**, `0`. Troubleshooting: if the flow stops at the maths step, open the run on **Flows** — the step says which number was not a number (a `$(count)` on a trigger that has no gift count, say), or that it was asked to divide by zero. Drag a step off its **error** output to handle that in the flow instead. > **Had an older award step that multiplied by gifts or bits?** > > It still gives the same amounts. Open the flow and you will find it drawn as these steps — **Do some maths**, a check that there is something to award, and the **Set a variable** write — with the same numbers in them, so you can change them like any other step. Older points steps that credit the triggering viewer also check whether there is someone to credit. With no viewer, they leave points alone and continue to the following step. This covers fixed awards, deductions and setting a balance as well as gifts or bits. If a flow you already saved stops at a viewer's **Set a variable** step on an anonymous gift or a timer, add this check yourself: 1. Put **Read points & watch time** before the write, reading the viewer who triggered the flow. 2. Follow it with **Check a value**: drag **There is someone to read** from the read step into the first value, choose **Equals**, and compare it with `true`. 3. Connect **true** to the write and **false** to whatever follows the write. For a deduction, skip its floor-at-zero step too. 4. Save and test an event without a viewer. The next step should run and no balance should change. An existing **Set a variable** step keeps its settings; it is not automatically given this check. ## Look up a viewer Open **Loyalty** and find **Viewer Parameters**. Type a viewer’s username into the search box — the `@` is optional — and press **Search**. Bloopbot answers with every value it holds for that person, under their display name: | What you see | What it means | | --- | --- | | **Balance** | The points they can spend right now. | | **Lifetime earned** | Every point they have ever earned, including the ones they have already spent. | | **Watch time** | Time counted from qualifying intervals in chat, including offline intervals if **Offline earning** is on, shown as hours and minutes — `3h 20m`. | | **Subscriber** | Yes or No: whether they count as a subscriber, including a gifted sub. The subscriber multiplier stops when their sub ends. | | **Last payout** | The date and time they were last paid loyalty points. | These values belong to the viewer, not the channel: each person has their own balance, watch time and the rest, and every one of them is also a variable a flow can read. The table’s **Use it in a flow** column shows the token — `$(var.loyalty_balance)`, `$(var.loyalty_lifetime_earned)`, `$(var.loyalty_watch_seconds)`, `$(var.loyalty_is_subscriber)` or `$(var.loyalty_last_payout_at)` — so `$(var.loyalty_balance)` in a chat message says the balance of the viewer the flow is running for. Watch time is the one to read carefully: the page shows hours and minutes, while `loyalty_watch_seconds` counts seconds. Any other per-viewer value your flows keep appears in the same table. Try it with your own username. Expected result: your display name, your balance and your watch time appear. A viewer Bloopbot has not counted yet comes back as **No viewer called “…” in this channel yet** — check the spelling, and remember that someone appears here once they have chatted with loyalty on, earned points or watched. The search only shows these values. To change a balance, use **Adjust** beside that viewer on the **Leaderboard** below, or set it from an **Add points**, **Set points** or **Remove points** flow. On a Kick channel the search finds Kick viewers. On a Twitch channel with [Kick added](https://bloopbot.com/docs/bloopbot-on-kick#connect), a Twitch viewer and a Kick viewer can share a name, and they are two viewers with their own points. The search then shows every viewer by that name, each with a small Twitch or Kick mark, Twitch first. **Adjust** always changes the viewer on the row you pick, so giving the Kick `bob` 100 points never touches the Twitch `bob`. ## Recognise regular viewers Regulars is a list of viewers you name yourself, kept on the **Regulars** page under **Viewers**. Flows check it with a **Has a role** step, and moderation filters can let regulars through. ![The Regulars page: a Roles list on the left with Regulars (built in, 4) selected and a custom role Mod squad (0), and on the right the Regulars members PixelPal, moss\_and\_tea, QuietKestrel and Lanternfish under a Twitch username box and an Add button, each with a bin icon (Remove).](https://bloopbot.com/docs/screenshots/regulars-page.jpg) _The Regulars page: your roles on the left, the chosen role’s members on the right._ To add someone from the dashboard: 1. Open **Regulars**. It opens on the built-in **Regulars** list. 2. Type their Twitch username, with or without the `@`, and choose **Add**. 3. They appear in the list straight away. The bin icon (**Remove**) beside a name takes them off again. If you type a name Twitch doesn’t know, the page says **No Twitch user called …** and adds nobody. Check the spelling and try again. To let your moderators manage the list from chat, you need the three `!regulars` flows: `!regulars add `, `!regulars remove ` (also `!regulars delete`), and a bare `!regulars`, which answers `Regulars: 12`. Only moderators and you can use them. Until a flow that adds or removes regulars is on, the Regulars page shows a **!regulars commands** row above the list: ![The Regulars panel with a quiet row above the member list: !regulars commands, 3 flows, Mods can’t add or remove regulars from chat yet, and an Add button. Below it, the Twitch username box and four sample regulars.](https://bloopbot.com/docs/screenshots/regulars-flows-door.jpg) _With no !regulars flow on, the page offers the three !regulars flows as one row._ 1. Press **Add** on the row. The review opens on the right of the page: _Adds 3 flows to your channel. They start paused — nothing runs until you switch them on._ 2. Press **Add 3 flows — paused**. The review turns into **Added — paused**, with **Set it up**: **Choose flows to switch on** opens them in **Flows** if you want to look first. 3. Close the panel. The row now says the flows are paused: press **Switch on**. The row goes away once they are on. Type `!regulars add` followed by a viewer’s name in your chat to check: they appear on the page. If you already have a `!regulars` flow and it is paused, the row names it instead, with **Open flow** and **Switch on**, so you never end up with two copies answering the same command. Use the **Regulars-only command** template, or add a **Has a role** step to your own flow with **Roles** left at `Regulars`, to give this group a special command. **New role** makes a list of your own, such as `Mod squad`, which a **Has a role** step can check by name in the same way. > **Check the audience** > > A regular in Bloopbot is not automatically a Twitch VIP, subscriber or moderator. Pick the condition that corresponds to the access you actually want. > **Extend it** > > To answer `!regulars add` or `!regulars remove` with a confirmation line, open that flow and drag a **Chat message** off the role step, the same way you would add a reply to any other action. > **Had the older Regulars?** > > One flow used to answer `!regulars add`, `!regulars remove` and a bare `!regulars` together. It still works exactly as it did. Adding the Loyalty pack again brings you the three separate flows above alongside it, switched off. Once you have checked them and switched them on, pause or delete the old combined flow — with both running, a bare `!regulars` is answered twice, and `!regulars add`/`remove` changes the list twice without saying so. If your old flow now only answers the count, switch on the Add a regular and Remove a regular flows. ## Verify a reward Use Test fire to inspect the connected reward action, then verify a real event and the resulting balance on Loyalty — search that viewer under **Viewer Parameters** to see it. Dry runs do not award real points. If a reward fires twice, inspect other enabled flows listening to the same trigger. --- # Play points games with chat Let viewers play slots, roulette, duels, heists and bets with their loyalty points, and show every game on stream as a corner card or a full-screen scene. Updated 12 October 2026 ## What you can do Your viewers can play five games with the loyalty points they earn by watching: `!slots`, `!roulette`, `!duel`, a `!heist` the whole chat can join, and bets your moderators open with `!bets`. Type `!minigames` in chat to see the commands. Each game takes the points it is played for, decides a result nobody can predict, and pays any win straight back to the viewer's balance. A **Minigames** layer on your overlay plays the game out on stream; chat announces the result after the animation finishes. The games are flows, so you can read every step and change the rules: the most a viewer may bet, how often they may play, and how much the house keeps. ## Before you start - Loyalty points must be on. [Reward your regulars with points](https://bloopbot.com/docs/loyalty-and-regulars) shows how to switch them on and how viewers earn them. - To show the games on stream you need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) shows how to add one as a Browser Source. ## 1. Add the games 1. In the dashboard sidebar, open **Marketplace** and search for **Minigames**. 2. Open **Minigames** and add the pack. It includes twelve flows, including `!minigames` help and `!bets` usage. They are added switched off, so nothing happens until you are ready. The pack also adds a **Minigames** overlay holding a Corner layer; **Set it up** gives you its URL for OBS. If you added the pack earlier, open it again: its update adds the overlay and updates any game flows you have not changed. 3. Open **Flows** and switch on the games you want, plus **List minigames (!minigames)** so viewers can find them. Switch on **Bet commands (!bets)** if you want `!bets` to explain moderator usage. ## 2. Show the games on your overlay The **Minigames** overlay the pack added already holds a Corner layer that plays every game: add its URL to OBS and go on to [Choose where each game shows](https://bloopbot.com/docs/points-minigames#show-as). To put the games on an overlay you already use instead: 1. Open **Overlays** and open the overlay the games should appear on. 2. Press **Add** on the left and choose **Minigames** under **Goals & games**. 3. Select the layer and pick **Show games as**: **Corner** plays each game as a card in a corner of the screen, several at once, newest on top, and shows a duel waiting for `!accept`, a heist taking its crew and an open bet's odds while they run; **Takeover** plays one full scene at a time, in turn with your alerts, so a game waits behind an alert that is already playing. 4. Under **Games**, untick any game this layer should leave alone. In a Corner, set **Cards at once** (1 to 3) and **Keep a result up for**, how long a finished card stays before it fades. 5. Place and size the layer like any other — [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay) covers placement — and press **Publish**. Every game plays in a Corner by default. If you would rather have the bigger show, add a second Minigames layer set to **Takeover** and choose **Show as: Takeover** on that game's step ([Choose where each game shows](https://bloopbot.com/docs/points-minigames#show-as)). To see the layer play before anyone does, open **Simulate** in the top bar and press **Test slots**, **Test roulette**, **Test duel**, **Test heist** or **Test bet**. The test only draws on your preview and in OBS; no points move and nothing is said in chat. ![Studio with a Minigames layer selected: Show games as Corner, with slots, roulette, duels, heists and bets ticked, two cards at once, a result kept up for four seconds, and its Sounds below.](https://bloopbot.com/docs/screenshots/minigames-layer-panel.jpg) _A Minigames layer selected in Studio, showing games in the corner, with slots, roulette and duels ticked._ The cards take your overlay theme: the panel colour, the text and accent colours, the corners and the font. ## 3. Choose where each game shows Each game flow has a **Show as** setting on its game step (**Pull the slots**, **Spin roulette**, **Finish a duel**, **Resolve the heist** and **Settle a bet**). **Challenge to a duel**, **Start a heist** and **Open a bet** have one too: with **Corner** or **Takeover**, the running duel, heist or bet shows on a Corner layer while it waits; with **Chat only** it shows nothing until it is played. - **Corner** (every game starts here, duels and heists included) plays on a Minigames layer set to Corner. - **Takeover** plays on a Minigames layer set to Takeover, in turn with your alerts. No game from the pack uses it until you choose it: add a Minigames layer set to **Takeover** to an overlay, then set **Show as** to **Takeover** on the game step. A duel or heist step you add to a flow of your own starts on **Takeover**. - **Chat only** shows nothing on stream. With **Corner** or **Takeover**, the result line waits until the animation finishes, so chat does not reveal the outcome early. A Takeover also waits its turn behind alerts. With **Chat only**, the result is posted straight away; a Takeover that no overlay can show also posts straight away, and so does one whose overlay is hidden in OBS: a game is over in a moment, so a Takeover is skipped rather than held until you show the overlay again (alerts and media are held for two minutes). Viewers can type `!minigames` for the full command list and examples of each command. If they leave out an amount, use an invalid wager or type extra words, the bot replies with the right usage and the 1 to 1,000 point limit. An invalid roulette choice gets the roulette usage instead. A mistaken `!bets` subcommand gets moderator bet usage; `!accept` with no waiting duel and `!bets close` with no open bet also get replies. No points are taken for these commands. ## 4. Sounds Every game moment can make a sound on stream: the reels spinning and each reel stopping, a win, a jackpot or a loss, the roulette ball landing, the clash of a duel, a viewer joining a heist, the vault door or the alarm, and bets opening, closing and paying out. - A Minigames layer you add now comes with a set of sounds made for the games, switched on and a little quieter than a typical alert. - A Minigames layer you added before sounds arrived stays silent, so your stream never gets louder by itself. Select the layer and press **Turn on game sounds** under **Sounds** to switch them on. To change them: 1. Open your overlay and select the Minigames layer. 2. Under **Sounds**, set **Game volume**. It turns every game sound up or down at once. 3. Each game lists its moments. For each one, pick a **Sound**: **Default**, **From library** to choose a sound file from your media library, or **Off**. Its slider sets that sound's own volume, which plays at that volume times **Game volume**. Press ▶ to hear it. 4. Press **Publish**. Use an audio file such as MP3, OGG or WAV for **From library**. Images and videos cannot be game sounds. If a save says to choose a sound, select an audio file for that moment and save again; your previous draft stays intact. ![The Sounds settings of a Minigames layer in Studio: Game volume at 100%, then the Slots moments — spin, each reel stop, jackpot, win and lose — each set to Default with its own volume slider and a play button.](https://bloopbot.com/docs/screenshots/minigames-sounds-panel.jpg) _The Sounds settings of a Minigames layer: Game volume, and each moment’s sound, volume and play button._ - A win, a loss or a jackpot always plays in full, even when two games finish together. A new spin cuts off a spin that is still playing, and each viewer joining a heist cuts off the blip before. - A duel's challenge, a heist's crew and bets opening and closing sound on a **Corner** layer only, where their cards show. - A game the layer does not show, and a hidden layer, make no sound. With **Reduce motion** on in the computer's settings, each game shows its result at once and plays only its result sound. To play a sound whenever you like, add a **Play a game sound** step to any flow. For example, for a `!horn` command: 1. Start the flow with a **Chat command** trigger for `horn`. 2. Add a **Cooldown** step with **Per viewer** set to 10 seconds, so one viewer cannot fill your stream with horns. 3. Add **Play a game sound**, choose a **Sound** from your media library (only sound files are listed) and a **Volume** from 0 to 100. It plays straight away on every overlay open in OBS that has a visible Minigames layer, always in full, at that volume times the **Game volume**. When an overlay holds more than one Minigames layer, it plays once, at the highest **Game volume** among them. At most three of these sounds play at once on an overlay: one more while three are still playing is skipped, not saved for later. A scene that is opened afterwards does not play it. The flow's run log says how many overlays it was sent to, or why it was not sent: no Minigames layer is open, the file is no longer in your media library, or the file isn't a sound. ## 5. Slots A viewer types `!slots 100` to pull the slot machine for 100 points. Three sevens pay 25 times the bet, three bars 10 times, three cherries 5 times, and two cherries in front 2 times; anything else loses. Chat hears _🎰 \[ 7 | 7 | 7 \] ArcadeAda wins 2500 points!_ or _🎰 \[ 🔔 | 🍋 | 🍇 \] No luck this time, ArcadeAda._ ![A slots card on the overlay: ArcadeAda’s avatar and a 100-point wager chip above a gold slot cabinet showing three sevens on the payline, JACKPOT ×25, and the payout counting up.](https://bloopbot.com/docs/screenshots/minigames-slots-corner.jpg) _A slots card in the corner: the player’s avatar and wager, three sevens on the payline, JACKPOT ×25, and the payout counting up._ ## 6. Roulette A viewer types `!roulette red 50` to bet 50 points on red. They can bet on **red**, **black**, **odd**, **even** or one number from **0** to **36**. The wheel has 37 pockets, and 0 is green, so it loses every red, black, odd and even bet. A colour or odd/even win pays 1.95 times the bet and a number pays 35.15 times, rounded down: _🎡 23 red! BonusBea wins 97 points on red._ A bet that is not one of those words gets a usage reply, and no points are taken. ![A roulette card in the corner: BonusBea’s avatar and 50-point wager, the ball settled on pocket 1 on a gold-rimmed wheel, a red number badge, a win of 1.95 times the bet and the payout counting up.](https://bloopbot.com/docs/screenshots/minigames-roulette-corner.jpg) _A roulette card: the ball has landed on 1, red, and the win of 1.95 times the bet is counting up._ ## 7. Duels A duel is two viewers staking the same points, and the winner takes both stakes. 1. A viewer types `!duel @someone 200`. Their 200 points are taken, and chat hears _@someone, CoinCyd challenges you to a duel for 200 points! Type !accept within 60s._ 2. The viewer who was challenged types `!accept`. Their 200 points are taken together with accepting the duel, one of the two wins at random, and the winner gets 400. On the Corner card the duel plays out: a 3-2-1 count, a clash, and the loser's card falls away. Then chat hears _CoinCyd beats ArcadeAda and wins 400 points!_ If nobody accepts within a minute, the challenger gets their points back: _@CoinCyd, nobody accepted your duel. Your 200 points are back._ A viewer can only have one duel at a time, and cannot duel themselves or the bot; they are told so and get their points back. If the challenged viewer does not have enough points to accept, the duel is called off and the challenger's points go back to them. The **Accept and stake** step accepts the duel and takes its wager together. If Bloopbot stops immediately afterward, recovery refunds only points that were actually paid. When the viewer cannot afford the wager, or points are switched off, the same step calls off the duel and returns the challenger's stake. The reply explains which happened; a repeated `!accept` takes nothing. For an existing Minigames pack, open it on **Packs**, review its update and choose **Use new** for the duel acceptance flow. **Keep mine** retains your existing graph. Older copies using **Accept a duel (legacy)** followed by **Spend points** keep their interruption risk until updated. To update a customized acceptance flow yourself, replace **Accept a duel (legacy)** with **Accept and stake**, connect **next** to the winner selection and keep **none** connected to the no-duel reply. Remove its separate **Spend points** step and the refusal branch's **Cancel a round** and refund write. Connect **not\_enough** directly to a reply using the acceptance step's **message** value: it already cancelled the duel and returned the challenger’s points. Do not add another payment or refund. **Test fire** shows the intended steps without accepting a real challenge, charging points, or proving the viewer can afford it. ![A duel on a full-screen Takeover layer: CoinCyd’s avatar ringed as the winner, ArcadeAda’s card tilting away, and the pot counting up.](https://bloopbot.com/docs/screenshots/minigames-duel-takeover.jpg) _A duel on a Takeover layer, if you choose Takeover: CoinCyd wins, ArcadeAda’s card falls away, and the pot of both stakes is counting up._ ## 8. Heists A heist is a group game: one viewer plans it, others join the crew, and then the whole crew either gets away with the loot or is caught together. 1. A viewer types `!heist 100`. Their 100 points are taken, and chat hears _💰 ArcadeAda is planning a heist with 100 points! Type !heist join and an amount within 60s to join the crew._ A Corner layer shows the heist with its crew and the time left to join. 2. Others type `!heist join 50` within the minute. Each one's points are taken, and the bot replies _You’re in the crew with 50 points. Crew of 3._ Up to 50 viewers can be in one crew. 3. When the minute is up, one roll decides for the whole crew. On the Corner card the vault plays out: the crew's faces under the vault door, the door swinging open with coins pouring out, or a searchlight sweeping over the crew. Then chat hears _💰 The crew of 4 got away with 684 points._ or _💰 The crew was caught._ A bigger crew gets away more often, but each thief gets less: one thief alone has a 35% chance, each extra thief adds 5%, and a crew of nine or more has 75%. Everyone who got away is paid what they put in, multiplied by 0.95 and divided by the crew's chance. A thief alone who put in 100 gets 271 back; in a crew of nine or more, 126. Either way the house keeps 5 of every 100 points on average. A caught crew keeps nothing. Only one heist can be planned at a time, and a new one can start two minutes after the last one started: _The next heist can start in 45 seconds._ A `!heist` that is turned away does not count, so a viewer without the points never holds anyone else up. A viewer is told why when they cannot start or join: they do not have the points, a heist is already under way or not due yet, there is no heist to join, they are already in the crew, or the crew is full. No points are taken when that happens. ![A heist on a full-screen Takeover layer: the vault door swung open, coins falling, the crew’s faces lined up under it, Got away! and the loot counting up.](https://bloopbot.com/docs/screenshots/minigames-heist-takeover.jpg) _A heist on a Takeover layer, if you choose Takeover: the vault door has swung open, coins are pouring out, and the crew’s faces are lined up underneath._ ## 9. Bets A bet lets chat back one of two outcomes, say whether you win the next round, and the winners share everything that was bet. The house keeps nothing. 1. A moderator types `!bets open win lose`. Chat hears _🎲 Bets are open: win or lose? Type !bet win or !bet lose and an amount._ A Corner layer shows the two options on a live odds bar. 2. Viewers type `!bet win 200` or `!bet lose 100`. Each one's points are taken, and the bot replies _You bet 200 points on win. The pool is 600 points._ The odds bar moves to show how the pool is split. Each viewer can bet once on a bet, and up to 50 viewers can bet. 3. When the outcome is about to be known, the moderator types `!bets close`. No more bets are taken, the odds bar shows a lock, and chat hears _🔒 Bets are closed: 600 points on the table._ 4. When the outcome is known, the moderator types `!bets win win`. A word that is not one of the two settles nothing, and the moderator is told the two options. Everyone who backed **win** shares the whole pool in proportion to what they bet, the winning side glows once on the odds bar, and chat hears _🏆 win wins! 2 winners share 600 points._ If nobody backed the winning option, or everyone backed the same side, nobody can win anything from anyone: every bet is given back, and chat says so. A bet stays open until a moderator settles it, even with betting closed; a bet nobody settles within 12 hours is ended and every bet given back. Only moderators and you can open, close and settle a bet; the same commands from anyone else are ignored. Only one bet can run at a time. A viewer is told why when their bet is not taken: they do not have the points, no bet is open, the option is not one of the two, they have already bet, or 50 bets are already in. ![An open bet in the corner: win and lose on a live odds bar, 300 points on win from two bets and 301 on lose from one.](https://bloopbot.com/docs/screenshots/minigames-bet-odds.jpg) _An open bet in the corner: win and lose on a live odds bar, with the points and the number of bets on each side._ ## 10. Change the limits and the house edge Open a game flow on the **Flows** page to change its rules. - **The most a viewer may bet.** The **Check a value** step that says _is at most 1000_ is the limit. Change 1000. A bet above it gets a usage reply and takes no points. - **How often a viewer may play.** The **Cooldown** step allows one game every 30 seconds per viewer. - **How often a heist can start.** **Start a heist** has **Time between heists**, two minutes unless you change it: the least time from one heist starting to the next. Set 0 to let a new heist start as soon as the last is over. - **How long a heist takes joins.** **Start a heist** has **Time to join**, a minute unless you change it. Change the **Wait** after it to the same time. - **The house edge.** **Pull the slots**, **Spin roulette** and **Resolve the heist** each have a **House edge (%)**, 5 unless you change it. It is how much of every bet the game keeps on average: at 5, a viewer who plays 100 points over and over gets 95 back on average, and some viewers win big while most lose a little. At 0 the game is fair and gives back what it takes on average. You can set it from 0 to 20. Slots keep their payouts and make the winning lines rarer; roulette keeps its pockets and pays a little less on a win; a heist keeps its chances and pays a little less to a crew that gets away. - **A heist's chances.** **Resolve the heist** has **Chance alone (%)**, **Per thief (%)** and **Best chance (%)**: 35, 5 and 75 unless you change them. Whatever you set, the house edge stays what it says. Duels and bets keep no edge: every point staked goes to the winners. ## 11. Style the games Every game card follows your overlay's theme. Its panel colour, opacity, corner radius, border, font and text colour restyle the cards, and each game tints itself from your accent colour: slots in gold, roulette in red, duels in orange and blue, heists in teal, bets in blue and pink. Pick a different accent in the **Theme** tab and the games shift with it. Anywhere a viewer appears (the player on a slot or roulette card, both fighters in a duel, the planner and every crew member in a heist) their Twitch or Kick profile picture is shown, or their first initial when they have none. The same applies when a game is set to show in chat only: no pictures are looked up. The cards also resize with the overlay layer: give a Minigames layer a small or large frame and the type, wheel, reels and avatars scale with it, and a narrow frame switches to a stacked layout so nothing is cut off. To style one piece on its own, select the Minigames layer and open **Parts**. You can restyle the **Card**, **Game name**, **Player**, **Wager chip**, **Player avatar**, **Heist crew face**, **Slot cabinet**, **Reel**, **Roulette wheel**, **Pocket number**, **Duel arena**, **Bet odds bar**, **Result**, **Payout** and **Countdown**. An AI assistant connected to your account can change the same theme fields and parts. ## 12. Make the games your own - **Quieter heists and bets.** Every successful `!heist join` and `!bet` gets a reply. To stop them, open the **Join a heist (!heist join)** or **Place a bet (!bet)** flow and delete the **Chat message** step after **Join the heist** or **Place a bet**. Refusals still get their reply. - **A slot pull as a channel point reward.** Duplicate the Slots flow, replace its command trigger with **On a reward redeemed**, and type a fixed number such as 50 into **Read a number** instead of `$(1)`. The steps in the node library, under **Minigames**: - **Pull the slots** and **Spin roulette** turn a random roll into a result and show it. They hand on the result, whether it **won**, and the **payout** to add to the viewer's points. - **Challenge to a duel** opens a duel; **Accept and stake** takes it up and pays its wager together, once; **Finish a duel** names the winner and shows the fight. **Accept a duel (legacy)** remains for older flows with a separate payment. - **End an unplayed round** ends a duel nobody accepted and says whose points to give back; **Cancel a round** calls one off. - **Start a heist**, **Join the heist** and **Resolve the heist** run a heist: the first two take the viewer's points and give them a place in the crew in one go, and the resolve pays everyone who got away. They hand on why a viewer was turned away, and what each thief was paid. - **Open a bet**, **Place a bet**, **Close betting** and **Settle a bet** run a bet: placing one takes the points with the bet, and settling pays the winners, or gives every bet back. - **Wait for the game** holds the result line until a Corner or Takeover animation has finished. - **Play a game sound** plays a sound from your media library now on every open Minigames layer ([Sounds](https://bloopbot.com/docs/points-minigames#sounds)). Slots, roulette and duel challenges use **Spend points**; duel acceptance uses **Accept and stake**. These games pay winners through **Set a variable**, so their flows show where a viewer’s points went. Heists and bets take and pay points in their own steps, so a crew or a bet of 50 is never paid only in part. ## Troubleshooting **The game plays in chat, but nothing shows on stream.** Check that the overlay with a **Minigames** layer is open in OBS and published, that the layer's **Games** include that game, and that the game's **Show as** matches the layer: a Corner game needs a layer set to Corner, and a game you set to Takeover needs one set to Takeover. **The games make no sound in OBS.** Open the Browser Source's properties and tick **Control audio via OBS**, then check the source is not muted in OBS's audio mixer. Check the layer's **Sounds**: a layer added before sounds arrived needs **Turn on game sounds**, and a moment set to **Off** is silent. Press **Publish** after a change. **The sounds play in a browser tab but not straight away.** A browser tab stays silent until you click somewhere on the page. OBS plays them without a click. **Every sound plays twice.** The overlay is open in two places at once, such as two scenes that each have their own Browser Source for it. Use one Browser Source and add it to both scenes as an existing source. **A viewer is told they do not have enough points.** They have fewer points than they bet; the reply says how many they have. Nothing is taken. Loyalty points must also be on for your channel. **The game finished, but the chat line came a moment later.** That is on purpose: chat waits for the overlay animation to finish before revealing the result. **Chat announced a result without an animation.** Check the game's **Show as** and that the matching Minigames layer is open in OBS. **Chat only** posts at once; a Takeover no overlay can show also posts at once. So does a Takeover whose overlay was hidden in OBS when the game ended: it is skipped, not replayed when you show the overlay. If you kept an edited duel or heist flow from before the pack's corner-only update, it may still be set to **Takeover** while your Minigames overlay no longer has a Takeover layer: set its **Show as** to **Corner**, or add a Takeover layer. **A duel was never answered, and chat said nothing.** If the duel's flow was edited or switched off while it waited for `!accept`, or something went wrong part-way through a duel, the flow cannot finish it. Bloopbot ends any duel still waiting or unfinished five minutes after its minute is up, and gives every viewer who staked points their points back. Nothing is said in chat when that happens. **A heist or a bet ended without a word, and everyone had their points back.** A heist whose flow was edited or switched off while its crew waited is ended five minutes after its joining time is up, and a bet nobody settles is ended after 12 hours. Every viewer in it gets their points back, and nothing is said in chat. **A `!bets` command did nothing.** Only moderators and you can open, close and settle a bet; the same commands from anyone else are ignored. **`!bets win` settled nothing.** The reply says why: the word was not one of the bet's two options (_wn isn’t one of the options: win or lose. Nothing was settled._), or no bet was running. Type `!bets win` and one of the two words the bet was opened with. **A result line never came.** Editing or switching off a flow while it waits for an animation drops the steps it was waiting to run, so the line that says who won is not sent. The points were already paid out before it waited. --- # Let viewers spend points in a store Set up a points store where viewers buy items you define with their loyalty points, from chat with !buy or from your web store, and make each item do something with a flow. Updated 21 October 2026 ## What you can do The **Store** is where your viewers spend the loyalty points they earn watching you. You decide what is for sale — a hydrate break, a shout-out, a song pick, a silly hat for a round — and what each item costs. Viewers buy from chat with `!buy`, or from your web store page signed in with Twitch. Buying takes the points off and the item off the shelf in one step, so two viewers can never both buy the last one, and nobody is ever charged for something they did not get. Every purchase is listed on the **Store** page, where you mark it done or refund it. What an item actually _does_ is a flow you draw on **Store item bought**: a chat line, an alert, a wheel spin, anything a flow can do. Nothing happens on stream by itself. ## Before you start - Loyalty points must be switched on: the store only takes points while they are. [Reward viewers and recognise regulars](https://bloopbot.com/docs/loyalty-and-regulars#points) shows how. - Viewers need points to spend. Give them time to earn some, or give a few by hand from the **Loyalty** page. - The store is not a plan feature: every channel has it, with as many items as you like. ## 1. Create an item 1. Open **Loyalty and store** under **Viewers** in the sidebar, then choose the **Store** tab. 2. Press **New item**. 3. Give it a **Name** — this is what viewers type after `!buy`, so something short like `Hydrate` works best — and a **Cost** in points. 4. Optionally add a **Description** and a **Picture**. Press **Choose picture** to see your pictures, or **Upload** to add one here. The picture shows on your web store. 5. Set **Stock** if there are only so many (blank is unlimited), a **Limit per viewer**, and a **Cooldown** — see [Limits, cooldowns and stock](https://bloopbot.com/docs/points-store#limits). 6. Leave **For sale** ticked and press **Create item**. ![The Store page's Items tab with Hydrate and Shout-out, and the item editor open on Hydrate: name, description, picture, a cost of 50, stock, a limit of one per stream and a 60-second cooldown.](https://bloopbot.com/docs/screenshots/store-item-editor.jpg) _The Store page with two items, and the item editor open on Hydrate: its cost, stock, per-viewer limit, cooldown and picture._ An item you untick **For sale** stays on the page but leaves the store until you tick it again. The archive icon (**Archive**) at the bottom of the item's editor files it away for good; its purchases stay in the list. You can also [ask a connected AI assistant to make an item](https://bloopbot.com/docs/connect-an-ai-assistant#store-example). Allow it to see and edit your points store when connecting. Items it creates start off sale so you can review them first. ## 2. Let viewers buy from chat The **Points store** pack gives chat two commands: - `!store` lists what is for sale and what each item costs: _🛒 For sale: Hydrate (50), Shout-out (500)._ - `!buy` and an item's name buys it: `!buy hydrate`. A viewer can type just the start of the name when only one item starts that way. The **Store** page offers the commands when nothing lets viewers buy from chat yet: a **Store commands** row under the page title says _Viewers can’t buy from chat yet._ Press **Add** on it to open the Points store pack’s review on the right, then press its button to add the three flows, paused, and switch them on. You can also add **Points store** from **Marketplace**. When a purchase is refused — not enough points, sold out, a limit reached, the cooldown still running, or no such item — `!buy` replies to the viewer saying why. On success it stays quiet, because the pack's third flow, **Thank a store purchase**, tells chat who bought what. ## 3. Share your web store Every channel has a web store at `/c//store`. The **Store** page shows the link at the top with a copy icon (**Copy the store link**); put it in your panels, your `!store` reply or a chat timer. Your channel's home page, `/c/`, shows the first few items and each viewer's points too, beside your open giveaways, a **Watch on Twitch** button, your full Twitch bio and [your own links](https://bloopbot.com/docs/public-page). If you only want one link in your panels, use that one: every channel page has tabs for **Home**, **Giveaways**, **Store** and **Your prizes**. On the web store, a viewer signs in with Twitch, sees how many points they have, and presses **Buy** on an item. An item that asks for text shows a box for it first. They land back on the store with a line saying it worked, or why it did not. Buying there is the same purchase as `!buy`: the same rules, the same list on your **Store** page, and the same **Store item bought** flows. ![A channel's web store signed in: Your points 1150, and the Hydrate and Shout-out items with their pictures, costs, limits and Buy buttons.](https://bloopbot.com/docs/screenshots/store-web.jpg) _The web store signed in: the viewer's points, and two items with their pictures, costs, what is left and a Buy button._ ## 4. Make an item do something A purchase runs every flow that starts with **Store item bought**. Make one flow per item: 1. On **Flows**, press **+ New flow** and start blank. 2. Add the **Store item bought** trigger. 3. On the **Store** page, open the item and copy its id from the bottom of the editor. Paste it into the trigger's **Only this item**. Blank runs the flow for every item. 4. Add what the item does. The trigger hands on `$(user)` (who bought it), `$(itemname)`, `$(cost)`, `$(text)` (what they typed with it), `$(balance)` (their points afterwards) and `$(purchaseid)`. 5. Save it and switch it on. **Example:** a Hydrate item that posts in chat. 1. Trigger: **Store item bought**, **Only this item** set to Hydrate's id. 2. **Chat message**: `💧 $(user) says drink some water! I’m taking a sip.` To mark the purchase done from the flow itself, end it with **Fulfil or refund** set to **Mark it fulfilled**; it takes `$(purchaseid)` from the trigger on its own. Otherwise mark it by hand on the **Store** page (below). A flow can also sell things itself: the **Buy a store item** step buys an item for the viewer who triggered the flow, and follows **ok** or **rejected** with the reason, and **List the store** hands on the `Hydrate (50), Shout-out (500)` line. That is how the `!store` and `!buy` commands are built. ## Items that ask for text Fill in **Ask the buyer for text** — for example _What should I say on stream?_ — and the buyer has to add something: after the name in chat (`!buy shout-out say hi to my cat`), or in the box on the web store. Without it the purchase is refused and nothing is charged. Your flow reads it as `$(text)`. What viewers type is not checked for you. To keep it off stream when it is not OK, put an **AI: text OK to show?** check between **Store item bought** and whatever shows it, set its **Text** to `$(text)`, wire its **safe** branch to whatever shows the text, and on its **flagged** branch add **Fulfil or refund** set to **Refund it**, so the viewer gets their points back. [Screen text before it goes on stream](https://bloopbot.com/docs/text-screening) explains the check and its **Unsure** branch. ## Limits, cooldowns and stock - **Stock** is how many there are. Each purchase takes one; at 0 the item shows _Sold out_ and `!buy` says so. A refund puts one back. Blank means unlimited. - **Limit per viewer** is how many times one viewer can buy it. **Limit counts** decides over what: **Forever**, or **Per stream**. A per-stream limit counts purchases made while you are offline towards your most recent stream, and starts again when your next stream goes live. A refunded purchase no longer counts. - **Cooldown** is for the whole item: after anyone buys it, nobody can for that many seconds. Use it for things you can only do so often on stream, like a sound or a spin. ## Purchases, fulfilling and refunds Open **Store** and choose **Purchases** to see every purchase, newest first: who bought what, for how much, from chat, the web store or a flow, anything they typed, and its state. **Show** filters by **Pending**, **Fulfilled** or **Refunded**. - The tick icon (**Mark fulfilled**) is for when you have done what the item promised. It is a note for you; it changes nothing for the viewer. - The undo icon (**Refund**) gives the viewer their points back and puts the item back in stock. Refunding a purchase you already marked fulfilled asks first. A purchase can only be refunded once. A refund returns the points to the viewer's balance only: it is not counted as points they earned. ![The Store page's Purchases tab: CozyCrow's pending Hydrate with Mark fulfilled and Refund, PixelPip's refunded Shout-out with the text they typed, and LunaMoth's fulfilled Hydrate.](https://bloopbot.com/docs/screenshots/store-purchases.jpg) _The Purchases tab: a pending purchase with Mark fulfilled and Refund, a fulfilled one, and a refunded one._ ## Ideas - **Hydrate** or **Stretch**: a cheap item with a cooldown, and a chat line. - **Shout-out**: an item that asks for a name, and a flow that runs **Shout out a streamer** on `$(text)`. - **Spin the wheel**: an item whose flow runs **Spin a wheel** — see [Spin a wheel on stream](https://bloopbot.com/docs/spin-wheel). - **Skip the queue**: an item that puts the buyer in your viewer queue ahead of everyone who joined normally — see [Sell a place at the front of the queue](https://bloopbot.com/docs/points-store#skip-queue). ## Sell a place at the front of the queue If you run a [viewer queue](https://bloopbot.com/docs/viewer-queue), a store item can put the buyer in it ahead of everyone who joined with `!join`. 1. On **Store**, create an item called `Skip the queue` with a cost, say 300 points. Fill in **Ask the buyer for text** with _Your gamertag_ if your queue asks for a note, and set **Limit per viewer** to 1 **Per stream** so nobody buys it twice. 2. Copy the item's id from the bottom of the editor. 3. On **Flows**, press **+ New flow**, start blank and add **Store item bought**. Paste the id into **Only this item**. 4. Add **Join the queue**. Set **Their note** to `$(text)` and turn **Skip the line** on. 5. Off **Join the queue**'s **rejected** branch — the queue is closed or full, or they are already in it — add **Fulfil or refund** set to **Refund it**, then a **Chat message**: `$(user), the queue can’t take you right now, so your points are back.` 6. Save the flow and switch it on. Now `!buy skip the queue Lucky#1234` (or **Buy** on your web store) takes the points and puts the viewer at the front of the line, behind only others who skipped it. If the queue will not take them, they get their points back and the item goes back in stock. [Run a viewer queue](https://bloopbot.com/docs/viewer-queue#rules) has more ways to decide who may join. ## Troubleshooting - **`!buy` does nothing.** Check the **Store** page's notice: the store commands may not be installed or switched on. `!buy` also has a short per-viewer cooldown so one viewer cannot flood chat. - **Everything says the store is closed.** Loyalty points are switched off. Turn them on from **Loyalty**. - **A viewer says they have points but cannot buy.** Their balance is below the cost, the item's limit or cooldown applies, or it is sold out. `!buy` and the web store both say which. - **The item bought, but nothing happened on stream.** Purchases only do what a **Store item bought** flow does. Check that the flow is switched on and that **Only this item** holds that item's id, or is blank. --- # Collections for cards, inventories and achievements Make a collection that viewers fill from chat, fill its catalogue from a CSV, build a !pack card opener and a !cards command, and manage what each viewer holds, within your plan's limits. Updated 21 October 2026 ## What a collection is A collection is a named set of items that each viewer holds, or that your channel holds once. Every entry is an item with a count: "Pixel Pup ×3". Use one for trading cards a viewer opens from packs, an inventory of potions, or a list of achievements (an achievement is an item held once). A collection is not a variable. A variable holds one value; a collection holds many items and lets a flow add one, remove one, check for one or read them all back. You make collections on the **Collections** page under **Bot**, next to **Variables**, and flows use them through six steps: **Give an item**, **Take an item**, **Has an item**, **Read a collection**, **Pick from a catalogue** and **Update a catalogue**. This guide builds a card-pack opener: viewers type `!pack` to open a pack, and `!cards` to see what they own. ## 1. Make the collection 1. Open **Collections** and press **New collection**. 2. Type a **Name**, `Cards`. 3. Under **Who holds the items**, choose **Each viewer has their own**. Choose **One set for the channel** instead for something shared, like a stream-wide loot pile. 4. Leave **Only items from a catalogue** ticked, then press **Make the collection**. ![The Collections page with the New collection form filled in: the name Cards, each viewer has their own items, and only items from a catalogue ticked.](https://bloopbot.com/docs/screenshots/collections-new.jpg) _The New collection form: the name Cards, each viewer having their own items, and only items from a catalogue ticked._ Expected result: the page confirms **Made the Cards collection** and opens it, with an empty catalogue. > **Channel or viewer?** > > A **viewer** collection keeps a separate set for each person, so `!cards` shows their own. A **channel** collection is one set for the whole channel: a step on it ignores who typed the command, and you edit its items right on the collection's page. A collection cannot be switched from one to the other afterwards; make a new one. ## 2. Fill the catalogue A catalogue lists every item the collection accepts. Each item has a name, an optional picture from your media library, an optional rarity and a **weight**: how often a weighted pick lands on it. With a catalogue on, a **Give an item** step can only hand out items from it, so a typo is refused instead of making a new item. Add items one at a time with **Add item**, or in bulk: 1. Open the collection and press **Import CSV** in the **Catalogue** section. 2. Paste one item per line as `name, picture, rarity, weight`. A header row can name the columns in any order, and the picture is a media-library file name. For the example, paste: ``` name,rarity,weight Pixel Pup,Common,10 Moss Mouse,Common,10 Cozy Cat,Uncommon,4 Neon Newt,Rare,1 ``` 1. Read the preview. It lists each line as **New**, **Changes**, **No change** or **Problem**, and nothing has changed yet. A blank cell leaves that field as it is. You can also press **Import CSV** to load one. 2. Press **Apply 4 changes**. ![The Cards catalogue with Import CSV open: four card rows pasted, and the preview below them listing each as new with a count of what will be added before anything is applied.](https://bloopbot.com/docs/screenshots/collections-catalogue.jpg) _The CSV pasted into Import CSV, with the preview listing four new cards and Apply 4 changes below it._ Expected result: **Catalogue updated: 4 added, 0 changed.** and a list of four items. Pasting a changed CSV later updates existing items by name. Weights are relative. With weights 10, 10, 4 and 1, Neon Newt turns up in 1 pack in 25. A weight of `0` never comes up. Removing an item from the catalogue (the trash icon on its row) only stops flows giving or picking it: viewers who already hold it keep it. A flow can fill a catalogue too with **Update a catalogue**, for example from a **Read JSON** step. It adds and changes items but never removes them. ## 3. Build the !pack command Make a flow with a **Chat command** trigger named `pack`, then add three steps in this order. Start from [your first command](https://bloopbot.com/docs/first-command) if you have not built one. 1. **Pick from a catalogue**: choose **Cards** and leave **Use each item's weight** on. It picks one card at random but gives nothing yet. 2. **Give an item**: choose **Cards**, and set **Item** to `$(from.pick.name)`. Leave **Whose collection** blank, which means the viewer who typed the command, and **How many** blank for 1. 3. **Chat message**: ``` @$(user) opened $(from.pick.name) ($(from.pick.rarity))! ``` Use **Insert…** to pick the values instead of typing them: the picked card's **The item** and **Its rarity** are listed under the **Pick from a catalogue** step. Save the flow and switch it on. ![The Open a card pack flow on the flow canvas: a !pack command, Pick from a catalogue on Cards, Give an item reading the picked name, and a chat message naming the card and its rarity, with dashed data wires carrying Who typed it, the picked item and its rarity to the steps that use them.](https://bloopbot.com/docs/screenshots/collections-pack-flow.jpg) _The Open a card pack flow on the canvas: Chat command, Pick from a catalogue, Give an item and Chat message._ Expected result: when a viewer types `!pack`, chat says something like `@PixelPal opened Cozy Cat (Uncommon)!` and the card is in their collection. Each pack adds one to the count, so a second Cozy Cat becomes ×2. To open only rare cards, fill **Only this rarity** on the pick step with `Rare`. To react when the viewer already had the card, put a **Has an item** step before **Give an item**. > **Test runs do not change anything** > > **Test fire** runs the flow without writing: the pick hands on a placeholder name and nothing is given. Type the command in chat to open a real pack. ## 4. Build the !cards command Make a second flow with a **Chat command** trigger named `cards` and a **Chat message**: ``` @$(user) your cards: $(collection.cards.text) ``` The **Insert…** menu lists each collection with four values you can drop into any message, so there is nothing to look up: | Value | Shows | | --- | --- | | `$(collection.cards.text)` | The collection as one line: `Pixel Pup ×2, Cozy Cat, Neon Newt` | | `$(collection.cards.count)` | How many items in all, counting repeats | | `$(collection.cards.distinct)` | How many different items | | `$(collection.cards.has.pixel_pup)` | `true` or `false` | The key (`cards`) is the collection's name in lower case, with accents dropped and every other run of characters written as `_`: "Gold Stars" becomes `gold_stars`. If you rename a collection, update the messages that use its values. A long list is cut to fit Twitch's 500 characters and ends with "…and 12 more". To go through items one by one, use **Read a collection** with a **For each** step. Expected result: typing `!cards` answers `@PixelPal your cards: Pixel Pup, Cozy Cat, Neon Newt, Moss Mouse`, with a count after any card held more than once. ## 5. Look up, give and take for a viewer Open the **Look up a viewer** tab and type a viewer's Twitch name. You see what they hold in every viewer collection, with **Give** and **Take** beside a box for the item and a count. Use it to fix a mistake or reward someone by hand. A viewer must have chatted in your channel before they can be found. ![Look up a viewer showing PixelPal and the Cards they hold with counts, Give and Take controls on each row, and the Remove this viewer’s data button.](https://bloopbot.com/docs/screenshots/collections-viewer.jpg) _Look up a viewer showing PixelPal's four cards in Cards, the Give and Take controls and the Remove this viewer's data button._ ## 6. Turn a text variable into a collection If you have been keeping a list in a text [variable](https://bloopbot.com/docs/variables), such as `Pixel Pup, Cozy Cat, Pixel Pup`, you can convert it: 1. Open **Variables** and find the text variable. 2. Press its **Convert to a collection** icon on the row. 3. Choose what separates the items: commas, new lines, semicolons, bars, spaces or something else. 4. Read the preview, which splits a few viewers' values the way the conversion will. Repeats are counted, so "A, A, B" becomes A ×2 and B. 5. Name the collection and press **Make the collection**. ![The Convert to collection form opened on a text variable called cards\_owned, with commas chosen as the separator, a collection name, and a preview that splits the value into counted items.](https://bloopbot.com/docs/screenshots/collections-convert.jpg) _Convert to collection open on a text variable, with commas chosen and a preview splitting the value into counted items._ The collection takes the variable's scope: a per-viewer variable makes a viewer collection. The variable stays exactly as it was, so no flow breaks. Change your flows to use the collection's steps, then delete the variable yourself. The conversion makes a collection without a catalogue, so any name is accepted. ## 7. Remove a viewer's data When a viewer asks you to forget them, open **Look up a viewer**, find them and press **Remove this viewer's data**. After you confirm, everything they hold in every collection and every value your per-viewer variables keep for them is deleted, and it cannot be brought back. Their loyalty points stay: change those on the [Loyalty](https://bloopbot.com/docs/loyalty-and-regulars) page. Otherwise, viewers' items are kept for as long as your channel exists, like loyalty balances. ## 8. What your plan holds | | Free | Plus | Pro | | --- | --- | --- | --- | | Collections | 1 | 5 | Unlimited | | Items one viewer can hold in one collection | 200 | 1,000 | 5,000 | | Items in one catalogue | 250 | 2,000 | 10,000 | Free is enough to run the card opener above end to end. The **Collections** page shows how many collections you have against your plan, and [Plan & billing](https://bloopbot.com/docs/what-your-plan-includes) shows all your limits together. Reaching a limit never deletes anything. A **Give an item** to a viewer who is already full follows its **error** path, and the reason is available as `$(from..message)` for a chat line such as "your collection is full". If your channel has more collections than its plan holds, for example after a plan ends, the newest ones become **Read-only**: flows can still read them and chat can still show them, but nothing can be added or changed until you delete an older collection or upgrade. ## Share a collection in a pack When you share flows that use a collection, as a download or in a [pack](https://bloopbot.com/docs/create-packs), the collection goes with them: its name, whether it is per viewer or for the channel, and its catalogue with pictures, rarities and weights. What your viewers hold never goes with it. When someone adds the pack, a collection with the same name in their channel is used and its catalogue is topped up: new items are added and the pack's details win for items they both have. Nothing is removed. Names that differ only in capitals, accents or spacing count as the same collection. If their collection with that name is the other kind (per viewer instead of for the channel), the pack is not added until they rename theirs. A pack can bring up to 2,000 catalogue pictures. With more, or with very large pictures, the download refuses and names the collection: take pictures off some items or use smaller pictures. ## Troubleshooting - **A step says the item is not in the catalogue.** The collection only accepts catalogue items, and the name must match one. Copy the name from the catalogue, or use `$(from.pick.name)` from a **Pick from a catalogue** step. - **`!pack` does nothing.** Check the flow is switched on and that **Pick from a catalogue** names the right collection. A pick fails on a collection with no catalogue or an empty one. - **`!cards` is blank.** The viewer holds nothing yet, or the message uses a key from an older collection name. Re-pick the value from **Insert…**. - **A collection is read-only.** You have more collections than your plan holds. Delete an older one or upgrade. - **The preview says a line has a problem.** The line has no name, or a picture file that is not in your [media library](https://bloopbot.com/docs/choose-and-upload-media). Problem lines are left out when you apply. - **A viewer is not found.** They have not chatted in your channel yet. --- # Run a giveaway in chat Create a giveaway, let chat enter with a keyword, then close it, draw a winner, confirm the prize and put it on stream. Updated 12 November 2026 ## The short answer Bloopbot runs keyword giveaways in Twitch chat. You pick a word, viewers type it to enter, and Bloopbot draws a winner at random, who confirms by saying a second word in chat. You can limit entry to followers, to certain roles or to a minimum watch time, charge loyalty points for each ticket, give subs, VIPs and regulars better odds, draw more than one winner and have a winner who does not answer replaced. Giveaways are included on every plan. From nothing to a winner: 1. Add the **Giveaway** pack from **Flows → Add** and switch its flows on. They are what enters viewers and announces the winner. 2. Open **Giveaways** in the sidebar, press **New giveaway** and name the prize. 3. On **Entering**, set the **Keyword**, such as `lucky`, and who can enter. 4. On **Winner**, choose how a winner confirms, then go on to **Review** and press **Save**. 5. Press **Open** in the **Run** panel. Chat is told the giveaway is open and which word to type. 6. Press **Close and draw**. Chat hears who won, and the winner types the confirm word to claim. The rest of this guide covers each rule, running a giveaway from chat with mod commands, putting it on stream and letting viewers enter from the web. ## Before you start A giveaway is a record with its own rules: the prize, the word that enters it, how many winners there are, and how a winner claims it. You set it up once, open it when you are ready, and every line chat sees comes from a flow — so the wording is yours to change. - Bloopbot connected to your channel so it can read and answer chat: [Get started with Bloopbot](https://bloopbot.com/docs/getting-started) walks through it. - The **Giveaway** pack, from **Flows → Add**. It brings the flows a giveaway runs on: the `!giveaway` mod commands (one flow per command — **Open a giveaway**, **Close a giveaway** and the rest), `!enter`, keyword entry, the confirm word, and the winner announcement. If the Flows list already holds flows such as **Giveaway status** or **Enter the giveaway**, yours came with the pack earlier — check what is there instead of installing a second copy. - Points, if a ticket is to cost anything: [loyalty points](https://bloopbot.com/docs/loyalty-and-regulars) are what a ticket spends. A giveaway whose ticket cost is 0 needs nothing here. - The bot account as a moderator, as for any flow that reads and answers chat: [make your bot a moderator](https://bloopbot.com/docs/getting-started#moderator) by copying the `/mod` command from the **Make your bot a mod** step of Set up your bot or the **Not a mod** bar and sending it in your Twitch chat. Giveaways are included for every channel, on every plan, including drawing more than one winner and letting viewers enter from the web. [Your plan](https://bloopbot.com/docs/what-your-plan-includes) shows what your channel has. > **Entry is chat, web, or both** > > Chat entry — the keyword and `!enter` — is what the rest of this guide covers. A giveaway can also take entries from its own public page: [Let viewers enter from the web](https://bloopbot.com/docs/giveaways#web) covers turning it on. To hand out keys one at a time with a mod command instead of a draw, use a [prize pool](https://bloopbot.com/docs/prize-pools). > **Had the older Giveaway controls?** > > One flow used to answer every `!giveaway` command. It still works. Installing the pack now brings you the seven newer command flows alongside it, and the pack’s review tells you before you add it if `!giveaway` is already claimed, under **Needs: chat commands**. Once you have switched the new ones on, pause or delete **Giveaway controls** — with both running, a bare `!giveaway` or an unknown word after it gets answered twice. ![The Needs: chat commands row of the Giveaway pack’s review in Add to Flows, opened: Command !giveaway is claimed by this flow and by “Giveaway controls” (paused). While both flows are live, each answers a !giveaway in chat. Change one of the command words, or keep one of the flows paused.](https://bloopbot.com/docs/screenshots/giveaway-command-conflict.jpg) _The Giveaway pack’s review in Add to Flows: its **Needs: chat commands** row, opened, says `!giveaway` is claimed by this flow and by “Giveaway controls” (paused) — a warning, not a blocker._ ## Get help with your setup Optional **Help me** explains your existing giveaway and its current state. Keep your first giveaway as a draft while reviewing entry channels, eligibility, ticket costs and the prize. Opening entries, drawing a winner and delivering the prize are separate choices; setup does none of them for you. ## 1. Set the rules Open **Giveaways** in the sidebar, under **Viewers**, and press **New giveaway**. A new giveaway starts as a **Draft**: nothing in chat can see it yet. ![The Giveaways page: a Drafts section with Blind box giveaway, an Open section with Saturday sub-a-thon, a Finished section with Friday key drop showing the Drawing badge, 5 entries, says “lucky” and 2 winners, and a collapsed Archived shelf.](https://bloopbot.com/docs/screenshots/giveaway-list.jpg) _The list groups giveaways the way you work through them: Drafts, Open, Finished and a collapsed Archived shelf, with the entry count and the keyword on every row._ Setting a giveaway up takes four steps — **Prize**, **Entering**, **Winner** and **Review** — shown along the top of the editor. **Next** saves what you changed and moves on, **Back** goes back without saving, and you can jump to any step from the step list; nothing you type is lost when you move between them. The address remembers the step you are on, so a reload keeps your place. **Prize** 1. Under **What are you giving away?**, name the prize as chat reads it, such as “Friday key drop”. **Tell viewers about it** is optional, and so is **Cover art**. 2. Set **Number of winners**. One is the usual case. 3. Under **How does the winner get it?**, choose **In chat**, the classic exchange this guide covers, or **Claim page** for a real prize — a key, a gift link, something posted to them — that a winner signs in and claims for themself. Choosing **Claim page** brings the **Prizes** section into this step to stock what you are giving away; see [Give away game keys and prizes](https://bloopbot.com/docs/giveaway-prizes). **Entering** 1. Under **Where do people enter?**, **Chat** is ticked by default. Set its **Keyword**: the one word that enters the giveaway, such as `lucky`. Only one open giveaway can hold a keyword at a time, and it is not a command, so it takes no prefix. Tick **Web** too, or instead, to let viewers enter from the giveaway's own public page — see [Let viewers enter from the web](https://bloopbot.com/docs/giveaways#web). Typing the keyword enters nobody by itself: a flow does the entering, and the Chat card names it — “Viewers who type “lucky” enter through your **Enter with the keyword** flow”. Under that line is the flow's status. **Live** means it is switched on, with **Open flow** beside it. **Paused — nobody can enter from chat** means the flow exists but is switched off; **Open flow** takes you to it to switch it on. **No flow enters people from chat yet** means the channel has no such flow; **Add the Giveaway pack** opens the pack in the Marketplace, with its review. Entering from the web does not need a flow. 2. Under **Who can enter?**, the line at the top says who can enter right now — **Anyone.** until you restrict it. Tick **Followers only** (and set how many days), pick roles under **Only these roles**, or set a watch-time minimum. 3. Open **Tickets and points** to decide what a ticket costs: **Ticket cost (points)** is spent per ticket, **Max tickets each** is how many one viewer may hold, and **First ticket is free** takes the cost off the first one they take. Left closed, entry is free with one ticket each. 4. Open **Better odds for subs, VIPs and regulars** if their tickets should weigh more. The best multiplier a viewer qualifies for is the one used; multipliers never stack. **Winner** 1. Under **How does a winner confirm?**, choose **Say a word in chat** — set the **Confirm word** (one word, `!claim` by default) and the **Seconds to confirm** — or **No confirmation**, where the winner is final the moment they are drawn. With a word to say, **If they don’t confirm in time, draw someone else** redraws a winner whose window runs out. The confirm word works the same way as the keyword: the **Say a word in chat** card names the flow that confirms a winner — the pack's **Claim with the confirm word** — and shows **Live**, **Paused — winners can’t confirm in chat**, or **No flow confirms winners from chat yet**, with a link to the flow or to the pack. 2. Under **When does it run?**, choose **I’ll open and close it myself**, or **On a schedule** and fill in **Opens** and **Closes**. **Review** 1. Read the giveaway back: one sentence each for the prize, entering, who can enter, the winner and when it runs, with a pencil icon (**Edit**) beside each to jump back to that step. **Before it can open** lists anything that would stop it opening — too few prizes stocked for the winners, a follow-lock Twitch cannot check yet, a plan limit — each with a button to the step that fixes it, or says **Ready to open**. It also lists a keyword or confirm-word flow that is paused or missing, with a link to the flow or to the Giveaway pack. The giveaway still opens without it, but nobody could enter or confirm from chat. ![The setup wizard’s Review step for Boss key giveaway: the stepper with Prize, Entering and Winner ticked, then one sentence per part with a pencil icon (Edit) — 2 winners get Boss key giveaway on a claim page, 2 prizes stocked for 2 winners; anyone in chat who types “bosskey” enters, free, up to 1 ticket each; anyone; each winner claims it on the page within 72 hours; you open and close it yourself — then Before it can open reading Ready to open, and Back and Save.](https://bloopbot.com/docs/screenshots/giveaway-setup-review.jpg) _The Review step: the giveaway in one sentence per part, each with a pencil icon (**Edit**), and Before it can open reading Ready to open._ Press **Save**. The giveaway is still a draft, so nothing reaches chat yet — open it from the **Run** panel when you are ready. > **Rules are fixed once it starts** > > After a giveaway opens, its rules cannot be changed: the editor shows them as the Review sentences, with no steps to edit. A closed giveaway that drew nothing is the exception — correct it and open it again. For a second run of the same idea, create a new giveaway with the same rules. ## 2. Let chat enter 1. Press **Open** in the **Run** panel. The badge changes to **Open**, and the pack’s flow says so in chat: _🎉 Friday key drop is open! Type lucky to enter._ 2. Type the keyword in chat as a viewer would: `lucky`. That line enters them. The pack’s defaults keep a successful entry quiet, so watch the **Entries** list on the page rather than chat. 3. A viewer who wants more than one ticket types `!enter 3`, or `!ticket 3`, and is charged for each ticket. `!enter max` takes the most they can hold. 4. Watch the run panel: the entry count and points spent refresh on their own, and the entries list shows each viewer with their tickets, badges and watch time. Keyword entry is the pack’s **Enter with the keyword** flow, and **Claim with the confirm word** handles the confirm word. Both start on the **Giveaway chat** trigger, whose **When** field picks the keyword, the confirm word or either. Nothing else in chat reaches that trigger, so a flow of your own on it only ever runs for an open giveaway’s keyword or a winner’s confirm word. The **Giveaways** page tells you when that is the case: with no entry flow on, a **Giveaway flows** row under the page title says _Viewers can’t enter your giveaways from chat yet._ Press **Add** on it. The Giveaway pack’s review opens on the right of the page, and its button says how many flows arrive, all paused. Press it: the review turns into **Added — paused** and **Set it up**. Close the panel, and the row now says the flows are paused: press **Switch on**, or **Open flow** to look first. A paused entry flow of your own is named instead, with **Open flow** and **Switch on**, so you never end up with two. ![The Giveaways page with a Giveaway flows row under the title: 15 flows, Viewers can’t enter your giveaways from chat yet, and an Add button. Beside it on the right, the Add giveaway flows panel shows the Giveaway pack’s review: Adds 15 flows to your channel, they start paused, an Add 15 flows — paused button, and What you get.](https://bloopbot.com/docs/screenshots/giveaways-flows-door.jpg) _The Giveaway flows row, and the Giveaway pack’s review docked on the right._ A refusal is said back to the viewer in the giveaway’s own words — not following, the wrong role, too little watch time, not enough points, or already holding every ticket they can. If chat says nothing at all, the keyword flow is usually paused or was never installed: the Chat card on the **Entering** step says which, and the last section covers the rest. ## 3. Close it and draw a winner Everything about the giveaway is on one page: the rules on the left, what it is doing right now in the **Run** panel on the right. Once it has started, the rules read as sentences rather than a form. ![One giveaway’s page after the draw: on the left, the started giveaway read back as sentences — 2 winners get Friday key drop, handed over in chat; anyone in chat who types “lucky” enters, first ticket free, then 100 points a ticket, up to 5 tickets each; anyone can enter; each winner confirms by typing “!claim” within 60 seconds, or someone else is drawn; you open and close it yourself — under the note that its rules are fixed; on the right, the Run panel with 5 entries, a Call off button, a Slot 1 winner marked Claimed, a Slot 2 winner Waiting to confirm with 55s left, and the five entrants with their tickets and badges.](https://bloopbot.com/docs/screenshots/giveaway-run.jpg) _The worked example after the draw: its rules as sentences — 2 winners, 100 points a ticket after a free first one, up to 5 each, 60 seconds to confirm — and the Run panel with one winner slot Claimed and one Waiting to confirm 55s left. One difference from the example below: the giveaway is open to anyone here, because checking follows needs a channel whose Twitch connection allows it._ 1. Press **Close** to stop entries, or **Close and draw** to do both at once. Entries stop the moment either is pressed. 2. The Draw button fills the empty winner slots at random. It closes an open giveaway first, so it is always safe to press. 3. Each winner appears as a **Winner slot** card with their avatar, tickets and a countdown for the confirm window. Chat hears who won from the pack’s announcement flow. 4. A winner types the confirm word to claim. You can also press the tick icon (**Confirm**) on the slot yourself — that is what to do when the prize was handed over on stream. 5. Press the circular-arrows icon (**Reroll**) on a slot to replace that winner with a fresh draw from everyone who has not won yet. The slot card shows the replacement. 6. When every slot is confirmed the giveaway reads **Finished**. Press **Archive** to file it away under the collapsed **Archived** shelf. When a confirm window runs out and the giveaway is set to draw a new winner when it does, that slot is redrawn on its own and the card shows the new winner. > **Calling a giveaway off** > > Press **Call off** to end a giveaway that should not finish. Every point spent on tickets goes back to its viewer, and the record ends as **Called off**. It cannot be reopened, so create a new one if you want to try again. ## 4. Run it from chat Moderators can drive the whole giveaway from chat. Each command is its own flow, named for what it does — **Open a giveaway**, **Close a giveaway**, **Draw a winner**, **Reroll a winner**, **Confirm a winner**, **Cancel a giveaway** and **Giveaway status** — so you can change one, or switch it off, without touching the rest. Making and editing the giveaway on **Giveaways** needs the dashboard, so that part is yours or an editor’s. A moderator you have ticked on **Team** can run a giveaway you already made from its page too — open, close, draw, reroll and end — without seeing any prize code; the rest of your moderators work from chat. [Share the work with mods and editors](https://bloopbot.com/docs/editors#roles) covers who can do what. | Command | What it does | | --- | --- | | `!giveaway open [keyword]` | Opens a giveaway, taking the keyword typed after the command | | `!giveaway close` | Stops entries; `end` and `stop` work too | | `!giveaway draw` | Draws the winners; `roll` and `pick` work too | | `!giveaway reroll [slot]` | Redraws one slot; without a number it is slot 1 | | `!giveaway confirm ` | Confirms that winner for them | | `!giveaway cancel` | Calls the giveaway off and refunds the points — the broadcaster only | | `!giveaway` | Anything else says where the giveaway stands | An operation on a giveaway that is not in the right state says why in chat. `!giveaway cancel` is quieter: only the broadcaster can call a giveaway off, and it does nothing at all for anyone else — no chat line, so it reads the same as a typo to a moderator who tries it. > **An easy extension** > > Want VIPs to draw winners too, without giving them every other command? Open the **Draw a winner** flow and change its level check from Moderator to VIP — the other six commands are untouched. ## 5. Put the moments on stream The **Giveaway** pack also shows three giveaway moments on your overlay as alerts: the giveaway opening, a winner being drawn, and a winner confirming. Each is its own flow, and each plays the alert design it names: **Giveaway opened alert** plays your `giveaway-open` alert design, **Giveaway winner alert** plays `giveaway-winner`, and **Giveaway claimed alert** plays `giveaway-claimed`. 1. Add the **Giveaway** pack from **Flows → Add** if it is not in your Flows list yet. 2. The pack adds a **Giveaway alerts** overlay with one alert layer for each moment, and puts the three designs in your draft (a design you already have by that name is kept). Publish in Studio so they show, then add the overlay’s URL to OBS from **Set it up**. To show them on an overlay you already use instead, add a **Custom alert** layer for each moment there and rename its design to the name that flow uses. 3. Open **Giveaway opened alert**, **Giveaway winner alert** and **Giveaway claimed alert** and enable the ones you want. Each of the three starts on the **Giveaway changes** trigger, with its **When** field set to **It opens**, **A winner is drawn** or **A winner confirms**. A flow of your own on that trigger can react to any other moment too — **Someone enters**, **Entries close**, **A claim runs out**, **A slot is redrawn** — and **Only this giveaway** narrows it to one giveaway. A missing design is not an error: the run continues, nothing is shown for that moment, and the run log says which design name it wanted. [Arranging your overlay](https://bloopbot.com/docs/arrange-your-overlay) covers placing alert layers, and [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) covers putting the overlay in OBS. ## 6. Put the giveaway panel on stream Chat runs the giveaway; the **Giveaway** widget is where viewers watch it. One panel follows the giveaway you are running and shows the prize and its cover art, the keyword, how many entries are in, the last few people who entered, and the draw itself. ![The Giveaway layer selected in the overlay editor: a small giveaway panel on the canvas, and the right inspector’s Content tab showing Draw style set to Slot reel, with Style, Parts and Motion alongside.](https://bloopbot.com/docs/screenshots/giveaway-panel-editor.jpg) _A Giveaway layer selected in the overlay editor: Layers on the left, the panel on the canvas, and Draw style in its Content tab on the right._ 1. Open **Overlays** and press **Browse templates** (**New overlay** makes an empty one instead). There are two giveaway overlays: **Giveaway panel**, a corner card, and **Giveaway: Big reveal**, a wider one that draws the draw out longer and lists more entrants. 2. Press **Add** on the one you want, read its review and press **Add**. A **Giveaway** layer on an overlay you already have comes from **Add** on the left of the editor instead. Press **Publish** to put it on stream. 3. Give the prize a picture on the Giveaways page: **Cover art** is on the giveaway's **Prize** step. Press **Choose picture** or **Upload** there. It is optional, and setting it needs no Twitch permission. 4. Copy the widget’s **OBS URL** and paste it into an **OBS Browser Source**, 1920 × 1080 with a transparent background — [the same as any other widget](https://bloopbot.com/docs/widgets-in-obs). 5. Open the giveaway. Everything else on the panel follows from the record: the keyword, the entry count and the last few entrants appear as chat enters. ![The giveaway panel while entries are open: the heading GIVEAWAY, the cover art above the prize “Friday key drop”, the keyword “lucky”, “5 entries”, the line “Entries open”, and the last five entrants — pixelpal, bytebaron, quietmouse, neonnina and maplemonk — each with the time they entered.](https://bloopbot.com/docs/screenshots/giveaway-panel-entries.jpg) _The panel while entries are open: the prize, its cover art, the keyword, how many have entered, and the last few entrants with the time each one entered._ While entries are open the panel counts down to the close time you set, or reads **Entries open** when the giveaway has no scheduled close. A giveaway that is still a draft draws its card with **Not open yet**, and nothing at all is drawn once one finishes or is called off. Then the draw. Press **Draw** on the giveaway (or **Close and draw**, or `!giveaway draw` in chat) and the panel takes over: each winner slot spins in turn and lands with that winner’s name and their confirm window counting down beside it. Redrawing a slot spins that slot again with the fresh draw. ![The giveaway panel just after the draw: the same prize and cover art, then two winner slots, each with the winner’s name and “55s to confirm” beside it, above the list of the five entrants.](https://bloopbot.com/docs/screenshots/giveaway-panel-overlay.jpg) _After the draw: two winner slots landed, each with its own confirm window counting down, above the entrants list._ **Use the roomier Giveaway 2 design.** Select your Giveaway layer, open **Content**, and look for **New look available**. Press **Preview new look** to see it on the canvas, then **Use new look** and **Publish** to put it on stream. Your giveaway settings are carried over. The new design groups the prize and optional cover art, gives the entry keyword its own space, and shows each winner in a card with a confirmation ring. ![Giveaway 2 with Friday key drop, the lucky entry keyword, five entries and five recent entrants with their entry times.](https://bloopbot.com/docs/screenshots/giveaway-panel-v2-open.jpg) _Giveaway 2 while entries are open: the entry keyword and five recent entrants have their own space._ The design follows your overlay's theme, including its font, colours, corners, spacing and backgrounds. In **Parts**, **Winner card** styles the cards and **Winner status** styles the confirmation and outcome text. A Minimal theme leaves the stream visible behind the content. **Show the entry keyword**, **Show how many have entered**, **Show the latest entrants** and the other Content switches still choose what appears. ![Giveaway 2 after a real draw: two winner cards with their own confirmation countdown rings, above the five recent entrants.](https://bloopbot.com/docs/screenshots/giveaway-panel-v2-winners.jpg) _Giveaway 2 after the draw: two separate winner cards, each with its own confirmation countdown ring._ **Draw with a wheel instead.** Select the Giveaway layer in the widget editor, open **Content**, and set **Draw style** to **Wheel**, then **Publish**. Each winner is then revealed on a spin wheel of the entrants, one segment each and sized by how many tickets they hold. With more than 24 entries the wheel shows the winner and 23 other entrants picked at random, and says **Drawing from** and the number of entries under it. The winner is drawn from every entry either way — the wheel only shows the draw, it never changes who wins — and each slot's wheel spins for at least 3 seconds. **Slot reel** puts the rolling names back. For a wheel of your own segments rather than your entrants, see [Spin a wheel on stream](https://bloopbot.com/docs/spin-wheel). ![The giveaway panel drawing with the Wheel style: a wheel of 24 entrants mid-spin, captioned Drawing from 300 entries.](https://bloopbot.com/docs/screenshots/giveaway-wheel-draw.jpg) _A giveaway drawn with the Wheel style: 24 of 300 entrants on the wheel, mid-spin, with Drawing from 300 entries under it._ > **Refreshing OBS is safe** > > Reload the Browser Source at any point and the panel comes back with the giveaway as it stands — the prize, the keyword, how many have entered, the entrants, and the winners with their confirm windows. Nothing about the draw happens in the page: the panel only draws what the giveaway is already doing, so a draw that has already been made shows its winners straight away. A draw that is still animating when the page reloads carries on from where it is rather than starting again: the reloaded page picks the reveal up at the point it has already reached and lands on the same winners at the same moment. > **One giveaway panel per channel** > > Your channel has one panel, and it follows the giveaway you are running. Open two giveaways at once and it shows the one you opened most recently, so run one at a time when you want to be certain which giveaway is on screen. When the giveaway it is showing finishes or is called off, the panel clears. **What you should see** - The heading **Giveaway**, the prize, and optional cover art when the giveaway has one. - The keyword, the entry count and the last few entrants, updating as chat enters. - A countdown to the close time while entries are open, or **Entries open** when there is none. - At the draw: the reel (or, with **Draw style** set to **Wheel**, a wheel of the entrants) spinning per slot, then each winner with their own confirm countdown. - Nothing at all once the giveaway finishes or is called off — the panel clears rather than freezing on the last winner. **If something looks wrong** - The card reads **Not open yet**: the giveaway is still a draft. Open it on the Giveaways page. - The card reads **No giveaway right now**: there is nothing to show, because no giveaway has been created on the channel yet. - The card reads **Entries closed — drawing next**: entries have stopped and the draw has not run yet. Press **Draw** on the giveaway. - No cover art: the giveaway has none, or the file it used has been deleted from your media library. A missing file draws no art rather than a broken picture — pick another under **Cover art** on the **Prize** step. - The panel is showing a different giveaway: two are running, and it follows the one you opened most recently. Run one at a time. - The panel cleared in the middle of a stream: the giveaway finished, or someone called it off. Points spent on tickets go back to their viewers — see the note under step 3. - Nothing is drawn at all: the layer may be hidden in the widget editor, or the Browser Source may not be in a visible scene. - A cover image will not delete from the media library: a giveaway still points at it, and the message names the giveaway. Change or clear its **Cover art** first, then delete the file. Once a giveaway has started its rules are fixed, so archive it instead: an archived giveaway lets go of its cover art, and the file can then be deleted. ## 7. Let viewers enter from the web A giveaway can also take entries from its own public page, so viewers who are not watching chat right now can still enter — good for a giveaway that runs over hours or days. Every plan includes it; [your plan](https://bloopbot.com/docs/what-your-plan-includes) lists it as **Web entry**. 1. Open the giveaway, go to its **Entering** step, and under **Where do people enter?** tick the **Web** card beside **Chat**. Both can be on together, or Web alone; at least one stays ticked. 2. Turning Web on moves **How does the winner get it?** on the **Prize** step to **Claim page** — a web winner may never be in chat, so the prize has to reach them somewhere they can sign in and claim it. Stock a prize for every winner there; [Give away game keys and prizes](https://bloopbot.com/docs/giveaway-prizes) covers stocking prizes and what a winner sees. 3. If the **Winner** step was set to **Say a word in chat**, it changes to **Claim it on the page** — a web winner cannot be asked to type a word in chat, so claiming is confirming. **No confirmation** is the other choice. 4. Once Web is on, its card shows the giveaway's **Public page** link: `bloopbot.com/c//giveaways/`. Share it however you like — a panel link, a chat command, your stream description. Every web giveaway is also listed at `bloopbot.com/c//giveaways`, so viewers can find it without the direct link. Your channel's home page, `bloopbot.com/c/`, shows the giveaways open now at the top, with a tab bar to the full list, your store, a winner's prizes, your full Twitch bio and [your own links](https://bloopbot.com/docs/public-page). ![The Entering step’s Where do people enter? cards: Chat ticked with its Keyword field reading openhouse and, under it, the Enter with the keyword flow marked Live with an Open flow link; Web ticked beside it, explaining that web winners claim on the claim page and showing the giveaway’s Public page link.](https://bloopbot.com/docs/screenshots/giveaway-web-entry-editor.jpg) _The Entering step’s Where do people enter? cards with Web ticked beside Chat, the Chat card showing its Enter with the keyword flow as Live, and the Public page link once Web is on._ **What a viewer sees.** The public page lists every giveaway currently open or scheduled, then up to five recently finished ones with their winners. ![The public giveaways page: Open now, Drawing soon and Recently finished sections, each giveaway as a card with its cover art, status and entry count.](https://bloopbot.com/docs/screenshots/giveaway-web-list.jpg) _The public giveaways page: Open now, Drawing soon and Recently finished sections, each giveaway as a card with its cover art, status and entry count._ Opening one giveaway shows the prize, who can enter, and its own **Take part** panel: ![One giveaway's public page, signed out: the prize, who can enter, entries closing in, and a Sign in with Twitch button under Take part.](https://bloopbot.com/docs/screenshots/giveaway-web-page-signed-out.jpg) _One giveaway's public page, signed out: the prize, who can enter, entries closing in, and a Sign in with Twitch button under Take part._ 1. **Sign in with Twitch** — the same identity-only sign-in the claim page uses. Bloopbot only sees their Twitch name. 2. Signed in, they see the same **Take part** panel. When tickets cost points, the button names the price — **Enter giveaway (100 points)**, say — and the **Who can enter** facts above it say **Free to enter** when they don't. 3. After entering, the panel shows **You're in with N tickets** and, while under their limit, a way to add more. ![The same page after entering: Entry saved, You're in with 1 ticket, and Add tickets (100 points each) or Take all 4 (400 points) to take more.](https://bloopbot.com/docs/screenshots/giveaway-web-page-entered.jpg) _The same page after entering: Entry saved, You're in with 1 ticket, and Add tickets (100 points each) or Take all 4 (400 points) to take more._ A giveaway limited to subscribers or VIPs checks that through Twitch rather than a chat badge, since a web entrant sends no chat message to read one from. If the channel's Twitch connection cannot answer that question right now, the Entering step warns **Reconnect Twitch to limit a web giveaway to subscribers or VIPs** beside the role chips, and Review lists it under **Before it can open** — and the giveaway refuses to open until it can check. Open **Settings** › **Connections** and follow a re-authorisation prompt if one is shown; [Troubleshooting](https://bloopbot.com/docs/troubleshooting) covers reconnecting in full. Long-running giveaways work the same way as any other: choose **On a schedule** on the **Winner** step and set **Opens** and **Closes**, and it is listed from the moment it has an opening time, showing **Opens in …** until then and a closing countdown once it is running — so a giveaway can sit on the page for days before or after you are live. ## Close or archive several at once 1. On the **Giveaways** list, tick each giveaway you want, or tick **Select all shown**. 2. Hold **Shift** and tick another row to take every row between the two. Rows in a folded **Archived** shelf are never included. 3. In the bar that appears at the bottom of the list, press the padlock icon (**Close entries**) to stop entries on the picked giveaways that are **Open**, or the archive icon (**Archive**) to file away the picked ones that are **Finished** or **Called off**. Hover an icon to see how many giveaways it will change; the others, such as a **Draft**, are left as they are. 4. Press the cross icon (**Clear selection**) to untick everything. If a giveaway cannot be changed, the bar says why and keeps it ticked; the rest are changed and the list updates. ## A worked example: Friday key drop Two winners, a follow lock, tickets that cost points, and a minute to claim. 1. Create the giveaway. On **Prize**: **What are you giving away?** `Friday key drop`, **Number of winners** `2`, **In chat**. 2. On **Entering**: Keyword `lucky`, tick **Followers only** and leave the roles clear; under **Tickets and points**, Ticket cost `100`, Max tickets each `5`, and **First ticket is free** on. 3. On **Winner**: **Say a word in chat**, word `!claim`, 60 seconds, with **If they don’t confirm in time, draw someone else** on, and **I’ll open and close it myself**. Check **Review**, Save, then press **Open**. Chat reads _🎉 Friday key drop is open! Type lucky to enter._ 4. A viewer types `lucky`: their first ticket is free and they are in. A second viewer types `!enter 5` and is charged for five tickets. A viewer who does not follow you is told they need to follow to enter. 5. Press **Close and draw**. Two winner cards appear, chat says who won and asks each of them to type the confirm word, and the cards count their windows down. 6. One winner types `!claim` inside their window; chat confirms them. The other lets the window run out, so that slot is redrawn and the card shows the replacement, who then types the word. 7. When both are confirmed the giveaway reads **Finished**. Press **Archive**. > **Where every chat line comes from** > > The opening line, the winner announcement and the confirmation line are all the **Giveaway** pack’s flows. To change the wording, open the flow and edit its chat message — the **Insert…** menu offers the tokens those flows already carry, such as `$(winner)`, `$(prize)`, `$(keyword)` and `$(entries)`. > **The winner announcement follows how the prize is delivered** > > **Announce the winner** is the pack's chat-delivery flow — it tells the winner to type the confirm word, so it only fires for a giveaway left **In chat**. A giveaway set to claim on a page uses **Winner: claim on the page** instead, which points the winner at `$(claimurl)`, their own claim page link. [Give away game keys and prizes](https://bloopbot.com/docs/giveaway-prizes) covers stocking a prize, choosing a claim page and what a winner sees there. ## What you should see - On **Giveaways**: a **Drafts** section holding the giveaway before you open it, then **Open** with the entry count and the keyword it answers to, then **Finished**, and **Archived** as a shelf you can show and hide. - In chat while it is open: the opening line from the pack, one entry per viewer who types the keyword, and a refusal said back to anyone who cannot enter. - On the run panel: the entry count and the points spent, every entry with its viewer’s tickets and badges, and one card per winner slot with its countdown. - On **Flows → Run log**: a run for the keyword or `!enter` — carrying the refusal reason when one happened — and a run for each `!giveaway` command a moderator typed. - Nothing at all in chat until you press **Open**: a draft is invisible to viewers. ## Troubleshooting - Typing the keyword does nothing: open the giveaway's **Entering** step and read the status under the Chat card. **Paused — nobody can enter from chat** or **No flow enters people from chat yet** means no flow is doing the entering — follow **Open flow** and switch it on, or add them from the **Giveaway flows** row on the **Giveaways** page. If the card says **Live**, the giveaway is still a draft or the word typed is not the one on the record: check the badge and keyword on the page. - Nothing happens for one particular word: only one open giveaway can hold a keyword, so another open giveaway in the channel may own that word. - A viewer cannot enter and chat does not say why: the refusal line is a connection in the flow. Open the keyword entry flow and check that the enter node’s **rejected** output is wired to a chat message. - Drawing reports nothing to draw from: nobody entered while it was open. A redraw only replaces a winner who already exists, so create a new giveaway for another draw. - A viewer types the confirm word and nothing happens: first check the status under **Say a word in chat** on the **Winner** step — the confirm flow has to be **Live**. Then, the word has to match the record’s **Confirm word** exactly, be typed inside the countdown, and come from the winner the slot is waiting on. The slot card shows which state that winner is in. - Drawing more than one winner is refused: check that [your plan](https://bloopbot.com/docs/what-your-plan-includes) lists **Multi-winner giveaways** as included, or set **Number of winners** to one on the **Prize** step. - The overlay shows nothing at a giveaway moment: no alert layer on your overlays shows the design the flow asks for, or that design does not exist. The run log says which name it wanted. - Chat never says who won: the winner announcement and the confirm-word flow are separate flows of their own — the announcement runs on the draw, and the confirmation line only after a winner types the word. Check both are installed and live. - The public giveaway page says **Not found**: the giveaway is a draft with no **Opens** time set, or **Web** is not ticked under **Where do people enter?** on the **Entering** step — either way the page treats it exactly like an unknown link. Set an opening time or open it yourself, and check Web is on. - A web giveaway won't open: check that [your plan](https://bloopbot.com/docs/what-your-plan-includes) lists **Web entry** as included, or, for one limited to subscribers or VIPs, the channel's Twitch connection needs reconnecting so it can check that role; see the note under [Let viewers enter from the web](https://bloopbot.com/docs/giveaways#web). --- # Give away game keys and prizes Stock keys, links, physical prizes and perks in a giveaway, and let winners claim them from their own claim page. Updated 29 September 2026 ## Before you start A giveaway can hand its prize to a winner two ways: in chat, the way it always has, or on a **claim page** — a private page for the winner, where they sign in with Twitch, claim, and reveal what they won. A claim page is the right choice for a real prize: a game key, a gift link, something posted to their door, or a perk you owe them — anything you would rather not paste into chat. - A giveaway, set up as in [Run a giveaway in chat](https://bloopbot.com/docs/giveaways) — title, keyword, winners, who may enter. - The **prize vault**. Stocking prizes and choosing a claim page needs a plan that includes it: [your plan](https://bloopbot.com/docs/what-your-plan-includes) shows whether your channel holds it, under **Prize vault**. - The claim page itself needs no setup — every channel has one, at `bloopbot.com/c//claim`. Chat entry, drawing and confirming still work the way [Run a giveaway](https://bloopbot.com/docs/giveaways) describes; this guide only covers what changes once the prize is claimed on a page instead of said in chat. - Handing keys out one at a time, whenever a mod says so, rather than to the winners of a draw? That is a [prize pool](https://bloopbot.com/docs/prize-pools): the same prizes and claim page, awarded with `!keydrop @name`. > **Chat delivery still works** > > Nothing here is required. A giveaway left on **In chat** hands out its prize exactly as before — the winner confirms with a word, and that is the whole exchange. Switch to a claim page only when the prize is something you would not type in chat. > **Entering from the web** > > A giveaway that also takes entries from its own public page always claims on a page too — a web winner may not be in chat to confirm or reveal anything there. [Let viewers enter from the web](https://bloopbot.com/docs/giveaways#web) covers turning that on. ## 1. Stock the prize Open the giveaway on **Giveaways**. On its **Prize** step, under **How does the winner get it?**, choose the **Claim page** card. A **Prizes** section appears in the same step, below the choice. ![The setup wizard’s Prize step: How does the winner get it? with the Claim page card chosen over In chat, then the Prizes section — 2 available · 2 winners, Kind, Label and a box for pasting keys, and two stocked TEST keys, each with a masked tail, an Available state and a bin icon (Delete).](https://bloopbot.com/docs/screenshots/giveaway-prizes-editor.jpg) _The Prize step with Claim page chosen: the Prizes section below it, with Kind, Label and a box for pasting keys, and the stocked list showing masked tails and a bin icon (**Delete**)._ 1. Pick a **Kind**. **Key (a code)** or **Link (a gift URL)** are pasted one per line into the box — each non-blank line stocks one prize, so ten lines stock ten keys. **Physical** has no payload; the claim page collects a shipping address instead. **Perk (a shout-out, a game together…)** has no payload and no address — the winner just sees the label and your note. 2. Give it a **Label** — what the winner sees before they claim, such as "Steam key: Bloop Raiders" — and an optional **Note**, shown only after they claim. 3. For a physical prize or a perk, set **Quantity** instead of pasting a box of codes; that many identical prizes are stocked at once. 4. Press **Stock prizes** (or **Stock prize** for a single one). A key or link prize never shows its payload again in the dashboard once stocked — the list shows a masked tail, only its last few characters (`X7Q2`), so you can tell two prizes apart, nothing more. The giveaway won't open until there is at least one **Available** prize for every winner slot; the page counts them for you (**N available · N winners**) and warns when you are short, and the **Review** step lists it under **Before it can open** until you have enough. An available prize can be **Deleted**, or **Moved to…** another draft or open giveaway of yours — handy when you stocked prizes on the wrong giveaway, or want to split one batch across two — unless the giveaway is running and still needs it for a winner. A claimed prize cannot be moved or deleted. > **Prizes stay in the vault if you switch delivery back** > > Switching **How does the winner get it?** back to **In chat** does not clear anything you stocked — those prizes just sit unused until you switch a giveaway back to a claim page. The page tells you when that giveaway is holding stock it isn't handing out. ## 2. Choose how a winner confirms On the **Winner** step, under **How does a winner confirm?**, a claim-page giveaway offers a third choice beside the usual two: - **Say a word in chat** — unchanged: the winner types the confirm word, then claims on their own time within the claim deadline (below). - **No confirmation** — also unchanged: the winner is final the moment they're drawn, straight to the claim deadline. - **Claim it on the page** — one step instead of two: claiming _is_ confirming, so there is no separate confirm word or window. Set **Hours to claim** (1 to 168 — up to seven days), which starts the moment they are drawn. **Claim it on the page** is the mode to use when your winners might not be watching chat — a keyword entry doesn't mean someone's still around to type a word back. With **Say a word in chat** or **No confirmation**, a confirmed winner then has a separate **Claim by (hours after confirming)** window before the prize itself expires — 0 means no deadline. **If they don’t confirm in time, draw someone else** (or **If they don’t claim in time…**) applies to whichever window is currently ticking, confirm or claim: an unclaimed slot is redrawn and the prize it would have taken stays available for the replacement. ## 3. What the winner sees The winner's own page is `bloopbot.com/c//claim` — share that link, or point them to it in the winner announcement (see [Flows](https://bloopbot.com/docs/giveaway-prizes#flows) below). Nothing about your giveaways is on it until they sign in. It is the **Your prizes** tab on every channel page, and a signed-in winner also sees a **Claim your prize** banner at the top of your channel's home page, `bloopbot.com/c/`, until the prize is claimed or its time runs out. ![The claim page signed out: a short line explaining what it is, and a single Sign in with Twitch button — nothing about any giveaway yet.](https://bloopbot.com/docs/screenshots/claim-page-signed-out.jpg) _The claim page signed out: a short line explaining what it is, and a single Sign in with Twitch button — nothing about any giveaway yet._ 1. **Sign in with Twitch.** This is an identity check only — Bloopbot never asks for anything beyond who they are on Twitch. 2. Signed in, they see every win of theirs on your channel: prizes **waiting for them** (with the prize's label, the time left to claim, and a **Claim prize** button) and prizes already **claimed**. 3. **Claim prize.** For a key or link this is the whole step. For a physical prize, claiming asks for a shipping address in the same form — name, address lines, city, region, postcode and country. ![A win waiting to be claimed: the giveaway's title, Next prize label, a claim-by countdown and the Claim prize button under Waiting for you.](https://bloopbot.com/docs/screenshots/claim-page-pending.jpg) _A win waiting to be claimed: the prize's giveaway title, Next prize label, a claim-by countdown and the Claim prize button._ 1. Once claimed, a key or link prize shows a **Show my key** (or **Show my link**) button rather than the payload straight away — nothing sensitive sits on the page until they ask for it. ![A revealed TEST key: the payload shown in a monospace box, with the reveal count noted beside it — Your key (shown 1×; only you can see it).](https://bloopbot.com/docs/screenshots/claim-page-revealed.jpg) _A revealed key: the payload shown in a monospace box, with the reveal count noted beside it — Your key (shown 1×; only you can see it)._ A win still waiting on a chat confirm word is listed too, with **Confirm your win in chat first** in place of a Claim button — the page always shows every win, it just tells the winner what to do next. > **Revealing is never a one-shot** > > A winner can come back and press **Show my key** again later — nothing is hidden after the first look, and a key never expires from being viewed. Every reveal is logged on your side, so you always know how many times a key has been shown and when it was first seen. ## 4. Handle physical prizes A physical prize's claim collects a shipping address, encrypted, that only you can read. - On the giveaway's **Prizes** list, a claimed physical prize with an address on file offers an eye icon (**View the address**) — each view is logged on your side. - Once you've sent it, press the send icon (**Mark shipped**). It only appears once an address is on file, so there's nothing to press before then. - The address is deleted automatically **30 days after you mark the prize shipped** — plan to note down anything you still need from it (a tracking number, say) before then. A prize you never mark shipped keeps its address indefinitely. ## 5. Tell chat where to claim The **Giveaway** pack's winner-announcement flow only fires for chat-delivery giveaways — telling everyone to type a confirm word makes no sense for a prize claimed on a page. Install its claim-page companion instead: 1. Open **Flows → Add** and search **Giveaway**, or find the flow if the pack is already installed. 2. Switch on **Winner: claim on the page**. It fires on the same **Giveaway changes** trigger as the chat announcement, filtered to **Prize delivery: Prize claimed on the claim page**, and says in chat: "🎁 @$(winner) won $(prize)! Claim your prize at $(claimurl)". 3. `$(claimurl)` is your channel's claim page link — insert it into any flow's chat message from the **Insert…** menu, the same way as `$(winner)` or `$(prize)`. A flow of your own can also react to **A winner claims their prize** on the **Giveaway changes** trigger — to thank them in chat once they've actually claimed, for instance, rather than when they're drawn. ## What you should see - The Prizes section lists what you've stocked, with **N available · N winners** and a warning when you're short. - The giveaway opens once every winner slot has an available prize; it refuses to open otherwise. - The winner's claim page shows their win, a countdown to the claim deadline, and — once claimed — a way to see what they won. - Your **Prizes** list shows who claimed which prize, how many times a key or link has been revealed, and a physical prize's shipping status. ## Troubleshooting - **The giveaway won't open.** Either there aren't enough available prizes for every winner slot yet — the Prizes section says how many you're short — or your channel's plan doesn't include the prize vault. [Your plan](https://bloopbot.com/docs/what-your-plan-includes) shows which. - **A winner says they can't claim, and the giveaway is follow-locked.** Claiming re-checks the rules a giveaway was entered under. If they've since unfollowed, the claim is refused until they follow again — the page tells them so. - **A win has disappeared from the winner's page.** The claim deadline ran out. If **draw someone else** was ticked on the **Winner** step, that slot was redrawn and a new winner drawn from everyone who hadn't already won; check the giveaway's **Run** panel for who has it now. - **A winner's prize changed after a reroll.** A manual **Reroll** (the circular-arrows icon) on the giveaway only replaces a winner who hasn't claimed yet — once claimed, a slot is done and cannot be rerolled. - **The winner announcement never mentions the claim page.** You likely still have the chat-only **Announce the winner** flow switched on instead of, or as well as, **Winner: claim on the page** — check both under Flows, and that the claim-page one is switched on. --- # Prize pools Stock a pool of game keys and links, let your mods award one to a viewer with !keydrop @name, reveal it on a wheel, and take donated keys from viewers. Updated 29 September 2026 ## What a prize pool is A prize pool is a stock of prizes your mods hand out one at a time, whenever they like. Nobody enters and nothing is drawn: a mod types `!keydrop @sam`, Sam gets a random prize from the pool, the giveaway panel spins a wheel of the prizes on stream, and chat tells Sam where to claim it. It suits a stream that gives things away as it goes — a key for the best clip of the night, a link for whoever guessed the boss, a thank-you for a raid — rather than one draw at the end. - A prize pool stocks prizes in the **prize vault**, which needs a plan that includes it: [your plan](https://bloopbot.com/docs/what-your-plan-includes) shows whether your channel holds it, under **Prize vault**. - Every award is claimed on your channel's claim page, the same one a [claim-page giveaway](https://bloopbot.com/docs/giveaway-prizes#winner) uses. Winners sign in with Twitch there; nothing secret is ever said in chat. - Bloopbot connected to your channel, with the bot account as a moderator, so it can read the command and answer in chat — [Get started with Bloopbot](https://bloopbot.com/docs/getting-started) walks through it. > **A draw or a pool** > > A pool is fixed as a pool when you make it: it never turns into a draw, and a draw never turns into a pool. For viewers entering with a keyword and a winner drawn at the end, [Run a giveaway in chat](https://bloopbot.com/docs/giveaways) is the guide. ## Set one up Open **Giveaways** and press **New giveaway**. Two choices appear under it. ![The Giveaways page after pressing New giveaway: two choices, Draw from entries and Prize pool, each with a one-line description.](https://bloopbot.com/docs/screenshots/prize-pool-new.jpg) _New giveaway offers Draw from entries and Prize pool._ 1. Choose **Prize pool**. A new pool opens as a draft called **Prize pool**, on its **Prize** step. 2. On **Prize**, under **What are you giving away?**, give it a name viewers will recognise, such as `Indie key drop`. **Cover art** for the giveaway panel is optional. 3. Stock it in the **Prizes** section on the same step: pick a **Kind**, usually **Key (a code)** or **Link (a gift URL)**, give the prize a **Label** (what chat and the wheel show, such as `Bloop Raiders`), paste the keys or links one per line, and press **Stock prizes**. Each line is one prize. Stocking works the same way as for a [claim-page giveaway](https://bloopbot.com/docs/giveaway-prizes#stock), and you can keep adding prizes while the pool is open. 4. Press **Next**. On **Claim**, under **Unclaimed prizes**, choose **Keep until claimed**, or **Return to the pool after** a number of days. Set **Days to claim** between 1 and 90; the time starts when the prize is awarded. 5. Press **Next**. On **Donations**, tick **Accept donations** if viewers may add their own keys (see [Let viewers donate keys](https://bloopbot.com/docs/prize-pools#donations)); leave it clear otherwise. 6. Press **Next**. **Review** reads the pool back in one sentence per step, each with a pencil icon (**Edit**). Press **Save**. 7. Add the award command (next section), then press **Open** on the **Run** panel. A pool opens even with nothing in it, and its settings stay editable while it is open: rename it, change how long prizes wait, or switch donations on halfway through a stream. ## Add the award command Mods award prizes with a chat command, and every line chat hears comes from that command's flow — so the wording is yours to change. 1. Open the pool. On the **Run** panel, under **Award command**, the **Command** box starts at `keydrop`. Change the word if you like. 2. Press **Add award command**. The line changes to **Mods award prizes with** `!keydrop @name`, with **Open flow** and a pencil icon (**Change the award command**) beside it. The award command is built in: it doesn't count toward your flow limit unless you edit it. **Open flow** shows what it does — a chat command, a check that the person typing it is a moderator, the **Award from a prize pool** action pointed at this pool, and a chat message for each outcome. The pencil icon swaps the word; **Keep it** leaves it as it was. Each pool has its own award command, so two pools running at once need two different words. ## Give a prize With the pool open, a mod (or you) types the command and the viewer's name: ``` !keydrop @sam ``` 1. A random prize comes out of the pool for Sam. If Sam donated a prize to this pool, they are never given their own. 2. Chat hears `🎁 @sam won Bloop Raiders! Claim it: bloopbot.com/c//claim`. When the prize was donated with credit, the line adds who donated it. 3. The giveaway panel on stream spins a wheel of the prizes and lands on Sam's. The panel always shows how many prizes are left. ![The giveaway panel revealing a prize pool award: a wheel of the pool’s three prizes mid-spin, under the pool’s title and 2 prizes left.](https://bloopbot.com/docs/screenshots/prize-pool-wheel.jpg) _The giveaway panel mid-spin on a prize pool's wheel, with 2 prizes left under the pool's name._ The wheel is the giveaway panel's **Wheel** draw style. Select the **Giveaway** layer in the widget editor, open **Content** and set **Draw style** to **Wheel**, then **Publish**. [Put the giveaway panel on stream](https://bloopbot.com/docs/giveaways#panel) covers adding the panel to OBS. Every award appears on the **Run** panel under **Awards**, newest first, with the winner, their prize and where it stands: **Waiting to be claimed**, **Claimed**, **Handed back** or **Expired**. While a prize is still waiting, the undo icon (**Take back**) returns it to the pool — useful when a mod typed the wrong name. ![A prize pool’s Run panel: 1 prize left, Add prizes and End pool, the award command reading Mods award prizes with !keydrop @name, two awards waiting to be claimed, each with an undo icon (Take back), and one donation waiting for review.](https://bloopbot.com/docs/screenshots/prize-pool-run.jpg) _A pool's Run panel: prizes left, Add prizes and End pool, the award command, two awards waiting to be claimed, and a donation waiting for review._ A flow of your own can react to awards too: the **Giveaway changes** trigger has **A prize is awarded from a pool** and **A pool prize is handed back** under **When** — to play an alert, say, or thank a viewer who passed their prize on. ## What the winner sees The winner opens the link from chat, your channel's claim page, and signs in with Twitch. Their prize waits under **Waiting for you**, with its label, and the time left to claim when the pool returns unclaimed prizes. ![The claim page with a prize pool award waiting: Your prize: Bloop Raiders, claim within 14 days, Claim prize, and Hand it back under it.](https://bloopbot.com/docs/screenshots/prize-pool-claim.jpg) _The claim page with a pool prize waiting: Your prize, the time left to claim, Claim prize and Hand it back._ - **Claim prize** makes it theirs. Then **Show my key** (or **Show my link**) reveals it, as often as they like, and only to them. - **Hand it back** gives it up before claiming: the prize goes back in the pool for someone else, and the award reads **Handed back** on your Run panel. Once a prize is claimed, it can't be handed back. - If the pool returns unclaimed prizes and the winner hasn't claimed in time, the award reads **Expired** and the prize goes back in the pool. With **Keep until claimed**, it waits for them however long it takes. ## Let viewers donate keys Viewers can add their own spare keys and links to a pool from a public page. 1. On the pool's **Donations** step, tick **Accept donations**. 2. Choose **Approve each donation first** (donations wait on the Run panel for you), or **Add donations straight to the pool** (each can be awarded the moment it arrives). 3. Copy the **Donation page** link with the copy icon (**Copy the donation page link**) and share it, in chat or in a panel. The page takes donations once the pool is open. On the donate page a viewer signs in with Twitch, picks **Key** or **Link**, gives it a **Name** (up to 60 characters, shown in chat and on the wheel), pastes it into **Key or link**, and presses **Donate**. **Credit me by name** is ticked to start with, so chat says who donated it when it is won. ![A prize pool’s public donate page, signed in: Key or Link, a Name, an empty box for the key or link, Credit me by name ticked, and Donate.](https://bloopbot.com/docs/screenshots/prize-pool-donate.jpg) _The donate page signed in: Key or Link, a Name, the Key or link box, Credit me by name and Donate._ A viewer can have up to five donations waiting for review in one pool at a time. Their own claim page lists their donations under **Your donations**, each as **Waiting for review**, **In the pool**, **Given away** or **Not accepted** — never who won it. > **Adding straight to the pool** > > With **Add donations straight to the pool**, a donated name can appear in chat and on stream without you seeing it first. Approving each one is the safer choice for a big channel. ## Review donations With **Approve each donation first**, donations wait on the pool's **Run** panel under **Donations**, with a count beside the heading. ![The Donations list on a prize pool’s Run panel: a donated key called Cozy Farm, donated by @moss\_and\_tea, with a tick icon (Approve) and a cross icon (Reject).](https://bloopbot.com/docs/screenshots/prize-pool-donations.jpg) _A donation waiting for review: its name, Key, who donated it, and Approve and Reject._ - The tick icon (**Approve**) puts it in the pool, where the next award can pick it. - The cross icon (**Reject**) turns it away. It is never awarded, and the donor sees **Not accepted**. A donation's key or link is never shown to you, only to the viewer who wins it — review the name, and who sent it. ## End a pool Press **End pool** on the **Run** panel and confirm. Mods can't award from it any more, and the award command answers that the pool isn't running. Prizes already awarded can still be claimed. The pool then reads **Finished**. Press **Archive** to file it away. Archive waits while a winner still has a prize to claim: press the undo icon (**Take back**) on that award under **Awards**, or wait for them to claim it. A pool that was never opened can be removed with **Call off** instead. ## Troubleshooting - **The pool is empty.** Chat says this when every prize has been awarded or is waiting to be claimed, or when the only prizes left were donated by the viewer being awarded: donors can't win their own. Press **Add prizes** on the Run panel to stock more, approve a waiting donation, or take back an award nobody will claim. - **No Twitch user called …** The name after the command isn't a Twitch account. Check the spelling; the `@` is optional. - **Say who wins, e.g. !keydrop @name.** The command was typed without a name after it. - **The wheel doesn't show.** The panel's **Draw style** is **Slot reel**, which rolls the prize names instead: set it to **Wheel** and **Publish**. If nothing appears at all, no overlay in OBS has a **Giveaway** layer, or the layer is hidden — see [Put the giveaway panel on stream](https://bloopbot.com/docs/giveaways#panel). An award always takes over the panel. When the panel reloads, it shows the giveaway you opened most recently, so run one pool or giveaway at a time. - **Mods can't use the command.** The Run panel reads **Your award command is paused, so mods can’t award prizes.** Press **Resume** and switch the flow on. If nothing happens at all, check the bot account is a moderator, and that the person typing is one: the command only answers mods and you. - **Chat says the pool is not running.** It is still a draft, or it has ended. Press **Open** on the Run panel, or make a new pool. - **Donations aren't possible.** The donate page only takes donations while the pool is open and **Accept donations** is ticked. A viewer with five donations already waiting is asked to wait for you to review them. - **A pool won't open or save.** Prize pools need the prize vault: [your plan](https://bloopbot.com/docs/what-your-plan-includes) shows whether your channel holds it. --- # Run a viewer queue Let viewers join a line to play with you using !join, pull the next ones from chat or the Queue page, and show the line on your overlay. Updated 14 November 2026 ## What you can do A viewer queue is a line of viewers waiting to play with you — the next lobby, the next match, the next co-op run. Viewers type `!join` to get in line, `!leave` to drop out and `!waitlist` to see who is waiting. When you are ready for the next players, a moderator types `!next 4`, or you press **Next** on the Queue page, and chat hears who is up. Your channel has one queue. It can be open or closed, hold as many viewers as you allow, put subscribers first, and ask every viewer for a note when they join, such as their gamertag. It lasts across streams until you clear it, and a **Viewer queue** layer shows it on your overlay. ## Before you start - Chat commands come from flows. The **Viewer queue** pack has all five; step 2 adds it. - To show the queue on stream you need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) shows how to add one as a Browser Source. ## Get help with your setup Choose **Help me** on Queue for an explanation of your current queue and intake flow. You can close help and edit those same settings. Opening a queue does not add a viewer; **Next** serves real people, so leave it until someone is waiting. ![Optional Viewer queue help explains the saved intake and distinguishes opening a queue from joining or serving a viewer](https://bloopbot.com/docs/screenshots/onboarding-participation-help.jpg) _Optional queue help explains the current intake without joining or serving a viewer._ ## 1. Set up the queue 1. In the dashboard sidebar, open **Viewers** › **Queue**. 2. Under **Settings**, set **Most viewers in line**: the most who can wait at once. Leave it blank for no limit. 3. Tick **Subscribers go first** to serve subscribers before viewers who are not, even ones who joined earlier. 4. Under **Ask for a note**, type a prompt such as `Your gamertag` if you want one. Every viewer must then type it after `!join`, and it is shown beside their name. Leave it blank to ask for nothing. 5. Press **Save settings**. 6. Press **Open queue**. The badge beside it turns to **Open**. Press **Close queue** when you want no more joins; viewers already in line stay in it. ![The Queue page: the queue marked Open with a Close queue button, two viewers in line with their gamertags, a move-to-top icon and a bin icon (Remove) on each, Pull 1 and Next above the line, and the settings for the most viewers in line, subscribers first and the note prompt.](https://bloopbot.com/docs/screenshots/viewer-queue-page.jpg) _The Queue page: the queue is open, two viewers wait with their gamertags, and the settings are on the right._ ## 2. Add the chat commands The Queue page offers the commands when nothing lets viewers join yet: a **Queue commands** row under the page title says _Viewers can’t join your queue from chat yet._ Press **Add** on it to open the Viewer queue pack’s review on the right, then press its button to add the five flows, paused. The row then offers **Switch on**, or **Open flow** to look first, and it goes away once they are on. You can also open **Flows**, press **Marketplace**, and add **Viewer queue**. | Command | Who | What it does | | --- | --- | --- | | `!join` or `!join Ada#1234` | Everyone | Puts the viewer in line and replies with their place, _You are #3 in the queue._ Anything after `!join` is their note. | | `!leave` | Everyone | Takes them out of line. | | `!waitlist` | Everyone | Says how many are waiting and who, in order: _In the queue (3): PixelPal, LoyalLlama, BitsBandit_. | | `!next` or `!next 4` | Moderators and you | Pulls the next viewer, or the next four, out of the line. Anyone else is ignored without a word. | | — | — | **Say who is up next**: whenever viewers are pulled, chat hears _Up next from the queue: PixelPal, LoyalLlama!_ | When a `!join` is refused, the viewer is told why in a reply: _The queue is closed right now._, _The queue is full._, _You are already in the queue at #2._, or _Add your gamertag after the command._ when your queue asks for a note and they gave none. ## 3. Run the line The Queue page lists everyone waiting, in the order you will pull them, and refreshes on its own every few seconds while viewers join from chat. - **Next** pulls the number of viewers in **Pull** (1 to 25) off the top. It is announced in chat the same way `!next` is, by **Say who is up next**. - The up-to-line arrow icon (**Move to top**) puts one viewer first, ahead of everyone else, including viewers who skipped the line. - The bin icon (**Remove**) takes one viewer out without announcing anything. - The bin icon above the list (**Clear the queue…**) takes everyone out. The queue stays open or closed as it was. A moderator you have [let in on Team](https://bloopbot.com/docs/editors#tick) can use **Next**, **Move to top**, **Remove**, **Clear the queue…** and open or close the queue, but cannot change the settings. The order is: viewers who skipped the line first, then — with **Subscribers go first** on — subscribers, then everyone else in the order they joined. ## 4. Show the queue on your overlay 1. Open **Overlays** and open the overlay the queue should appear on. 2. Press **Add** on the left and choose **Viewer queue** under **Goals & games**. 3. Select the layer and set **Viewers to show**, from 1 to 20. The layer lists that many from the top of the line and says how many more are waiting. 4. Size and place it like any other layer — [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay) covers placement — and press **Publish**. The layer shows **Queue**, whether it is open and how many are waiting, then each viewer's place, name and note. It takes your overlay theme, and its panel, rows, names and notes can each be styled from the theme's parts. To see it with made-up viewers before anyone joins, open **Simulate** in the top bar and press **Test queue**; after a few seconds it returns to your real line. ![A Viewer queue layer on the overlay: Queue, Open · 6 waiting, the next five viewers numbered 1 to 5 with their gamertags, and +1 more.](https://bloopbot.com/docs/screenshots/viewer-queue-layer.jpg) _The Viewer queue layer on stream: open with six waiting, the next five with their gamertags, and one more below._ ## 5. Build your own queue flows Six steps in the node library, under **Queue**, do everything the queue does: - **Join the queue** — puts the viewer in line. **Their note** is what they typed (`$(query)` is everything after the command) and **Skip the line** puts them ahead of everyone who joined normally. It follows **ok** with their place in `$(from..position)`, or **rejected** with why in `$(from..message)`. - **Leave the queue** — follows **ok**, or **none** when they were not in line. - **Pull from the queue** — **How many** takes 1 to 25, and `$(1)` reads the number after the command. It hands forward `$(from..users)`, the names as one line, and follows **empty** when nobody is waiting. - **Open the queue**, **Close the queue** and **Clear the queue**. And one trigger: - **Viewers pulled from queue** — runs after every pull, from a flow or from **Next** on the Queue page. Its tokens are `$(users)` (the names, in order), `$(count)` and `$(notes)` (each note with its viewer's name). Any flow can also read the queue without a step: `$(data.queue.length)` is how many are waiting, `$(data.queue.viewers)` their names in order, and `$(data.queue.open)` is `on` or `off`. ## Only followers, or a price in points Who may join is decided in the `!join` flow, before **Join the queue** runs. - **Followers only**: turn on Twitch's **Followers-only** chat while the queue is open, and only followers can type `!join` at all. A flow can do it for you: in a moderator command, add **Chat settings** with **Followers-only** set to **on** after **Open the queue**, and set it back to **off** after **Close the queue**. - **A price in points**: in the **Join the queue (!join)** flow, put **Read points & watch time** before **Join the queue**, then a **Check a value** step: `$(from..balance)` **at least** `100`. After **Join the queue**'s **ok**, add **Set a variable** to **subtract** `100` from `loyalty_balance` for the viewer, so a refused join costs nothing. [Loyalty and regulars](https://bloopbot.com/docs/loyalty-and-regulars) explains the points. - **Skip the line for channel points**: make a flow that starts from **On a reward redeemed** and adds **Join the queue** with **Skip the line** on. [Reward redemptions](https://bloopbot.com/docs/reward-redemptions) shows how to pick the reward. A note is text a viewer typed, and it is shown on your overlay. To screen it first, put **AI: text OK to show?** on `$(query)` before **Join the queue**, where your channel has it. ## A worked example: squad night 1. On the Queue page, set **Most viewers in line** to `20`, **Ask for a note** to `Your gamertag`, save, and press **Open queue**. 2. Add the **Viewer queue** pack and switch its five flows on. 3. Add a **Viewer queue** layer to your main overlay, set **Viewers to show** to `5`, and publish. 4. PixelPal types `!join Pixel#2048` and is told _You are #1 in the queue._ Five more join the same way; one types just `!join` and is told _Add your gamertag after the command._ 5. Your layer shows _Open · 6 waiting_, the first five with their gamertags, and _+1 more_. 6. For the first match, your moderator types `!next 4`. Chat reads _Up next from the queue: PixelPal, LoyalLlama, BitsBandit, QuietQuokka!_ and the layer drops to two waiting. 7. Between matches you press **Next** on the Queue page, and chat reads _Up next from the queue: NightOwl!_ ## What you should see - The Queue page listing everyone waiting, updating on its own as viewers join and leave. - A reply in chat for every `!join`: their place, or why not. - One _Up next_ line in chat for every pull, whether it came from `!next` or from **Next** on the Queue page. - The Viewer queue layer following along within a moment, and showing the line as it stands when you refresh or re-open the Browser Source. ## Troubleshooting - `!join` does nothing: the **Viewer queue** flows are paused, or were never added. Switch them on in **Flows**, or add them from the Queue page’s **Queue commands** row. - Every `!join` says the queue is closed: press **Open queue** on the Queue page. - `!next` does nothing: it is for moderators and you. [Permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns#permissions) shows how to change who can use a command. - Nobody is announced after **Next**: **Say who is up next** is paused, or was deleted. Add it again from the **Viewer queue** pack. - The layer says **Nobody in line yet** while the Queue page lists viewers: the overlay has not been published since the layer was added. Press **Publish** in the overlay editor. - Two replies to one command, or the wrong one: another flow of yours uses the same word, such as a `!join` of your own. When you add the pack, the review warns about a command already in use; keep one of the two flows paused or change its command. The Song requests pack's `!queue` lists songs; the viewer queue's list is `!waitlist`. - Yesterday's viewers are still in line: the queue lasts until you clear it. Press **Clear…** on the Queue page when a new session starts. --- # Keep a quote book Save memorable lines from your streams, let chat pull them up with !quote, let your mods add new ones, and share the whole book on your public page. Updated 14 November 2026 ## What you get Your channel has a numbered quote book. Viewers type `!quote` for a random one or `!quote 12` for a particular one, and your moderators add, fix and remove quotes from chat. You can also look after the whole book from your dashboard, and so can a moderator you have [let in on Team](https://bloopbot.com/docs/editors#tick). Every quote keeps its number for good. Deleting quote #3 leaves a gap; the next one added is still the next new number, so `!quote 12` always means the same line. ## Before you start - The **Quotes** flow, from the **Starter** pack. Starter is installed on a new channel and switched on in Set up your bot, so you already have it. Otherwise open **Flows**, press **Marketplace**, and add **Quotes** on its own or with the pack — [Use templates and flow packs](https://bloopbot.com/docs/templates-and-packs) shows how. - The bot as a moderator in your chat, as for any command: [make your bot a moderator](https://bloopbot.com/docs/getting-started#moderator) by copying the `/mod` command from the **Make your bot a mod** step of Set up your bot or the **Not a mod** bar and sending it in your Twitch chat. ## Get help with your setup Optional **Help me** uses your saved quote records. Reuse a real quote, review who can add or read quotes, and edit that same record deliberately. Help never invents a quote or sends one to chat as a test. ## 1. Add quotes from the dashboard 1. Open **Quotes** in the sidebar, under **Channel**. 2. Choose **+ Add Quote**, type the line in **Quote Text** and choose **Save Quote**. 3. The quote joins the list with its number, who added it and when. Use **Search quotes...** to find one, the pencil to edit its text, and the bin to delete it. ![The Quotes card on the Quotes page, reading 4 quotes total, with a + Add Quote button, a Search quotes box and four numbered quotes — #1 I am not lost, the map is wrong; #2 That boss had way more health than it needed; #3 Chat, we do not speak of the lava level; #4 One more run, then bed — each with who added it, the date, and edit and delete buttons.](https://bloopbot.com/docs/screenshots/quotes-page.jpg) _The quote book on the Quotes page: four numbered quotes with who added each one and when._ Editing keeps the quote’s number. Deleting asks you to confirm and cannot be undone. ## 2. Turn on the !quote command If you have no `!quote` flow yet, the **Quotes** page shows a **!quote command** row at the top: _There’s no !quote command yet, so chat can’t read or add quotes._ Press **Add**, read the review on the right and press **Add 1 flow — paused**. Close the panel: the row now says the flow is paused, so press **Switch on**, and carry on from step 2 below. A paused `!quote` flow is named instead, with **Open flow** and **Switch on**. 1. Open **Flows** and find **Quotes**. It has one trigger, the chat command `!quote`, and one **Quotes** step set to **Handle the !quote command**. 2. Check **Who can read** on that step. **Everyone** lets any viewer pull up quotes; pick a higher level to keep reading to subscribers, VIPs or moderators. 3. Press **Save**, then switch the flow on. ![The Do this step of the Quotes flow: a Quotes action with Do set to Handle the !quote command, explained as covering !quote, !quote with a number and !quote add, edit and delete; and Who can read set to Everyone, noting adding, editing and deleting always need a moderator.](https://bloopbot.com/docs/screenshots/quotes-step.jpg) _The Quotes step in the Quotes flow: Do is Handle the !quote command and Who can read is Everyone._ That one step answers every form of the command: | In chat | What happens | Who can | | --- | --- | --- | | `!quote` | Posts a random quote, such as _#2: That boss had way more health than it needed._ | Whoever **Who can read** allows | | `!quote 2` | Posts quote #2 | Whoever **Who can read** allows | | `!quote add I am not lost, the map is wrong.` | Saves it and replies _Added quote #5._ | Moderators and you | | `!quote edit 5 I am not lost. The map is wrong.` | Replaces the text and replies _Updated quote #5._ | Moderators and you | | `!quote delete 5` | Removes it and replies _Deleted quote #5._ `!quote remove 5` works too. | Moderators and you | Adding, editing and deleting always need a moderator, whatever **Who can read** says. A quote added from chat is credited to the person who typed it. To stop the chat command, pause the **Quotes** flow. Your saved quotes stay in the book. ## Other ways to use quotes The **Quotes** step has three more choices in **Do**, for flows that are not the `!quote` command: - **Say a random quote** — for example, on a timer that posts one every so often. [Post a recurring chat message](https://bloopbot.com/docs/timers) shows the timer. - **Say one quote by number** — set **Number or text** to the number, or to a token. - **Add a quote** — set **Number or text** to what should be saved, such as `$(query)` from a channel points reward that asks for text, so viewers can suggest quotes. [Respond when a viewer redeems a reward](https://bloopbot.com/docs/reward-redemptions) covers rewards. To have an AI read new quotes before they are saved, install **Check a quote before saving it** — [Screen text before it is shown or saved](https://bloopbot.com/docs/text-screening#quotes) walks through it. ## Share your quote book Your [public page](https://bloopbot.com/docs/public-page) has a **Quotes** tab at `bloopbot.com/c//quotes`. It lists every quote, newest first, with its number and the date it was added. It doesn't show who added it. - Viewers can search by words or by number, such as `boss` or `12`. A number search shows that quote first, then any quote that mentions the number. - A long book shows 50 quotes per page, with **Newer** and **Older** to move between them. - To send someone straight to one quote, search for its number and share that address: `…/quotes?q=12`. The tab appears once your book has at least one quote. Anyone can read it there, even if **Who can read** keeps `!quote` to some viewers in chat. To take the page down, open **Public page**, then **Pages**, switch **Quotes** off and click **Save**. [Switch pages on or off](https://bloopbot.com/docs/public-page#pages) shows how. ## Check it works 1. In the Quotes flow, press **Test fire**. The dry run plays a made-up `!quote sample arg`, so the Run log shows the bot _would_ reply _Error: Quote not found._ — expected, because `sample` is not a quote number. It proves the flow is wired; it posts nothing, and a test never adds, edits or deletes a real quote. 2. With the flow on, type `!quote` in your Twitch chat. The bot posts a real quote from your book. 3. As a moderator, try `!quote add` with a test line, then `!quote delete` with the number it gives back. ## Troubleshooting - Nothing happens on `!quote`: the flow is paused, the viewer is below **Who can read**, or another flow also answers `!quote`. Check **Flows → Needs attention**. - _Error: No quotes found._: the book is empty. Add one from the Quotes page or with `!quote add`. - _Error: Quote not found._: there is no quote with that number, often because it was deleted. Numbers are never reused. - A line starting _Usage: !quote_: the command was missing its number or text. - A viewer’s `!quote add` is ignored: only moderators and you can add, edit or delete. - There's no **Quotes** tab on my public page: the book is empty, or **Quotes** is switched off on **Public page → Pages**. --- # Set up moderation helpers Combine moderation filters with deliberate, permission-checked flows. Updated 31 October 2026 ## Start with the bot’s access On **Connections**, check the bot account your channel uses. The bot-account section only appears on the Connections page when your plan includes [your own bot account](https://bloopbot.com/docs/bot-account) — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes); without it the shared bot account speaks in your chat and there is nothing to re-authorise there. When the section appears, make that account a moderator: copy the `/mod` command from the **Not a mod** bar across your dashboard and send it in your Twitch chat. Re-authorise a connection if the dashboard reports missing permissions. Until Twitch lists your bot as a moderator, the filters leave chat alone: they don’t delete, warn or time anyone out, and no strikes build up. ## Configure the filters If your channel uses guided setup, filters start off until you choose to enable them. Switching an existing channel to guided setup keeps its effective rules, including defaults it was already using. For channels using the original setup, every filter starts on: blacklist, links, caps, symbols, emotes and repetition. A first offence gets a warning and its message is deleted; after that, timeouts grow from 5 seconds to 1 minute, 10 minutes and 1 hour, and a viewer's strikes fade after an hour. Subscribers skip every filter except the blacklist, and moderators skip them all. A link in a command one of your flows answers, such as `!sr` with a Spotify link for [song requests](https://bloopbot.com/docs/song-requests) or a video for [media share](https://bloopbot.com/docs/media-share), gets past the link filter, because the command's own checks decide what it takes; the other filters still apply to it. The blacklist, shown as **Blocked words** at the top of the page, starts empty, so it acts only once you add words to it: type a word and press **Block**, or separate several with commas. **More options** makes an entry a regex pattern, matches capitals exactly or gives it its own timeout, and the bin icon unblocks a word, with **Undo** if you change your mind. If you saved your Moderation settings before, they stay exactly as you saved them. In guided setup, choose **Moderation** to review the saved rules and bot permission, with optional help on the same page. There is no moderation dry-run button: review harmless examples against your thresholds and exemptions while the filter is off. Never use an unsuspecting viewer as a test. Enabled rules are separate from proof that a rule acted live. Open **Moderation** and review each filter and its configured response. Set thresholds, exemptions and escalation deliberately for your community, and switch off any filter your chat doesn't need. Save your settings and observe the result before changing several rules at once. You and your editors change these settings here. Your Twitch moderators can switch filters on and off, manage the blacklist and the link whitelist, and `!permit` a viewer to post a link, all from chat: [What moderators can do from chat](https://bloopbot.com/docs/editors#moderators) lists the commands. A moderator you have ticked on **Team** can also change the filters, blacklist and whitelist on this page, though not the escalation settings: [Share the work with mods and editors](https://bloopbot.com/docs/editors#roles) lists what they can do. ![Optional Moderation help explains reviewing harmless examples with filters off and shows that bot moderator permission is not yet verified](https://bloopbot.com/docs/screenshots/onboarding-moderation-help.jpg) _Review moderation with filters off, without testing a timeout or ban on a viewer._ ## Messages split across chat lines The enabled **Blocked words** and link filters also check recent messages from the same viewer together. Splitting a blocked phrase into two messages, or posting a domain and its ending separately, can still be caught when the new message completes it. A matching earlier line alone does not make later ordinary chat an offence. The window includes up to five earlier messages from the last 60 seconds, with a cap on the retained text. Twitch and Kick viewers have separate windows. With copypasta blocking enabled in the repetition filter, three matching messages of at least 12 characters in that window also count as repetition. Different messages sent quickly are not a violation on speed alone. Existing exemptions, link permits and escalation still apply. For meaning across a sequence, such as a greeting followed by a sales pitch, use [AI moderation](https://bloopbot.com/docs/ai-moderation#context) alongside the filters. ## Moderate Kick chat The filters screen [Kick chat](https://bloopbot.com/docs/bloopbot-on-kick) too, on a Kick channel and on a Twitch channel that has Kick added. They work from the same **Moderation** page, with the same thresholds, exemptions and escalation, and a filter's settings apply to both chats. Bloopbot moderates Kick as you, with the permission you gave it when you signed in with Kick or added Kick. If your Kick connection is older, the Kick card on **Connections** says **Update available** and "Reconnect Kick to allow moderation." Choose **Reconnect Kick** and allow Bloopbot again. Until you do, the filters still catch a Kick message, but nothing is deleted or timed out. - **Exemptions.** Kick's moderator, VIP, subscriber, OG and founder badges count like their Twitch equivalents, so "Moderators skip every filter" and "Subscribers skip the filters" work on Kick too. You are exempt as the broadcaster. - **Warnings.** Kick has no warning message of its own. A warning on Kick deletes the message and posts the warning in Kick chat, the same as on Twitch. **Silent mode** posts nothing. - **Timeouts.** Kick times a viewer out in whole minutes, from 1 minute to 7 days, so a timeout of 5 or 90 seconds becomes 1 or 2 minutes. Bloopbot deletes the message first, then times the viewer out. - **No bot to make a moderator.** Replies come from your own Kick account, so the **Not a mod** bar and the pause until your bot is a moderator are Twitch's only. A flow that starts from Kick chat is never paused for it. - **Commands.** Your Kick moderators and you can type `!filters`, `!permit`, `!blacklist` and `!whitelist` in Kick chat. Bloopbot answers in Kick chat. - **Flow steps.** **Time out** and **Delete message** work on Kick: they act on the viewer or the message that started the flow, on the platform it came from. A Kick timeout is whole minutes, and a flow that starts from Kick chat needs the same Kick permission. The **Ban, timeout or unban** trigger starts for Kick bans and timeouts too (pick **Platform** to choose); Kick sends no unban, so **Unbanned** only fires for Twitch. Two things stay on Twitch for now: **Nukes**, and the **Moderation acted** trigger, so a filter acting on a Kick message doesn't start those flows. Use **Ban, timeout or unban** to follow Kick bans and timeouts, including those a filter gives. ## Add a helper flow The **Mod commands** pack holds the commands your moderators run: `!nuke`, `!title` and `!game` for the stream information, and the alert queue controls `!skip`, `!pause`, `!resume` and `!replay` — skip the alert on screen, pause the queue (chat hears _Alerts paused._), resume it (_Alerts resumed._) and replay the last one. Open each installed flow to review its trigger, role checks and action. To do something extra when a filter acts — tell your moderators in chat when a viewer reaches their third strike, for example — start a flow from the **Moderation acted** trigger. **Which filter** (such as **Links** or **Blocked words**), **What it did** (**Warned the viewer**, **Deleted the message** or **Timed the viewer out**) and **At least this many strikes** narrow it down. For bans, timeouts and unbans whoever issued them, including in the Twitch dashboard, use **Ban, timeout or unban** instead. A timeout a filter gives reaches both triggers, so let only one of your flows speak about it. > **Filters are settings, not flows** > > The link filter is one of the filters on the **Moderation** page, so it applies to every message and you set its thresholds, its exemptions and its response there. It also catches a link disguised to slip past it: spaced or spelled out (`example . com`, `example dot com`, `example(.)com`), written in look-alike or fancy letters, or broken up with invisible characters. The blacklist sees through the same disguises. Whatever a filter does — warn, delete or time out — the message it caught is deleted; a first-offence warning only spares the viewer the timeout. A flow is for the decisions that need a step of their own. Review a flow’s action before making it live: a template is a starting point, not a recommended policy for every community. Until a `!nuke` flow is on, the **Nukes** page shows a **!nuke command** row at the top: _There’s no !nuke command yet, so nothing can nuke chat._ Press **Add**, read the review on the right and press **Add 1 flow — paused**, then **Switch on** on the row. If your `!nuke` flow is paused, the row names it, with **Open flow** and **Switch on**. Once it is on, the page names the flow `!nuke` runs from, with **Open flow**: who can nuke is that flow’s **Who can trigger** check, and switching the flow off is how you turn `!nuke` off. The page’s **Limits** cap every nuke, whatever a moderator types: how far back it looks, how long radiation lasts, and the longest timeout. ## Stop a follow-bot raid A follow-bot raid is dozens of brand-new accounts following your channel within a minute, often before a wave of abuse in chat. The **Follow-bot protection** pack notices the burst, turns on Twitch **Shield mode**, posts a calm announcement, and turns Shield mode off again 10 minutes later. It works on every plan. Before you start, set up Shield mode on Twitch itself: in your Twitch moderator view, open **Shield Mode** settings and choose what it does — followers-only chat, a minimum account age, verification and the rest. Bloopbot only switches it on and off; your saved Twitch settings decide what it restricts. Bloopbot also needs your channel's permission to manage Shield mode: if a run says it needs your channel's authorisation, re-authorise it on **Connections**. 1. Open **Flows**, press **Marketplace**, and choose **Follow-bot protection**. 2. Press **Add 1 flow — paused**. The **Follow-bot lockdown** flow arrives paused. 3. Open the flow and read it from left to right, using the list below. 4. Switch the flow on. What each step does: - **Follow burst** starts the flow when at least 20 different accounts follow within 60 seconds. One follow, or a normal trickle, never starts it. - **Account age**, set to **The follow burst**, carries on only when at least 60% of those accounts are younger than 7 days. A real rush of new followers — after a shoutout from a big streamer, say — is mostly older accounts, so the flow stops there quietly. An account in the burst that Twitch has already suspended or deleted counts as new. - **Shield mode** turns it on, and **Announcement** tells chat what is happening. Everyone in chat sees an announcement, the raiders included, so keep its wording calm and neutral. - **Wait** holds for 10 minutes, then the second **Shield mode** turns it off. For example, when 25 accounts follow within 40 seconds and 22 of them were created this week, the flow turns Shield mode on, announces it, and turns it off again 10 minutes later. While that burst's cooldown runs, the next follows don't start it again. **See who followed.** Open the flow and expand its **Run log**. The **Follow burst** line lists the login of every account in the burst (up to 100), and the **Account age** line says how many of them were new, such as “22 of 25 accounts under 7 days old (88%)”, adding “3 no longer on Twitch” when some accounts are already gone. Bloopbot doesn't ban anyone in bulk: review the list with your moderators and act on Twitch where you need to. The Run log shows a burst as it happens while the flow is open in the editor. ![The Run log of the Follow-bot lockdown flow after a follow burst: Follow burst → next, listing 20 follows in 60 seconds and every account’s login; Account age → true, 18 of 20 accounts under 7 days old (90%); Shield mode → next, shield mode on; Announcement → next, with the start of its calm message; and Wait → waiting, with the time it resumes.](https://bloopbot.com/docs/screenshots/follow-bot-run-log.jpg) _The Run log of a follow burst: the Follow burst line lists every login, Account age counts the new accounts, and the Wait step says when Shield mode goes off._ To tune it, select a node and change its settings: - **Follows** and **Within (seconds)** on **Follow burst** set what counts as a burst. A bigger channel that often gains 20 followers a minute should raise **Follows**. **Then wait (minutes)** is how long after a burst before another one can start the flow, 15 by default. That wait starts whenever **Follow burst** fires, even when **Account age** then decides the followers are real and stops the flow — so a follow-bot raid that arrives within 15 minutes of a genuine rush of new followers is missed. If you often get real follow rushes, after a raid or a shoutout, lower **Then wait (minutes)**. - **Younger than (days)** and **At least (% of the burst)** on **Account age** set how many new accounts it takes. Lower the percentage to act on a mixed burst. - **Wait for** on **Wait** sets how long Shield mode stays on, up to an hour. - The announcement's text and colour are yours to change. **Account age** works in your own flows too. Set it to **The viewer** to check the follower on **New follower**, the chatter on **Any chat message** or **Chat command**, or the raiding channel on **Incoming raid** — for example, to skip the welcome message for an account made today. > **Chat floods are Twitch's job** > > This pack watches follows only. For waves of chat messages from new or suspicious accounts, use Twitch's own **Chat verification** and **Suspicious user** settings in your Twitch moderation settings. They act before a message reaches chat, which no flow can do. If Shield mode stays on: saving a change to the flow's canvas while its wait is pending cancels the wait, so the step that turns it off never runs. Turn Shield mode off yourself in Twitch. If Twitch can't be reached to check the accounts, the run stops at **Account age** with “Couldn't look up account ages on Twitch” in the Run log, and Shield mode stays as it was. **Test fire** doesn't wait and asks Twitch nothing: it treats every account in its sample burst as new, so you can see the whole path at once. ## Deleted messages on your overlay A successful Bloopbot deletion on Twitch or Kick removes that message from the chat overlay too. A timeout or ban removes that viewer's displayed lines; refreshing or reconnecting the overlay does not bring them back. A failed deletion is not treated as confirmed removal. Twitch supplies message-deletion events for actions taken by you or other moderators. Kick supplies ban and timeout events, so those clear the viewer's lines too. Kick does not currently supply Bloopbot with an individual-message deletion event: if you delete one message directly in Kick, the overlay may not hear about it. Deletions made by Bloopbot's filters or flows reach the overlay directly. ## Check what happened Use a flow’s **Run log** to inspect its path and failures. Use **Audit log** to see who changed channel configuration. Bulk moderation jobs are on **Nukes**; review the job details before considering a rollback. Test fire simulates actions without timing out or banning real viewers. --- # Set up AI moderation Build a flow that reads chat for harassment, hate speech, sexual content, scam/spam and your own rule — watch first, then let it act. Updated 31 October 2026 ## Before you start You’ll need the **AI moderation filter** feature on your channel — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes). Without it the step still appears in the step list, but can’t be added, and everything else about your moderation setup keeps working unchanged. > **This is a flow, not a filter card** > > AI moderation is something you build, not something you switch on. Your six deterministic filters — blacklist, links, caps, symbols, emotes, repetition — are exactly where they were on the [Moderation page](https://bloopbot.com/docs/moderation) and work alongside the AI flow. The AI is a separate step you put in a flow, which is what lets you delete a scam link quietly and time someone out for a slur, in the same flow, in your own words. ## Watch it for a stream first 1. Open **Flows**, press **Marketplace**, and add **AI chat moderation — watch only** on its own (it is in the **AI helpers** pack). 2. It reads every non-moderator message and writes what it thought into the flow’s run log. It says nothing in chat, deletes nothing and times out nobody. 3. Leave it running for a stream or two, then open the flow and read its **Run log** — every message it saw, the verdict, and every probability behind it. You can see the step, change what it looks for, and point it at any trigger you like. > **Don’t have it repeat what it caught** > > It is tempting to add a chat step saying what was flagged. Don’t: your bot would be repeating a slur, someone’s address or a scam link word for word under its own name, to everyone, while the original message is still sitting there. The run log tells you the same thing and only you and your editors can read it. ## Let it act When you trust it, install **AI chat moderation — delete and warn** and pause or delete the watch-only flow. It deletes a message that breaks the rules and says so; only the hate-speech branch reaches a timeout. What it does about each finding sits in one group inside the flow, **Enforce chat rules**: open the group to change a branch, and every flow that uses it follows — [reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes) walks through it. Every branch is yours. Point **Scam/spam** at a delete with no reply, send **Harassment** to a warning instead, add a **Timeout** where you want one — they are ordinary steps. A change to the group applies to every flow that uses it. > **Never wire a judgment straight to a ban** > > Both templates put a **Who can use this** check in front, so a moderator is never judged at all, and only one category reaches a timeout. If you wire every branch to the harshest thing you can, one AI judgment is all it takes — which is exactly what this bot is built to avoid. ## Each message with recent context Each new Twitch or Kick message is checked as it arrives, with up to five earlier messages from the same viewer in the last 60 seconds. The window moves forward with every message; it never waits for a burst to finish. Each chat keeps its own context, even when you show several platforms on one overlay. The retained text is capped, so long messages can leave less history available. For example, a friendly opener followed by an advertisement and an AI-service sales pitch can reveal unsolicited promotion. The judge checks whether the new message contributes to that sequence. An earlier offence alone should not flag a later unrelated question or compliment. This context is included when the step checks the message that triggered the flow. Checking other text, such as a reward input, does not pull in chat history. **Test fire** also uses no live history and never asks the real judge. Your categories, **Sensitivity** and connected actions still decide what happens. The window does not add strikes or turn a delete into a ban. When a message is deleted successfully, it also disappears from your chat overlay and stays absent after refreshing it. ## Categories and your own rule Four categories you tick on the step, each getting its own output so you can treat them differently: | Category | Catches | | --- | --- | | Harassment | Harassment or a personal attack aimed at a specific person. | | Hate speech | A slur or hateful language aimed at race, ethnicity, gender, sexual orientation, religion, disability or a similar protected characteristic. | | Sexual content | Sexual content, solicitation or sexually degrading language. | | Scam/spam | A scam, spam or unsolicited self-promotion — a follow-for-follow pitch, a crypto/gambling link, repeated promotion of another channel. | Plus **your own rule**, written in plain English — “no discussing other streamers by name” — which gets an output of its own once you write one. Untick a category and it is never asked about, which also costs you nothing. Ordinary chat — hype, trash talk about the game rather than a person, swearing for emphasis, ALL CAPS excitement — is deliberately not a violation on its own, however crude, as long as nothing is aimed at a person as an attack. ## Sensitivity, and what it costs One **Sensitivity** picker rather than a threshold per category: **Low — only the obvious**, **Medium — recommended** (the default, and the safe starting point) or **High — catches more, and more false alarms**. **Ignore very short and emote-only messages** is on by default and skips those messages when there is no recent context. With earlier messages available, a short fragment can finish a longer pitch, so it is checked with that context. Neither does a message the step was never pointed at. Chat stays exactly as fast as it was. The flow runs beside your bot’s replies rather than in front of them, so a command typed in a message that is about to be deleted may still get its answer a beat before the message disappears. ## The Unsure branch The step leaves by **Unsure** when the judge can’t answer — your channel doesn’t include the feature, or the judge is unreachable — and also when it lands right on the fence. Leaving **Unsure** unconnected is the right choice here: a judgment that isn’t sure hasn’t found anything, and doing nothing about it is correct. Both templates leave it unwired; the run log still records every one, so you can see how often it happens. ## Troubleshooting - Step won’t add? Your channel doesn’t currently include the AI moderation feature — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes). - Nothing happens when you expect a detection? Check which branches you wired. An unconnected branch is silence by design — read the flow’s run log, which records the verdict on every message it saw whether or not anything was wired. - A command answered on a message that then got deleted? Expected — the check runs beside your bot’s reply, not in front of it. - Catching too much or too little? Move **Sensitivity** one step, or untick the category that keeps firing. The run log shows the probability behind each one, so you can see how close the calls were. - Silent entirely? If the AI judge is unreachable, not switched on for your channel, or your channel loses the feature, every message leaves by **Unsure** — your six deterministic filters keep moderating exactly as before. --- # Share the work with mods and editors Give your Twitch moderators a dashboard that runs the stream, invite editors to help build your channel, and send them both one link to sign in. Updated 14 October 2026 ## Moderators and editors Three kinds of people can help with a channel, and each gets a different amount of Bloopbot: | Who | What they can do | How they get it | | --- | --- | --- | | You, the owner | Everything | You linked the channel | | Editor | Change your channel’s pages: flows, overlays, settings, moderation and the rest | You invite them or add them on **Team** | | Moderator | Run the stream from a small dashboard: Live, Song requests, Queue, Questions, Media share, Nukes, Wheels, Moderation, Quotes, Highlights, your giveaways and one viewer’s points, plus your control panels if you allow it | They are a Twitch moderator of your channel, and you tick them on **Team** | A moderator’s dashboard is a separate thing from a Twitch moderator’s power in your chat. Every Twitch moderator already has the chat commands below with nothing to sign in to; ticking someone on **Team** adds the dashboard on top. Editors and moderators sign in with their own Twitch accounts, so you never share yours. > **Choose people you trust** > > Editors have broad access to your channel’s configuration. Moderators have less, but they can still remove songs, change your filters and hand out points. Nobody is added until you choose them, and you can end anyone’s access at any moment. ## What each can do Moderators run the stream. They do not build the channel, see what you keep private or touch your account. | | You | Editor | Moderator | | --- | --- | --- | --- | | Live, Queue, Nukes | Yes | Yes | Yes | | Questions: show, answer, dismiss and clear viewers’ questions | Yes | Yes | Yes | | Song requests: skip, remove, block and clear (not the Spotify connection) | Yes | Yes | Yes | | Media share: approve, skip and remove viewers’ video requests | Yes | Yes | Yes | | Spin a wheel | Yes | Yes | Yes | | Moderation: filters, blacklist, whitelist and link permits | Yes | Yes | Yes | | Quotes: add, fix and remove | Yes | Yes | Yes | | Giveaways: open, close, draw, reroll and end one you already made | Yes | Yes | Yes | | Loyalty: adjust one viewer’s points | Yes | Yes | Yes | | Highlights: open the page and read it | Yes | Yes | Yes | | Control panels: open them, press their buttons and change their values | Yes | Yes | Only with **Use control panels** | | Control panels: make, edit or delete a panel | Yes | Yes | No | | Giveaways: make, edit or delete one; stock or see **prize codes** | Yes | Yes | No | | Build or edit flows, overlays, Variables, Schedule, Store, Public page and Marketplace | Yes | Yes | No | | Change settings: Loyalty and Store settings, queue settings, nuke limits, moderation escalation, Connections | Yes | Yes | No | | Audit log | Yes | Yes | No | | **Team**, buying a plan, unlinking Twitch or Spotify, the bot account | Yes | No | No | | Connect an AI assistant, the Stream Deck plugin, or another app | Yes | Yes | No | A moderator never sees a prize code, even on a giveaway they are running: the pages they use show the prizes’ labels and how many are left, and nothing that could reveal a key, link or address. A page a moderator cannot use is not in their sidebar, and opening its address anyway shows a short **Ask the streamer** message instead of the page. Someone who is both an editor and a ticked moderator is an editor. Take the editor role away and they stay a moderator. ## Open the Team page **Team** holds everything about who helps: your editors, your moderators and the link you send them. Only you see it. 1. Sign in as the channel owner and choose your channel. 2. In the sidebar open **Settings** › **Team**. Pebble’s **Invite a helper** tutorial walks you there too: [Learn Bloopbot with Pebble’s tutorials](https://bloopbot.com/docs/tutorials#list) lists it. The page has three cards: **Editors**, **Moderators** and **Helper link**. ## Let a moderator into your dashboard **Prerequisites:** the person must already be a moderator of your channel on Twitch. Bloopbot asks Twitch for your current moderators, so making someone a moderator there is the first step. Moderators are included on every plan, with no limit on how many you tick. 1. Open **Settings** › **Team**. 2. On the **Moderators** card, wait a moment while it asks Twitch for your moderator list. With eight or more moderators, a **Find a moderator** box appears above the list. 3. Tick the box beside each person you want to let in. The count at the top of the card goes up (**2 ticked**), and each ticked row shows the date you ticked them. 4. Send them the [helper link](https://bloopbot.com/docs/editors#helper) so they can sign in. Nobody is ticked to begin with, and a new Twitch moderator does not get in until you tick them. The tick asks Twitch again, so someone who has just lost the role cannot be ticked. ![The Moderators card on the Team page: what a moderator can and cannot do, the count 2 ticked, four Twitch moderators with a tick box each, the two ticked ones showing the date they were ticked and a Use control panels box (on for the first), and the Helper link card below with the address to send and a copy button.](https://bloopbot.com/docs/screenshots/team-moderators.jpg) _The Moderators card on Team with two of four Twitch moderators ticked, the tick date under each and a Use control panels box beside each ticked person, one of them on, and the Helper link card beneath it._ ## Let a moderator use your control panels [Control panels](https://bloopbot.com/docs/control-panels) are screens of buttons and controls you build for your stream. A moderator can use them too, so someone else can press **Home goal** or fix the score while you play. Each moderator needs your say-so first. **Prerequisites:** the moderator is ticked on **Team**, and you have made at least one control panel. 1. Open **Settings** › **Team**. 2. On the **Moderators** card, find the person. Beside each ticked moderator is a **Use control panels** box, off to begin with. 3. Tick **Use control panels**. It takes effect at once. The moderator now sees **Control panels** in their sidebar. They can open any of your panels, press its buttons and change its variables, on a computer, a phone or in an OBS dock. They cannot make, edit or delete a panel, and a button or control that is not on a panel is not theirs to use: they get only what your panels show. Everything they do from a panel runs exactly as when you do it, uses the same limits on how fast buttons can be pressed, and appears in **Audit log** under their name. To stop it, untick **Use control panels**. Their next press or change is refused, and any panel they have open says **You no longer have access**. Unticking the person as a moderator ends it too, and if you tick them again later the box starts off. ## Add an editor **Prerequisites:** editors come with some plans, and the number you can add depends on your plan: check [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). Moderators need no plan. 1. Open **Settings** › **Team** and find the **Editors** card. 2. Type the person’s Twitch username in the **Twitch username** field and choose **Add editor**. 3. Or, under **Or send a link**, choose **Create invite link** and copy the link straight away: it is shown once. Share it privately with the person you intend to add. Each link works once and expires in a week. 4. Ask them to sign in with their own Twitch account. With an invite link they choose **Accept and open the channel**; otherwise they open your [helper link](https://bloopbot.com/docs/editors#helper) or choose your channel from **Channels**. ![The Editors card on the Team page: what editors can and cannot change, the line Nobody else can manage this channel yet, a Twitch username field with an Add editor button, and under Or send a link one pending invite link with its made and expiry dates, works once and a Revoke button, above a Create invite link button.](https://bloopbot.com/docs/screenshots/editors-card.jpg) _The Editors card on Team, with one invite link waiting to be used._ When your plan’s editor limit is reached, the add button reads **Editor limit reached** with your limit, and **Create invite link** is unavailable, until you remove someone. Editors can add their own backup sign-in email under **Account**, as [Keep a backup way to sign in](https://bloopbot.com/docs/backup-sign-in-email) explains. ## Send the helper link The **Helper link** card shows one address to send to both moderators and editors. Choose the copy icon (**Copy the helper link**) and send it to them privately. What your helpers see when they open it: 1. **Signed out:** Bloopbot sends them to Twitch to sign in. Twitch asks only for their name and email address, and nothing else. It does not ask to link a channel of theirs, and it does not set up Bloopbot on their own channel. 2. **Signed in and on your team** (a ticked moderator or an editor): they land in your channel’s dashboard. A moderator opens on **Live**, with a bar across the top reading **Moderator** and the name of your channel, and only their pages in the sidebar. 3. **Signed in but not on your team yet:** a page tells them they are not on this channel’s team and to ask you to add them. It never says whether your channel exists. ![A moderator's view of a streamer's Live page: the Moderator bar across the top naming the channel with Switch channel, and the sidebar listing only Home and Live, On stream (Wheels), Viewers (Song requests, Queue, Questions, Media share, Giveaways, Loyalty), Channel (Quotes, Highlights) and Safety (Moderation, Nukes), with Help and the moderator's own account at the foot and no Marketplace or Settings.](https://bloopbot.com/docs/screenshots/moderator-dashboard.jpg) _A moderator’s dashboard on Live: the bar reads Moderator, and the sidebar lists only the pages a moderator can use, with Moderation and Nukes under Safety and no Settings._ Someone who helps a channel does not have to run Bloopbot on their own. If they stream too, the Overview offers **Set up Bloopbot for your own channel** (and **Channels** offers **Link Channel**) whenever they want it, and that is a separate, full sign-in. The channel switcher lists every channel they help with, moderated ones marked _(moderator)_ and edited ones _(editor)_. ## What moderators can do from chat Bloopbot reads the moderator badge on each chat message, so a moderator on Twitch is a moderator to Bloopbot straight away, with nothing to sign in to. Take the role away on Twitch and their next message counts as an ordinary viewer’s. You, the broadcaster, can do everything a moderator can. These commands are built in. There is nothing to install, they are not on your **Flows** page, and anyone below moderator who types one gets no reply at all: | Command | What it does | | --- | --- | | `!permit ` | Lets that viewer post a link past the link filter for the **Permit Duration** set on it (60 seconds unless you change it) | | `!filters` | Lists each filter as on or off | | `!filters enable ` | Switches a filter on; `on` works too. Filters: `blacklist`, `links`, `caps`, `symbols`, `emotes`, `repetition` | | `!filters disable ` | Switches a filter off; `off` works too | | `!blacklist` | Lists the first ten blacklist entries | | `!blacklist add ` | Adds an entry; add `-regex` for a pattern, or `-timeout=600` for its own timeout in seconds | | `!blacklist remove ` | Removes an entry; `del` works too | | `!whitelist` | Lists the domains the link filter allows | | `!whitelist add ` | Allows links to that domain, for example `!whitelist add youtube.com` | | `!whitelist remove ` | Stops allowing it; `del` works too | | `!link` | Posts the link for connecting a Twitch account to Bloopbot | A command from chat changes the same settings you see on **Moderation**, so a filter a moderator switches off in chat shows as off there too. Out of the box every filter leaves moderators alone; each filter’s **Exempt Level** on **Moderation** decides who it skips. Everything else moderators run is a flow, so you decide what they get. The **Mod commands** pack holds `!nuke`, `!title`, `!game`, `!spin` and the alert queue controls, each already checked for moderators, and the giveaway commands in [Run a giveaway in chat](https://bloopbot.com/docs/giveaways#chat) work the same way, except that cancelling a giveaway is yours alone. To open one of your own flows to moderators, put **Who can trigger** set to **Moderators and up** after its trigger, as [Make a command moderators-only](https://bloopbot.com/docs/permissions-and-cooldowns#permissions) shows. Everyone at the level you choose and above passes: **Moderators and up** lets your moderators and you through, and **Broadcaster only** keeps a command to you alone. > **Try it with a moderator** > > Ask a moderator to type `!filters` in chat. The bot answers with each filter and whether it is on. If it stays silent, check they have the moderator badge next to their name in your chat. ## Review or end access Return to **Settings** › **Team** at any time. - **Moderator:** untick their box. Their access ends on their very next click, and a live page they already have open stops updating within about half a minute. - **A moderator’s control panels:** untick **Use control panels** beside them. Their open panels stop working straight away, and they keep the rest of their moderator pages. - **Editor:** choose the bin icon (**Remove**) next to their name. Choose the broken-link icon (**Revoke**) next to a pending invite link to stop it working. This works on every plan: if your plan does not include editors, the card still lists the editors you have, with the same two icons, and only hides the controls for adding more. - **On Twitch:** if you remove someone’s moderator role on Twitch, Bloopbot notices and clears their tick as well, so their dashboard access ends with it. The row disappears from your ticked list; if you make them a moderator again later, tick them again. The Audit log records it as a change made by Twitch. - If Bloopbot checks Twitch and finds a ticked person is no longer a moderator, their row on **Team** reads _no longer a Twitch moderator_. Untick it to tidy the list. **Audit log** records who ticked and unticked a moderator, who turned **Use control panels** on or off for them, who added or removed an editor, and the changes made under each editor’s and moderator’s name. If Bloopbot cannot reach Twitch to confirm your moderators, it never removes anyone’s tick, but your moderators may briefly lose their access until it can check again. Editors and you are not affected, and it clears by itself once Twitch answers. ## An example: a mod for game night You stream game nights and your friend Sam is a Twitch moderator of your channel. 1. Open **Settings** › **Team**. **Moderators** lists your Twitch moderators, including _Sam_. 2. Tick Sam’s box. The count reads **1 ticked** and Sam’s row shows today’s date. 3. Copy the **Helper link** and send it to Sam. 4. Sam opens it, signs in with Twitch (which asks only for a name and an email address) and lands on **Live** in your channel, under the **Moderator** bar. 5. During the stream Sam skips a song on **Song requests**, presses **Next** on **Queue** and draws your giveaway on **Giveaways**. The prize codes stay hidden from Sam. **Flows** and **Overlays** are not in Sam’s sidebar, and typing their address shows **Ask the streamer**. 6. After the stream you untick Sam. Sam’s next click no longer reaches your channel. ## Troubleshooting - **My mod doesn’t see my channel.** Check three things: they are a moderator of your channel on Twitch, you have ticked them on **Team**, and they signed in with the same Twitch account. Ask them to open your helper link again while signed in. If it says they are not on the team yet, one of the first two is missing. Bloopbot moderators are not the same as your chat’s: a Twitch moderator you have not ticked has your chat commands but no dashboard. - **The Twitch mod list won’t load.** The **Moderators** card says Twitch could not be reached. Choose **Try again**. If it keeps happening, your ticked moderators are still listed and you can still untick them; ticking someone new needs Twitch to answer. If it stays broken, check **Connections** for a notice asking you to reconnect Twitch. - **A mod is shown as no longer a Twitch moderator.** Twitch no longer lists them, so they cannot use their access. If that is a mistake, make them a moderator on Twitch again, then tick them. If it is not, untick them to clear the row. - **My mod sees “Ask the streamer”.** That page is one moderators do not use: flows, overlays, settings, **Connections** and **Team** stay with you and your editors. If they need a change, make it for them, or make them an editor if your plan includes editors. - **A moderator lost access for a while and then got it back.** Bloopbot could not reach Twitch to confirm your moderators, so it held their access until it could. Nothing was changed or removed. - **The Add editor button is disabled.** You have reached your plan’s editor limit, or editors are not part of your plan. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows what your channel holds. - **A helper is asked for more than their name and email.** The helper link asks Twitch for nothing else. If they see a longer list of permissions, they started from a different address: send them the **Helper link** from **Team** again. --- # Watch your stream on Live Check stream status, control the alert queue and see what your flows just did. Updated 21 October 2026 ## Open Live during a stream Choose **Live** in your channel's sidebar. A moderator you have [let in on Team](https://bloopbot.com/docs/editors#tick) lands here when they sign in. Live keeps the sidebar available so you can move to Flows, Overlays or other pages while you stream. The activity feed updates as flows run and catches up after a connection interruption. > **Pebble can check you’re ready** > > Before your first stream, Pebble’s **Ready to go live** tutorial checks your overlay, an alert, your bot and your flows, then shows you this page. Start it from [Tutorials](https://bloopbot.com/docs/tutorials). The status area shows whether your stream is **Online** or **Offline**, the current giveaway, the number of songs waiting and the Nuke tool. Open a status item to work with it. If a giveaway is open, you can **Draw** from Live; its winners and claim time appear there too. For example, start a giveaway with a flow, then open Live. The giveaway item shows its title and entry count. When you draw, any winners and their remaining claim time appear in the same place. ## Manage the alert queue The **Alerts queue** panel shows what is playing, what is up next and whether the queue is paused, waiting for an overlay in OBS, or holding alerts whose design no open overlay shows (it names each one). Use **Skip** to move past the current item, **Pause** or **Resume** to control playback, **Replay** to play the last item again, and **Clear** to remove waiting and held items. The buttons become available when there is something they can act on. ![The Alerts queue on Live: a test raid playing, five alerts up next, and Pause, Skip, Replay and Clear controls.](https://bloopbot.com/docs/screenshots/alerts-live-card.jpg) _The Alerts panel on Live shows the item playing, what is up next and the queue controls._ An alert test sent with **Test published output…** enters this same queue and can reach viewers. A flow editor's **Test fire** is simulated and does not play an alert on stream. [Test alerts and check OBS delivery](https://bloopbot.com/docs/alerts-in-obs) explains when to use each test. ## Read recent activity **Activity** lists flow runs across your channel. **Recent** shows the latest runs; **This stream** filters those runs to the current broadcast. The feed loads up to 100 recent runs when opened and adds new runs as they happen. If you are offline, This stream is empty and Recent still shows earlier activity. Each row names the flow, how the run ended, what triggered it and when it happened. Open a flow's name to inspect or change it. Choose **Problems only** to find runs that need attention, then **Everything** to return to the full feed. A flow set to **Any chat message** gets one running tally in Recent. Its checked and acted counts begin when you open Live, so a busy chat does not fill the feed with quiet checks. Any other flow gets the same tally the first time a run of it stops before it does anything, such as a cheer below the trigger's minimum bits, a sub below its tier, or a **Stop** node. Those stops count on the tally instead of appearing as rows, and **Problems only** leaves them out. A run that acts or has a problem, including one stopped by the cascade guard, still appears as its own row. > **If Live says Reconnecting updates…** > > The live connection is being restored. Recent activity reloads when it reconnects. If the feed says it could not load, press **Try again**. --- # Control panels Buttons for your flows and controls for your variables, on any screen: your dashboard, your phone or an OBS dock. Updated 14 November 2026 ## Make a panel A control panel is a screen of your own with big buttons that start your flows and boxes that change your variables. Put a scoreboard, a death counter or a "start the raffle" button on it, then keep it open on a second monitor, a phone or an OBS dock while you stream. Before you start, have at least one flow, or a channel variable you have declared, ready to put on the panel. > **Pebble can walk you through it** > > Pebble’s **Your first control panel** tutorial makes a panel with you, puts one of your flows on it as a button, switches that flow on, and has you open the panel and press the button. Start it from [Tutorials](https://bloopbot.com/docs/tutorials) → **Your first control panel**. It stays locked until your channel has a flow to put on a panel; the card says so ([locked tutorials](https://bloopbot.com/docs/tutorials#locked)). 1. In the sidebar, open **Control panels** under **Bot**. 2. Type a name in **New panel name**, for example `Match night`. 3. Select **Create panel**. The editor opens with an empty grid. You can keep up to 20 panels, and a panel holds up to 64 tiles. Anything you put on a panel keeps working everywhere else too: the flows and variables are the same ones you already have. An AI assistant you have connected can build a panel for you too, from the flows you name: see [Build a control panel](https://bloopbot.com/docs/connect-an-ai-assistant#panel-example). ## Get help with your setup Optional **Help me** explains the panel you select and its saved tiles. Review each tile’s actual flow or variable before pressing it: a button can run real actions, and a variable control writes a real value. Edit a label on that same panel to practise. A copied dock or Stream Deck link does not prove that a button worked. Moderators can use permitted controls; setup edits need the owner or an editor. ![Optional Control panels help explains reviewing real tile bindings and keeps external OBS and Stream Deck setup separate from a successful action](https://bloopbot.com/docs/screenshots/onboarding-advanced-help.jpg) _Panel help separates inspecting saved tiles from pressing a button or verifying an external dock._ ## Add buttons and variables Under **Add to panel**, the editor keeps your library: your **Flows**, your channel **Variables**, and a **Heading** for labelling groups of tiles. Select the **+** beside an item to add it to the end of the grid, or drag it to where you want it. Drag a tile by its grip to move it, or use **Move earlier** and **Move later** in the tile's settings. Search by name to find an item. Flow names wrap so you can read them in full; the hint beneath says whether adding one needs a Run trigger. **Panel layout** shows how many tiles you have added. Nothing is saved until you select **Save**; **Unsaved changes** beside the panel name tells you when there is work to save. ![The control panel editor for a panel called Match night: the library of flows and variables on the left, the scoreboard grid in the middle, and the Home goal button selected with its own image and media picker on the right.](https://bloopbot.com/docs/screenshots/control-panels-editor.jpg) _The control panel editor for Match night: the library on the left, the scoreboard in the middle and the Home goal button selected with its own image in Tile settings._ Each kind of tile does one job: | Tile | What it does on the panel | | --- | --- | | Flow button | Starts that flow when pressed. It shows **Running…**, then **Done** or **Failed**. | | Variable control | A number gets **minus** and **plus** buttons and a box you can type into. Text gets a box. An on/off variable gets a switch. | | Variable readout | Shows the current value, read-only, and updates as it changes. Each variable has **Control** and **Readout** choices in the library. | | Heading | A label across the full row that groups the tiles after it. Leave its **Text** empty for a plain dividing line. | Select a tile to open **Tile settings**. Give it a **Label**, and pick a size of 1×1, 2×1 or 2×2. A number control also has a **Step**, the amount each press of minus or plus changes it by. A flow button can be set to **Press and hold to fire**, so a stray tap on a phone doesn't start it. For a flow button, **Button image** lets you choose an image from your media library or upload a PNG, JPEG, WebP or GIF. The image belongs to this button, so **Home goal** and **Away goal** can run the same flow with different pictures. Use **Remove button image** to show just the label. Save the panel to keep the image; it appears in both Panel and Deck views. Existing buttons keep their flow's Stream Deck artwork until you choose or remove an image for that button. Button images travel with a shared pack's panels. Only channel variables you have declared appear in the library. A variable that belongs to each viewer, or one Bloopbot keeps for itself, is left out. Declare new ones on [Variables](https://bloopbot.com/docs/variables). ## Buttons need a Run button trigger A panel starts a flow through its **Run button** trigger, the same one behind the **Run** button in the flow editor ([Run a flow on demand](https://bloopbot.com/docs/flow-basics#run-button)). A flow that doesn't have one is marked **Adds a Run trigger** in the library. When you add it, the editor asks first: - **Add a Run trigger?** explains that the flow's other triggers keep working. A chat command still answers in chat, and the panel button is one more way to start the same steps. - If the flow reads things that only its normal trigger provides, such as the viewer who typed a command, the dialog lists them: _Started from the panel, these will be empty_. Check that the flow still does something sensible without them. - If the flow starts from a chat command that has **named arguments**, such as `team`, `scorer` and `minute` ([Name the words after a command](https://bloopbot.com/docs/first-command#arguments)), the new Run trigger gets the same ones as inputs. The flow keeps reading `$(input.team)` either way, and the button asks for or fixes each of them (see below). `$(1)`, `$(2)` and the other numbered words still come out empty from a panel, because nobody typed a line, so name the words you want a button to fill. - If the flow is a built-in or installed one, the dialog says that adding a trigger makes it your own copy. It then counts towards your flow limit and stops getting updates. Select **Add Run trigger** to confirm, or **Cancel** to leave the flow alone. A button is greyed out when its flow is switched off, has lost its Run button trigger, or was deleted. Hover it and the tip says it is one of those three; check the flow itself to find which. ## Fix or ask for a button's inputs A Run button trigger can take inputs, such as a team name or an amount. When you select a button tile, each of the flow's inputs is listed under **Inputs** with a choice: - **Always** fixes the input to a value you type. The button never asks, which suits one-tap buttons. - **Ask on press** opens a small prompt every time the button is pressed, so you fill the input in then. This is how one flow serves several buttons. A _Goal scored_ flow with a **Team** input can sit on the panel twice: a **Home goal** button with Team fixed to `home`, and an **Away goal** button with Team fixed to `away`. A button with every input fixed starts the flow straight away. The same flow can be a chat command too. Give the command named arguments (`!goal home Saka 23` with **team**, **scorer** and **minute**) and the panel's inputs are the same three, so the message `GOAL for $(input.team)! $(input.scorer), minute $(input.minute)` reads the same whether someone types the command in chat or you press a button. A word left out of a command line uses the argument’s default, or is empty without one. ## Use it on your phone or in OBS Open the panel from the list with **Open**, or from the editor with **Open**. It opens full screen, without the dashboard's sidebar, with the panel's name and **Panel** and **Deck** buttons along the top. ![The Match night control panel in use, full screen: Home, Away and Stage readouts, number controls with minus and plus buttons, a Scorebug toggle, and the Home goal, Away goal, Kick-off, Half time and Full time buttons.](https://bloopbot.com/docs/screenshots/control-panels-use.jpg) _The Match night panel in use: score readouts, number controls with plus and minus, the Scorebug switch and the goal, Kick-off and half-time buttons._ That address needs you to be signed in. To use the panel on a phone or in an OBS dock without signing in there, give it a secret link: 1. On **Control panels**, select the **Share** icon beside the panel, or select **Share** in the editor. 2. Select **Get a link**. The panel's secret link appears, with a QR code under it. 3. Select **Copy link** to copy it. ![The Share dialog for the Match night panel: its secret link with a Copy link button, a QR code, the line that anyone with the link can use the panel so treat it like a password, steps for a phone and for an OBS dock, and the Regenerate, Turn off and Done buttons. The link and the code are hidden.](https://bloopbot.com/docs/screenshots/control-panels-share.jpg) _The Share dialog for Match night: the secret link with Copy link, its QR code, the phone and OBS steps, and Regenerate, Turn off and Done._ - **On your phone**: scan the QR code with the camera and open the link. Choose **Add to Home Screen** in your browser's menu, and the panel opens from its own icon, named after the panel and without the browser's address bar. On Android, installing the panel as an app sends its address to Google to build the app, so use **Add to Home screen** or a bookmark if that matters to you. - **In OBS**: choose **Docks**, then **Custom Browser Docks**. Give the dock a name, paste the link as its URL, then select **Apply**. The panel sits next to your scenes, and nobody has to sign in inside the dock. - **On a second screen**: open the link, or the panel's own address, in a browser window next to the stream. Anyone with the link can use the panel, so treat it like a password. Don't show it on stream or post it in chat. The link opens this one panel and nothing else: its buttons and controls, but no other panel, no flow list, no variable list and nothing else in your dashboard. A press from the link is real, counts towards the same limits as yours, has its own limit on how fast it can press, and appears in **Audit log** as _secret link_ with the panel's name. Press a flow button and it starts the flow for real: chat messages are sent, alerts play and points change, exactly as when the flow's own trigger fires. This is not a simulation. Every open copy of a panel stays in step: change a number on your phone and the readout on your monitor changes with it, and a panel you edit or delete updates everywhere that has it open. ## Replace or turn off a link A panel has one link at a time. Only you and your editors can see it, get it, replace it or turn it off. Moderators never see it. - **Regenerate** gives the panel a new link. The old one stops working at once, on every phone and OBS dock that has it, so give them the new one. Do this if the link was shown on stream or sent to the wrong person. - **Turn off** removes the link. It stops working at once. Select **Get a link** later for a new one. Both ask you to confirm first. A link also stops working when you delete its panel. A link that no longer works opens a page that says **This link doesn't work**. ## Panel and Deck views **Panel** shows the whole layout, with every tile at the size you gave it, and reflows to fit the width of the screen. It is the view for a monitor or an OBS dock. **Deck** is for a phone held in one hand. It shows only your flow buttons, as big square keys in a grid, and leaves out headings, readouts and controls. ![The Match night panel in Deck view on a phone: five square keys, Home goal with its own image and Away goal, Kick-off, Half time and Full time each with a play icon above its label.](https://bloopbot.com/docs/screenshots/control-panels-phone.jpg) _The Match night panel in Deck view on a phone: five square keys for Home goal, Away goal, Kick-off, Half time and Full time._ Each device remembers the view it was last in. To open a panel straight into Deck, add `?view=deck` to its address or to its secret link. A key shows its button's image, or its flow's [Stream Deck](https://bloopbot.com/docs/stream-deck-plugin) key graphic. A key with neither shows a play icon above its label. ## What happens when you change a variable A change from a panel is a real write, the same as a flow's **Set a variable** step: - **Overlays update.** A graphic or alert that shows the variable redraws with the new value. - **Variable changes flows run.** A flow that starts on **Variable changes** for that variable runs when a panel changes it, so a threshold such as "when the score reaches 10" fires from a tap. Its run history names the **Control panel** as the source. - **Every open panel updates.** Other copies of the panel, on other devices, show the new value straight away. Typing a value works like this: select the box, type the number or text, then press Enter or move to another box to save it. Press Escape to cancel. A number box ignores anything that isn't a number. ## Share a panel with its flows A panel can go in a pack you made, beside the flows its buttons start: open the pack on **Flows → Packs** and press **Add to pack** under **Control panels** ([Add control panels to a pack](https://bloopbot.com/docs/create-packs#panels)). When you share the pack on the Marketplace or as a bundle file, the panel's layout goes with it. - **Every button must start a flow in the pack.** A button for any other flow is stopped when you share, with the button and the panel named. - **Every variable or readout tile must show a variable the pack's flows or custom graphics use.** Those variables come with the pack. A streamer who adds the pack gets a new panel under **Control panels**. Its buttons start their own copies of the pack's flows, which arrive paused, so switch the flows on before pressing. A channel holds up to 20 panels: if the pack would take you past 20, adding it is stopped and nothing is added until you delete a panel. [Add an item](https://bloopbot.com/docs/the-marketplace#add) shows the rest. When the creator publishes a new version, a panel you have not changed takes the new layout in place, keeping its link and your moderators' access. If you changed its name or buttons, the update asks whether to keep yours, as it does for a flow you changed ([Update what you added](https://bloopbot.com/docs/the-marketplace#update)). Such a panel shows **Edited** in your list of control panels, and its editor says when saving would make it yours. ## Let your moderators use your panels A moderator can use your panels when you allow it, so someone else can run the scoreboard or press the raffle button for you. On **Settings** › **Team**, tick **Use control panels** beside a ticked moderator, as [Let a moderator use your control panels](https://bloopbot.com/docs/editors#panels) explains. What a moderator gets: - **Control panels** in their sidebar, with every panel you have made and an **Open** button for each. - Each panel in use, in Panel or Deck view, on any screen, exactly as you see it. - The buttons and controls on your panels, and nothing else. A flow that is not on a panel, or a variable that is not, is not theirs to start or change. What stays yours: making, editing and deleting panels, a panel's secret link, and adding a Run button trigger to a flow. A moderator has no **Edit** or **Share** button and no editor. A press or a change from a moderator is real, uses the same limits on how fast buttons can be pressed as yours, and appears in **Audit log** under their name. When a moderator starts a flow, their button shows **Done** or **Failed**, but they do not see the flow's steps. If you untick **Use control panels**, their open panels say **You no longer have access** the next time they press a button or change a value. ## If a button doesn't start its flow - **The button is greyed out.** Its flow is switched off, has no Run button trigger, or was deleted. Switch the flow on, or add the panel to it again from the editor. - **It says Failed.** Either the flow ran but stopped with an error, or the press was refused, for example because you pressed too fast or the flow is busy. A refused press shows a message saying why. If there is no message, open the flow in the [flow editor](https://bloopbot.com/docs/flow-basics) and check its recent runs to see which step stopped it. - **A value in the flow's message is empty.** The flow was started from a panel, so anything that only a chat command or an alert provides is blank. Edit the flow to use an input from its Run button trigger instead, and fix or ask for that input on the button. - **The panel won't open on your phone or in OBS.** Use the panel's secret link there ([Use it on your phone or in OBS](https://bloopbot.com/docs/control-panels#use)): the panel's own address needs you to be signed in to Bloopbot in that browser. - **The link says This link doesn't work.** It was regenerated or turned off, or its panel was deleted. Open **Share** for the panel and copy its current link, or select **Get a link**. - **A moderator's panel says You no longer have access.** **Use control panels** is off for them, or they are no longer ticked as a moderator. Turn it back on for them on **Settings** › **Team**, then ask them to reload the panel. - **Your edits are gone after a reload.** Nothing is saved until you select **Save**. If the panel was changed somewhere else, the editor tells you and offers **Reload**. --- # Catch viewer questions Save the questions viewers ask you in chat, answer them from the Questions page, and show the one you are answering on your overlay. Updated 14 November 2026 ## What you can do When chat is busy, a viewer’s question scrolls away before you see it. **Catch viewer questions** keeps them for you: when someone asks you a real question in chat, it lands on your **Questions** page and waits there until you answer it or dismiss it. From that page you can put one question on your overlay while you answer it, so viewers can see what you are talking about, then mark it answered to take it off again. Your moderators can run the page for you. Only genuine questions to you are kept: “what game is this?” and “how long have you been streaming?” are, while “lol why” or a viewer replying to someone else are not. Nothing is said in chat. ## Before you start - **Catch viewer questions** uses the **AI: chat means…** trigger to tell a real question from chatter. It may not be available on your channel yet; [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows whether it is. Without it, the Questions page shows how to get it, and you can use a `!q` command instead: [Build your own question flows](https://bloopbot.com/docs/catch-viewer-questions#flows) shows how. - To show questions on stream you need an overlay in OBS. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs) shows how to add one as a Browser Source. ## Get help with your setup Optional **Help me** explains the current question intake. Reuse your existing flow and read its trigger and screening. Existing questions do not prove that intake is enabled. Featuring a question and displaying it on stream remain separate actions. ## 1. Add Catch viewer questions 1. In the dashboard sidebar, open **Viewers** › **Questions**. 2. A **Question catcher** row under the page title says _Questions from chat don’t reach this page yet._ Press **Add** on it to open the review on the right, then press its button to add **Catch viewer questions**, paused. 3. Press **Switch on** on the row. It goes away once the flow is on. You can also open **Flows**, press **Marketplace**, and add **Catch viewer questions** on its own; it is in the **AI helpers** pack. ![The Questions page: PixelPal's question under On your overlay with Answered and Take it off your overlay, and three questions under Waiting, each with Show on your overlay, Answered and Dismiss buttons.](https://bloopbot.com/docs/screenshots/questions-page.jpg) _The Questions page: one question on your overlay, three waiting below it with Show, Answered and Dismiss buttons on each._ ## 2. Answer questions on the Questions page The Questions page shows the question on your overlay at the top, under **On your overlay**, and every other question under **Waiting**, oldest first. New questions appear on their own as viewers ask them. Each waiting question has three buttons; hover one to see its name: - **Show on your overlay** (the screen with an arrow) puts it on your overlay, in place of the one shown before. - **Answered** (the tick) marks it answered and takes it off the page. - **Dismiss** (the cross) takes it off without answering, for a question you will skip. The question on your overlay has **Answered** and **Take it off your overlay**; taking it off leaves it waiting in the list. The bin icon at the bottom (**Clear all questions…**) deletes every question once you confirm. A moderator you have [let in on Team](https://bloopbot.com/docs/editors#tick) can do all of this. Up to 200 questions wait at once; when one more arrives, the oldest that is not on your overlay is dismissed to make room. Each viewer can have 3 questions waiting at a time, and if a viewer asks the very same question twice, it is kept once. ## 3. Show the question on your overlay For a stream built around answering questions, press **Browse templates** below the search on **Overlays** and add **Q&A**: a ready-made overlay with a camera frame, chat and a **Viewer questions** layer under the camera, set to show at most three lines of a question. [Add an overlay to OBS](https://bloopbot.com/docs/widgets-in-obs#templates) covers ready-made overlays. To put the layer on an overlay you already have: 1. Open **Overlays** and open the overlay the questions should appear on. 2. Press **Add** on the left and choose **Viewer questions** under **Chat & info**. 3. Select the layer. **Title** is the small line above the question (`QUESTION` to start with; leave it empty for none). **Waiting questions to list** shows that many of the next questions under it, from 0 to 10. **Say how many more are waiting** adds a line such as _3 more questions waiting_. **Longest question, in lines** (6 to start with, from 1 to 10) cuts a longer question with an ellipsis, so the card never grows past its place; the whole question stays on the Questions page. 4. Size and place it like any other layer — [Arrange your overlay](https://bloopbot.com/docs/arrange-your-overlay) covers placement — and press **Publish**. The layer shows who asked the question and what they asked. With nothing on your overlay, it shows nothing at all, so it can stay in your scene. It takes your overlay theme, and its panel, title, name, question and rows can each be styled from the theme’s parts. To see it with a made-up question, open **Simulate** in the top bar and press **Test question**; after a few seconds it returns to your real one. ![The Viewer questions layer on stream: the title QUESTION, PixelPal, the question What game are we playing after this one?, and 3 more questions waiting.](https://bloopbot.com/docs/screenshots/questions-layer.jpg) _The Viewer questions layer on stream: PixelPal asks what game is next, with 3 more questions waiting._ ## 4. Build your own question flows Five steps in the node library, under **Questions**, do everything the page does: - **Add a viewer question** saves the viewer’s question. **The question** is `$(message)`, the whole chat message, to start with. It follows **ok**, or **rejected** when there is no text, the viewer already asked the same thing or already has 3 questions waiting, with a line for chat in `$(from..message)`. - **Mark question answered** marks the question on your overlay answered, or the oldest when none is shown. - **Feature a question** puts the oldest question not already shown on your overlay. It hands on who asked it, `$(from..user)`, and the question, `$(from..text)`. - **Take question off screen** takes it off your overlay; it stays waiting. - **Clear all questions** deletes them all. **Mark question answered** and **Feature a question** can also name one question by its id, under **Which question**: **Add a viewer question** hands its id on as `$(from..id)`. Some flows worth building: - **A `!q` command**: a **Chat command** trigger for `q`, then **Add a viewer question** with **The question** set to `$(query)`, everything after the command. This needs no AI, so it works on every channel. - **Next question from a Stream Deck**: a **Stream Deck button** trigger, then **Mark question answered**, then **Feature a question**. One press answers the question on screen and shows the next one. - **Read it out in chat**: after **Feature a question**, a **Chat message** that names who asked and what. Pick both from the **Insert…** menu, under that step. To catch more or fewer questions, open the **Catch viewer questions** flow and change its trigger: raise **Probability needed** from `0.7` to keep only the clearest questions, or edit **Fires when…** to say what should not count. [Wake a flow when chat means something](https://bloopbot.com/docs/intent-trigger) explains each setting. ## A worked example: a Q&A stream 1. Add **Catch viewer questions** from the Questions page and switch it on. 2. Add a **Viewer questions** layer to your main overlay, set **Waiting questions to list** to `0`, keep the count line on, and publish. 3. PixelPal types _what game are we playing after this one?_ It appears on the Questions page under **Waiting**. LoyalLlama types _lol same_; nothing is saved. 4. Two more viewers ask questions. You press **Show on your overlay** on PixelPal’s. Your overlay shows _PixelPal_ and the question, with _2 more questions waiting_ under it. 5. You answer it on stream and press **Answered**. The layer disappears until you show the next one. ## What you should see - Real questions from chat appearing on the Questions page within a few seconds, with nothing said in chat. - The question you show appearing on your overlay within a moment, and staying there when you refresh or re-open the Browser Source. - Answered, dismissed and cleared questions leaving the page and the overlay at once, wherever the page is open. ## Troubleshooting - No questions arrive: the **Catch viewer questions** flow is paused, or the AI trigger is not available on your channel. Switch the flow on in **Flows**, check [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes), or add a `!q` command as shown in [Build your own question flows](https://bloopbot.com/docs/catch-viewer-questions#flows). - Chatter is saved as questions: raise **Probability needed** on the flow’s trigger, or say in **Fires when…** what should not count. - A real question was missed: it has to look like a question, with a question mark or starting with a word such as _what_ or _how_, and be at least 8 characters, and each viewer is heard at most once every 30 seconds. Lower **Probability needed** a little, or shorten **Per viewer cooldown**. - The layer shows nothing: no question is on your overlay. Press **Show on your overlay** on one, and make sure the overlay is published. - A moderator cannot see the Questions page: tick them on **Team**; [Editors and moderators](https://bloopbot.com/docs/editors#tick) shows how. --- # Work with your stream schedule Keep your Twitch schedule up to date from the dashboard, and post a heads-up before each scheduled stream. Updated 14 November 2026 ## What it does Your stream schedule lives on Twitch — it is the schedule on your channel page. The **Schedule** page in your dashboard shows it, lets you add and cancel streams and set a vacation without opening Twitch, and hands you links for widgets and calendar apps. Flows can then act on it: _half an hour before each scheduled stream, tell chat what is coming up_. ## Before you start - Your channel connected on **Connections**. To add, cancel or delete streams from the dashboard, Bloopbot also needs permission to manage your schedule; if it does not have it yet, the Schedule page says **Schedule management requires reauthorization** — choose **Reauthorize now** there and accept on Twitch. - For reminders in chat: the **Going-live countdown** flow from the **Starter** pack, or any flow you build with the **From your schedule** trigger. ## Get help with your setup Optional **Help me** separates a recent cached schedule from a fresh Twitch check. Open Schedule to read current entries, cancellation and time zone before editing. Saving changes Twitch; there is no private sample event created by setup. ## 1. Look after your schedule Open **Schedule** in the sidebar, under **Channel**. - **Upcoming Segments** lists your scheduled streams from Twitch: date, time, title, category and length. A weekly stream is marked **Recurring**; a cancelled one is marked **Canceled**. Select the refresh icon (**Refresh schedule**) after changing something on Twitch. - Each row’s buttons, named when you point at them: **Cancel this occurrence** skips that one date, **Restore this occurrence** brings it back, and **Delete segment** deletes the whole segment — for a weekly stream, every week — and cannot be undone. - **Vacation Mode** pauses your schedule between two dates. Choose **Set Vacation**, pick **Start Date**, **End Date** and **Timezone**, then **Set Vacation**. **End Vacation** lifts it early. - **Twitch Dashboard** opens your schedule on Twitch, for anything this page does not cover, such as a stream’s category or editing an existing stream. > **These changes reach Twitch** > > Adding, cancelling or deleting a stream and setting a vacation change your real Twitch schedule straight away — viewers see them on your channel page. There is no preview or undo. ## 2. Add a stream 1. Choose **+ Add Segment**. 2. Fill in **Title** — what viewers see on Twitch, such as _Ranked grind_. 3. Set **Start Date & Time**, at least 10 minutes from now, and **Duration (minutes)** between 30 and 1440. It starts at 180. 4. Pick your **Timezone**, and leave **Recurring weekly** ticked for a stream that repeats every week. Twitch may not accept a one-off stream on every account. 5. Choose **Save**. The stream appears under **Upcoming Segments** and on your Twitch channel page. ![The Add Segment form on the Schedule page: Title Ranked grind, a start date and time with the note to schedule at least 10 minutes ahead, Duration 180 minutes between 30 and 1440, Timezone Europe/London, Recurring weekly ticked, and Cancel and Save buttons.](https://bloopbot.com/docs/screenshots/schedule-add-segment.jpg) _Adding a weekly Ranked grind stream: title, start time, a three-hour duration, timezone and Recurring weekly._ ## 3. Post a reminder before each stream 1. Open **Flows** and find **Going-live countdown**. It is set to post _Going live in $(minutes) minutes with $(segment)!_ half an hour before each scheduled stream. 2. On its trigger, **When** chooses the moment: **Before a scheduled stream**, **When a scheduled stream is due to start** or **After a scheduled stream is due to end**. **Minutes** is how long before the start or after the end, up to 1440; it is not used for the start itself. 3. Reword the message if you like, then press **Save** and switch the flow on. ![The When this happens step of the Going-live countdown flow: When set to Before a scheduled stream, noting cancelled streams and vacations never fire, and Minutes set to 30, before the scheduled start or after the scheduled end.](https://bloopbot.com/docs/screenshots/schedule-trigger.jpg) _The From your schedule trigger in Going-live countdown: 30 minutes before a scheduled stream._ The message can use what the trigger knows about the stream: | Token | What it says | | --- | --- | | `$(segment)` or `$(title)` | The scheduled stream’s title | | `$(category)` | Its category, when it has one | | `$(minutes)` | The **Minutes** you set | For a note after the stream, such as _Thanks for watching — see you Thursday!_, add a second flow with **After a scheduled stream is due to end**. The same trigger can start anything a flow can do, not only a chat line. ## How the timing works - The trigger follows your **schedule**, not the moment you actually go live. Start late or early and the reminder still posts at the scheduled time; an unscheduled stream gets no reminder. For something that happens when you really go live, use the **Stream starts or ends** trigger instead. - Cancelled occurrences and vacation days never fire. - Bloopbot reads your schedule about every ten minutes and looks a week ahead, so a stream added or moved at the last minute may be missed. Set the schedule up at least a little ahead. - Each moment fires once. If the reminder cannot be posted within five minutes of its moment, it is skipped rather than posted late. ## Check it works 1. In **Going-live countdown**, press **Test fire**. The dry run uses a made-up scheduled stream, _Ranked grind_, half an hour away, so the Run log shows the bot _would_ post _Going live in 30 minutes with Ranked grind!_. Nothing is posted. 2. Add a real stream on the Schedule page, or check an existing one, and leave the flow on. The reminder posts in your real chat at the set time. ## Use your schedule elsewhere Under **Embed URLs**: - **JSON Embed URL** is your schedule as data, for a [custom widget](https://bloopbot.com/docs/custom-widgets) or overlay of your own. - **Twitch iCal URL** adds your schedule to Google Calendar, Apple Calendar or another calendar app — share it with viewers, too. ## Troubleshooting - The page shows the schedule but no **+ Add Segment**, and **Edit on Twitch** instead of **Twitch Dashboard**: Bloopbot cannot manage your schedule yet. Choose **Reauthorize now** in the notice at the top. - _No scheduled streams yet._: there is nothing on your Twitch schedule. Add a stream here or on Twitch. - Saving a stream fails: the start is less than 10 minutes away, the duration is outside 30–1440 minutes, or Twitch refused a one-off stream — tick **Recurring weekly**. The message under the form says which. - The reminder did not post: the flow is paused, that occurrence was cancelled or on vacation, the stream was added too close to its start, or the flow’s chat step failed — check **Flows → Needs attention** and the flow’s **Run log**. - It posted at the wrong time: check the stream’s time on Twitch and the trigger’s **When** and **Minutes**. Your real go-live time does not move it. --- # Announce your stream in Discord Connect a Discord server, send a safe test post, and use a flow to announce each new stream. Updated 7 October 2026 ## Before you start You need permission to add apps to the Discord server and a channel where Bloopbot may post. Bloopbot requests **View Channel**, **Send Messages** and **Embed Links**. A server can belong to one Twitch channel in Bloopbot; you can connect up to three servers to yours. Your announcement is a flow. You can change its message, pause it, or choose a different connected server and channel later. ## Connect a server 1. Open your channel in Bloopbot, choose **Connections**, then **Discord** in the list on the left. 2. Choose **Connect a Discord server**. 3. In Discord, choose the server, review the permissions and approve. Discord also lists access to your username, avatar and banner: Discord only tells Bloopbot which server you picked when it asks for that. Bloopbot doesn't keep or use it. 4. You return to the **Discord** card on **Connections**. Your server and its text and Announcement channels appear there. Check that your intended channel says **Ready to post**. ![The Discord card under Connections with a Connect a Discord server button before a server has been added](https://bloopbot.com/docs/screenshots/discord-connection.jpg) _Start on the Discord card under Connections and choose Connect a Discord server._ On the Free plan, once a server is connected the card also asks **Join ours too? Unlock Free+.** That is Bloopbot's own Discord, not yours. **Join the Discord** signs you in with Discord, adds you to the server and puts your channel on Free+, which adds web requests to your flows and room for five themes. **Not now** hides the question for 30 days. [Unlock Free+ by joining the Discord](https://bloopbot.com/docs/unlock-free-plus) explains Free+. If **#live-now** is the channel you want, make sure Bloopbot can view it, send messages and embed links there. Server permissions can be overridden for an individual channel. An Announcement channel only lets its staff post at first, so give the **BloopBot** role **Send Messages** in that channel's permissions. ## Set up the go-live flow 1. Open the **Marketplace**, find the **Discord** pack and install **Post when you go live**. The pack declares a channel variable for remembering the last announced stream and installs the flow paused. 2. Open the flow. In **Post to Discord**, choose your connected server and **#live-now**. Edit the message if you like, then save. Keep **Twitch channel link** in the message or button so people can reach the stream. 3. Return to the **Discord** card under **Connections** and choose **Send test post** beside that flow. Check the actual Discord channel for the message marked **TEST POST**. This sends a real Discord message, without a mention, and does not mark your current stream as announced. It does not simulate a Twitch go-live event. 4. Open the flow and choose **Enable**. If you are already live, the announcement waits for the next stream start. ![The Discord card under Connections showing the connected Stream community server and the saved Post when you go live flow with its Send test post button, and below them Join ours too? Unlock Free+. with Join the Discord and Not now](https://bloopbot.com/docs/screenshots/discord-go-live-ready.jpg) _A configured go-live flow can send a test post before you enable it._ ![The Discord card under Connections confirming that the labelled test post was sent while the go-live flow remains paused, with the Join ours too? Unlock Free+. invitation below](https://bloopbot.com/docs/screenshots/discord-test-posted.jpg) _After the test, Bloopbot confirms the post and leaves the flow ready to enable._ For example, the starter message posts **We are live!** and your Twitch channel link. At the next stream start, the flow checks the stream ID, posts once, then remembers that ID only after Discord confirms the post. The next new stream gets a fresh announcement. A failed post leaves the ID unchanged so a later run can try again. Overlapping runs or an uncertain network retry can still produce a duplicate; check the channel before retrying manually. The starter also offers a **Watch live** button. A current stream title and category appear in its embed when available; if they are not available, the link and generic message still work. It does not edit the Discord message if the title or category changes later. ## Change the post Edit **Post to Discord** in the flow to change the message, embed, button, destination, or mention. **No one** is the default mention choice. You may opt into **@everyone**, or choose **One role** and then pick it in **Role to mention**, which appears once **One role** is chosen. For @everyone, Bloopbot needs **Mention Everyone** in that channel; for a role, the role must be mentionable or Bloopbot must have that permission. Members' Discord notification settings still apply. A test post always suppresses mentions, even when the saved flow uses one. For an Announcement channel, **Also publish to followers** is an optional setting. Leave it off when you only want a post in your own channel. It is not available for an ordinary text channel. You can add **Post to Discord** to another flow, such as a flow triggered by a command or a Twitch event. Select a connected server and channel in that action. The Discord pack supplies the single go-live starter; you decide the trigger and checks for any other post. ## Check posting access The **Discord** card under **Connections** checks each connected server. **Ready to post** means Bloopbot currently has the requested posting permissions in that channel. A channel Bloopbot can't post in shows **Missing posting permission** on its own line, which is expected for staff-only channels. The server gets a warning when Bloopbot can't post in a channel one of your flows uses, can't post anywhere, loses access to the server, or a post fails. Open the flow's **Run log** for the failed step and its reason. Bloopbot makes a few attempts for a temporary Discord failure, for up to about two minutes; it does not keep posting indefinitely. After changing permissions, return to the **Discord** card and send another test post. A successful post clears the stored warning. ## Disconnect a server Choose **Disconnect server** under that server on the **Discord** card. Bloopbot leaves that Discord server and removes the connection from your Twitch channel. A flow aimed at it cannot post again until you reconnect it and choose a valid destination. ## Troubleshooting - **The server is connected to another Twitch channel:** disconnect it there before connecting it to this channel. - **You already have three servers:** disconnect one before adding another. - **A channel says Missing posting permission:** allow Bloopbot to view the channel, send messages and embed links in that channel, including any channel-specific overrides. - **The test post fails:** open the flow's **Run log**, check the warning on the **Discord** card, correct the destination or permissions, and send a new test post. A test post never sends a mention. - **The flow cannot be enabled:** select a connected server and channel in **Post to Discord** and make sure its channel variable was declared when the pack was installed. - **The connection does not finish:** try **Connect a Discord server** again. If it keeps failing, check that the server still allows you to add apps. --- # Announce your stream on social media Connect Bluesky, Mastodon, X, Threads, Instagram or a Facebook Page, test a post, and let the Socials pack announce each new stream once. Updated 14 November 2026 ## What you can do Bloopbot can post to your social accounts from a flow. The usual use is a go-live announcement: the moment your stream starts, a post goes out on each network you connected, with your stream's title, its category, a picture of the stream and a link to your channel. Anything a flow can trigger can post, so a milestone or a command can too. Each network has its own step in the **Integrations** group of the node library, because the networks differ in length, pictures and cost: | Step | Text limit | Picture | Link | | --- | --- | --- | --- | | **Post to Bluesky** | 300 characters | optional | link card when there is no picture | | **Post to Mastodon** | your server's limit, 500 on most | optional | Mastodon builds its own card | | **Post to X** | 280, counted the way X counts | optional | X builds its own card | | **Post to Threads** | 500 characters | optional | link card | | **Post to Instagram** | 2,200 characters | required | not clickable in a caption | | **Post to Facebook** | very long | optional | link card, or in the photo's caption | Only X costs money to post to: see [What posting to X costs](https://bloopbot.com/docs/announce-your-stream-on-social-media#x-costs). Every other network is free. If a network says **Coming soon** on **Connections**, connecting and posting to it are paused. Saved accounts stay connected, and existing post steps stay in your flows. Wait until the card offers **Connect** or **Reconnect** before trying it again; nothing is wrong with your flow. ![The Mastodon card on Connections marked Coming soon, with an explanation that posting is coming soon and no connect controls.](https://bloopbot.com/docs/screenshots/socials-coming-soon.jpg) _Coming soon means connecting and posting to this network are paused._ ## Before you start - **Only the channel owner connects accounts.** An editor can build and change the flows that post, but the connect and disconnect buttons are the owner's. - **You approve Bloopbot on the network's own page.** Bloopbot never sees or stores a password, and never asks for an app password. What it keeps is the sign-in token the network hands back. - **A post is public.** Everything Bloopbot posts is a normal public post from your own account, including the test post. - **Ten posts an hour.** Bloopbot sends at most 10 posts an hour to each network for your channel, so a flow that loops by mistake can't flood your account. More in [Limits and safety](https://bloopbot.com/docs/announce-your-stream-on-social-media#limits-and-safety). - **Add a backup sign-in email.** If a network stops accepting the connection, Bloopbot emails your confirmed [backup sign-in email](https://bloopbot.com/docs/backup-sign-in-email) once. Without one you find out from the card and the flow's **Run log**. ## Get help with your setup Optional **Help me** explains your existing announcement flow. Read its actual starting event: a going-live trigger can post automatically once enabled. Review recipients, mentions, image publication and service limits while paused. A connected account or inline preview does not prove delivery; **Test post** can send a real post and is not required to finish setup. ## Install the Socials pack The **Socials** pack is a ready-made go-live flow for each network, so you don't build the four steps yourself. Each flow, named **Post to Bluesky when you go live**, **Post to Mastodon when you go live** and so on, does this: 1. **Stream starts or ends**, set to **Live**: it starts when your stream goes online. 2. A check that this stream has not already been announced on that network. 3. The **Post to** step for the network. Its starter text is your stream's title, category and channel link, for example `Live now: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel`. It attaches your stream's live picture, and where the network offers one, a link card. 4. **Set a variable**, which remembers this stream so it is announced once. To turn one on: 1. Connect the account first: open **Settings** › **Connections**, choose the network in the list on the left, and follow its section below. 2. Open **Flows**, press **Marketplace**, and add the **Socials** pack (you can also find it in the [Marketplace](https://bloopbot.com/docs/the-marketplace)). It installs every flow **paused** and declares the variables they use, so nothing posts until you decide. 3. Open the flow for the network you connected, edit the post text if you like, and save. Keep your channel link in the text so people can reach the stream. 4. In the **Post to** step, press **Send test post** (see [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step)) and check the real post. 5. Enable the flow. If you are already live it waits for your next stream to start. ![The Socials pack's page after it is added, listing a paused go-live flow for each of Bluesky, Facebook, Instagram, Mastodon, Threads and X.](https://bloopbot.com/docs/screenshots/socials-pack-added.jpg) _The Socials pack after it is added: one paused go-live flow for each network._ You can install the pack before you connect anything. Enabling is what needs the account: enable a flow whose network isn't connected and Bloopbot says **Connect your Mastodon account on Connections before enabling this flow.** (with the network's own name) and leaves it paused. Pausing is never blocked. Turn on only the networks you use; a paused flow does nothing and costs nothing. **Once for each stream.** At the start of a stream the flow compares the stream's ID with the last one it announced on that network. If they differ it posts, and only after the network confirms the post does it remember the new ID. So a stream is announced once even if Twitch reports it going online again after a short disconnect, your next stream gets a fresh announcement, and a failed post leaves the ID as it was so the next go-live event can try again. Each network keeps its own memory in a channel text variable named `_announced_stream_id`, such as `bluesky_announced_stream_id`, so one network being down never stops the others. This is a best-effort guard. Two runs at the same instant, or a network that accepts a post but is slow to answer, can still produce a duplicate, so if a post reported a failure, look at the network before you retry by hand. If you delete a flow's variable, the flow can't be enabled until you declare it again on **Bot** › **Variables**, as a **text** variable for the **channel** with the name Bloopbot shows. Don't add a second go-live flow for a network that already has one from the pack: you would announce every stream twice. To announce something else, or to post from another flow, add the **Post to** step to that flow. ## The post step Every **Post to** step has the same fields, whatever the network. Add it after a trigger in any flow; for a go-live announcement start with **Stream starts or ends** and set **When the stream goes** to **Live**. 1. **Post text.** Write the post. Choose **Insert…** to add values such as `$(streamtitle)`, `$(streamcategory)` and `$(channelurl)`; they are filled in when the flow runs. Text over the network's limit is cut with … when it posts, never in the middle of a link or a character. 2. **Picture.** Choose **Live preview** (a screenshot of your stream on Twitch, or on Kick for a Kick channel; the default), **From Media** (a picture from your Media library), **Social image** (one of your published designs) or **None**. Instagram has no **None**, because it has no text-only posts. **Picture description** is read out to people using a screen reader. 3. **Show a link card**, on the networks that have one, adds a preview card for **Link** (your channel link by default). 4. Read the **Preview** at the bottom of the step. It shows who the post will go out as, your text with sample values, the count against the network's limit (for example **84 / 500**), and the picture. 5. Save the flow. A test post uses the saved step. ![The Post to Mastodon step's settings: the post text, the picture choice, and the preview showing the account it posts as, the text with sample values, a picture and the count out of 500, with a Send test post button.](https://bloopbot.com/docs/screenshots/socials-post-step.jpg) _The Post to Mastodon step and its preview: who it posts as, the text with sample values, the picture and the count against your server's limit. Every network's step looks like this._ **Your own design.** Choose **Social image**, then pick a published design. **Create design** and **Edit** open the [Social images editor](https://bloopbot.com/docs/social-images) in another tab. Its preview shows the actual converted picture with current stream details. Draft edits stay private until **Publish changes**; a preparing post keeps its starting published revision. If the whole design cannot render, the post stops and the connection warning and **Run log** explain it, even on a network that allows text-only posts. **The live preview and the profile picture.** Twitch makes your stream's live preview a few minutes after you go live, and Kick shows its own shortly after. A go-live post waits up to a minute and a half for it, then uses your profile picture if there still isn't one, and the flow's **Run log** says so. Only if that can't be fetched either does the post go out without a picture (or, on Instagram, fail). A test post doesn't wait: it uses the live preview if you are live, and your profile picture if you aren't. A Kick channel's live preview comes from Kick, and its profile picture is your Kick one. **Send a test post.** Under the preview, **Send test post** shows a box titled **Post publicly to** the network, with the exact post, its count, the rendered image for a Social image design and, on X, what it will cost. If the published design or its rendered inputs changed since the preview, it shows the new version and asks you to confirm again. **Post publicly** sends it for real, to your own account; **Cancel** sends nothing. A test post fills the stream title and category from your stream as it is right now, so when you are offline they come out blank, as in the picture below; the box says so, naming each value that is empty, and you can still post or cancel. Go live first, or trust the preview's sample values, if you want to see them. A test post is public, so delete it on the network afterwards if you don't want it to stay, and it counts toward the hourly limit. It never counts as a go-live announcement, so your next real stream still posts, and it never sends the reconnect email. The button is greyed out, with the reason beside it, until the flow is saved and the network is connected. ![The box titled Post publicly to Mastodon? with the exact post text, a picture and the count out of 500, a warning that Stream title and Stream category are empty because the channel is offline, and Cancel and Post publicly buttons.](https://bloopbot.com/docs/screenshots/socials-test-post.jpg) _The box a test post opens, shown for Mastodon while the channel is offline: the exact post with its title and category blank, its count against the limit, the warning that names the empty values, Cancel and Post publicly._ **What you should see.** After **Post publicly**, the step shows **View the post** with a link to it, and the post is on your profile. In a real run the flow's **Run log** says _Posted to_ the network, adds a note when the text was shortened or your profile picture stood in, and later steps can use the post's ID and link. ## Bluesky You need a Bluesky account. You approve Bloopbot on Bluesky's own page. 1. Open **Settings** › **Connections** and choose **Bluesky** in the list on the left. 2. Under **Bluesky handle**, type your handle, for example `name.bsky.social`, or your own domain if you use one. A leading `@` is fine. 3. Press **Connect Bluesky**. Bluesky opens and asks you to sign in and approve Bloopbot. The approval screen describes a general permission for your account; Bloopbot only uses it to create the posts your flows send and to upload their pictures. 4. Approve. You come back to the **Bluesky** card, which shows your handle and **Connected**. One Bluesky account can be connected to more than one of your channels; disconnecting it from one leaves the others connected. Add **Post to Bluesky** as in [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step). The starter text is `Live now: $(streamtitle) ($(streamcategory)) $(channelurl)`. For example, a stream titled "Celeste any% attempts" in the category "Celeste" posts: ``` Live now: Celeste any% attempts (Celeste) https://twitch.tv/yourname ``` with a screenshot of the stream under it. The link is clickable, and the picture's description is the stream title. A Bluesky post carries one attachment, so the step offers a choice. **With a picture**, the picture is the attachment and your link stays clickable in the text; if the text doesn't already contain the link, Bloopbot adds it on its own line and shortens your text to make room. **With Picture set to None and Show a link card on**, Bloopbot shows a preview card for **Link**, using the page's own title, description and image; if the page can't be read the card still appears with just the link. Bloopbot converts pictures to JPEG and shrinks them to fit Bluesky's size limit; a picture that can't be prepared leaves the post going out without it, and the **Run log** says so. The limit is 300 characters, an emoji counting as one. Links and `#hashtags` are clickable; an `@name` stays plain text and notifies no one. Only one picture goes with a post. ## Mastodon You need an account on a public Mastodon server, such as mastodon.social. Servers that work like Mastodon, such as GoToSocial or Pleroma, usually work too; a private or company-only server doesn't. Every post is **public**: there is no followers-only or unlisted option, content warning or poll. 1. Open **Settings** › **Connections** and choose **Mastodon**. 2. Under **Your Mastodon server**, type your server, `mastodon.social`, or your full address such as `@you@mastodon.social`. Bloopbot uses only the server part. 3. Press **Connect Mastodon**. Your server opens and asks you to approve **Bloopbot**. Check you are signed in as the account you want to post from, review the permissions and approve. 4. You come back to the **Mastodon** card, which shows your account, for example **@you@mastodon.social**, and **Connected**. The first time anyone connects on a server, Bloopbot introduces itself there, so that step takes a moment longer. You can start five connection attempts every ten minutes per channel. ![The Connections page with Mastodon selected, its server field and Connect button, and all six social networks in the list with their current availability.](https://bloopbot.com/docs/screenshots/socials-connections.jpg) _Connections lists every network with its status. The Mastodon card asks for your server before Connect Mastodon; the other networks' cards work the same way._ ![A connected Mastodon card showing the account name and connection date, your server filled in, and Reconnect Mastodon and Disconnect Mastodon buttons.](https://bloopbot.com/docs/screenshots/socials-mastodon-connected.jpg) _A connected card shows the account and its connection date, and offers Reconnect Mastodon and Disconnect Mastodon._ Add **Post to Mastodon** as in [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step). The starter text is `I am live: $(streamtitle) ($(streamcategory)) $(channelurl)`; for a stream playing Celeste it posts **I am live: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel** with your stream's picture, and Mastodon adds its own preview card for the link. - **Length.** Your server sets the limit; most allow 500, some more, and the step's preview uses your server's number once you are connected. Every link counts as 23 characters however long it is, and a mention of someone on another server counts as just their name. - **Pictures.** One picture, converted to a JPEG no larger than 1920 by 1080 pixels and 4 MB. If your server refuses it, the whole post fails and the **Run log** shows your server's own words; choose **None** for a server that doesn't take pictures. - **Editing and deleting.** Bloopbot posts. It doesn't edit or delete: do that on Mastodon. Mastodon access doesn't run out. If you or your server take it away, for example under **Preferences**, **Account**, **Authorized apps** on Mastodon, the card shows **Needs reconnecting**. ## X X is the one network that charges for posting, and Bloopbot passes the charge on to you, so read [What posting to X costs](https://bloopbot.com/docs/announce-your-stream-on-social-media#x-costs) before your first post. You need to be the channel's owner to connect X and to add X balance. 1. Open **Settings** › **Connections** and choose **X** in the list on the left. 2. Press **Connect X**. X asks whether Bloopbot may post for you: approve everything it lists. You come back to the card, which shows your account, for example **@yourname**. 3. Add X balance ([Add X balance](https://bloopbot.com/docs/announce-your-stream-on-social-media#x-topup)), or connect your own X developer app instead ([Use your own X developer app](https://bloopbot.com/docs/announce-your-stream-on-social-media#own-x-app)). Posting through Bloopbot's app needs a balance. 4. Add **Post to X** as in [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step). It starts as `Live now: $(streamtitle) ($(streamcategory)) $(channelurl)`. Under **Preview**, Bloopbot counts the post the way X does: a link counts as 23 characters however long it is, an emoji as 2, and the limit is 280. Text over the limit is cut with … when the step runs, and a link is never cut in half. X builds its own link card from a link in your text, so the step has no link card setting. On Bloopbot's app a picture goes up without its description, because X bills the description separately; through your own X app the **Picture description** is set. For example, `Live now: Speedrunning Celeste until the PB falls (Celeste) https://www.twitch.tv/yourchannel` with the live preview posts your title, your category and a link to your channel, with a picture of the stream, and costs $0.20 because it has a link. **What you should see:** the flow's run shows _Posted to X_, the post appears on your X profile, and the X card's balance drops by the cost of the post. A step that fails leaves a warning on the X card and a line in the flow's **Run log**. X refuses text it has already published from the same account as duplicate content, so keep `$(streamtitle)` in the text. ## Threads You need a Threads profile. Bloopbot posts as that profile. A post is text, and it can carry a picture or a link card for your channel page. 1. Open **Settings** › **Connections** and choose **Threads**. 2. Press **Connect Threads**. 3. On Threads, sign in if you are asked to, review what Bloopbot asks for (to read your profile name and to publish posts for you) and approve. 4. You come back to the **Threads** card, which shows your Threads username and the day you connected. Bloopbot keeps your connection fresh in the background, so you don't sign in again every couple of months. If Threads doesn't let you through, the card shows Threads' own explanation of why: read it, fix that, and press **Connect Threads** again. Add **Post to Threads** as in [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step). For example: ``` Live now: $(streamtitle) - playing $(streamcategory). Come hang out: $(channelurl) ``` - **500 characters.** Longer text is cut with … when it posts. - **Up to 5 links.** The link card counts as one unless the same link is already in your text. A post with more than 5 links is refused, with a message in the **Run log**. - **A picture replaces the link card.** A post with a picture shows the picture; the link card shows under text-only posts. - **250 posts every 24 hours** on your profile, set by Threads, on top of Bloopbot's 10 an hour. ## Instagram You need an Instagram **Business** or **Creator** account. Instagram only lets those account types publish from apps, so a personal account can't be connected: in the Instagram app switch to a professional account in **Settings**, then connect again. You don't need a Facebook Page. Every Instagram post is a picture with a caption; there are no text-only posts. 1. Open **Settings** › **Connections** and choose **Instagram**. 2. Press **Connect Instagram**. 3. On Instagram, sign in if you are asked to, review what Bloopbot asks for (to read your profile and publish posts) and approve. 4. You come back to the **Instagram** card, which shows your username. A personal account isn't connected, and the card tells you why. ![The Instagram card on Connections before it is connected, with its Connect Instagram button and a note that only Business and Creator accounts can post and that caption links are not clickable.](https://bloopbot.com/docs/screenshots/socials-instagram-card.jpg) _The Instagram card before it is connected: its note says only Business and Creator accounts can post from apps, and that links in a caption are not clickable._ Add **Post to Instagram** as in [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step). The **Post text** becomes the caption, and **Picture** is **Live preview**, **From Media** or **Social image**. For example: ``` Live now on Twitch: $(streamtitle) - playing $(streamcategory). Link in bio! ``` - **Links.** Instagram doesn't make a link in a caption clickable, so put your Twitch link in your Instagram bio and say "Link in bio", as the starter text does. That is why there is no link card. - **Pictures.** Bloopbot turns the picture into a JPEG and sizes it, so a PNG from your Media library works. Instagram only accepts pictures no wider than 1.91 to 1 and no taller than 4 to 5. The live preview fits; for your own picture, choose one in between, such as a square. Instagram takes a few seconds to process the picture, so a test post can take a moment. - **2,200 characters** in a caption, and up to 30 hashtags: longer text is cut with …, and hashtags past 30 lose their `#`. - **100 posts every 24 hours** through apps, set by Instagram, on top of Bloopbot's 10 an hour. ## Facebook Bloopbot posts to a Facebook **Page**, never to a personal profile, because Facebook doesn't let apps post to profiles. You need a Page you manage, with a role that lets you create posts (an admin, or an editor who can create content). One Page is connected at a time. A post is text, a link that shows a preview, and optionally a photo. 1. Open **Settings** › **Connections** and choose **Facebook**. 2. Press **Connect Facebook**. 3. On Facebook, sign in if you are asked to and review what Bloopbot asks for: to see your Pages and to publish posts to them. Choose the Pages you are allowing Bloopbot to use. 4. If you allowed more than one Page, Bloopbot asks **Which Facebook Page should Bloopbot post to?** Choose one and press **Connect this Page**. With a single Page it connects straight away. 5. You come back to the **Facebook** card, which shows the Page you chose. To post to a different Page later, press **Reconnect Facebook** and pick another. A Page connection doesn't need renewing. Add **Post to Facebook** as in [The post step](https://bloopbot.com/docs/announce-your-stream-on-social-media#post-step). For example: ``` Live now: $(streamtitle) - playing $(streamcategory). Come hang out: $(channelurl) ``` Leave **Show a link card** on to add a link preview under a text post. On a post with a picture Facebook has no card, so Bloopbot adds the link to the photo's caption. A test post is a real, public post on your Page: you can delete it from the Page in Facebook. ## What posting to X costs Posting to X costs money, and we pass that cost straight to you. X charges for every post an app makes on your behalf: $0.20 for a post with a link, $0.015 without. Add X balance in $5.99 top-ups, plus VAT or sales tax where it applies — $5.00 of each goes straight to X; the rest covers card fees and changes in X's pricing. You can connect your own X developer app instead, and X bills you directly. Your channel holds an **X balance** in money, shown under **Posting balance** on the X card. Below it, _About 23 posts with a link_ estimates what $4.60 covers, or _Add balance to post to X_ tells you what to do when nothing is left. Each post that X accepts takes its charge off the balance. A post that fails costs nothing, and a test post that goes out is charged like any other. The balance never expires. A post with a link is any post with an address in it, and a dotted word such as `twitch.tv/yourname` counts as one, so keep the text free of dotted words if the plain price matters. Bloopbot holds a post's charge just before it sends the post and takes it once X accepts the post, so two flows can never spend the same last cents. ![The X card separates posting through Bloopbot from using your own app. Posting balance, per-post prices and Add X balance are on the left; own-app setup is on the right.](https://bloopbot.com/docs/screenshots/socials-x-card.jpg) _The X card separates posting through Bloopbot from using your own app. Prices and top-ups sit beside your posting balance._ **Tax.** The top-up price is before tax. Where VAT or sales tax applies, Stripe adds it on top and shows it on its own line before you pay, and you can add a tax ID there. It never comes out of the $5.00 that goes to X. The card shows the two posting prices beside your balance. Open **How charging works** for the full explanation of top-up costs. **Use your own X app** sits alongside it on a wide card, and below it on a phone. ## Add X balance Only the channel's owner can add X balance. It is a one-off payment through Stripe's secure checkout page, and you need no subscription: a channel on Free can do it. 1. Open **Settings** › **Connections** and choose **X**. 2. Under **Pay in**, choose the currency you want to pay in, then press **Add X balance**. You go to Stripe's checkout page. 3. Check the price, shown in your currency: $5.99 in dollars, £4.79 in pounds, or 5.49 euros. Each top-up adds $5.00 to your balance whatever you pay in, and whatever the tax. 4. Pay. You come back to **Connections**, and the balance updates within a few seconds of Stripe confirming the payment. If Stripe refunds a top-up, the part of it you haven't spent comes off your balance, and the tax on it is refunded with it. Spending uses your oldest top-up first, so refunding an old top-up that is already spent takes nothing back from newer ones. Buying X balance may not be available on your channel yet, because it depends on posting through Bloopbot's X app being available. Until it is, the card says so, offers no **Add X balance**, and keeps any balance you already hold. ## When your balance runs low When a post takes your X balance below $1.00, Bloopbot sends one email, _Your X balance is running low_, to the channel owner's confirmed [backup sign-in email](https://bloopbot.com/docs/backup-sign-in-email). It says how much is left and links to the X card. You get one email each time the balance falls below $1.00: after you add X balance, the next time it runs low sends another. The X card says _We email you when your balance falls below $1.00._ when the email can reach you. Without a confirmed backup email it says _Add a backup sign-in email to get an email when your balance falls below $1.00._ instead; add one under **Account** to turn the email on. Bloopbot never charges your card by itself: X balance is only added when you press **Add X balance** and pay. ## Use your own X developer app On any plan you can post through your own X developer app instead of Bloopbot's. X then bills you directly for every post, so Bloopbot takes nothing off your X balance and the card shows _Posting through your own X app — X bills you directly._ Only the ten-posts-an-hour limit and X's own limits apply. You need an X developer account with an app on X's **Pay-per-use** plan and credit added to it in X's developer console. 1. Open [console.x.com](https://console.x.com/) signed in with the X account that owns your developer app, and create an app. Add credit to it under **Pay-per-use**. 2. In the app's **User authentication settings**, choose **Web App, Automated App or Bot**, give it **Read and write** permissions, and add the callback URI shown on Bloopbot's X card under **Use your own X developer app**. Copy it with the button beside it: it must match exactly. Bloopbot asks for these permissions: `tweet.read`, `tweet.write`, `users.read`, `offline.access` and `media.write`. 3. Open the app's **Keys and tokens** and copy the OAuth 2.0 **Client ID** and **Client Secret**. 4. On Bloopbot's **Connections** page, open the X card, then **Use your own X developer app**. Paste both and press **Save your X app**. 5. Press **Connect X**. X asks whether your app may post for you: approve everything. ![The Use your own X developer app section unfolded: three numbered steps, the callback address to copy (hidden in this picture), and Client ID and Client Secret fields above Save your X app.](https://bloopbot.com/docs/screenshots/socials-x-own-app.jpg) _Use your own X developer app: the steps, the callback address to copy into X, and the fields for your Client ID and Client Secret._ **What you should see:** the X card says _Posting through your own X app — X bills you directly._, shows your Client ID (never the secret) and your account. **Post to X** steps now post through your app, and their test-post box says nothing about a charge. Saving your app, or removing it, disconnects X, because a connection belongs to one app: connect again afterwards. Your X balance stays, and the card reminds you it is there if you switch back. To go back to Bloopbot's app, open **Change app**, press **Remove your X app** and confirm, then **Connect X**. If your plan ends and your channel returns to Free, posting through your own app stops, and the X card says why. Bloopbot doesn't switch you to its own app without asking: upgrade to keep posting through your app, or remove it and connect X again to post through Bloopbot's app with an X balance. ## Limits and safety - **10 posts an hour per network.** Bloopbot sends at most 10 posts an hour to each network for your channel, test posts included, whichever flows they come from. The eleventh fails that step with _Not posted: Bloopbot sends at most 10 posts an hour to Bluesky for your channel. The next one can go in about 12 minutes._ (with the network's name and the real wait); the step's error path runs, nothing is posted, and the card shows a warning. Look for a flow that posts more often than you meant. - **Once for each stream.** The pack's go-live flows announce a stream once per network. See [Install the Socials pack](https://bloopbot.com/docs/announce-your-stream-on-social-media#install-the-socials-pack). - **Public posts.** Every post, test posts included, is public and appears from your own account. Bloopbot doesn't edit or delete posts. - **Your account, your permissions.** You can remove Bloopbot's access at any time, from the network's own settings or with **Disconnect** on the card. **Disconnect** forgets the account on Bloopbot's side and, where the network allows it, tells the network to cancel Bloopbot's access; a flow that posts there then fails at that step until you connect again. - **Each network's own limits** apply as well, such as Threads' 250 posts every 24 hours and Instagram's 100. ## Troubleshooting - **The card says Needs reconnecting.** The network stopped accepting the connection, for example because you removed Bloopbot in its settings, changed your password or lost your role on the Page. Posts to that network are paused. Press **Reconnect** on the card (**Reconnect Bluesky**, **Reconnect X** and so on; a Mastodon server or Bluesky handle is already filled in) and approve again; your flows keep working without changes. If your go-live post was the one that first failed, Bloopbot sends one email, _needs reconnecting_, to your confirmed [backup sign-in email](https://bloopbot.com/docs/backup-sign-in-email), and no more until you reconnect. Without a backup email the card and the **Run log** are how you find out. - **A card says a post did not go through.** _The last post to_ the network _did not go through_ is followed by the network's own reason. It clears itself on the next successful post. The same line is in the flow's **Run log**. - **No X balance left — add balance on Connections.** The post was not sent and nothing was charged. Add X balance. If a channel has its own X app connected, this message doesn't apply. - **Posting to X is temporarily unavailable.** The problem is on Bloopbot's side, not yours. The post was not charged and there is nothing to fix on your channel. Try again later. - **Posting to X through Bloopbot's app is not available yet.** The card says this, and offers no **Add X balance**, when your channel can't yet post to X through Bloopbot's app. On a paid plan you can [use your own X app](https://bloopbot.com/docs/announce-your-stream-on-social-media#own-x-app) meanwhile. - **I paid and my balance did not change.** It updates when Stripe confirms the payment, usually within seconds. Reload **Connections**. Only the channel's owner sees the top-up buttons. - **I didn't get the running-low email.** It goes to the channel owner's confirmed backup sign-in email, once each time the balance falls below $1.00. Check that the X card says _We email you when your balance falls below $1.00._, and look in your spam folder. - **The balance line says about 0 posts with a link, but I have some balance.** A post with a link costs $0.20, so below that the balance still covers posts without a link. - **X says your own app is out of credit, or can't post.** _Your X app is out of credit — top it up in X's developer console_ means X refused because your developer account has no credit left; nothing was sent. _The connection needs the tweet.write permission_ means set your app's permissions to **Read and write** in X's console and press **Reconnect X** (pictures also need `media.write`). If X shows an error before it asks you to approve, or says the callback URL doesn't match, the callback URI in your X app must be exactly the one on the card, with `https://` and no trailing slash. If X didn't accept your Client ID and Client Secret, copy them again from **Keys and tokens** (the OAuth 2.0 ones, not the API key and secret) and save the app again. If the app isn't set up for posting, put it on **Pay-per-use** in a production environment in the developer console. - **The card says your plan no longer includes your own X app.** Upgrade to use it again, or remove your app and connect X through Bloopbot's app. - **X refused the post as duplicate content.** X doesn't let an account post the same text twice. Include something that changes, such as `$(streamtitle)`. - **Instagram connects nothing and mentions a Business or Creator account.** You connected a personal account. In the Instagram app switch to a professional account, then press **Connect Instagram** again. - **Instagram needs a picture.** The step's **Picture** is set to something that failed to load, or the Media picture was deleted. Choose **Live preview** or another picture. - **Facebook says you have no Page you can post to.** Only Pages where you can create posts are listed, and only those you allowed on Facebook's screen. A Page you only have an analyst role on isn't enough: ask a Page admin for a role that can create content, then press **Reconnect Facebook** and select the Page. - **Mastodon could not be connected.** The card says this, and adds why when your server told Bloopbot, for example _That server is not a public Mastodon server._ Check the spelling of the server, that it is open to the public and that it is a Mastodon-compatible server, then try again. If you started five attempts in ten minutes, wait a few minutes. If it fails after you approved, choose **Connect Mastodon** again and approve every permission; your server may have removed Bloopbot's app since the last time. - **Bluesky asks for a handle and says it can't start.** Type the full handle, such as `name.bsky.social`. A bare name or a web address won't work. If Bluesky opens but the connection doesn't finish, try **Connect Bluesky** again from the card in the same browser window, and stay signed in to Bloopbot while you approve: an attempt expires after ten minutes. - **The post has the wrong picture, or my profile picture.** The live preview only exists a few minutes after you go live. A go-live post waits up to a minute and a half, then uses your profile picture and says so in the **Run log**; a test post uses your profile picture straight away unless you are live. Choose **From Media** for a picture you control. - **The post is cut short.** It was over the network's limit. The preview shows the count; shorten the text. - **A post said the network could not be reached.** The network was slow or down. The next run tries again; use **Send test post** to check once it is back. If the network refused the post, the **Run log** carries its reason: shorten the text or use a different picture. - **Send test post is greyed out.** Save the flow first, and connect the network on **Connections**: the reason is written beside the button. - **My test post has an empty title, like "I am live: ()".** A test post uses your stream as it is right now, and an offline channel has no title or category yet. Go live and send the test again, or check the wording in the preview, which uses sample values. - **A test post went out and I didn't want it.** A test post is a real, public post. Delete it on the network. It isn't counted as your go-live announcement, so your next stream is still announced. - **A stream was announced twice.** Check that only one flow posts to that network when you go live, and that no second copy of the go-live flow is enabled. - **Nothing was posted at the start of a stream.** Open the flow's **Run log**. A run that stopped at the check means that stream had already been announced on that network; a run that stopped at the post shows the network's reason. Check that the flow is enabled and the account is connected. - **You can't find a network's card or step.** It may not be available on your channel yet. See [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes). --- # Make a branded image for your social posts Build a go-live image with your own text, pictures and colours, then let a flow fill in your stream details. Updated 14 November 2026 ## Before you start **Social images** are saved designs for the pictures your social posting flows send. Make one image, publish it, and use it in several flows. Your stream title, category, channel name and channel link can fill themselves in when a flow runs. - The channel owner and authorised editors can create and edit designs. A moderator cannot author them. - Use a computer for editing. On a phone you can preview designs and choose a published design in a flow. - Connect the social account before its flow posts. Creating, previewing, publishing a design and downloading its PNG do not send a public post. - Add a social posting flow first if you want Pebble to walk you through it. Find **Your first social image** on **Tutorials**; it is offered after first run when you visit the library and your channel has a social posting flow. ## Get help with your setup Optional **Help me** reuses the design you select. Preview the same draft with sample values, then choose **Publish changes** when ready. Publishing makes that design available to flows; it does not publish a social post. Unpublished edits do not replace the design an existing flow uses. ## Create your first design Open **Social images** in the sidebar, or choose **Social image** under **Picture** in a social flow and press **Create design**. The flow link opens the library in another tab so your unsaved flow stays open. 1. Press **New social image**. 2. Choose a starter: **Bold announcement**, **Gameplay showcase**, **Clean minimal** or **Cosy illustrated**. Each has editable text, pictures and shapes. Choose **Blank canvas** to begin with only a background. 3. Enter a **Design name** you will recognise in the flow picker, such as Friday adventure. 4. Choose **Landscape** for a 1600 × 900 image or **Square** for 1080 × 1080 under **Canvas size**. 5. Press **Create design**. Select a layer on the canvas or in **Layers**, then change its words or appearance in the dock below the canvas. **What you should see:** the rendered picture above the layer list and properties, with the draft status beside the design name. The draft saves automatically. It is available for posting only after **Publish changes**. ![The Social images creation form with Design name, Landscape canvas size and five real starter previews: Blank canvas, selected Bold announcement, Gameplay showcase, Clean minimal and Cosy illustrated, above Create design.](https://bloopbot.com/docs/screenshots/social-image-library.jpg) _Choose an editable starter, give it a name and choose Landscape or Square before creating the draft._ ## Fill in stream details automatically A linked badge on a selected layer and its source chip in the dock open the same source chooser. The chooser offers sources suited to that layer. | Layer | Sources | | --- | --- | | Text | Static text, stream title, category, channel name or channel URL | | Picture | A fixed picture from Media, channel avatar, category artwork or Twitch live preview | 1. Select the text or picture you want to change. 2. Press its linked badge or source chip and choose the source. 3. For automatic text, set fallback words for an empty value. Without fallback words the empty text can hide. 4. For automatic pictures, choose a fixed fallback from **Media** if you want one. A missing **Twitch live preview** uses your chosen fallback first, then Bloopbot’s fun Pebble farm gameplay background. Press **Use Bloopbot preview background** to clear your chosen fallback. Other automatic pictures leave the design background showing when neither their source nor their fallback is available. For example, use **Stream title** for the large heading and A new adventure starts here as its fallback. Add **Category** below it and a fixed logo from Media beside it. The same design then works for another game without retyping the title. ![Gameplay showcase using Bloopbot’s Pebble farm background for a missing Twitch stream picture, with the live-preview layer and fallback controls selected.](https://bloopbot.com/docs/screenshots/social-image-stream-fallback.jpg) _When Twitch has no preview yet, the Gameplay showcase uses Bloopbot’s fun Pebble farm background. Choose a fallback from Media to use your own picture instead._ ## Arrange and style your image Drag a selected layer to move it, drag its handles to resize it, and use its rotation handle or rotation value to turn it. The properties show position and size for precise adjustments. Snapping helps line layers up. - Use **Layers** to select, reorder, hide, lock or duplicate a layer. A locked layer keeps its position while you work on the others. - Add text, a picture or a shape from the canvas toolbar. Select several layers to line them up, group them or move them together; [Line layers up](https://bloopbot.com/docs/social-images#arrange) covers the tools. - Text has a curated font choice, size, weight, italic style, colour and alignment. A fixed text box wraps and shrinks toward its minimum size; text that still does not fit ends with an ellipsis. - For a picture, choose cover or contain and use **Crop picture** to keep the part of its source you want. - **Undo** and **Redo** let you correct recent edits. Keyboard arrows move selected layers; Delete removes them, and the toolbar offers the same actions. Press **Keyboard shortcuts** to see every key, including the ones in the sections below. The editor creates still images. Animation, video and uploaded fonts are not part of Social images. Change **Design name** in the editor, or use **Rename** on its library card, to update the name shown in the library and flow picker. Renaming saves immediately and does not need **Publish changes**; publishing controls the picture’s text, images and layout. ## Line layers up Select two or more layers and the properties panel shows the Arrange tools. Hold Shift and click to add layers, press Ctrl/⌘ A or the **Select all layers** button for everything, or click a group's row in **Layers**. A group counts as one item, and a locked layer keeps its position. 1. Select the layers you want to line up. 2. Under **Align to**, choose **Selection** to line layers up with each other, or **Canvas** to line them up with the picture's edges. 3. To line everything up with one layer, Option-click (Alt-click) that selected layer. It becomes the _key layer_, shown as **Key layer:** and its name, and stays where it is. Press **Clear key layer** to go back to **Align to**. 4. Press an align button, such as **Align left edges**, **Align horizontal centres** or **Align bottom edges**. There are six, for the left, centre and right, then the top, middle and bottom. 5. With three or more items, use the **Distribute** buttons to spread them out evenly by their edges or centres, or **Make horizontal gaps equal** or **Make vertical gaps equal** to give them the same space between them. 6. To set the space yourself, type a number in **Gap px**, then press the spacing button, now named **Space horizontally by** or **Space vertically by** that many pixels. Two items are enough. Clear the box to go back to equal gaps. 7. Press **Match width** or **Match height** to make the layers the same width or height as the key layer, or as the largest layer when you have not chosen a key layer. **What you should see:** the layers move at once on the canvas, and **Undo** puts them back in one step. While you drag a layer, it snaps to the canvas, to the edges and centres of other layers, and to gaps that match one you already have. Pink labels with a pixel number show those matching gaps. Press **Snap to canvas and layers** to turn snapping off, or hold Alt while you drag to move freely for that drag. ![The Social image editor with three shapes selected, the Arrange tools open and pink gap markers showing while one shape is dragged.](https://bloopbot.com/docs/screenshots/social-image-arrange.jpg) _Three shapes are selected with the Arrange tools beside them. While one is dragged, pink labels show it is the same distance from its neighbour as the two fixed shapes are from each other._ ## Put a picture inside a shape or text A clipping mask shows a layer only inside the layer below it. Put a photo inside a star, or let a picture show through the letters of a title. 1. Add the shape or text and place it where you want the picture to appear. 2. Add the picture and make sure it sits directly above that shape or text in **Layers**. Move it with **Move layer forward** and **Move layer backward** if not. 3. With the picture selected, tick **Clip to layer below** in the properties. You can also press the clip button on its row in **Layers**, press ⌥⌘G (Ctrl Alt G on Windows), or Alt-click the line between the two rows. 4. Move or resize either layer to choose which part of the picture shows. **What you should see:** the picture is cut to the outline of the layer below, and its row in **Layers** is indented with a clip mark. Several layers can clip to the same one. To release the mask, untick **Clip to layer below** or press the clip button again. Hiding the shape or text below hides the clipped pictures with it. The lowest layer cannot be clipped, because there is nothing under it. ![A photo clipped into a star in the Social image editor, with the clipped Photo row indented in Layers.](https://bloopbot.com/docs/screenshots/social-image-clipping.jpg) _A photo clipped into a star. Its row in Layers is indented under the star and carries the clip mark._ ## Add and change shapes 1. Press **Add shape** on the canvas toolbar. 2. Type in **Search shapes**, or look through the groups: **Basic**, **Stars and badges**, **Arrows and lines**, **Callouts** and **Frames**. There are 23 shapes in all. 3. Choose one. It lands in the middle of the canvas as a new layer. 4. To change a shape later, select it and press the button beside **Shape** in the properties, which shows its current name. Choosing another keeps its colours, size and effects. Some shapes have their own settings in the properties: - **Polygon**: **Sides**, from 3 to 12. - **Star** and **Burst**: **Points** and **Depth %**, which sets how deep the notches cut in. - **Roundness %**: softens every corner of shapes such as the triangle, diamond, star and arrows. - **Line**: **Start** and **End** line ends, each **None**, **Arrow**, **Triangle**, **Circle** or **Bar**. A line is drawn with its **Outline colour** and **Outline width**. - **Outline width**: adds an edge to any shape, in its **Outline colour**. A **Rectangle** has **Corners** instead of roundness, and so does every picture. Set one **Corner radius** for all four corners. Press **Round each corner separately** to enter **Top left radius**, **Top right radius**, **Bottom right radius** and **Bottom left radius**, and **Link all corners** to go back to one. ![The Add shape popover listing 23 shapes in groups, with a Search shapes box.](https://bloopbot.com/docs/screenshots/social-image-shape-picker.jpg) _Add shape lists the shapes in groups, with a search box above them._ ## Pick colours Every colour in the editor opens the same colour picker: the **Colour** of text, the **Fill colour** and **Outline colour** of a shape, the **Background colour**, and the colours of effects. 1. Select a layer, or select nothing for the background, and press the colour button. 2. Under **Theme**, press **Theme Accent**, **Theme Panel** or **Theme Text** to use a colour from your overlay theme. These swatches stay linked: when you restyle that theme in Studio, every social image that uses them changes, including for later posts. A linked colour shows **Theme accent**, **Theme panel** or **Theme text** beside a link icon. Press **Unlink** to keep today's colour for good. 3. Under **In this design**, pick a colour another layer already uses. 4. Under **Palettes**, pick from ten ready-made sets, such as **Bloop**, **Neon arcade**, **Sunset** and **High contrast**. 5. Or type a hex value such as `#467BFF` in the hex box and press Enter, or use the colour square to pick one by eye. The design follows your **Active theme** unless you choose another in **Theme**, which you reach by selecting nothing. To dress a whole design at once with nothing selected, press **Use theme colours**, which links the background, shape fills and text to your theme, or press **Apply** beside a palette to give the background, shapes and text its colours. Both leave locked layers and pictures alone and replace any gradient, and **Undo** reverses them. ![The colour picker with linked theme swatches, colours in this design, preset palettes and a hex box.](https://bloopbot.com/docs/screenshots/social-image-colour-picker.jpg) _The colour picker lists linked theme swatches, colours already in this design and ten preset palettes, with a hex box at the bottom._ ## Blend colours with a gradient Under **Fill colour** or **Colour**, choose **Linear** or **Radial** instead of **Solid**. 1. Each **Stop** has its own colour and a **Position %** along the gradient. Change them to move the blend. 2. Press **Add stop** for up to five, or the trash button beside a stop to remove it. Two stops is the least. 3. For **Linear**, set **Angle°**: 0 runs left to right and 90 runs top to bottom. A gradient fills a shape's fill, or the letters of a text layer. It does not colour a shape's outline, which stays a single colour, and a line has no gradient. ## Add a shadow, glow or outline Open **Effects** in the properties and tick what you want. - **Drop shadow**: **Shadow colour**, **Shadow opacity %**, **Shadow angle°**, **Shadow distance**, **Shadow blur** and **Shadow spread**. - **Outer glow**: **Glow colour**, **Glow opacity %**, **Glow blur** and **Glow spread**. - **Outline**: **Outline colour** and **Outline width** draw an edge around the layer, on text and pictures too. Untick an effect to remove it. ![The Social image editor with a title selected and Effects showing a drop shadow with its settings.](https://bloopbot.com/docs/screenshots/social-image-effects.jpg) _A drop shadow under a title, with its colour, opacity, angle, distance, blur and spread in Effects._ ## Group layers and flip them Select two or more layers and press ⌘G (Ctrl G on Windows) or **Group** to treat them as one item. A group becomes a folder in **Layers**. Press ⇧⌘G or **Ungroup** to take it apart. - Select a group's row to move, flip or align the whole group. Type in **Group name** to rename it. - Press the arrow beside a folder to collapse or expand it. Its eye and lock buttons hide or lock every layer inside. - Drag a layer onto a folder row to move it in. Press **Move out of group** to take the selected layer out. - Press ⇧H or **Flip horizontally** to mirror the selection left to right, and ⇧V or **Flip vertically** to turn it upside down. Several layers flip as one, so their places swap too. ## Preview and publish 1. Use **Sample** while arranging the design. Sample fills automatic pictures with example pictures: a square avatar, tall category artwork and a gameplay scene for the live preview. 2. Press **Current stream** to preview your channel’s current details. Missing values use the fallbacks you set. If Twitch has no picture for a layer, such as category artwork when no category is set, a note under the canvas names the layer so you can choose a fallback. 3. Try **Long title** to see how the text boxes cope with a crowded title. 4. Wait for **Draft saved**, then press **Publish changes** when the picture is ready. **What you should see:** a published revision is reported, and the design appears in your social flow’s picker. Later changes to its text, pictures or layout are an autosaved draft until you publish again. A post that is already preparing keeps the revision and stream details it started with, even if you publish changes meanwhile. If another tab changes the same draft, the editor shows a conflict rather than overwriting it. **Load saved draft** reads that version; **Keep my edits** lets you review and save your own changes. Use **Retry save** for a failed save and **Retry preview** for a failed render. ![The Friday adventure Social image editor with its Stream title layer selected, Friday adventure starts here as fallback text, Current stream preview, Layers and text properties, and Publish changes.](https://bloopbot.com/docs/screenshots/social-image-editor.jpg) _The title follows Stream title, with your own fallback words. Current stream shows the rendered picture before you publish._ ## Use the design in a flow Open a flow with a **Post to** step, such as one from the **Socials** pack. [Announce your stream on social media](https://bloopbot.com/docs/announce-your-stream-on-social-media) covers accounts and go-live behaviour. 1. Select the **Post to** step. 2. Set **Picture** to **Social image**. 3. Choose the published design. The picker shows only designs from this channel; an unpublished draft is not a choice. 4. Check the actual image in **Preview**. It uses the published design and current stream details, converted for that destination. 5. Press **Save** in the flow. **Edit** beside the picker opens the selected design in another tab. Return to the flow after publishing; its choices and image preview refresh when the tab regains focus. You can also refresh the image with its refresh control. **Send test post** shows the actual converted image before asking to post publicly. If its published revision or rendered inputs changed, it shows the new preview and asks again. **Cancel** sends nothing. A whole-design render failure stops the social action, even if that network permits text-only posts, and appears in the connection warning and flow’s **Run log**. ![The Mastodon step with Picture set to Social image, Friday adventure selected and its actual published image preview with revision 2, while the account is not connected.](https://bloopbot.com/docs/screenshots/social-image-flow.jpg) _Friday adventure is selected in a Mastodon step, with its published revision rendered below. Connect the account before sending a public post._ ![The published Friday adventure design on a phone with a Sample image preview, Current stream and Long title choices, Original canvas destination and Use in a flow, plus a note to author on desktop.](https://bloopbot.com/docs/screenshots/social-image-phone.jpg) _On a phone, preview a published design and use the flow link to choose it in a social step. Create and edit the design on a desktop._ ## Download or make another size **Download PNG** exports the rendered image at its native Landscape or Square size. Choose the preview content you want before downloading. A destination may resize or re-encode the picture when posting; the flow preview shows that version. Use **Duplicate to square** or **Duplicate to landscape** to create another design. Rearrange its layers for the new canvas yourself, then publish that version separately. Duplicating keeps the original design in place. ## Check usages and remove unused designs The library and editor show which flows and groups use a design. A design referenced by a saved flow or group cannot be deleted, including retained selections in paused flows or the Trash. Switching **Picture** away from **Social image** remembers its selection. 1. Open each flow or group listed in the design’s usages and select its social post step. 2. Set **Picture** to **Social image**, then clear its picker by choosing **Choose a published design**. 3. Switch **Picture** to the source you want instead, then press **Save**. 4. For a flow marked **in Trash**, open **Flows → Trash** and **Restore** it first. Restored flows stay paused; clear and save the reference as above. If you no longer want that flow, **Delete forever** in the Trash releases its references instead, after confirmation. 5. Return to **Social images** and delete the unused design. Restoring an older flow version also checks that its Social images are still published and available in this channel. If a design was removed, choose another picture in the current flow instead. Media pictures used by a draft or a retained published design revision cannot be deleted either. Check their usages in **Media**. Discarding a draft does not remove the pictures needed by earlier published revisions. Social images stay in their own channel. Flow export and sharing refuse a selected design; choose another picture source before sharing, then choose a published design on the receiving channel. An AI assistant can select a published design through the existing flow tools, but design creation, editing and publishing remain in this editor. --- # Make your public page your one link Set up a free link-in-bio page for your Twitch channel with your live status, links, schedule, clips, giveaways, store, quote book and a chat commands list for viewers, switch each page on or off, and add your own sections and page fonts. Updated 12 November 2026 ## The short answer Every Bloopbot channel has a free public page at `bloopbot.com/c/` that works as the one link in your Twitch bio, like a Linktree that also knows when you are live. It shows your live status with a **Watch on Twitch** button, up to 25 links of your own as big buttons, and a tab each for your chat commands, giveaways, store and quote book. The **Commands** tab is a list of your chat commands for viewers, grouped by who can use them. It builds itself from your flows, so there is no list to keep up to date. Links, sections, page fonts and the page switches are part of every plan. To set it up: 1. Open **Public page** in the sidebar, under **Channel**. 2. Open **Links** and click **Add link**. Give each link a **Title** and an **Address**, then click **Save**. 3. Open **Pages** and switch off any tab you do not want. Under **Commands**, tick the groups of commands viewers should see. Click **Save**. 4. Copy your page's address from the top of **Public page** with the copy icon (**Copy the page link**) and paste it into your Twitch bio, your panels and your other profiles. 5. To point chat at your commands list, add the **Commands link** flow from the **Starter** pack. When someone types `!commands`, the bot replies with the page's address. The rest of this guide covers each part of the page: sections, fonts, your schedule and clips, your gear, what viewers see and using your own domain. ## What you can do Every channel has a public page at `bloopbot.com/c/`. It shows your full Twitch bio, whether you're live with a **Watch on Twitch** button (on a Kick channel: your Kick bio and banner, your stream's title, category and viewer count while you're live, and **Watch on Kick**), your open giveaways, your store, your quote book, your chat commands and each viewer's prizes. Each of those is a tab on your page's header, and you can switch any of them off. > **Pebble can set it up with you** > > Pebble’s **Share your public page** tutorial turns the page on, opens your page and your commands list, and copies the one link for your Twitch bio. Start it from [Tutorials](https://bloopbot.com/docs/tutorials). You can also add your own links: YouTube, Discord, TikTok, merch, a tip page or anything else. They sit right under your live status as big buttons, so the page works as the one link in your Twitch bio, your panels and your other profiles, like a Linktree that also knows when you're live. You can add your schedule, recent broadcasts, top clips, YouTube uploads, an About section, a Work with me section for brands, and your gear. You choose which sections show, their order and the fonts viewers see across the page. ## Before you start - Links, sections and page fonts are part of every plan. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows what your channel has. - Schedule, broadcasts and clips come from Twitch; set up your Twitch schedule if you want it to appear here. - For page fonts, browse [Google Fonts](https://fonts.google.com/) for family names you want to use. - Your bio comes from Twitch. To change it, edit it in your Twitch profile settings; the page shows the new one within a few minutes. ## Get help with your setup Choose **Help me** for an explanation of the same page and its switches. **Save** can change an already-visible page immediately: there is no separate unpublished page draft. Review your words, links and visibility before saving. Commands and custom domains are optional. ![Optional Public page help explains that saving permitted page content can update the live page immediately](https://bloopbot.com/docs/screenshots/onboarding-growth-help.jpg) _Public-page help explains that Save can affect the live page immediately and keeps the same page settings._ ## Find your way around Open **Public page** in the sidebar, under **Channel**. Your page's address sits at the top, with a copy icon (**Copy the page link**). Below it, a menu on the left opens one part of your page at a time: - **Pages**: which tabs your page has. - **Links**: your own buttons under your live status. - **Home sections**: what Home shows, in what order, and what each section says. - **Look**: the fonts across your pages. - **Domain**: your own domain, on Pro. Each item in the menu says how it stands, such as _5 of 6 on_ or _3 links_. A blue dot means that part has changes you haven't saved. Your changes stay while you move between parts, and each part saves with its own **Save** button at the bottom. **Discard** puts back what you last saved. On a phone, the menu is a row you can swipe along the top. ## Switch pages on or off Your page has six tabs: **Home**, **Giveaways**, **Store**, **Quotes**, **Commands** and **Your prizes**. To take one off your page: 1. Open **Public page**, then **Pages**. 2. Click the switch beside the page, so it says **Off**. The **Tabs viewers see** strip above the list shows your page without it. 3. Click **Save**. A page you switch off loses its tab, and anyone who opens its address sees _This page is off_, with a button back to your Home, or to your Twitch channel when Home is off too. Switch it on again whenever you like; nothing on it is lost. - **Home** off leaves your other tabs; viewers who open your main address see the note instead. - **Giveaways** off also hides the Giveaways section on Home. A giveaway's own page still opens from its link, so viewers can still enter and donate from a link you share. - **Store** off also hides the Store section on Home, and viewers can't buy from the page. Anything your flows let viewers buy in chat still works. - **Quotes** shows your [quote book](https://bloopbot.com/docs/quotes#public). Its tab appears once you have at least one quote. - **Commands** lists your chat commands by who can use them. Its tab appears once it has a command to list; see [show your chat commands](https://bloopbot.com/docs/public-page#commands). - **Your prizes** always stays on, so winners can claim what they won. Page switches are part of every plan. ## Show your chat commands The **Commands** page lists the chat commands your viewers can type, grouped by who can use them: **Everyone**, **Subscribers**, **VIPs**, **Moderators**, **Broadcaster** and **Special roles**. Signed-out visitors see the public groups up to **VIPs**. After signing in with Twitch, viewers also see their level in your channel; moderators see **Moderators** commands, and you see both **Moderators** and **Broadcaster** commands. It builds itself from your flows, so a command you add, change or switch off shows up there within a minute. A command's group comes from the **Who can trigger** step after its **Chat command** trigger. A command with no **Who can trigger** step is for **Everyone**; one set to **Moderators and up** goes under **Moderators**. A command that only a **Has a role** step lets through, such as one for your Regulars, goes under **Special roles**. [Add permissions and cooldowns](https://bloopbot.com/docs/permissions-and-cooldowns) shows how to set who can use a command. To choose which groups viewers see: 1. Open **Public page**, then **Pages**. 2. Under **Commands**, tick the groups to list. Each shows how many of your commands it has. At first, **Everyone**, **Subscribers** and **VIPs** are ticked. Moderator and broadcaster commands appear automatically for signed-in people at those levels, so they have no tick box. **Special roles**, when ticked, is listed for signed-in viewers; each command still checks its required role in chat. 3. Click **Save**. ![The Commands row on Public page → Pages: Everyone 4, Subscribers 1 and VIPs 1 ticked, Special roles 1 unticked; moderator 3 and broadcaster 1 commands show automatically to signed-in people at those levels.](https://bloopbot.com/docs/screenshots/public-page-command-levels.jpg) _The Commands row on Pages, with the public groups ticked, their command counts, and the note about staff commands after sign-in._ Viewers see the public groups you ticked, with every command's other names beside it. To see staff commands, open the Commands page and click **Sign in with Twitch** in its header. Twitch returns you to the same page, which shows **Your level in this channel** and adds the staff groups you can use. For example, a moderator sees **Moderators**, while **Broadcaster** stays hidden. If the level cannot be checked, the page shows public commands and asks the viewer to reload; check they signed in to the right Twitch account. When a command's flow has a [description](https://bloopbot.com/docs/flow-basics#describe), it shows under the command: ![A channel's Commands page after sign-in: Your level in this channel is Moderator, then Everyone with !commands, !discord, !hello (also !hi) and !lurk, Subscribers with !hype, VIPs with !pick, and Moderators with !giveaway open/start, !so (also !shoutout) and !title, each group saying who can use its commands.](https://bloopbot.com/docs/screenshots/public-commands-page.jpg) _The Commands page after a moderator signs in: their level, then Everyone, Subscribers, VIPs and Moderators with their commands, such as !hello (also !hi) and !giveaway open/start._ To point chat at the page, add the **Commands link** flow from the **Starter** pack: when someone types `!commands`, the bot replies with the page's address. In any chat message, `$(commandsurl)` is that address. It follows your own domain when you have one. See [point viewers at your Commands page](https://bloopbot.com/docs/first-command#commands-link). Switch the whole page off under **Pages** if you'd rather not list your commands. The page is part of every plan. ## Add your links 1. Open **Public page**, then **Links**. 2. Click **Add link**. 3. Give it a **Title**, such as `YouTube: speedrun VODs`, and an **Address**, such as `youtube.com/@you`. You can leave off `https://`; it is added for you. 4. Add as many as you like, up to 25. 5. Click **Save**. ![The Public page editor on Links: the menu on the left, and five links — YouTube: speedrun VODs, Join the Discord, Clips on X, Merch store and a hidden Hat giveaway rules — each with Title and Address fields and move, hide and remove icons, then Add link and the save bar.](https://bloopbot.com/docs/screenshots/public-page-links-editor.jpg) _The Public page editor with five links, one of them (Hat giveaway rules) hidden._ Each link shows the site's own icon, the small picture a browser shows in its tab, such as YouTube's red play button. Bloopbot fetches it from the site a few seconds after you save; reload your page to see it. A site that has no icon Bloopbot can use keeps a simple one picked from its address: video for YouTube, Twitch and Kick, chat for Discord, social for X, Instagram, TikTok, Bluesky, Threads and Facebook, a bag for shops like Fourthwall, Etsy, Ko-fi and Patreon, and a plain link for anything else. ## Order and hide links - Use the up and down arrow icons (**Move up**, **Move down**) to move a link. The page shows them in this order. - The eye icon (**Hide**) keeps a link but takes it off your page, for example a giveaway link between events. Its crossed-out eye becomes **Show** and puts the link back. - The bin icon (**Remove**) deletes it when you save. Nothing changes on your page until you click **Save**. ## Choose your sections **Home sections** on **Public page** lists every part of Home below your live status, in the order viewers see them. 1. Open **Public page**, then **Home sections**. 2. Turn on the switch beside each section you want viewers to see. A section that needs your words, like **About**, opens so you can fill it in. 3. Drag a section into place by its handle, or use its up and down arrow icons. 4. Click a section's name to open or close it: **About**, **Work with me**, **Latest on YouTube** and **Gear** hold their own text there. 5. Click **Save**. ![The Sections list on the Public page: every section with a Show checkbox, About moved up above Schedule, Latest on YouTube, Work with me and Gear switched on, and the Twitch sections noting they hide themselves when Twitch has nothing to show.](https://bloopbot.com/docs/screenshots/public-page-sections-editor.jpg) _The Sections list with About above Schedule, and YouTube, Work with me and Gear switched on._ Your live status and any prize waiting for a signed-in viewer stay at the top. ## Choose page fonts 1. Open **Public page**, then **Look**. 2. Enter a Google Fonts family name in **Heading font** and another in **Body text font**, or pick one of the suggestions. For example, use `Playfair Display` for headings and `Open Sans` for paragraphs. The sample below the fields shows both as you type, and says so if Google Fonts has no family by that name. 3. Click **Save**, then open your public page to see both fonts. ![The Public page's Page fonts panel with Playfair Display chosen for every heading and Open Sans for body text, plus a link to browse Google Fonts.](https://bloopbot.com/docs/screenshots/public-page-fonts-editor.jpg) _Choose one Google Font for every heading and another for body text across your public page._ Each choice applies to your channel header and every public page: Home, Giveaways, Store, Quotes, Your prizes and prize pool donation pages. It also applies to sections you add later. Leave either field blank to use the usual font for that text. Fonts and sections are saved together, so **Save** on either **Look** or **Home sections** keeps changes in both; the save bar says so when the other one has changes waiting. Your choices stay saved if your plan changes, and show again when your plan includes page sections. If a font cannot load, the usual font appears instead. ## Schedule, broadcasts and clips These three sections read from your Twitch channel, with nothing to fill in on this page: - **Schedule** shows your upcoming streams for the next 7 days and a note during a scheduled break. Times are shown in UTC. - **Recent broadcasts** shows up to six saved past broadcasts, with their length. - **Top clips** shows up to six of your most viewed clips from the last 30 days. A section hides itself when Twitch has nothing to show. Twitch changes can take about 10 minutes to reach your page. A Kick channel has no Twitch schedule, broadcasts or clips, so **Home sections** doesn't list these three there, and your page never shows them. ![The channel home's About section with two paragraphs and a link, then Schedule with three streams this week in UTC, then Recent broadcasts and Top clips as thumbnail cards with lengths and view counts.](https://bloopbot.com/docs/screenshots/public-page-home-sections.jpg) _About, this week's schedule in UTC, recent broadcasts and top clips on the channel home._ ## About and Work with me Open **About** on **Home sections** to introduce yourself and your stream. **Work with me** tells brands and sponsors how you collaborate. You can add a contact button there by choosing **Email address** or **Web address** and filling in the field beside it. Choose **No contact button** to remove it. Each text field holds up to 2,000 characters. Leave a blank line between paragraphs. An address starting with `https://` becomes a link; other formatting appears as plain text. ## Your YouTube uploads 1. On **Home sections**, turn on **Latest on YouTube**; it opens. 2. Enter your channel address, such as `youtube.com/@you`, or your `@handle`, and click **Save**. Bloopbot finds the channel when you save and shows up to six recent uploads. New uploads can take about 30 minutes to appear. ## Your gear 1. On **Home sections**, turn on **Gear**; it opens. 2. Click **Add item**, then enter a **Group**, such as `Audio`, an **Item**, such as `Shure MV7`, and an optional **Link**. 3. Add up to 50 items. Items in the same group appear together. 4. Click **Save**. Your gear and your sections save together. ![The channel home's Latest on YouTube uploads as thumbnail cards, the Work with me section with an Email button, and the Gear list grouped into Camera, Audio and Desk.](https://bloopbot.com/docs/screenshots/public-page-home-sections-more.jpg) _YouTube uploads, a Work with me contact button and gear grouped by type on the channel home._ ## What viewers see Open your page with the address at the top of **Public page**, or click the copy icon (**Copy the page link**) and paste it into your Twitch bio, panels or a chat command. ![The channel home's header and stream panel, offline, above four link buttons — YouTube, Discord and X each with its site's own icon, and a merch store with a shopping-bag icon — the hidden Hat giveaway rules link left out.](https://bloopbot.com/docs/screenshots/public-page-home-links.jpg) _The channel home, offline, with the full Twitch bio and four links under the stream panel, each with its site's icon; the hidden link is not shown._ Viewers don't need to sign in to see your page or use your links. Links open the site directly. On the **Free** and **Free+** plans, the bottom of every page has a short **Stream on Twitch?** box that tells viewers who stream they can get a page like yours with Bloopbot. On Plus, Pro or Legacy the box is gone, and your page ends with your own content. See [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#defaults). ## Search engines Your pages can appear in search engines such as Google and Bing, so viewers can find your channel's commands, quote book, store or giveaways by searching for them. Bloopbot lists every page you've switched on in its sitemap, which search engines read to find pages. Nothing on those pages is new: it is what anyone can already open from your link. - **Which pages**: Home, Giveaways, Store, Quotes and Commands, and a giveaway's own page. Quotes and Commands are listed only once they have a quote or a command to show. **Your prizes** is never listed. - **What shows**: your channel name, your Twitch (or Kick) bio and the text on the page. A finished giveaway's page names its winners, so a search result can show those names too. - **Your own domain**: search engines list a page at your domain when you use one, and not at `bloopbot.com/c/`. Your domain isn't in Bloopbot's sitemap, so link to your pages from your own sites so search engines find them. - **Keep a page out of search**: switch it off under **Public page**, then **Pages** (see [Switch pages on or off](https://bloopbot.com/docs/public-page#pages)). It then says _This page is off_ and search engines drop it the next time they visit, which can take days or weeks. Search engines don't sign in, so they never see a viewer's points, prizes or channel level. Those show only to the viewer who signed in. ## Use your own domain On the Pro plan, your public page can open at a domain you own, like `live.yoursite.com`, instead of `bloopbot.com/c/`. [Use your own domain for your public page](https://bloopbot.com/docs/custom-domain) shows how. ## Edit with an AI assistant If you have connected an AI assistant, you can ask it to arrange your sections, switch pages on or off, choose which command groups your Commands page lists, set page-wide heading and body fonts, or edit your links and gear. For example, ask: “Put About above Schedule, use Playfair Display for headings and Open Sans for paragraphs, and keep everything else as it is.” The assistant reads your current page before saving the change. The page's usual plan limits still apply. Reading the page and editing it are separate permissions on the connection screen. Domain setup and removal need a third permission. All three start ticked; untick any the assistant shouldn't have. [Connect an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant#permissions) explains each choice. ## Troubleshooting - **"Use a web address that starts with https://"**: the address isn't a web page. Only `https://` and `http://` addresses can be added; email and app links can't. - **"Keep the title to 60 characters"**: shorten the title; the address shows under it anyway. - **A tab is missing from my page**: check **Pages** on **Public page**; it may be switched off. The **Quotes** tab also waits for your first quote, and the **Commands** tab for a command in a group you ticked. - **A command is missing from my Commands page**: its flow must be switched on, and its group ticked under **Commands** on **Pages**. A flow that only replies when the viewer isn't allowed (its **Who can trigger** **No** path) and never does anything on **Yes** isn't listed. Changes can take a minute to show. - **A command is in the wrong group**: the group comes from the **Who can trigger** step between the **Chat command** trigger and the flow's first action. Change **At least** on that step and save the flow. - **My mod commands show on my page**: untick **Moderators** (and **Broadcaster**) under **Commands** on **Pages**, then click **Save**. - **Viewers see "This page is off"**: that page is switched off on **Pages**. Switch it on and click **Save**. - **A page I switched off still shows in search**: search engines drop a page when they next visit it, which can take days or weeks. Check that it says _This page is off_ when you open its address. See [Search engines](https://bloopbot.com/docs/public-page#search). - **My links don't show on my page**: check that they aren't hidden and that you clicked **Save**. If the Public page says links aren't included on your channel right now, your links are kept and show again once they are. - **A link shows a simple icon instead of the site's own**: some sites don't offer one Bloopbot can use, or refused the request. Bloopbot tries again the next day whenever you open **Public page**. When a site changes its icon, your page picks up the new one within a week. - **My bio is out of date**: it comes from Twitch. Change it there and reload your page after a few minutes. - **Schedule, Recent broadcasts or Top clips doesn't show**: check that its switch is on under **Home sections** and that you saved. Twitch may have no scheduled stream in the next 7 days, saved past broadcast or clip from the last 30 days. Recent Twitch changes can take about 10 minutes to appear. - **"We couldn’t find that YouTube channel"**: open the channel address in your browser to check it. Enter the address from your channel page, such as `youtube.com/@you`, instead of a video's address. - **"YouTube didn’t answer"**: click **Save** again in a minute. - **My sections don't show**: check each section's switch on **Home sections** and click **Save**. A Giveaways or Store section also hides while that page is switched off. If **Public page** says sections aren't included on your channel right now, your settings are kept and return once they are. - **A page font doesn't show**: check the family name on Google Fonts; the sample on **Look** says when a name isn't found. Then click **Save**. A font blocked by the viewer's connection falls back to the page's usual font. --- # Use your own domain for your public page Open your public page, giveaways, store and prize claims at a domain you own, like live.yoursite.com, instead of a Bloopbot address. Updated 14 October 2026 ## What you can do Your public page normally lives at `bloopbot.com/c/`. With a custom domain, the same page opens at an address you own, like `live.yoursite.com` or `yoursite.com`: your bio, live status, links, giveaways, store and prize claims. Once your domain is live, your `bloopbot.com/c/` address forwards to it, so links and QR codes you already shared keep working. Viewers sign in with Twitch on your domain, and the claim links in your giveaway messages use it too. ## Before you start - Custom domains come with the **Pro** plan. On other plans, **Domain** on **Public page** shows **Available on Pro**. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) shows what your channel has. - You need a domain you own, and access to its DNS settings wherever the domain is managed, such as Cloudflare, Namecheap or GoDaddy. The DNS record you add there is a real change to your domain. - Each channel can use one domain. A subdomain like `live.yoursite.com` works with any DNS provider. A bare domain like `yoursite.com` needs a provider that offers CNAME flattening or an ALIAS record, so a subdomain is the easier choice. ## Add your domain 1. Open **Public page** in the sidebar, under **Channel**. 2. Choose **Domain** in the page's menu. 3. Type your domain in **Your domain**, for example `live.yoursite.com`. Leave off `https://` and anything after the domain. 4. Click **Add**. 5. The card shows the DNS record to add, and its progress at **Waiting for DNS**. ![The Public page’s Custom domain card for live.localstreamer.tv: the three progress steps with Waiting for DNS highlighted, then a table with the DNS record to add, Type CNAME and Name live, its target painted over, and a refresh icon (Check now) and a bin icon (Remove) below it.](https://bloopbot.com/docs/screenshots/custom-domain-pending.jpg) _The Custom domain card just after adding live.localstreamer.tv: the CNAME record to add, and the progress at Waiting for DNS. Your card shows the real target, domains.bloopbot.com._ ## Add the DNS record At your DNS provider, add the record the card shows. For `live.yoursite.com` it is a **CNAME** record named `live` that points to `domains.bloopbot.com`. Menu names change from time to time. If yours look different, look for your domain’s **DNS records** settings. | Provider | Where to add it | | --- | --- | | Cloudflare | **DNS**, then **Records**, then **Add record**. Type `CNAME`, Name `live`, Target `domains.bloopbot.com`, and set the proxy status to **DNS only**. | | Namecheap | **Domain List**, then **Manage**, then **Advanced DNS**, then **Add New Record**. Type `CNAME Record`, Host `live`, Value `domains.bloopbot.com`. | | GoDaddy | **My Products**, then **DNS** next to your domain, then **Add New Record**. Type `CNAME`, Name `live`, Value `domains.bloopbot.com`. | For a bare domain like `yoursite.com`, the card asks for a **CNAME, ALIAS or flattened** record named `@`. Cloudflare flattens a CNAME there for you. On Namecheap, choose an **ALIAS Record** instead of a CNAME. GoDaddy can't point a bare domain at another name, so use a subdomain like `live.yoursite.com` there. Leave the record in place for as long as you use the domain. ## Wait for it to go live While it waits, Bloopbot keeps checking your domain and the card updates itself. The progress moves from **Waiting for DNS** to **Issuing certificate**, while Bloopbot gets the security certificate that lets your domain open over `https://`, and then to **Live**. Many domains are live a few minutes after the DNS change; with some DNS providers it takes a few hours. Click the refresh icon (**Check now**) to check straight away. It checks at most once every 10 seconds, so clicking again sooner shows the same answer. When your domain is live, the card shows it as a link and says your Bloopbot address now forwards there. ![The Public page’s Custom domain card once live.localstreamer.tv is live: the domain as a link, the line under it saying the Bloopbot address (painted over) now forwards here, and a bin icon (Remove).](https://bloopbot.com/docs/screenshots/custom-domain-live.jpg) _The Custom domain card once live.localstreamer.tv is live: the domain as a link, the line saying your Bloopbot address now forwards there, and a bin icon (**Remove**)._ ## What viewers see - Your home is at your domain's root, like `live.yoursite.com`. **Giveaways**, **Store** and **Your prizes** are at `/giveaways`, `/store` and `/claim`. - Links to `bloopbot.com/c/` open your domain instead, with the rest of the address kept, so old links and QR codes still work. - **Sign in with Twitch** takes a viewer to Twitch and straight back to the page they were on, signed in on your domain. - Being signed in on bloopbot.com doesn't sign a viewer in on your domain; they sign in once there. Signing out on either one signs them out of both. - The claim links your giveaway messages post, `$(claimurl)`, use your domain, and so do the links to your page on your dashboard. - Anything that isn't your page, like these guides or your dashboard, opens on bloopbot.com. ## If your plan changes If your plan stops including custom domains while your domain is live, it keeps working for 7 more days. The card shows the date it switches off. After that, visitors to your domain are sent to your `bloopbot.com/c/` page, and the card says the domain is switched off. A domain that wasn't live yet, or had stopped pointing at Bloopbot, switches off straight away. Move back to Pro and your domain comes back on its own, usually within a minute or two, as long as you haven’t changed its DNS record. If it has been switched off for more than 30 days, it goes through **Waiting for DNS** and **Issuing certificate** again before it is live. ## Remove your domain Click the bin icon (**Remove**) on the card and confirm. Your page goes back to `bloopbot.com/c/` straight away, and links to it no longer forward. You can then delete the DNS record at your provider, and add a different domain if you like. ## Troubleshooting - **"Bloopbot is still waiting for your DNS change"**: the record hasn't been seen yet. DNS changes can take up to a few hours to show up; the card keeps checking on its own. - **"Your DNS record doesn’t point at Bloopbot yet"**: check that the record's type, name and target match the card exactly. If your domain sits behind Cloudflare's proxy or another CDN, set the record to **DNS only** so it points straight at `domains.bloopbot.com`. - **"A CAA record on your domain is blocking the security certificate"**: your domain limits which companies may issue its certificates. Add CAA records that allow `letsencrypt.org` and `pki.goog`, or remove the CAA records. - **"Bloopbot couldn’t reach your domain to check it"**: the check timed out. There’s nothing to do; the card keeps trying on its own and updates when it gets an answer. - **"This domain can’t be used right now"**: the domain was refused for your channel. Remove it and add it again. If the message comes back, contact support. - **"That domain is already connected to another channel"**: a domain can serve one channel. Use a different subdomain, or remove it from the other channel first. - **"Remove your current domain before adding a different one"**: each channel has one domain. Click the bin icon (**Remove**), then add the new one. - **"That domain belongs to Bloopbot"**: enter a domain you own, not a bloopbot.com address. - **"Bloopbot couldn’t set up your domain just now"**: nothing was added. Wait a minute and click **Add** again. - **"Custom domains aren’t available yet"**: custom domains may not be available on your channel yet. Check back soon. - **"Your domain stopped pointing at Bloopbot"**: the DNS record was changed or deleted, so your page is back on its Bloopbot address for now. Put the record back as the card shows, and the domain goes live again on its own. - **My domain shows "Unknown host"**: the domain isn't live yet, or it was removed. Open **Public page**, then **Domain**, and check the card. --- # Fix a flow or connection Work through missing chat replies, blocked flows, silent alerts, Spotify problems and trouble signing in. Updated 21 October 2026 ## The bot does not reply to a command 1. Check the selected channel and that the flow is live rather than paused. 2. Read the trigger’s **Command**, **Prefix** and aliases. Use exactly that command in chat. 3. Save any pending edits. Check that the action is connected to the trigger through the intended conditions. 4. Review permission, cooldown and live-stream checks. A failed condition may be stopping the flow correctly. 5. In **Settings**, review Twitch and bot-account status. Follow a re-authorisation prompt if one is shown. ## A flow needs attention or stops early The **Overview** counts flows that need attention and marks them in its list. Open **Flows → Needs attention** and follow the reported requirement. Common causes include a missing Twitch permission, a disconnected integration, a missing variable, a step that [reads a value before it’s set](https://bloopbot.com/docs/data-wires) or a graph that cannot run. Open the flow’s **Run log**. Find the first failed or stopped node, inspect its inputs and check the outgoing path. Use **Test fire** after saving your fix. A dry run does not verify live Twitch permissions or actual OBS delivery. ## OBS is blank or the test never arrives - Keep the correct OBS scene and Browser Source visible. Hidden sources may be shut down. - While you’re building your first overlay, Pebble watches for the overlay opening in your streaming app and says what it can see: nothing open yet, or something open that isn’t this overlay. See [Learn Bloopbot with Pebble’s tutorials](https://bloopbot.com/docs/tutorials#first-run). - For an overlay, copy its current URL from Overlays. For a local HTML widget, check the file path on the streaming computer and its complete connection URL. - For a custom overlay, choose it under **Overlays → Custom overlays** and press **Refresh status**. Its connected-source count should increase while the OBS scene is visible. Grant and subscribe to **stage.alert** and the matching `alert_design:name` record before testing an alert with **Test published output…** → **Play it on stream** on an alert layer. - A label needs content; an alert layer stays blank until an alert plays on it. Use the relevant sample or test control. - If a key or read token changed, replace the affected URLs in OBS. For the now-playing display that means the widget’s own URL: the old `/overlay//nowplaying` address still works but is no longer the way to set one up, and [put now-playing on stream](https://bloopbot.com/docs/now-playing-in-obs) covers the swap and the card that rotates or revokes the old token. ## A message or alert appears twice Look for two enabled flows with the same command or event trigger, especially after installing a pack. Check OBS for duplicate sources. For a custom overlay, [check its saved file path and access](https://bloopbot.com/docs/custom-widgets#duplicates). Pause one duplicate path at a time and test again. ## A song request is accepted but does not play Confirm Spotify is linked, Premium is available and playback is active on the intended device. Check the song variables on **Variables** — `song_max_queue` and `song_per_viewer` can turn a request down before it is searched for — and the blocked tracks, artists or viewers, which **Block or unblock** in your request flows holds. Then check the Song requests flow group for disabled or duplicate commands. ## Spotify will not link, or chat says it is not set up - **“Spotify isn’t set up for this channel.”** The channel owner has not saved a Spotify app yet. Follow step 1 of [the song requests guide](https://bloopbot.com/docs/song-requests). - **“Spotify rejected your Client ID or secret.”** Re-copy both values from the Spotify dashboard, and check that the Redirect URI in your Spotify app matches the one on the Spotify card exactly. - **Spotify shows an error after you approve.** Link with the same Spotify account that owns the app. A development-mode app only admits its owner and the few people the owner adds in the Spotify dashboard. - **Needs reconnecting.** Press **Re-link Spotify** on the card. If there is no button, save your Spotify app first. - **It worked and then stopped.** Spotify stops an app when its owner’s Premium lapses; it resumes when Premium returns. “This channel’s Spotify app has hit its API quota” clears on its own after a short wait. - **The Link Spotify button sends you to sign in.** Linking is only available to the signed-in channel owner. Editors cannot link, re-link or unlink Spotify. ## I can’t sign in with Twitch If you added a backup sign-in email, choose **Can’t use Twitch? Sign in with email instead** on the sign-in page and we’ll email you a link that opens your dashboard. Only an address you confirmed under **Account** can sign you in. If you haven’t added one yet, do it the next time you can sign in: [Keep a backup way to sign in](https://bloopbot.com/docs/backup-sign-in-email) walks through it. ## Sign in with a different Twitch account 1. In the dashboard, choose **Sign out** at the bottom of the sidebar. 2. Choose **Sign in with Twitch**. Twitch shows its authorisation page so you can check which account you’re using. 3. Use Twitch’s option to change accounts, sign in with the account you want, then approve access. For example, switch from your bot account to the account that owns your streaming channel. You return to Bloopbot signed in as the account you chose. Signing out of Bloopbot does not sign you out of Twitch or disconnect your channel. If Twitch still uses the wrong account, sign out on Twitch itself and try again, or open Bloopbot in a private browser window. ## Collect a useful problem report Record the page, flow name, what you expected, what happened and the relevant error from the Run log. Include the time of a real event if useful. Crop screenshots to the problem area and remove widget URLs, private flow URLs, invite links and credentials before sharing. ## Still stuck? Ask in the Bloopbot Discord Bloopbot has its own Discord server, where you can ask a person. Join it at [discord.gg/CANzH5SVpN](https://discord.gg/CANzH5SVpN). The first time, it asks what brings you there and shows the server rules to accept. Channel owners also see a Discord card on **Overview** (**Join the Bloopbot Discord**, or **Unlock Free+ with Discord** on Free) until their linked Discord account is in the server. Choose **Join the Discord** there, or **Already a member? Link your Discord** if you are already in. If you signed up through a sign-up link that came with its own Discord invitation, that invitation appears in the card's place with its own button: it also gives you that link's role, and the cross button (**Dismiss the Discord invite**) hides it for your channel. You can always use **Bloopbot Discord** in the **Help** menu. 1. Open **#help** and search for your problem; someone may have asked already. 2. Start a post with a title that says what’s wrong, such as “!hello doesn’t reply”, and pick a tag. 3. Add the [problem report](https://bloopbot.com/docs/troubleshooting#report) from the section above, with any screenshots cropped. 4. When it’s fixed, tag the post **Solved**. If something is broken rather than confusing, post in **#bugs** instead. Nobody from Bloopbot will message you first asking for your password. This is Bloopbot’s server, not your own. To post in your Discord when you go live, see [Announce your stream in Discord](https://bloopbot.com/docs/discord-go-live). --- # Bloopbot terms, explained A quick reference for triggers, nodes, packs, source URLs and dry runs. Updated 9 October 2026 ## Building behaviour | Term | Meaning | | --- | --- | | Flow | An automation made of connected steps. | | Node | One step on the canvas: a trigger, condition, action or control. | | Trigger | The event that starts a flow, such as a chat command or a raid. | | Condition | A check that decides whether a path should continue. | | Action | A step that does something, such as sending a message. | | Template | A reusable starting flow that installs as your own copy. | | Pack | A group of related flows installed together. | | Group | A set of steps saved once and used as one card in any flow, with named ways in and exits — see [reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes). Not the same as the Flows list grouping a pack’s flows. | | Dry run | A simulated execution. Test fire records what would happen without live actions. | ## AI features | Term | Meaning | | --- | --- | | AI judge | Answers a plain-English question about a chat message with a probability, a pick from a short list, or a position on a scale — never generated text. | | AI feature | One AI capability, included or not per channel — see [Your plan](https://bloopbot.com/docs/what-your-plan-includes). | | Locked | An AI feature your channel doesn’t currently include. The step stays visible in the library but can’t be added. | | Confidence / threshold | How sure the judge has to be before a flow acts on its answer. Higher catches less but is more certain. | | Watch-only flow | An AI flow whose branches only log what it thought, so you can tune it before letting it act. | | Fails open | When the AI judge is unavailable, an AI feature falls back to ordinary, non-AI behaviour rather than blocking anything. | ## Remembering and reusing data | Term | Meaning | | --- | --- | | Variable | A named value you declare, such as a death counter. | | Channel scope | One shared value for the channel. | | Viewer scope | A separate value for each viewer. | | Channel data | Information the bot keeps up to date on its own, such as the last raid or the songs waiting in the queue. | | Insert… | The editor menu for choosing data to use in a field. | | Port | A small dot in the tray under a card: a value the step hands on, or a field that reads one. | | Data wire | The dashed line from one step’s value to the field that uses it — see [connect values with data wires](https://bloopbot.com/docs/data-wires). | | Cooldown | A time limit on how often a path can run. | ## Putting it on screen | Term | Meaning | | --- | --- | | Overlay | A page Bloopbot hosts for OBS as a Browser Source: alerts, chat, goals and the rest, designed and kept under **Overlays**. | | Alert layer | The place on an overlay where one alert design draws. Every alert type — follow, sub, raid and the rest — is its own layer. See [Show alerts on stream](https://bloopbot.com/docs/alerts). | | Alert design | The look, text, picture and sound of one alert. It belongs to your channel, so every overlay that shows it changes together. | | Alert queue | The one line every alert and media file waits in, so they play one at a time. The Live page’s Alerts card and the Alert queue step skip, pause, resume, replay and clear it. | | Custom overlay | Your own named HTML overlay connected to Bloopbot with its own private URL and selected data access. | | Custom widget | A widget you wrote, or added from the Marketplace, kept once on the **Widgets** page. Every overlay that shows it changes when you edit it and publish — see [Reuse your widgets in every overlay](https://bloopbot.com/docs/your-widgets). | | Layer | One placement of a widget on an overlay, with its own position, size and settings. | | Browser Source | The OBS source type that displays a webpage or widget. | | Read token / widget key | A private value in a connection URL that allows access to that output. | | Remote trigger (webhook) | A flow’s private URL that an external button or service can call to trigger it — see [start a flow from a URL](https://bloopbot.com/docs/webhooks). | | Editor | Someone the owner has allowed to manage the channel in Bloopbot. | --- # What your plan includes Find the Plan & billing page, see what your channel holds and how much of each limit it uses, upgrade to Plus or Pro, manage what you pay for, the emails you get about payments, and what happens when something is not included or you reach a limit. Updated 14 October 2026 ## Where to find it In the dashboard's sidebar, open **Settings** › **Plan & billing**. Only the channel's owner sees it. The page shows the plan your channel is on and how much of each limit it uses. It is also where the owner [upgrades to Plus or Pro](https://bloopbot.com/docs/what-your-plan-includes#upgrade) and [manages what they pay for](https://bloopbot.com/docs/what-your-plan-includes#manage-billing). Nothing on it switches a single capability on or off. You can also get there from: - **Your plan**, at the end of the Flows page bar; - the **Upgrade** button at the foot of the menu, when there is a plan you can buy; - the **Upgrade** button beside a limit's count, on **Flows**, **Variables**, the overlay editor's **Theme** tab and **Giveaways**. The count on the Flows bar is how many custom flows count toward your plan. Hover over it to see how many installed flows are still free. ![The Flows page bar on the Free plan: the Web requests: off and Secrets buttons, then “Custom flows: 12 of 15 · 3 left · Plus gives 75” above a mostly filled bar in the warning colour, a blue Upgrade button, then Your plan, Marketplace and the blue + New flow button.](https://bloopbot.com/docs/screenshots/flow-quota-bar.jpg) _The Flows bar on Free: 12 of 15 custom flows, 3 left, Plus gives 75, with an Upgrade button beside Your plan._ ## How to read the page The page names the plan your channel is on. If you can upgrade, it starts with Plus and Pro: what you can build with each, prices, and monthly or yearly billing. **Prices in** previews pounds, dollars or euros; Stripe confirms your payment currency and tax at checkout. Yearly shows the full annual charge and the saving against twelve monthly payments. **Your usage** follows, with a bar for each counted limit: custom flows, overlays, editors, variables, open giveaways and themes. Each bar warms in colour as you near the limit and says how many are left. Open **Your features & usage** below that to see what your channel actually holds. For a subscriber or an editor, this section starts open. Every capability Bloopbot has is listed — grouped by the part of the product it belongs to — and each one carries the reason it resolves the way it does: - **On your Plus plan** (or whichever plan you are on) — that plan includes it. When the plan has an end date the badge says so, for example _On your Plus plan, until 3 Jan_; after that date the channel is on Free. - **Included by default** — it is included for every channel on Bloopbot, plan or no plan. - **Granted** — this capability is switched on for your channel specifically. **Switched off for this channel** is its opposite: a capability that is available here, but switched off for you. - **Not included** — your channel does not hold it. That is a neutral state, not an error, and nothing is broken. The AI capabilities also report how much they have been used: requests this month, and today against the daily limit that would refuse the next one. ![Your features & usage expanded on a Plus channel: AI judgments show their inclusion reasons, requests this month and today against the daily allowance.](https://bloopbot.com/docs/screenshots/plan-panel-top.jpg) _The open Your features & usage section, with the reason each capability is or is not included._ ## What each group means Capabilities are grouped the way the product is, so you can find the thing you are looking for by where you would go to use it: | Group | What lives there | | --- | --- | | AI judgments | The steps that ask an AI judge a plain-English question: routing and picking things out, the intent trigger, song matching and policy, AI moderation and text screening. | | Overlays | The overlays Bloopbot builds and serves for OBS — label, goal bar, event stack, alerts and chat layers — and the media library behind them, on the **Media** page. On-screen alerts, and the **Show alert**, **Play media** and **Alert queue** steps that drive them, come with every channel, and so does the Spin Wheel's **Spin a wheel** step. **Speak text**, which reads viewers' messages out loud ([Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech)), is the one overlay step Free does not hold: it comes with Free+ and every paid plan, with a daily limit on characters. So does a media library: every channel can upload 200 MB of images, sounds and videos for its widgets and alerts, and paid plans hold more — 500 MB on Plus and 1 GB on Pro. The **Media storage** line under Limits shows yours. Every style control and theme starter works on every plan; how many [themes](https://bloopbot.com/docs/widget-themes) you can keep is the **Widget themes** line under Limits: 1 on Free, 5 on Free+, 15 on Plus, and as many as you like on Pro. No plan limits how many overlays you build. | | Spotify and song requests | Everything from `!sr` and the queue to channel-point requests. Every plan lets the channel owner connect a Spotify developer app; requests need that linked app, Spotify Premium and active playback. [Set up song requests](https://bloopbot.com/docs/song-requests#connect) before trying `!sr`. | | Twitch | The richer Twitch surfaces a flow can drive: [polls and predictions, hype trains](https://bloopbot.com/docs/polls-and-predictions), creator goals, ad breaks, VOD markers, and changing your stream title and category from a flow. **Shield mode** and **Chat settings** are not in this group: they protect your channel, so every plan has them, including the [follow-bot lockdown](https://bloopbot.com/docs/moderation#follow-bots). Also the **prize vault**: stocking keys, links, physical prizes and perks that a giveaway hands out from its own [claim page](https://bloopbot.com/docs/giveaway-prizes), rather than in chat. **Web entry** is what lets a giveaway also take entries from [its own public page](https://bloopbot.com/docs/giveaways#web), not only from chat. **Links on your page** puts your own links, like YouTube, Discord and merch, on [your public page](https://bloopbot.com/docs/public-page). **Sections on your page** adds your schedule, recent broadcasts, top clips, YouTube uploads, About, Work with me and gear to [your public page](https://bloopbot.com/docs/public-page#sections), in the order you choose, along with [page fonts](https://bloopbot.com/docs/public-page#fonts) for headings and body text. **Custom domain** (Pro) opens that page at [your own domain](https://bloopbot.com/docs/custom-domain), like `live.yoursite.com`. | | Moderation | Moderation beyond the six deterministic filters, such as nukes. | | Automation | Reaching outside Bloopbot: [outbound web requests and webhook triggers](https://bloopbot.com/docs/webhooks), and [connecting an AI assistant](https://bloopbot.com/docs/connect-an-ai-assistant) such as Claude or ChatGPT to your flows, which comes with Pro. Webhook triggers are on every plan; outbound requests are included in [Free+](https://bloopbot.com/docs/unlock-free-plus) (2 per flow run, in up to 50 runs a UTC day and 200 a UTC month), Plus (2 per flow run) and Pro (20 per flow run). | | Sharing a channel | Editors and invite links. Moderators are not part of this group: every plan can let any number of its [Twitch moderators](https://bloopbot.com/docs/editors#tick) into the dashboard. | | Install resources | The resources your channel draws on: [your own bot account](https://bloopbot.com/docs/bot-account). | ![The Plus plan’s expanded features and usage, scrolled to Automation, Sharing a channel and Install resources: Outbound requests, Webhook triggers and Channel editors are on the Plus plan; Your own bot account is not included.](https://bloopbot.com/docs/screenshots/plan-panel-families.jpg) _Scrolled on, the same page covers automation, sharing and install resources the same way it covers the AI steps._ ## When something is not included The capability stays visible everywhere it normally appears — it is never hidden from you — and it cannot be added or switched on: - In the flow editor it still appears in the node library, in ⌘K search, while you drag a connection and in the sidebar’s suggestions: dimmed, with a small lock badge reading **Not included in your plan**. Clicking or dragging it explains why instead of adding it. - A flow built _before_ a capability stopped being included keeps running. Its nodes stay editable, and the step simply takes the path it takes when it has no answer. Nothing is deleted, and nothing stops. - Nothing behaves “half-way”. A capability you do not hold is a step that does not act, not one that acts unpredictably — your commands, filters, song requests and overlays carry on exactly as they did. When a paid plan removes the restriction, the owner sees **Upgrade to Plus** or **Upgrade to Pro** in the node preview. The same action appears on locked public-page panels. It opens plans in a new tab so any edits stay here. If support has switched the feature off for your channel, an upgrade cannot enable it; contact support instead. That is what the neutral wording is for. A missing capability should read as “that step is not mine today”, never as a broken flow or a channel-wide problem; [the AI features guide](https://bloopbot.com/docs/ai-features) takes the same idea through the AI steps in detail. ## When you reach a limit You don't have to wait for a limit to see it coming. The count on **Flows**, **Variables**, the overlay editor's **Theme** tab and **Giveaways** reads, for example, _Custom flows: 12 of 15 · 3 left · Plus gives 75_. Its bar warms in colour past 60% and turns to the warning colour from 80%. When a higher plan holds more, an **Upgrade** button beside it opens **Plan & billing**. At your custom-flow ceiling, Flows shows **Upgrade to Plus** or **Upgrade to Pro** beside the limit explanation. The same action appears when you run out of media storage, themes, variables or editor spaces, wherever a higher plan has enough room. You can still make room by removing something you no longer need; at the theme limit you can still replace a theme. Existing work stays in place. Some capabilities are numbers rather than yes or no: how many flows you can keep, how many people you can share your channel with, how much media you can upload, how many prizes the prize vault can hold stocked and unclaimed at once. The **Limits** section at the bottom of **Your features & usage** lists each one as what you have against what you get — `5 of 20 custom flows`, say — or **Unlimited** when nothing caps it. **Vault prizes** reads 0 without the prize vault, 250 on Plus, and Unlimited on Pro. [Collections](https://bloopbot.com/docs/collections#limits) have three of their own: how many collections you can keep (1 on Free, 5 on Plus, Unlimited on Pro), how many items one viewer can hold in one collection (200, 1,000 and 5,000), and how many items a catalogue can list (250, 2,000 and 10,000). Past one, a collection goes read-only rather than losing anything. ![The Limits section of the Plan & billing page: Flows reads 5 of 75 custom flows with a note that built-in flows are free until changed, above Overlays, Editors, Flow variables and Media storage, with Run history starting below.](https://bloopbot.com/docs/screenshots/plan-panel.jpg) _The Limits section shows the custom flow count and the other resources against your plan's ceilings._ The custom flow number is the one to read carefully, because it is not the number of flows you can see on the Flows page. It counts **custom flows**: the ones you built, and the ones you changed. - Installing a built-in pack is free. Its flows arrive as your own copies, paused, for you to look over — and none of them counts until you change one. - Installing a pack shared by a channel counts each new flow toward your allowance. Bloopbot checks the whole pack first, so an install that does not fit adds nothing. Those flows still update in place while you leave them as they came. - Change what a flow actually does — add a step, rewire one, edit one of its settings — and that flow becomes one of yours and counts from then on. Renaming it, describing it, enabling or pausing it does not. - A single template installed from the marketplace counts the same way: free while you leave it as it came, yours once you change it. - A bundle from the **Community** group counts the same way too. The sound and image files it brings count toward your file storage, and the install is refused before anything is copied if they do not fit. - The Flows page carries the same running total in its bar (hover over it for the installed flows you have left alone), and marks each installed flow you changed with an **Edited** chip in the list. Flows you built yourself count too, without a chip. ![One row of the Flows list: the live toggle, the flow named Welcome new followers, its Form chip and an Edited chip beside it, and the line “When someone follows the channel.” underneath.](https://bloopbot.com/docs/screenshots/flow-edited-chip.jpg) _An installed flow you changed carries the Edited chip beside its Form or Canvas chip; the bar above counts it._ **Reset to built-in** replaces a changed flow with its source version. The flow no longer reads as edited: a built-in copy goes back to being free, and a channel-pack copy still counts toward your allowance. For a pack member, this takes the latest available pack version; your earlier graph stays in History. It sits in the row’s ⋯ menu on any flow that came from a pack or a template; a flow you built yourself has nothing to reset to and does not offer it. When a pack has a newer version, **Use the new one** under **Marketplace → Installed** does the same in one step ([Update what you added](https://bloopbot.com/docs/the-marketplace#update)). ![The Reset to built-in? dialog: “This replaces your changes with the installed copy of ‘Welcome new followers’. Your changes are kept in its History, so you can put them back.”, with a Cancel button and a coral Reset to built-in button.](https://bloopbot.com/docs/screenshots/flow-reset-to-builtin.jpg) _Reset to built-in names what it replaces and where the old version is kept, so a reset is never a one-way door._ - Limits are checked when you _create_ the next thing. At the limit, the next flow, overlay, editor or upload is refused with a message naming the limit. Everything that already exists keeps working. - Widget themes work the same way, with one convenience: at your theme limit, a theme you add from **Marketplace** swaps into your draft in place of your Active theme, and History can undo it. [Style every overlay with a theme](https://bloopbot.com/docs/widget-themes#limit) walks through it. - Marketplace cards show a chip such as **Free+ & paid** when an item's flows need a paid plan, and the add review lists the flows your plan can't run before you add anything: see [When your plan doesn't cover it](https://bloopbot.com/docs/the-marketplace#plan-needs). On Free+, a chip that is there for Web requests shows no lock. - Some marketplace packs work on every plan: a **Works on every plan** chip means their Web requests run on Free too, as long as you leave those steps as they came. See [Packs that work on every plan](https://bloopbot.com/docs/the-marketplace#every-plan). - Adding a theme from the Marketplace follows the theme limit: at it, the review swaps the new theme into your draft. Overlays are not limited by any plan, so you get every overlay a theme brings. [Add a theme from the Marketplace](https://bloopbot.com/docs/widget-themes#catalogue) shows it. - Nothing is ever deleted, disabled, stopped or trimmed retroactively to fit a limit. Reaching the flow count never switches off a flow you already have — a channel that is already over one keeps everything it has, and is simply refused the next thing. - Because they are only checked at creation, these limits cannot interrupt a stream: no flow stops mid-run and no overlay stops serving or disappears. The daily AI allowance is the one limit that works differently — see [Daily AI allowance](https://bloopbot.com/docs/what-your-plan-includes#ai-allowance). > **Why the numbers are generous on purpose** > > A limit that took something away would be worse than no limit at all, so the caps are set above what almost every channel already uses — and any channel above one keeps what it has. ## Daily AI allowance Each AI step has a daily allowance per channel: how many chat messages the AI chat rules check, how many song requests the AI matches, and so on. The allowance resets at midnight UTC. | AI check, per day | Plus | Pro | | --- | --- | --- | | AI chat rules | — | 4,000 messages | | Text screening | — | 500 | | Intent trigger | 1,000 messages | 2,000 messages | | AI yes/no, route and pick-out steps | 700 | 1,500 | | Smarter song matching | 200 requests | 400 requests | | Song policy | — | 400 tracks | | AI credits, all AI together | 2,000 | 6,000 | Every AI check also draws on the day's **AI credits**, which follow what a check actually costs to run: a chat-rule check, an intent check or a text screen uses 1 credit, and a song match 2. You'd only run short of credits by using several AI features heavily on the same day. Pro's 4,000 chat-rule checks cover a four-hour stream in a busy chat of around 150 viewers. Channels that used Bloopbot before plans existed keep every AI feature, with a daily allowance close to Plus's. Your channel's own numbers are on the Plan & billing page, beside what it has used today. When an allowance runs out, only that AI step stops asking for the rest of the day: - The step takes its **unsure** path, the same as when the AI is unavailable, and the run log says _This channel has used today's AI allowance for this feature; it resets at midnight UTC._ Wire **unsure** the way you want a quiet day to go. [Ask the AI judge in a flow](https://bloopbot.com/docs/ai-conditions-and-routing#unsure) explains the unsure branch. - Everything that is not AI keeps working: the six moderation filters, commands, alerts, overlays and song requests. ## Upgrade to Plus or Pro Every channel starts on the **Free** plan, and Bloopbot is free to use. Free includes everything that doesn't cost Bloopbot money to run: your public page's links and sections, polls, predictions, hype trains, goals and stream markers, channel-point song requests, Nukes, the chat widget, multi-winner and web-entry giveaways, webhook triggers and your own X app. Text-to-speech does cost Bloopbot to run, so it comes with [Free+](https://bloopbot.com/docs/unlock-free-plus) and every paid plan: **5,000** characters a day on Free+, **20,000** on Plus and **100,000** on Pro. **Plus** is £5.99 a month including VAT, with more flows, editors, the lighter AI features and **2 outbound web requests per flow run**. **Pro** has everything in Plus, including **20 outbound web requests per flow run**, AI moderation, text screening and your own bot account. **Plan & billing** lists exactly which capabilities each one adds to your channel, and the [pricing page](https://bloopbot.com/pricing) compares the three plans side by side, with their prices. Its **Upgrade** buttons bring you to **Plan & billing**, signing you in first if you need to. Subscription prices in pounds, US dollars and euros are set to roughly the same value, with rounded amounts. The pricing page and Plan & billing show the current prices from Stripe. Plus is **£5.99 / $7.99 / €6.99 monthly**, or **£59.99 / $79.99 / €69.99 yearly**. Pro is **£12.99 / $17.49 / €14.99 monthly**, or **£129.99 / $174.99 / €149.99 yearly**. Subscription prices include applicable VAT or sales tax. Check the currency and total at checkout before paying. An existing subscription keeps its agreed price; choosing a different plan or billing period uses the current prices. When you can buy a plan, a button near the foot of the dashboard's sidebar names your plan and the next step: **Free plan · Upgrade**, **Free+ plan · Upgrade** on Free+, or **Plus plan · Go Pro** on Plus. With the sidebar collapsed, a small **Upgrade** icon sits near the bottom. On a phone, open **Menu**; the button is at the bottom. Each one opens **Plan & billing** for the channel you are viewing, so you can compare plans before choosing Monthly or Yearly. ![The foot of the sidebar: Marketplace, Settings and Help, a blue Free plan · Upgrade button under them, and the account with its sign-out button.](https://bloopbot.com/docs/screenshots/upgrade-sidebar.jpg) _The Free plan · Upgrade button at the foot of the sidebar._ ![The blue “Free plan · Upgrade” button at the bottom of the dashboard menu on a phone.](https://bloopbot.com/docs/screenshots/upgrade-menu.jpg) _On a phone, the same button is at the bottom of Menu._ The **Overview** shows the owner what the next plan lets them do and its monthly price, with **Explore Plus** or **Explore Pro**. When a limit is at least 80% used, a smaller note shows the count so you can decide whether you need more room. ![Build more with Plus: more flows, AI song matching and editors, with the monthly price, Explore Plus and a smaller usage note.](https://bloopbot.com/docs/screenshots/upgrade-overview.jpg) _Build more with Plus: more flows, AI song matching and editors, with the price and a smaller usage note._ A prominent upgrade button also appears where your plan blocks something. It names the lowest plan that removes that block. Choose it to open **Settings** › **Plan & billing** in a new tab; compare the plans there before paying. If you already subscribe, use **Manage billing** on that page to change your plan. ![A reached custom-flow limit with the plan allowance, free alternatives and a prominent Upgrade to Plus button.](https://bloopbot.com/docs/screenshots/upgrade-flow-limit.jpg) _At the custom-flow limit, upgrade or make room while your existing flows keep working._ ![A locked AI node preview with an Upgrade to Plus button beneath its explanation.](https://bloopbot.com/docs/screenshots/upgrade-locked-feature.jpg) _The locked node preview offers the plan that includes it._ Only the channel's owner can buy a plan. Only the owner has **Plan & billing**; editors and moderators don't see it in the sidebar. 1. Open **Settings** › **Plan & billing** in the sidebar, or press any **Upgrade** button. 2. Compare the benefits in the Plus and Pro cards, then choose **Monthly** or **Yearly**. Use **Prices in** if you want to preview another currency; it does not set your checkout currency. 3. Press **Upgrade to Plus** or **Upgrade to Pro**. You go to Stripe's secure checkout page. 4. Check the price. It is shown in your currency, including any applicable VAT or sales tax, before you pay. A business can add its tax ID there too. 5. Pay. You come back to **Plan & billing**, which says _Confirming your payment with Stripe…_ until your plan arrives, usually within a few seconds. ![The Plan & billing page on Free, headed Make more of every stream: comparing Plus and Pro benefits and monthly prices, yearly savings, a currency preview and Upgrade to Plus and Pro actions, then a Discord card: Free+ unlocks web requests and five themes: join our Discord, with Join the Discord and Not now.](https://bloopbot.com/docs/screenshots/plan-upgrade.jpg) _More ways to make your stream yours: Plus and Pro benefits, actual prices, yearly savings and upgrade actions, then Free+ for joining the Bloopbot Discord._ On Free, **Plan & billing** also shows **Free+ unlocks web requests and five themes: join our Discord** below Plus and Pro. Free+ costs nothing: it is Free with web requests and room for five themes, for streamers in the Bloopbot Discord. **Join the Discord** adds you to the server and switches your channel at once. **Not now** hides the card for 30 days. It stays away while your Discord account is linked and in the server. [Unlock Free+ by joining the Discord](https://bloopbot.com/docs/unlock-free-plus) covers its limits and what happens if you leave. On Free+, the Plus card lists **No daily or monthly cap on web requests**. Free+ also holds text-to-speech, which [Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech) covers. For example, a channel on Free that picks **Yearly** and **Upgrade to Plus** comes back to _Thanks! Your channel is on Plus now._ The plan line now reads **Your plan: Plus**, and every capability Plus adds reads **On your Plus plan**. Your plan starts the moment Stripe confirms the payment. Closing the checkout page, or a card that is declined, changes nothing and charges nothing. ## Manage or cancel your plan Once you pay for a plan, **Plan & billing** shows what you pay for and when it renews, for example _Plus, billed monthly. Renews on 13 Nov._, and gives you **Manage billing**. On Plus, the cards also show what Pro adds; choose **Manage billing** to switch. On Pro, the page focuses on your subscription and usage. ![Just after buying Pro: Your plan: Pro, a thank-you line, Pro billed monthly with its renewal date, and Manage billing.](https://bloopbot.com/docs/screenshots/plan-manage-billing.jpg) _Just back from Checkout: the plan has arrived, with its renewal date and Manage billing._ **Manage billing** opens Stripe's billing page for your channel's subscription. From there you can: - switch between Plus and Pro, or between monthly and yearly; - update your card; - download past invoices and receipts; - cancel your subscription. When you cancel, nothing changes until the end of the period you have paid for, and the page says so: _Plus is cancelled and ends on 13 Nov. Until then, nothing changes._ After that date your channel goes back to Free, or to [Free+](https://bloopbot.com/docs/unlock-free-plus#paid) if your linked Discord account is in the Bloopbot Discord. As with any limit, nothing you built is deleted or switched off; [When you reach a limit](https://bloopbot.com/docs/what-your-plan-includes#limits) explains what that means for anything over Free's limits. Cancelling renewal and unlinking Twitch are different actions: unlinking your channel does not cancel your subscription. Use **Manage billing** first, or email support@bloopbot.com if you cannot reach it. Changed your mind about your first paid subscription? Email support@bloopbot.com within fourteen days of buying it, with your Twitch login, purchase date and a request to cancel and refund. Bloopbot will end the subscription and refund that initial payment in full within fourteen days of your request. Outside that window, cancelling normally stops the next renewal and keeps your plan until the paid period ends. Your statutory rights still apply; see [Refunds and your right to cancel](https://bloopbot.com/terms#refunds). If a renewal payment does not go through, you keep your plan while Stripe tries the card again, and the page asks you to update your card in **Manage billing**. Bloopbot also emails you, with the date of the next try. If every retry fails, the plan ends the same way a cancelled one does. ## Emails about your plan Bloopbot emails you when something happens to what you pay for, so a failed card or an ending plan never takes you by surprise. Each email links to your channel's **Plan & billing** page. | When | The email | | --- | --- | | You start paying for Plus or Pro, or upgrade from Plus to Pro | Confirms the plan is active and everything in it is unlocked. | | You switch plan, or between monthly and yearly | Says what changed, in case you didn't mean to. | | A payment doesn't go through | Says when Stripe will try the card again. Your plan keeps working until then. | | The last try fails | Says your channel is going back to Free and nothing you built is deleted. | | A yearly plan is about to renew | A reminder about a week before the charge. Monthly plans don't get one. | | You cancel | A short note from Ryan, who builds Bloopbot, with the date your plan ends. Reply to tell him why. | | A cancelled plan ends | A note from Ryan saying your channel is on Free or Free+ now. | Receipts and invoices come from Stripe, our payment provider, not from Bloopbot. You can also download them from **Manage billing**. The emails go to the address you gave at checkout. If Stripe has none, they go to your confirmed backup email, then to the email on your Twitch account. The emails about payments can't be switched off, because they're about money you're paying. The two notes from Ryan end with a link that stops them, and it also stops his tips and check-ins. ## Posting to X costs extra No plan includes posting to X, because X charges for it. The other platforms Bloopbot posts to cost nothing extra. Posting to X costs money, and we pass that cost straight to you. X charges for every post an app makes on your behalf: $0.20 for a post with a link, $0.015 without. Add X balance in $5.99 top-ups, plus VAT or sales tax where it applies — $5.00 of each goes straight to X; the rest covers card fees and changes in X's pricing. You can connect your own X developer app instead, and X bills you directly. - Your balance never expires, and it is yours whatever plan you are on. - A post that fails costs nothing. A test post that goes out is charged like any other. - If Stripe refunds a top-up, the part of it you have not spent is taken off your balance. - The top-up price is before tax. Where VAT or sales tax applies, Stripe adds it on top and shows it at checkout; it never comes out of the $5.00 that goes to X. - Pay in pounds or euros and the top-up is priced in those currencies, so $5.00 of X spend costs about the same wherever you pay. [Announce your stream on social media](https://bloopbot.com/docs/announce-your-stream-on-social-media#x-costs) shows where the balance lives on the X card, how to add to it and the email you get when it runs low, and [Use your own X developer app](https://bloopbot.com/docs/announce-your-stream-on-social-media#own-x-app) walks through connecting your own app on Plus or Pro. ## A worked example Say your channel is on the **Plus** plan and you want a flow that wakes when chat _means_ something rather than when it matches a word. 1. Open **Settings** › **Plan & billing**. Find **Your features & usage** (open it if it is folded), then look under **AI judgments** for **Intent trigger**. 2. If it reads **On your Plus plan** — or **Included by default**, or **Granted** — add the **AI: chat means…** trigger to a flow, following [the intent trigger guide](https://bloopbot.com/docs/intent-trigger). 3. If it reads **Not included**, the trigger stays locked in the node library. Nothing about your channel changes and no flow of yours breaks, and [the AI features guide](https://bloopbot.com/docs/ai-features) covers exactly what a locked step does. The result: within a few seconds you know whether the capability is yours, why, and — when it is — which step to add. ## Where every channel starts Every channel starts on the **Free** plan: the plan line on **Plan & billing** reads **Your plan: Free**, and each capability says whether Free includes it. None of the paid plans is required to use Bloopbot. When you [upgrade](https://bloopbot.com/docs/what-your-plan-includes#upgrade), Plus or Pro replaces Free or Free+, and when a paid plan ends, your channel goes back to Free, or to Free+ when your linked Discord account is in the Bloopbot Discord. On Free and Free+, your [public page](https://bloopbot.com/docs/public-page#viewers) ends with a small **Stream on Twitch?** box inviting viewers to get Bloopbot; on any other plan it doesn't appear. A channel that was using Bloopbot before plans existed keeps everything it already had: its plan line reads **Legacy (grandfathered)**, and nothing is taken away. ## Troubleshooting - A step is greyed out in the library? Your channel does not currently include it. **Plan & billing** says which plan or default answered, and [the AI features guide](https://bloopbot.com/docs/ai-features) explains the locked-node behaviour for the AI steps. - A flow that used to work does nothing now? Check **Plan & billing** for the capability that flow depends on. A step you do not hold takes its “no answer” path: nothing is broken, but it cannot act. - Your channel says **Free+** and you never bought it? Free+ is free for streamers in the Bloopbot Discord, and your channel switched when you joined or linked your Discord account. [Unlock Free+ by joining the Discord](https://bloopbot.com/docs/unlock-free-plus#leaving) says what happens if you leave. - An AI step suddenly takes its unsure path every time, partway through a stream? It may have used today's allowance: the run log's detail line says so. It starts again at midnight UTC. [Daily AI allowance](https://bloopbot.com/docs/what-your-plan-includes#ai-allowance) lists each plan's numbers. - The next flow (or overlay, or editor) will not save? You have reached that limit — the message names it, and the Limits section shows the count against the ceiling. Delete something you no longer need; **Plan & billing** shows the ceiling and what your channel is using. - The plan line says “none assigned”? Your channel is not on any plan right now, which is rare. The groups below it still list exactly what your channel can use. - There are no **Upgrade** buttons? Only the channel's owner can buy a plan, so editors and moderators never see them, nor **Plan & billing** itself. The owner does not see them either on Pro, when the channel already pays and the change goes through **Manage billing**, or when the page says your plan was set up for your channel directly: that plan is not something you buy or manage. - You paid, but the page still says _Stripe is still confirming your payment_? Some payment methods take a little longer to confirm. Your plan switches over by itself as soon as Stripe confirms it; there is nothing more to do, and you are not charged twice if you look again later. - A capability does not switch on or off from **Plan & billing**? Correct, and deliberate: the page changes your plan, never a single capability. - Didn't get an email about a failed payment? Check your spam folder and the address you used at checkout, which **Manage billing** shows. [Emails about your plan](https://bloopbot.com/docs/what-your-plan-includes#payment-emails) lists every email and where it goes. --- # Unlock Free+ by joining the Discord Join the Bloopbot Discord to put your Free channel on Free+, which adds web requests to your flows and room for five themes at no cost, and see its limits and what happens if you leave. Updated 14 October 2026 ## What Free+ gives you Free+ is the Free plan plus **web requests** in your flows and room for **five themes**, for streamers in the Bloopbot Discord. It costs nothing. A **Web request** step can fetch a forecast, ping your own server or post to a service, the way it does on Plus. [Use Stream Deck keys and web requests in flows](https://bloopbot.com/docs/webhooks#web-request) shows how to build one. Free keeps one theme; on Free+ you can keep five, so you can hold a different look for each game or event and switch your whole stream between them. [Style every overlay with a theme](https://bloopbot.com/docs/widget-themes) shows how to add one and switch to it. Free+ also holds **text-to-speech**: a **Speak text** step that reads viewers' messages out loud on stream, up to 5,000 characters a day. [Let viewers send text-to-speech](https://bloopbot.com/docs/text-to-speech) shows how to set it up with the **Text to speech** pack. Everything else is the same as Free, including the small **Stream on Twitch?** box at the bottom of your [public page](https://bloopbot.com/docs/public-page#viewers). Free+ has limits that Plus and Pro don't: see [How many web requests Free+ runs](https://bloopbot.com/docs/unlock-free-plus#limits). Only Free channels switch to Free+. A channel on Plus, Pro or Legacy keeps its plan, and one Discord account unlocks one channel. ## Join from the dashboard You need to be the channel's owner, on the Free plan, with a Discord account. 1. Find a **Join the Discord** button. On Free it appears on **Overview** under **Unlock Free+ with Discord** (other plans see **Join the Bloopbot Discord** there), on **Plan & billing** under **Free+ unlocks web requests and five themes: join our Discord**, on a locked **Web request** step as **Free+ unlocks this: join our Discord**, on the **Discord** card under **Connections** as **Join ours too? Unlock Free+.**, and and on the last card of [Your first overlay](https://bloopbot.com/docs/tutorials) as the link **Join the Bloopbot Discord**. 2. Choose **Join the Discord**. Discord asks you to sign in and to let Bloopbot add you to its server. Allow it. 3. You land on **Overview**, which says _You’re in the Bloopbot Discord. This channel is on Free+: web requests and five themes are unlocked._ **Plan & billing** now reads **Your plan: Free+**. 4. On the **Flows** page, the header button reads **Web requests: off** until you allow them. Choose it so it reads **Web requests: allowed**. This is one switch for your whole channel, whatever its plan. ![The Plan & billing page on Free, headed Make more of every stream: comparing Plus and Pro benefits and monthly prices, yearly savings, a currency preview and Upgrade to Plus and Pro actions, then a Discord card: Free+ unlocks web requests and five themes: join our Discord, with Join the Discord and Not now.](https://bloopbot.com/docs/screenshots/plan-upgrade.jpg) _On Free, Plan & billing offers Free+ below Plus and Pro, with Join the Discord and Not now._ ![Overview’s Discord card after joining: You’re in the Bloopbot Discord. This channel is on Free+: web requests and five themes are unlocked.](https://bloopbot.com/docs/screenshots/free-plus-joined.jpg) _Back on Overview after joining: you're in the Bloopbot Discord, and the channel is on Free+._ On any other plan, **Overview** still invites you to the Bloopbot Discord: the card reads **Join the Bloopbot Discord** and says to ask for help, share your flows and meet other streamers. It has the same **Join the Discord** and **Already a member? Link your Discord** actions, but no mention of Free+, because your channel already has web requests. Joining links your account to your channel, so the card goes away. Your invitation may also include **What’s new in Discord**, with current community news such as a Build Night or a new workshop. It is extra information; use the same **Join the Discord** button to join. Already in the Bloopbot Discord? Choose **Already a member? Link your Discord** under the offer on **Overview**, or any **Join the Discord**, and sign in with the same account. You won't join twice: it links your account to your channel, and the channel switches to Free+. After **Link your Discord**, **Overview** says _Your Discord account is linked._ **Not now** on a prompt hides that one for 30 days. They all go away while your linked Discord account is in the Bloopbot Discord, and come back if it leaves and Free+ ends. ## How many web requests Free+ runs | Limit | Free+ | | --- | --- | | Web requests in one flow run | 2 | | Flow runs with web requests, per day | 50 | | Flow runs with web requests, per month | 200 | Days and months follow UTC: the day's count starts again at midnight UTC, and the month's on the 1st. - A run counts once, however many web requests it sends. - A run paused by a **Wait** counts again when it carries on, because the part after the Wait runs as a new run. - **Test fire** never sends a request, so it never counts. - Web requests from a marketplace pack that [works on every plan](https://bloopbot.com/docs/the-marketplace#every-plan) never count, as long as you leave them as they came. When a run would go over either limit, it isn't skipped. Its **Web request** step sends nothing and leaves by **bad answer** with status `0`, and the rest of the run carries on down that path. The Run log gives the reason, for example: “This channel has used its 50 flow runs with web requests for today. Upgrade for unlimited:”, followed by a link to **Plan & billing**. For example, give a `!weather` command's **Web request** a **bad answer** path to a **Chat message** saying “The forecast is resting, try again tomorrow.” On a day the limit is reached, chat gets that line instead of silence. ## If you leave the Discord Leaving the Bloopbot Discord doesn't end Free+ straight away. Your channel stays on Free+ for 7 days, and **Overview** says _You left the Bloopbot Discord, so Free+ ends on_ the date, with **Rejoin the Discord**. ![Overview’s Discord card after leaving: You left the Bloopbot Discord, so Free+ ends on a date a week away. Rejoin before then to keep web requests and your extra themes, with a Rejoin the Discord button.](https://bloopbot.com/docs/screenshots/free-plus-grace.jpg) _After leaving: Free+ ends in 7 days unless you rejoin._ 1. Choose **Rejoin the Discord** on **Overview** and sign in with the same Discord account. 2. **Overview** says you're in the Bloopbot Discord again, and the end date is gone. If you don't rejoin, your channel goes back to Free on that date. Your flows stay exactly as they are, but their **Web request** steps stop running, as on Free, and the Run log says your plan doesn't include them. Your themes stay too, and you can still edit and switch between them, but you can't add another while you hold more than Free's one. Rejoin at any time to turn Free+ back on. ## Free+ and paid plans - The button near the foot of the dashboard's sidebar reads **Free+ plan · Upgrade**. On **Plan & billing**, the Plus card lists **No daily or monthly cap on web requests**, which is what Plus adds to Free+. Plus also keeps 15 themes to Free+'s 5. - Upgrading replaces Free+ with Plus or Pro. Staying in the Discord changes nothing while you pay. - When a paid plan ends and your linked Discord account is in the Bloopbot Discord, your channel lands on Free+ instead of Free. - [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes#upgrade) covers prices and checkout. ## Troubleshooting - **Overview** says “This Discord account already unlocks” and names another channel: one Discord account unlocks one channel. Sign in with the Discord account that belongs to this channel, or email [support@bloopbot.com](mailto:support@bloopbot.com) to move the link. - “That Discord account isn’t in the Bloopbot Discord yet.”: the account you signed in with isn't in the server. Choose **Join the Discord** on the same card. - “Couldn’t reach Discord, try again.”: nothing changed. Choose **Try again**. - You joined the Discord from a link outside the dashboard and your channel is still on Free: Bloopbot doesn't know which channel is yours yet. Choose **Join the Discord** on **Plan & billing** to link your account. - There is no **Join the Discord** on Overview: only the channel's owner sees it, and not while your linked account is in the Bloopbot Discord. The Free+ prompts elsewhere show only on Free, and a prompt also stays hidden for 30 days after **Not now**, and while your linked account is in the Bloopbot Discord. - A **Web request** leaves by **bad answer** with status `0` and the Run log says the channel has used its flow runs with web requests: that's the day's or the month's limit. It starts again at midnight UTC or on the 1st, or upgrade to Plus for no limit. [Use Stream Deck keys and web requests in flows](https://bloopbot.com/docs/webhooks#troubleshoot) covers other reasons a request fails. --- # AI features and what’s included What each AI capability does, how to tell if your channel has it, and what “locked” means today. Updated 23 October 2026 ## What “AI” means in Bloopbot A handful of Bloopbot features can ask an AI judge a plain-English question about a chat message — never to generate a reply, only to answer with a probability, a pick from a short list you define, or a position on a scale you define. Nothing it decides is shown to viewers as AI-written text; it only steers which path your flow takes, or whether something gets through. | Feature | What it does | | --- | --- | | Judge & route nodes | Flow-canvas nodes that read what a message means: ask a yes/no question, pick one of several labelled branches, pick a song title/username/game name/number out of a message, work out which of your options a viewer meant, or answer a question from your own FAQ and chat commands. | | Intent trigger | Wakes a flow when chat means something, instead of when it matches an exact word. | | Smarter song matching | A **Find a song** step that picks the track a viewer actually meant out of several Spotify results, and hands you the runner-up for “wrong song”. | | Song policy | A step that screens out troll/meme uploads and checks a track against a song policy you write in plain English. | | AI moderation filter | A step that judges what a message means — harassment, hate speech, sexual content, scam/spam, or your own rule — rather than which exact words it contains. | | Text screening | A step that checks viewer-written text before it is saved or shown. | | Highlights | An add-on: ask us to switch it on for your channel. It looks through your past streams for the moments worth sharing and rates them on the **Highlights** page, where you can make a Twitch clip of any of them. Unlike the rows above it reads the stream’s audio, never to reply, only to find and rate moments. When you make a clip, **Suggest titles with AI** asks an AI model for three titles (funny, hype and deadpan) from what was said and what chat typed, in the style of your channel's recent clip titles; a filter checks them, and you pick one and can change it before you make the clip. See [Find your best moments with Highlights](https://bloopbot.com/docs/highlights). | ## Check what your channel has Open **Settings** › **Plan & billing** in the dashboard's sidebar (the channel's owner has it). The AI capabilities are the **AI judgments** group there: it says whether your channel currently includes each one, why, and how many AI requests your channel has used this month for it. Nothing there switches a single AI feature on or off; a plan that includes more of them is [one upgrade away](https://bloopbot.com/docs/what-your-plan-includes#upgrade). [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) walks through the whole page, including the groups that have nothing to do with AI. > **No prices here on purpose** > > This page shows whether a feature is included for your channel today, not what it costs. There is nothing to buy or set up here. ## What “locked” looks like A feature your channel doesn’t currently include shows up wherever it would normally appear, dimmed, with a small lock badge reading **Not included in your plan** and a short explanation on hover: - On the flow canvas, a locked node (an AI judge/route node, or the intent trigger) appears in the node library, in ⌘K search, when you drag a new connection, and in the sidebar’s suggestions — always visible, never addable. Its preview explains why instead of adding it, and offers **Upgrade to Plus** or **Upgrade to Pro** when that plan unlocks it for the owner. Plans open in a new tab so your flow edits stay here. - A flow someone built _before_ a feature became locked keeps working. The node stays fully editable and deletable, and the flow still runs — the AI step just always takes its “didn’t answer” path (unsure, or the branch built for that), so nothing breaks and nothing crashes. - Every AI capability is a step on the canvas, so this is the only shape “locked” takes — there is no AI settings page or filter card anywhere that can be locked separately. This is intentionally boring: an expired or missing entitlement should feel like “this AI step didn’t run today”, never like a broken flow or a channel-wide problem. ## If your channel doesn’t have a feature at all Nothing changes for you. Every AI feature is additive — it sits in front of behaviour Bloopbot already had, and hands control straight back the moment it isn’t available. A channel with no AI features included is indistinguishable from Bloopbot before any of this existed: the same commands, the same moderation filters, the same song requests. The same is true moment-to-moment even on a channel that _does_ include a feature: if the AI judge times out, is rate-limited, or has not been switched on for this channel, every AI feature falls back to its ordinary, non-AI behaviour rather than blocking chat or failing a flow run. For a suggestion-only command such as `!findsong`, that means asking for a clearer clue rather than guessing a track — see [find a song from a description](https://bloopbot.com/docs/song-requests-ai). ## If a feature isn’t available yet Some AI steps are not available on every channel yet. Most come with a paid plan, which the channel's owner can [upgrade to from Plan & billing](https://bloopbot.com/docs/what-your-plan-includes#upgrade). When a step isn’t available, it still appears in the library with a **Not included in your plan** badge so you can see what it would do — you just can’t add it to a flow, and a flow that already uses it keeps running. Everything else in your channel works exactly as before, and none of these steps is required to run Bloopbot. [What your plan includes](https://bloopbot.com/docs/what-your-plan-includes) lists what your channel holds; for what each one does when it is available, see [the smart song requests guide](https://bloopbot.com/docs/song-requests-ai), [the AI moderation guide](https://bloopbot.com/docs/ai-moderation) and [the flow AI guide](https://bloopbot.com/docs/ai-conditions-and-routing). --- # Connect TikTok and see your stats Connect your TikTok account to see follower, following, like and public video counts on Connections. Updated 14 October 2026 ## Connect your account 1. In **Settings** › **Connections**, select **TikTok**. 2. Choose **Connect TikTok**. Sign in to TikTok if it asks. 3. Approve access to your profile and profile statistics. 4. Back on **Connections**, check the account name and **Connected** badge. Only the channel owner can connect or remove TikTok. Editors can see its statistics. You can add TikTok to a Twitch or Kick channel; keep signing in to Bloopbot with your existing account. If TikTok isn't listed on Connections, the connection isn't available on your channel yet. ![The TikTok connection card with the account name, Connected status and four profile counts.](https://bloopbot.com/docs/screenshots/tiktok-connection-stats.jpg) _The TikTok card shows the connected account, four profile counts and when they were checked._ ## Read your counts The TikTok card shows **Followers**, **Following**, **Total likes** and **Public videos**. Total likes means likes received across your videos; public videos means the number of publicly posted videos. The **Stats checked** time tells you when TikTok supplied the reading. Reload Connections to update it. A reading may be reused for up to 30 seconds. TikTok's counts aren't a live feed of new followers or likes. **Unavailable** means TikTok didn't supply that count. It doesn't mean zero. If a reading fails, the card explains how to retry. A real zero appears as **0**. You can also use these values in flows and widgets from **Variables → Channel data → TikTok account**. For example, `$(data.social_tiktok.followers)` is the follower count. [Social accounts in Channel data](https://bloopbot.com/docs/variables#socials) explains availability checks and update timing. This connection reads profile statistics. It doesn't publish posts or receive TikTok LIVE chat, follows or gifts yet. ## Reconnect or remove TikTok If the card asks you to reconnect, choose **Reconnect TikTok** and approve profile and statistics access again. Cancelling keeps your existing connection. To remove it, choose **Disconnect TikTok** and confirm. Bloopbot forgets the connection and stops reading its statistics. Your Bloopbot channel and flows stay in place. Choose **Connect TikTok** again whenever you want to add it back. --- # Connect YouTube to your existing setup Add YouTube to your existing setup, show live comments and make a command reply in the original live chat. Updated 31 October 2026 ## Connect your channel 1. Sign into Bloopbot with the account you already use. 2. Open **Settings** › **Connections**, then select **YouTube**. 3. Choose **Connect YouTube**. In Google, choose the account and YouTube channel you own, then approve the requested permissions. 4. Back on **Connections**, check the channel name, channel ID and **Connected** badge. The channel ID links to its YouTube page so you can check that you picked the intended channel. YouTube is an additional connection on this setup. Your existing flows, overlays, settings and other accounts stay here. Keep signing into Bloopbot as you do now; connecting YouTube does not create a separate Bloopbot account. Only the channel owner can connect or disconnect it. Editors can see the connection. If YouTube is not listed, connecting YouTube is not available yet. If Google refuses access, return to Connections and try again with the intended account. Cancelling Google leaves your setup unchanged. Google access is currently limited to approved test accounts. If Google says access is blocked or the app is in testing, use your approved Google account; other accounts cannot connect yet. ![YouTube under Connections with the sample Local Streamer Studio channel connected, its channel ID, and Reconnect YouTube and Disconnect YouTube controls](https://bloopbot.com/docs/screenshots/youtube-connected-account.jpg) _YouTube joins the same setup on Connections. Check the channel name and ID after connecting._ ## Show live comments Open a supported chat view in Bloopbot’s apps, or use your existing [Chat box](https://bloopbot.com/docs/chat-box) or [Chat highlight](https://bloopbot.com/docs/chat-highlight) widget. YouTube comments from an active live chat can appear alongside Twitch and Kick. The widget’s platform filter decides which comments it shows. Connecting YouTube alone does not start a broadcast. Commands can reply in the live chat that triggered them; YouTube moderation and other event triggers are not available in this release. Bloopbot keeps encrypted, short-lived recovery records so interrupted connections can resume without repeatedly processing the same chat. These are separate from visible chat history; the [privacy policy](https://bloopbot.com/privacy#youtube) explains what is kept and for how long. Disconnecting removes these records. Replayed comments remain history and do not become commands or rewards. If your channel has Cloud Stream access, **Manage YouTube broadcasts in Cloud stream** opens its broadcast controls. Those controls use this same connection; you do not need to connect a second time. ## Make a YouTube command reply Connect your YouTube channel first. Its broadcast must be live with live chat available, and Bloopbot's YouTube sender must have permission to post there. You keep using the same **Flows** page and the same Bloopbot login. 1. Open **Flows**, then open or add the **Simple command** template. Keep the flow paused while editing. 2. Set **Command** to `hello`, leaving **Prefix** as `!`. 3. In the command trigger, choose **Platform** → **YouTube only**. To accept commands from your supported connected accounts instead, choose **Connected accounts**. 4. In the chat message step, set **Message** to `Hello $(user)! You said: $(query)` and **Send as** to **A reply in the original chat**. 5. Use **Test fire**. The simulated YouTube command should produce a recorded reply, with the sample viewer and words filled in. This preview sends nothing to YouTube and does not check live posting permission. 6. Save the flow, then turn it on when you want viewers to use it. A new `!hello friends` in your YouTube live chat should produce `Hello Viewer! You said: friends`, with the viewer's actual display name. ![Simple command with YouTube only selected and its chat message set to A reply in the original chat.](https://bloopbot.com/docs/screenshots/youtube-command.jpg) _YouTube only on the command, with A reply in the original chat on the message._ The reply appears as an ordinary message from Bloopbot in that same YouTube live chat. It is not a threaded reply. It cannot move to a different broadcast if your selected broadcast changes. Comments on uploaded videos and messages recovered from chat history do not trigger this command. Choosing **YouTube only** or **Connected accounts** also makes this flow's chat actions return to their source chat. That routing stays on if you later change the platform choice; use **Undo** to undo the original change. Existing flows keep their routing until you make this choice, and reused groups keep their own routing. **Twitch and Kick** does not add YouTube to a flow. If Test fire works but the live command does not, check that the flow is on, the command's spelling and platform choice match, and the YouTube connection still shows **Connected**. Check the flow's run history for a refused or unavailable reply. A closed chat, lost posting permission or exhausted allowance can prevent sending. A preview cannot prove those conditions are satisfied. YouTube replies need an incoming command; timers and manual runs cannot choose a YouTube chat to post into. ## Reconnect or disconnect For **Needs reconnecting**, choose **Reconnect YouTube** and approve access to the intended channel again. Reconnecting can clear your selected broadcast; check Cloud stream before the next stream. To remove the connection, choose **Disconnect YouTube**, read the confirmation, and confirm. End an active YouTube Cloud Stream first. Your Bloopbot setup, Twitch and Kick connections stay. Removing Google permission can also affect other Google permissions you granted to the same app and Google account; reconnect those through their original connection controls if needed. If the connection changed or its status cannot be loaded, reload Connections before trying again. --- # What Bloopbot measures and keeps How visits to the public pages and your dashboard are counted, what is never tracked, what is kept after you unlink, and how to opt out. Updated 23 October 2026 ## What is measured, and where Analytics covers the **public** pages (the homepage, these guides and the “Account linked” pages you see after connecting Twitch) and, with the same choice, your **dashboard** (see [What the dashboard measures](https://bloopbot.com/docs/privacy-and-analytics#dashboard)). It counts nothing until you accept analytics, and on the public pages Bloopbot counts: - Page views, including which guides are read and for how long. - Google Ads measurement on public production pages that use Google Analytics, only after you choose **Accept all** on a public page. This permits advertising measurement cookies and sharing those page visits with Google Ads. **Analytics only** keeps Ads off. The Google script is served from analytics.bloopbot.com, and Google measurement passes through our tagging server to Google. Personalised advertising stays off. - Searches in the guides, so unanswered questions show up as guides worth writing. - Clicks on **Sign in with Twitch**, **Open dashboard** and the homepage flow demos. - Whether a channel finished linking, counted once per browser session without any channel or account identifier. - Your answer to **Was this guide helpful?** at the end of a guide. - Microsoft Clarity heatmaps and session recordings across the website and dashboard at bloopbot.com, showing clicks, scrolling, page addresses and how visitors use pages. It does not run in OBS sources, widgets or embedded overlays. > **Cookies wait for your answer** > > The first time you open one of these pages, a cookie bar along the bottom asks whether your visits may be counted. **Accept all** permits analytics and Google Ads measurement, and lets Reddit match your setup completion; **Analytics only** permits Google Analytics and Microsoft Clarity, with Google Ads off. **Reject all** keeps analytics and Google Ads off. The guide works with every choice. Reddit ad measurement runs whatever you choose, including **Reject all**, **Global Privacy Control** or **Do Not Track**. Our server tells Reddit which public pages you visit, that you searched the guides (not what you typed) and that you pressed a sign-in button, with your IP address and browser details. No Reddit script runs on the page. If a Reddit ad brought you, your browser keeps its click ID for 28 days so those events, and your signup, setup steps, first checkout, first live flow and first payment, can be credited to the ad. For those, and for setup completion when you chose **Accept all**, Bloopbot trims and lowercases the email Twitch supplied, then sends its SHA-256 hash to Reddit. Hashing does not make it anonymous: Reddit can use it to identify a matching account. The raw email is never sent, and the hash is removed from Google forwarding. ## What the dashboard measures Your dashboard shows the same cookie bar as the public pages, with **Accept all** and **Reject all** side by side, and the same answer covers both. To change it later, use **Cookie settings** in the [privacy policy](https://bloopbot.com/privacy#cookies-and-measurement). - Nothing is sent to Google Analytics or Microsoft Clarity until you choose **Accept all**. Reject, ignore the bar, or turn on **Global Privacy Control** or **Do Not Track** in your browser, and the dashboard is never counted. - If you accept, Bloopbot counts which dashboard page you opened, so we can tell which parts get used and which are ignored. Microsoft Clarity also records how you use the page, including clicks and scrolling. Input fields and dropdown contents are masked by Clarity. - Google Analytics reports each page under a generic name, such as “Dashboard: flows”, and never under its real address. It does not receive your channel’s name or ids. Clarity receives the actual page address and visible page content, subject to its masking, so do not treat recordings as anonymous page counts. - Setup completion is counted once per channel, when you finish the **Set up your bot** tutorial (a test you put off counts when it later plays) or, on a channel linked before it arrived, when you first publish your overlay in **Your first overlay**. Visiting the sign-in page is a separate intent event, counted once per browser session; the first flow you successfully switch on is counted once in this browser; and the first **Test published output…** that plays on your overlay in the **Set up your bot** or **Your first overlay** tutorial is counted once per channel. These events use generic page addresses without channel, flow or overlay identifiers. If you previously chose **Accept all** on a public page, setup completion is also shared with Google Ads and Reddit as the main signup conversion. Dashboard page views are excluded from Ads. - Your analytics answer is shared with the public pages. Accepting in the dashboard never grants advertising permission; only **Accept all** on a public page does that. **Reject all** or **Cookie settings** also clears any earlier Ads permission. ## What Bloopbot notes without cookies Separately from analytics, and whatever you chose on the cookie bar, Bloopbot notes each day that your channel went live or that someone opened its dashboard. That lets us count how many channels are in use each week. The note is your channel’s Twitch id, the date, and whether it was a stream or the dashboard. It does not say who was signed in, sets no cookie and stores nothing in your browser. ## Where you came from when you signed up When you first link a channel, Bloopbot keeps a note of how you found it, so we can tell which links and communities bring new streamers. The note can hold the campaign or referral code in the link you followed, the site that sent you (its address only, not the page you were on), and the Bloopbot page you landed on first. - It is read from the visit that led to sign-in and carried in the **Sign in with Twitch** link itself. Nothing is stored in your browser and no cookie is set. - It is saved only when signing in links a new channel. Signing in again later, or reading a page without signing in, saves nothing. - If you wander to another page before signing in, the note is lost, and the sign-up is recorded as “direct”. ## Sending a page to your computer On a phone, the top of the homepage and the feature pages offers **Send this to my computer**, for when you would rather sign up at the computer you stream from. The link it sends is the page you are on, with the campaign code it came with, so a sign-up from it is credited the same way. - **Send this to my computer** opens your phone’s share menu, and **Copy link** copies the link. Neither sends anything to Bloopbot. - **Email it to me instead** sends one email with the link to the address you type. Bloopbot doesn’t store the address: it is used for that one email, and a one-way hash of it is kept for at most two hours, so the same address gets no more than one email an hour. The email goes out through Cloudflare Email Service, like our other emails. ## What is never tracked - Nothing in **widgets**, **alerts** or **OBS Browser Sources**. Overlays are streaming surfaces and are never counted. - Google Analytics does not measure chat messages, viewer names or loyalty points. Clarity records website and dashboard pages, including viewer-facing website pages; its masking hides input and dropdown contents. - No Twitch tokens or keys are intentionally sent as analytics events or custom identifiers. Clarity captures actual website page addresses and page interactions; it is never loaded in OBS sources or overlays whose addresses contain browser-source keys. - The dashboard is measured only if you accept. Clarity covers team pages too, with the same choice. - Sign-in parameters and channel IDs are removed from Google Analytics page reports. Clarity uses actual website addresses, including dashboard paths. - No personalised advertising or advertising profiles. Advertising measurement cookies, Google Ads and the Reddit setup match require a separate choice on a public page; dashboard acceptance never grants that permission. Reddit's public page and Reddit ad signup measurement runs whatever you choose. Dashboard page views, widgets and overlays are not sent to Ads. ## Highlights training labels If your channel has the [Highlights](https://bloopbot.com/docs/highlights) add-on, Bloopbot keeps a small record for each moment it finds, to improve which moments Highlights picks. It holds numbers and yes/no answers only: where the moment is in the broadcast, how strong the laughter, shouting, volume and chat signals were, the AI's rating, whether you clipped, dismissed or watched it, and your answer to **Good clip?**. It holds no words, no chat and no titles. It is kept for 2 years and deleted with your channel. The [privacy page](https://bloopbot.com/privacy#changes) lists the change. ## Highlights clip titles When you press **Suggest titles with AI** in the clip dialog, [Highlights](https://bloopbot.com/docs/highlights) sends that moment’s words and chat text (no usernames), with the titles of up to 10 of your channel's public clips from the last 60 days as style examples, to an AI model that suggests three short clip titles, and a filter checks each one. Nothing is sent until you press it. The titles are offered in the dialog and are not kept, and they are never added to the training labels. The [privacy page](https://bloopbot.com/privacy#changes) lists the change. ## What is kept after you unlink To unlink, open **Settings** › **Connections** and choose **Unlink Twitch**, or **Unlink Kick** on a channel you signed up for with Kick. A channel is deleted only when unlinking leaves it with no streaming platform: on a Twitch channel with Kick added, **Unlink Twitch** asks you to **Disconnect Kick** first, and disconnecting Kick removes only the Kick connection, never the channel. Unlinking your channel deletes its settings, flows, loyalty points, viewer data and everything else the features use. Bloopbot keeps a short history that is tied to your channel’s Twitch or Kick id and nothing else: - when the channel linked and unlinked, - which plans it held, - which days it streamed or used the dashboard, - where it signed up from, and - how much AI it used, per day: the number of requests, the tokens and the cost. That history is deleted 24 months after you unlink. If you would rather it went sooner, ask through the contact details on [the privacy page](https://bloopbot.com/privacy) and we will delete it. Unlinking also removes your custom domain, if you set one up. If you listed anything in the marketplace, your listings are taken down, but streamers who already installed them keep their copies, still credited to your creator name. Ask for your history to be deleted and that name becomes “Former creator”. Payment records (your plan, the amounts and your invoices) are kept separately, because accounting rules require it. The accounting policy keeps these records for six years from the end of the financial year they relate to, with longer retention only when law or a dispute requires it. They are reviewed separately from channel deletion; the [privacy page](https://bloopbot.com/privacy#retention) explains the full retention rules. ## Delete a connected social account To remove a Bluesky, Mastodon, X, Threads, Instagram or Facebook connection: 1. Open **Settings** › **Connections** in your channel’s dashboard. 2. Open the account’s card and disconnect it. 3. Its saved account details and tokens are deleted, and flows can no longer post through that connection. Posts already published remain on the platform; delete them there if you want them removed. For Facebook, Instagram and Threads, you can also request deletion through Meta’s app settings. Bloopbot provides a confirmation code and a status page for the completed request. If you cannot reach either route, email support@bloopbot.com with your Twitch login and the account to remove. See [Deleting your data from Meta accounts](https://bloopbot.com/privacy#data-deletion). Disconnecting X keeps the financial ledger. It does not automatically refund unused credit or cancel a paid plan; email support@bloopbot.com about unused purchased credit, and use **Manage billing** to cancel your subscription. ## Opt out ![The cookie bar: cookies count visits, show how pages are used and measure ads, with a pointer to the privacy policy, above Accept all, Reject all, Analytics only and a Privacy policy link](https://bloopbot.com/docs/screenshots/public-cookie-choice.jpg) _Choose Analytics only to allow analytics while keeping Google Ads off._ You choose. The first time you open one of these pages, a cookie bar along the bottom asks whether your visits may be counted. Public pages offer **Accept all**, **Analytics only** and **Reject all** with equal prominence. Choose **Analytics only** for Google Analytics and Clarity without Google Ads. Reject, ignore the notice, or close the page, and no cookies, Google Analytics, Clarity or Google Ads measurement starts. Reddit ad measurement still runs (see above). Your answer is remembered in this browser, so the notice does not come back and the answer holds on every Bloopbot page you read from then on. You can change your mind at any time: press **Cookie settings** in the footer at the bottom of the page or in the [privacy policy](https://bloopbot.com/privacy#cookies-and-measurement), answer again, and measurement starts or stops with the new answer. The link is on the pages that can be measured — the homepage, these guides, the “Account linked” page and the privacy policy, which also changes your dashboard choice. The setup wizard keeps **Cookie settings** beside its main action at the foot of the page. Legal and sign-in pages show the button in the bottom corner after you answer. Sign-in pages offer the public measurement choices; legal pages use Clarity with analytics consent. Turning on **Global Privacy Control** or **Do Not Track** in your browser refuses for you, and it takes precedence over an earlier accept; it does not stop Reddit ad measurement. A content blocker can block Google Analytics, Google Ads, Reddit Ads and Microsoft Clarity separately. Not sure how to switch this on? Search your browser’s settings for “Global Privacy Control” or “Do Not Track”. Some browsers offer it under Privacy, others through an extension. ## The “Was this guide helpful?” buttons Each guide can end with a quick yes/no question. It appears only once you have accepted analytics, because that is the only place the answer goes: the guide’s name and your yes or no, with nothing else. If you reject or ignore the notice, the question stays hidden and there is nothing to click. There is no text box and nothing you type is sent. Use [the troubleshooting guide](https://bloopbot.com/docs/troubleshooting) to collect a proper problem report when something is wrong. For the full policy — what Bloopbot holds, why, and how to ask us about it — read [the privacy page](https://bloopbot.com/privacy), alongside [the terms of use](https://bloopbot.com/terms).