Widgets module
The Widgets module provides browser-source overlays for your streaming software (OBS, Streamlabs, and similar tools). It ships twelve configurable native widgets, an AI generator that writes custom widgets from a description, a full code editor for hand-written HTML/CSS/JS overlays (with StreamElements compatibility), and Catalyst Scenes — named layouts served as a single browser source per scene.
Available on the Free tier and above. See Module access by tier.
Native widgets
Configure these in Widgets → Gallery; each has style controls (theme dark/light/transparent, accent color, font color, font, base size, font size), its own settings, and live simulate buttons in the configurator.
Base Size vs Font Size. Base Size (12–22 px) is the widget’s layout unit — padding, gaps, bars and icons are all measured from it, so moving it resizes the whole card. Font Size (50–200 %) multiplies the text on top of that, so you can make the type bigger inside a card whose footprint you already like, or keep a large card with small type. One exception: the Wheelspin wedge labels size themselves to fit their wedge, so they follow the wheel rather than the Font Size slider.
Font Color is separate from Accent Color: leave it on Auto to follow the light/dark theme, or set a color to override every piece of body text. Accent-highlighted text (counters, progress figures, reward names) deliberately keeps following Accent Color — that is what the accent is for.
| Widget | What it shows | Variants |
|---|---|---|
| Alerts | Rewards earned in the Events module, played in a sequential queue and styled per trigger (sub, resub, gift, cheer, tip, follow, chat, meta, manual). Display duration 3–15 s, plus an adjustable gap between alerts and an optional same-type cooldown | strip, burst, ribbon |
| Chat display | A styled live chat overlay — badges, first-time-chatter highlight, per-role styling | cards, cinema, kinetic |
| Goal progress | Progress toward a Numbers metric (picking up a matching native Twitch goal automatically), an Events event/rule goal, or your active tip goal | bar, radial, thermometer |
| Leaderboard | Top gifters, cheerers, and tippers from the Events module. Pick any combination — a single list shows on its own, two or more rotate on an interval you set (3–60 s). Windowed to this stream, week, month, or all time; week and month follow Twitch’s own reset times | gifters, cheerers, rotating tabs |
| Counter | One live number from Numbers (follows, subs, bits, sub points, Plus Points, streaks…), Chatters (command counts, named counters — channel-wide or all viewers combined, regulars), or Events (rewards earned, gifts, bits, follows) | — |
| Ticker | A scrolling recap of recent events | rail (marquee), stack |
| Hype Train | Live hype-train overlay — start spotlight, level-ups, last-minute warning, final results with top contributors, and an optional all-time-high record line | banner, theater, streak |
| Subathon timer | A countdown that grows with subs, gifts, and bits — state lives on the server, so it survives OBS restarts | slab, ring, stack |
| Subathon goals | A ladder of goals that fill as viewers subscribe, gift, cheer, or tip — combined points or a single contribution type, with optional spoiler goals and per-goal timer bonuses | ladder, milestone track, spotlight |
| Wheelspin | A spin-to-win wheel of up to 24 items, fired by a chat command, by bits / gifted subs / tips crossing a threshold, or by a channel point redemption | Ember Dial, Theater Wheel, Ticket Rail |
| AI persona bubble | An on-screen bubble that comments on your stream every 1–15 min while you are live, written from your prompt template plus your live title, category, viewer count and uptime, and your Channel Lore. Optionally also recent chat and the AI personas behind it, with opted-out viewers removed. Needs the AI Personas module on your plan and switched on; spends your channel’s shared daily AI token allowance | refined, cinema, minimal |
| Ending credits | A full-screen credits roll for the stream you just finished — top gifters, cheerers and tippers, new subs, resubs, raiders, hype train conductors, mods on duty, VIPs and first-time chatters. Full-bleed 1920×1080, so it wants a scene of its own | theater, marquee card, ticket stub |
The Goal progress widget supports up to 9 instances per scene, each with its own source and placement — track a follower goal, a rewards goal, and your tip goal side by side.
Each goal can also carry an event window — a start and end set in Widgets → Goal → Settings. Before it opens the overlay shows Starts …, while it runs Ends …, and once it closes Ended … with the card dimmed and frozen. How much the window scopes depends on the source: a Numbers metric counts only inside it — the window replaces that goal’s own Window setting, and Numbers counts by whole UTC days, so a part-day window covers those days in full, a Rewards event counts only rewards earned inside it, while a Rewards rule and your tip goal keep their own running totals — there the window only controls what the overlay shows and when it freezes. Leave both blank to keep counting at any time. You pick the dates in your own timezone and they’re stored in UTC, so an overlay shows them in whatever timezone the machine running OBS is set to. If the Numbers goal you’re tracking already has its own dates (Numbers → Goals), leaving the window blank here inherits them.
The Subathon timer is configured in Widgets → Subathon Timer → Settings:
- Title — the label shown with the countdown (defaults to “Subathon”). Leave it blank to hide the label entirely.
- Starting time — entered as hours / minutes / seconds. It’s what the countdown starts from and what Reset on the Controls tab returns it to. Reset leaves the timer paused at that value, so press Resume on the Controls tab when you’re ready to start it.
- Maximum time — an optional cap, also entered as H / M / S. Events (and the Controls tab’s Add buttons) stop adding time once the countdown reaches it;
00:00:00means no cap. Set on the Controls tab is exempt, so you can still override the cap by hand. - Minutes per new sub / gifted sub / 100 bits / $1 tipped — how much each event adds. Drag the slider for whole minutes, or type an exact value in the box beside it — decimals included (
0.5= 30 seconds,0.67= 40.2 seconds). These are rates: the value is multiplied by the size of the event and only the total is rounded to a whole second, so a $100 tip at0.67adds exactly 67 minutes, and a 20-sub gift bomb pays 20× the gifted-sub rate. Tips count their cents too — a $12.50 tip at1adds 12m30s. Bits are the exception: they’re counted in whole blocks of 100, so a 250-bit cheer pays for 200. - Minutes per follow / per raid / per raider — optional time for follows and incoming raids, all set to
0(off) by default so nothing about a running subathon changes until you turn them on. A raid pays the flat per raid amount plus per raider × the raid’s viewer count, and Minimum raiders ignores raids smaller than the number you set. Each follower only counts once, so an unfollow/refollow can’t farm time. - Multiply time by sub tier — off by default. Turn it on and Tier 2 subs pay 2× and Tier 3 subs 6× (both adjustable), applied to new subs, resubs, and every sub in a gift bomb. Prime subs count as Tier 1.
- When timer hits 0 — stop, go negative, or hide the widget.
Follows and raids only reach the timer when something on your account subscribes those Twitch events — the Numbers module subscribes both automatically (it’s on every plan and collects passively), or add a follow / raid rule in the Events module. Without either, the follow and raid settings sit there doing nothing.
The timer also pauses automatically when your stream goes offline (Auto-pause when stream goes offline), and its state lives on the server, so it survives OBS restarts. Events add their time server-side as they arrive, so subs, cheers, and tips still count while OBS is closed — the widget just has to exist on your account.
The Subathon goals ladder tracks either combined points or a single contribution type. It counts subs, gifted subs, cheers, tips, and channel-point redemptions directly from the events themselves — no Events module reward rule is needed, and every contribution counts whole (a 100-bit cheer is 100 bits of progress regardless of any rule thresholds). The tally is kept server-side as events arrive, so contributions still count while OBS is closed — the widget just has to exist on your account. Like the timer, an event only reaches the ladder when something on your account subscribes it on Twitch — enabling the Numbers module or running EventSub setup in the Events module covers subs, gifts, and cheers; tips flow in from the Tipping module. When it’s set to Single type → Tips, you can turn on Sync progress with the active tipping goal: the widget then reads its tip total straight from your active goal in Tipping → Goal — manual off-platform adjustments included — instead of counting only the tips the overlay happened to see. Tips are no longer tallied separately while sync is on, progress jumps to the tipping goal’s total the moment you enable it — unlocking every rung already below that total, including its timer bonus — and thresholds are read in major units of that goal’s currency. The settings panel shows the live goal and a Match top goal to tip target button that sets your highest rung to the goal’s target. The ladder’s Overall meter shows how much is left to the top goal alongside the percentage — an amount in single-type mode ($340.00 to go, 1,250 to go) and a remaining percentage in points mode, so raw point totals stay off stream. Goals visible at once caps all three styles, the Milestone Track’s pins included; the track spaces its pins evenly rather than by threshold, so a lopsided ladder (500 / 1000 / 1500 / 40000) no longer bunches them together, and its caption reports how many of the full ladder are unlocked. The ladder is always ordered by threshold, lowest first — drag a goal’s handle in Widgets → Subathon goals → Settings to move it to a different rung (the thresholds stay put, the goal moves onto one), and use the + between two rows to insert a new rung at the midpoint of the gap. A rung whose bonus time was already awarded stays awarded, so reordering never re-adds time.
Set to Single type → Subs or Single type → Bits, the same ladder offers Sync progress with a Numbers goal. It then reads its total from Numbers → Goals — your manual override, or, for a live Twitch creator sub goal, that goal’s own progress, which is the count you see on Twitch — so a ladder created mid-subathon starts at 53/100 instead of 0. Pick the metric (total subs, new subs, resubs, gifted subs; a bit ladder always tracks bits) and the window: This stream resets every stream and Today resets at midnight UTC, so a subathon that runs past either boundary usually wants Last 7 days or Last 30 days. (A live Twitch creator sub goal reports its own running progress, so the window doesn’t change what that ladder reads.) While sync is on the chosen contribution type is no longer tallied separately, progress jumps to the Numbers total as soon as you enable it — unlocking every rung already below it, timer bonuses included — and the panel offers a Match top goal to Numbers target button. It’s mutually exclusive with the tipping sync above, since each needs its own single type.
The Wheelspin widget is configured in Widgets → Wheelspin → Settings:
- Items — 2 to 24 entries. Unchecking an item keeps it on your list but leaves it off the wheel, so you can swap prize pools without retyping them.
- Weights — every item starts at weight
1. Set0.5to make it half as likely,0.2for a fifth, or up to10for the inverse — a jackpot that hits rarely. The settings panel shows each item’s real percentage beside it, so you can see the odds you configured. The range is 0.1–10 and only enabled items count toward the odds; because the floor is 0.1, unchecking an item is still how you take it off the wheel entirely. The overlay is drawn to match: the Ember Dial and Theater Wheel give each item a slice sized to its weight, and the Ticket Rail repeats heavier items more often in its strip, so viewers can read the odds off the wheel instead of taking your word for them. Two caveats worth knowing — a very small weight beside a very large one becomes a sliver too narrow to print a name in, so its label is hidden (the item is still on the wheel, still spins, and is still announced by name when it wins); and an extreme ratio in the Ticket Rail is capped so the strip stays readable, at which point every item gets one card and the strip stops encoding the odds. The odds themselves are always exact either way — the winner is picked from the weights on the server, never from the drawing. - Chat command (default
!spin) and Who can spin — broadcaster only, or broadcaster + mods. A command cooldown (up to 5 minutes, or off) throttles repeat spins. - Event triggers — also spin when bits, gifted subs, or tips cross a threshold you set, or when a channel point reward is redeemed. For the redemption trigger, pick one of your custom rewards or leave it on Any channel point reward; a reward set to need manual approval spins the wheel when it’s redeemed, not when you approve it. (Custom channel point rewards need Twitch Affiliate or Partner.) The viewer who triggered it is shown with the result. All trigger sources share one cooldown, so a burst of cheers can’t stack spins.
- When idle — hidden until triggered (spin, show the winner for 5 s, fade out) or always visible with the last winner highlighted.
- Spin duration (3–10 s) and Show who spun with the result.
- Post winner in chat — an optional templated announcement with
$(username)and$(item)slots.
Triggers are detected by the Chatters module, which reads your chat and your bits/gift/tip/redemption events. Event triggers — the redemption one included — work whether or not the Chatters bot is enabled; the chat command needs Chatters enabled, since that’s what listens for !spin. Turning the redemption trigger on and saving also subscribes your channel to Twitch’s channel point redemption events, so it starts working from the next redemption with nothing else to set up.
The Ending Credits widget is configured in Widgets → Ending Credits → Settings:
- Credit sections — pick any combination of top gifters, top cheerers, top tippers, new subs, resubs, raiders, hype train conductors, mods on duty, VIPs and first-time chatters. They roll in the order listed, and a section with nobody in it is skipped unless you turn Skip sections with nobody in them off. Gifted subs are credited to the gifter under Top gifters rather than listing every recipient under New subs, so a gift bomb doesn’t bury the rest of the roll.
- Title and Subtitle — the title card at the head of the roll. Leave the subtitle blank to hide that line.
- Window — This stream by default, which means the stream you are on, or the last one if you are already offline. Last 7 days, Month and All time are also available for a season recap. Mods and VIPs are always read live from Twitch, so the window doesn’t apply to those two.
- Roll duration (20–180 s) — total time from the title card to the last name. A long list scrolls faster rather than overrunning the duration you set.
- Names per section (3–25) — anyone past the cap is counted in a
+ N moreline, so nobody is silently dropped. - Roll when the scene loads — on by default. Switching to the scene in OBS starts the roll and switching away stops it, which is the whole setup if Ending Credits has a scene of its own. (This uses OBS’s own source-visibility events, so it works with the default Shutdown source when not visible setting left off.)
- Chat command (default
!credits) and Who can run it — broadcaster only, or broadcaster + mods. The command needs the Chatters bot enabled, since that’s what listens for it. Leave the field blank for no command. A command is one word — letters, digits,-or_— and the leading!is added for you if you leave it off; the Controls tab shows what is actually listening. It also takes an argument:!credits restart,!credits next,!credits holdand!credits resumedrive the roll from chat. - Loop until the scene changes — off by default, which holds the closing card on screen after the last name. Turn it on for a BRB scene that has to fill an unknown amount of time.
- Closing note — rolls last, after every section.
{viewers}and{duration}are substituted; either shows as—rather than0if we never got a reading.
The Theater variant fills the frame with a backdrop while it rolls; Marquee card and Ticket stub sit over your game feed. All three render nothing at all when they aren’t rolling, so the source is invisible for the rest of the stream.
Because it is full-bleed, Ending Credits takes the whole canvas and cannot share a scene with another widget. Give it its own scene in Catalyst Scenes and switch to it when you are wrapping up.
The Controls tab drives a live roll: Roll now starts the credits on stream whether or not the credits scene is up, Restart takes it back to the title card, Next section advances immediately, and Hold freezes the roll where it is. It also shows what is about to play, and carries two lists a roll usually needs:
- Add a name — for the people the events never told us about: an off-platform tip, a guest, an editor. Pick the section it belongs in. Cleared when the stream ends. Mods and VIPs aren’t offered here, because those two are statements about a Twitch role and a typed name can’t make one true.
- Exclude from the roll — bots, and anyone who asked to stay off screen. This one persists between streams.
Credits are tallied server-side from the same events the rest of the platform reads, so they still count while OBS is closed — the widget just has to exist on your account. Which events reach it depends on what your channel subscribes: enabling Numbers or running EventSub setup in the Events module covers follows, subs, gifts, cheers and raids; tips come from the Tipping module; mods and VIPs are read from Twitch at roll time. A section we can’t read is skipped and the reason is shown on the Controls tab, rather than rolling an empty heading — VIPs in particular needs the permission that the Chatters VIP commands ask for, so it stays skipped until those are switched on.
The Counter widget can also surface Plus Points (Numbers’ Plus Program estimate) — a live snapshot shown without a time window. The Hype Train widget has a Show all-time-high record toggle that adds a record line (“Best Lv N” and your current train as a ”% of record”), driven by the all_time_high_level / all_time_high_total fields that its hype-train events carry (custom widgets can read them too — see below).
The Hype Train’s conductor pills are counted from the subs, gifts and cheers themselves, so they fill in whether or not you run any Events rules, and they show real counts (“6 subs”, “4.2K bits”) rather than Twitch’s point figure — Twitch reports a train in points and never says how they split between subs and bits. The counting happens on our side, not in the overlay, which means it doesn’t matter when you opened the browser source: an overlay added half-way through a train still shows the whole train, two overlays on the same channel always agree, and nothing depends on your PC’s clock.
The subs and bits that trigger a train land a moment before Twitch says it started, so the window reaches back 90 seconds before the start and 2 minutes past the end — the same window the Discord bot uses when it posts a train’s results, so the two report the same numbers. A contribution delivered later than that lands outside both.
The streak variant’s contribution feed is a live ticker, so it shows contributions as they arrive while the overlay is open — the pre-train ones count toward the pills but aren’t replayed into the feed. And the countdown runs off the train’s own expiry rather than off contributions, so it stays accurate through a quiet stretch.
Catalyst Scenes
A scene groups enabled widgets into a named 1920×1080 layout — one for gameplay, one for Just Chatting, one for BRB. Two starter scenes are created for you.
- Widgets snap to an anchor grid (3 rows × 4 columns, plus full-width and center zones; short widgets can take a half-cell). The ticker uses full-width anchors only, and other widgets shift automatically to make room for it. Ending Credits is full-bleed — it takes the whole canvas, so it has no placement to pick and belongs on a scene of its own.
- Each widget instance has a per-scene scale (25/50/75/100%).
- Each scene produces one browser-source URL (
/v1/scene/<scene-id>?token=…, added at 1920×1080). The page checks for layout changes every 30 seconds, so edits in the dashboard appear in OBS without touching the source.
Manage scenes on Widgets → Catalyst Scenes (desktop only): create, rename, duplicate, reorder, and delete scenes, place widgets on the canvas by clicking a grid zone, and copy the scene URL.
Custom widgets
Widgets → Custom Widgets hosts widgets you write (or generate) yourself — HTML, CSS, JS, and a JSON field schema that renders a settings form. The editor includes a live preview, a schema panel, an error log fed by runtime errors from your live overlays, and version history with publish: OBS always renders the published version, so you can iterate on a draft safely and revert if needed (last 10 versions kept).
Custom widget code runs in an isolated browser context and talks to StreamerCatalyst through two APIs:
- SC runtime (
SC_API) — live event subscriptions, per-widget key-value storage (8 KB per value, 100 keys, 100 KB per widget), module data (Events/Numbers/Chatters metrics, goals, leaderboards), a Twitch data proxy (users, streams, clips, polls, predictions, charity — rate-limited per channel), andSC_API.ai.completefor AI text (opts.max_tokensaccepted, 16-512 — it bounds the length of the returned text, not the model’s own thinking, so it does not reduce what a call costs; capped at 120 calls/hour per channel, since an overlay URL is public).SC_API.ai.remaining()answers{ unavailable: true }rather than a fabricated0when the budget cannot be read.SC_API.ai.personaComment()is the AI persona bubble’s own call: same daily token budget, but gated on the channel being live and on the AI Personas module, and its prompt is built server-side from your lore and personas. It resolves to{ skipped }or{ error }rather than rejecting, and answers are capped at 500 characters. SE_APIcompatibility layer — StreamElements-stylestore.get/set,counters.get(a bare name reads one of your Chatters counters — lowercasea-z,0-9and_, up to 32 characters, e.g.deaths— and gives its channel-wide value, the one your!deathscommand prints, which is what the name means on StreamElements; a dotted name reads a module metric, e.g.numbers.follows,rewards.total_bits,chatters.regulars_count. A name that resolves to nothing, or one needing an option a name can’t carry, is rejected rather than answered with a0— sochatters.deathsis an error, not a counter: a counter is spelled bare. To total a counter across every viewer instead, useSC_API.chatters.metricwithnamed_counter_total),sanitize, andonEventReceivedevents (follows, subs, resubs, gifts, cheers, raids, chat messages, channel-point redemptions, hype trains, stream online/offline). Tips are delivered astip-latest(via StreamerCatalyst tipping). Hosts, merch, and charity SE events have no Twitch equivalent here and are not delivered.
Three more things match how StreamElements serves an overlay, so widgets written for it run unmodified:
{fieldName}placeholders in your HTML, CSS, and JS are replaced with the field’s current value when the overlay is served — sofont-size: {fontSize}pxin CSS works the same way it does on SE. Only names that match one of your fields are substituted, and the braces must hug the name;const { goal } = fieldDatais left alone.- jQuery is available to widgets whose code calls
$(...)orjQuery. It’s injected automatically for those and left out of everything else, so widgets written againstSC_APIstay lean. session.datais present on theonWidgetLoaddetail in SE’s shape (tip-goal,follower-session,cheer-month, …), which is what goal and counter widgets read at startup — and it’s filled from your real history, so an imported goal resumes its running total instead of restarting at zero every time OBS reopens the source.
Those counters come from the same data your dashboard shows:
| SE counter | Filled from |
|---|---|
follower-*, subscriber-*, cheer-* | your Numbers follow / sub / bits totals |
tip-* | your tipping ledger, converted to your currency |
follower-goal, subscriber-goal, cheer-goal | your live Twitch creator goal’s progress, or the target you set in Numbers |
tip-goal | your active donation goal |
session, week, and month mean your current stream (the last one if you’re offline), 7 days, and 30 days. total means since StreamerCatalyst started tracking your channel, not your lifetime Twitch numbers — if you’re coming from StreamElements, expect that one to read lower than it did there. Two smaller notes: cheer counts only accumulate from the point this shipped (the bits amounts are complete), and the *-latest keys start empty and populate as soon as a follow, sub, cheer, or tip comes in.
Everything else — styling, layout, animations, and live reactions to follows, subs, cheers, and tips — behaves as it did on StreamElements.
Total widget source is capped at 1 MB. Widgets can be exported as a zip bundle.
Generate a widget with AI
Describe the widget you want (up to 400 characters, plus an optional style hint) and the AI writes the full widget — markup, styles, behavior, and a settings schema — ready to preview and edit. From the editor’s AI assist panel you can also refine an existing widget with an instruction (“make the background glassy”, “add a combo counter”).
Generation is limited to 10 per hour and consumes your channel’s daily AI token allowance (Affiliate 25,000 / Partner 100,000 / Partner+ 250,000 tokens, reset at midnight UTC; unavailable on Free). Generated widgets follow the same safety rules as hand-written ones: vanilla self-contained code, no external scripts.
Import from StreamElements
The Import tab accepts a pasted StreamElements widget (HTML/CSS/JS/fields) or an exported zip. Imported widgets run against the SE_API compatibility layer at render time; the editor flags anything it stubs (e.g. SE_API.tip, the imperative shim, which stays stubbed even though tip-latest events fire).
A StreamElements export unzips to a folder holding widget.ini plus html.txt, css.txt, js.txt, fields.txt and data.txt — drop that zip in as-is. The importer reads widget.ini to find each part, converts SE’s field types to ours (colorpicker → color, dropdown → dropdown, googleFont → font, slider → slider), and carries data.txt over as your saved settings, so the widget arrives configured the way it was in StreamElements rather than blank. Plain bundles work too — any zip with an HTML, CSS, and JS file (plus an optional fields.json). Files macOS adds to zips (__MACOSX, ._ stubs) are ignored, and each file is capped at 500 KB with the zip capped at 5 MB.
Two things don’t survive the trip: dropdown option labels (the underlying values are kept, so the widget still behaves correctly) and images hosted on StreamElements’ CDN, which keep working from their original URLs but are worth re-uploading under Assets so they aren’t at the mercy of another service.
Sync a field with a goal
An imported widget’s goal target is a number its author typed — change your real goal and the overlay keeps showing the old one. In the editor’s Fields tab, any number or text field can be synced with a goal instead: flip the toggle, pick the goal and which part of it you want, and the field follows along.
| You can sync to | Which gives you |
|---|---|
| Your tip goal | Target, current, remaining, or the goal’s name |
| A Numbers goal — followers, subscribers, bits, or Plus Points | Target, current, remaining, or the goal’s name |
| Your charity goal | Target, current, remaining, or the campaign’s name |
Numbers goals resolve the same way the dashboard does: a target you set there wins, otherwise your live Twitch creator goal.
Plus Points is the one that needs nothing set up: with no target of your own it aims at the next Plus Program level (100, then 300), and its progress is the same month-to-date number the Plus panel and a Plus counter overlay show. It runs on Twitch’s monthly cycle, so it resets on the 1st like the figure on your Twitch dashboard.
Syncing is per field, so a widget can take its target from your tip goal and its title from the goal’s name while everything else stays hand-set. Values update on stream as the goal moves — there’s no need to restart the browser source when you raise a goal mid-stream.
Two things worth knowing. Your typed value stays put as the fallback: if the goal you synced to isn’t set yet (or gets archived), the field quietly uses what you typed instead of showing zero. And turning sync off keeps whatever number was on screen, so nothing jumps.
When you import a widget with goal-shaped fields, the Import tab offers to sync them right there. It defaults to keeping the imported value — accepting is a deliberate choice, since it overrides what the widget shipped with.
Sounds
Every native widget has a Sounds tab beside Style and Settings. Assign a sound to an event the widget shows and it plays at the moment the widget shows it — an alert sound waits in the same queue the alert does (gap and same-type cooldown included), so the two land together instead of drifting apart on a busy stream.
Two sources, one picker:
- The StreamerCatalyst library — a set of sounds we host, free on every tier.
- Your own uploads — the same audio library your custom widgets use. A sound you upload from the Sounds tab is available to a custom widget’s Sound field, and one you uploaded for a custom widget shows up here. Uploads use your widget storage and its per-tier sound size limit (see Assets); the library is available even on Free, where uploads are not.
Sound assignment is off by default — nothing makes a noise until you pick one.
One sound per event, per scene
Within a Catalyst Scene, an event can carry one sound across all the widgets in it. If your Alerts widget plays a sound for New follower, the Goal widget in the same scene cannot also play one for it — its row says which widget has it, with a button to move it across. Different scenes are independent, so a BRB scene and your main scene can each have their own.
Moving a widget to another scene takes its sounds with it. If the widget in the new scene already has one of those events, that one assignment is dropped rather than doubled up — reassign it there if you want it.
Each widget only offers the events it can actually show:
| Widget | Events you can attach a sound to |
|---|---|
| Alerts | New follower, new subscriber, resub, gifted subs, bits cheered, tip, reward earned |
| Subathon timer | New subscriber, gifted subs, bits cheered, tip, charity donation, new follower, raid |
| Subathon goals | New subscriber, gifted subs, bits cheered, tip, charity donation, channel-point redemption, goal reached |
| Goal | Goal reached |
| Hype train | Train starts, levels up, ends |
| Wheelspin | Wheel starts spinning, wheel lands on a winner |
| Chat display | First-time chatter, every chat message |
The other native widgets have no moment a sound belongs on, so their Sounds tab carries the upload manager only.
Chat display’s two keys
First-time chatter fires once per person, ever — the first message someone has ever sent in your channel, the same moment the widget outlines in the overlay. Turning Highlight first-time chatters off changes the outline only; a sound you assigned still plays, because it is an assignment rather than an appearance option.
Every chat message fires on every message the widget draws.
A widget has one audio channel — a new sound stops whatever it was already playing — and chat is continuous, so an unspaced sound on a busy stream would restart before you could hear any of it. Both keys are therefore spaced by at least 0.4 s, and a message that lands inside that gap makes no sound. That applies to first-time chatters too: a raid can deliver several people’s first message inside a second, and without the floor none of them would be audible. Pick short sounds.
When both are assigned:
- A first-time chatter plays their sound rather than the per-message one, and may interrupt a blip that is playing — the rarer moment wins.
- That first-timer sound then holds the per-message one off for about 3 seconds, so it gets a run at being heard. This is a fixed hold, not a measurement of your file: a sting longer than that can still be cut short by the next message. Keep it under 3 seconds if you want it to finish.
Assign only Every chat message and a first-time chatter gets that sound instead — but it is the same sound on the same 0.4 s floor, so a first-timer who speaks straight after another message is silent like any other.
Testing
The configurator’s preview plays your sounds when you press a simulate button, using the sound you have picked — including one you have not saved yet. Use the Sound on / Sound off button beside the simulate row to mute it. The Stage and the widget gallery never play sound.
Rights
You are responsible for holding the rights to any audio you upload. Only upload sounds you own or are licensed to use on stream. We may remove uploaded sounds at any time at the request of a copyright holder, or for any other legal reason.
A removed sound stops playing everywhere on the next reload — in native widgets that had it assigned, and in custom widgets using it on a Sound field.
Assets
Upload images, sounds, and videos for use in widgets. Uploads are validated by content type (PNG/JPEG/GIF/WebP/SVG, MP3/WAV/OGG/WebM audio, MP4/WebM video) and count against tier-based storage:
| Tier | Total storage | Max image | Max sound | Max video |
|---|---|---|---|---|
| Free | — (no uploads) | — | — | — |
| Affiliate | 200 MB | 5 MB | 10 MB | 50 MB |
| Partner | 2 GB | 10 MB | 20 MB | 200 MB |
| Partner+ | 10 GB | 25 MB | 50 MB | 500 MB |
Videos can optionally be transcoded for streaming (adaptive playback); transcoding minutes are a Partner-tier feature (600 min/month on Partner, 3,000 on Partner+). After a tier downgrade, assets that exceed the new tier’s limits get a 10-day grace period before their streaming copies are cleaned up (the original files stay in storage).
Real-time updates
All widgets receive events over a WebSocket to widgets.streamercatalyst.com. The SC runtime manages the connection — automatic reconnection with backoff, sequence tracking, and a replay window so brief disconnects don’t drop alerts. Simultaneous widget connections are tier-capped: 5 (Free), 10 (Affiliate), 25 (Partner), 50 (Partner+).
Dashboard previews run in simulate mode — the same widget code fed with sample events and simulate buttons, no live connection or token needed.
Widget token
All overlay URLs carry your per-channel widget token (a 64-character read-only key). It is created for you automatically and every URL the dashboard hands you already includes it — there is nothing to generate or paste by hand.
Treat the URLs themselves as secrets and keep them out of screenshots and stream captures. If one leaks, open Widgets → Gallery and use Revoke all overlay URLs under Overlay URL security. That issues a new token, which immediately invalidates every URL you have already added to OBS — re-copy each browser source URL (scene URLs included) afterwards.
Adding a widget to your streaming software
- Open Widgets in the dashboard, enable the widgets you want in the Gallery, and configure each one.
- Arrange them on a scene in Catalyst Scenes.
- Copy the scene’s browser-source URL.
- In your streaming software, add a Browser Source, paste the URL, and set it to 1920×1080 (in OBS: Sources → + → Browser).
Tier availability
| Feature | Free | Affiliate | Partner | Partner+ |
|---|---|---|---|---|
| Native widgets | 2 | 5 | Unlimited | Unlimited |
| Custom widgets | 1 | 5 | 10 | Unlimited |
| Simultaneous connections | 5 | 10 | 25 | 50 |
| Asset storage | — | 200 MB | 2 GB | 10 GB |
| AI generation / AI persona | — | ✓ | ✓ | ✓ |
| Video transcoding | — | — | 600 min/mo | 3,000 min/mo |
See Tier comparison for the full matrix.
Endpoint reference
Key public (token-authenticated) endpoints on https://widgets.streamercatalyst.com:
GET /v1/scene/:sceneId?token=<token>— the all-in-one per-scene browser source (recommended).GET /widget/native/:channelId?type=<type>&instance_id=<id>&token=<token>— a single native widget.GET /widget/:channelId?widget_id=<id>&token=<token>— a single custom widget.
Share Feedback
Need help or want to chat? Join our Discord to get support, report bugs, and talk with other streamers.▸ What we're sending
| Module | — |
| Page | — |
| Browser | — |
| Screen | — |
| Channel | anonymous |
| Submitted | — |