# SheevChat Automation Reference

App version: **2.8.0-beta.28** (beta). Reference schema: 1.0.0.

Source revision: 472fb34b484eeef0b663d28cacb628a7b9f14ff1. Reviewed/generated: 2026-10-23T22:20:23.056Z.

Generated from the canonical JSON. This is a source-reviewed reference; connected-service behavior remains subject to release UAT.

- Use only capabilities documented for the user’s app version and selected release channel. This snapshot describes a beta, not the stable release.
- Configure commands, automations, timers or SheevPad using exact editor labels and supported fields. JSON examples illustrate fields; they are not an import format.
- For how-do-I questions, compose click-by-click instructions from context UI setup, trigger UI selection and action UI/Fields. Include initial name, organizational Category or Group, enabled state, When, Where, Do, action order, save and verification. Distinguish organizational categories, Trigger category and action categories.
- Choose an automation for an incoming event, a command for a chat invocation, a timer for recurring execution, or a SheevPad button for a manual tap. Combine compatible actions in one ordered list; do not imply parallel execution or automatic rollback. Use context.raid-response as a complete worked composition.
- Ask for missing resource selections and connection details. Fixture IDs and paths must be replaced using the app pickers; never invent a real resource ID.
- Check action picker contexts, runtime prerequisites, originating provider, output routing and variable producer/lifetime separately.
- Report unsupported steps explicitly. General conditional branching, arbitrary scripts and unavailable placeholders are not implied by this reference.
- Imported libraries and Marketplace commands depend on installed packages; consult their own contracts. Never assume every package is installed.
- Source-verified means offline source review, not live validation of connected services. Follow the release UAT status.

## Coverage

```json
{
  "triggers": 29,
  "actions": 79,
  "globalVariables": 59,
  "globalAliases": 19,
  "commands": 54,
  "fields": 188,
  "filters": 33,
  "navigationModes": 4,
  "operationVariants": 38,
  "entries": 441
}
```

## Index

- [Refresh Conversation Starters](#action.conversation_topic_refresh)
- [Select Next Conversation Starter](#action.conversation_topic_next)
- [Send Current Conversation Starter](#action.conversation_topic_send)
- [Mark Conversation Starter Used](#action.conversation_topic_mark_used)
- [Release Conversation Starter](#action.conversation_topic_release)
- [Set Bot Voice](#action.ai_personality_set)
- [Generate raid greeting](#action.ai_generated_raid_shoutout)
- [Generate creator introduction](#action.ai_generated_shoutout)
- [Generate viewer greeting](#action.ai_generated_welcome)
- [Generate community reaction](#action.ai_generated_event_celebration)
- [Generate stream opening message](#action.ai_stream_showstarter)
- [Generate after-ad message](#action.ai_stream_ad_followup)
- [Generate recent chat summary](#action.ai_stream_chat_recap)
- [Generate scheduled message variations](#action.ai_smart_timer_announcement)
- [Generate with Writing Assistant](#action.ai_creative_utility)
- [Pause / wait](#action.pause)
- [Send chat message](#action.chat)
- [Send announcement](#action.announcement)
- [Send chat message (delayed)](#action.chat_delay)
- [Shoutout](#action.shoutout)
- [Song request](#action.song_request)
- [Current song](#action.song_now_playing)
- [Show song queue](#action.song_queue)
- [Skip song](#action.song_skip)
- [Pause song](#action.song_pause)
- [Resume song](#action.song_resume)
- [Give bonus loyalty](#action.bonus_points)
- [Set loyalty name](#action.set_loyalty_point_name)
- [Set Windows playback device](#action.windows_set_default_playback)
- [Set Windows input device](#action.windows_set_default_input)
- [Set Windows system volume](#action.windows_set_system_volume)
- [Set Windows system mute](#action.windows_set_system_mute)
- [Snooze upcoming Twitch ad](#action.twitch_snooze_upcoming_ad)
- [Show top loyalty](#action.top_points)
- [Post random quote](#action.random_quote)
- [Add quote](#action.add_quote)
- [Increment counter](#action.increment_counter)
- [Set counter](#action.set_counter)
- [Reset counter](#action.reset_counter)
- [Increment user counter](#action.increment_user_counter)
- [Set user counter](#action.set_user_counter)
- [Reset user counter](#action.reset_user_counter)
- [Show watchtime](#action.watchtime_lookup)
- [Stop trivia](#action.stop_trivia)
- [Set stream title](#action.set_stream_title)
- [Set stream category](#action.set_stream_category)
- [Chat Overlay](#action.change_theme)
- [Master Overlay](#action.change_master_overlay)
- [UI Resizing](#action.ui_resizing)
- [Trigger Alert](#action.trigger_alert)
- [Trigger Marketplace Widget](#action.trigger_marketplace_widget)
- [Send TTS/Text Payload](#action.send_overlay_tts)
- [Play Audio Payload](#action.send_overlay_audio)
- [Send Text Payload](#action.send_overlay_text)
- [Create Twitch Clip](#action.create_twitch_clip)
- [Queue Clip](#action.queue_clip)
- [Queue Clip](#action.queue_tiktok_clip)
- [Skip Current Clip](#action.skip_current_clip)
- [Clear Clip Queue](#action.clear_clip_queue)
- [Set Clip Command Enabled](#action.set_clip_command_enabled)
- [Toggle Clip Command Enabled](#action.toggle_clip_command_enabled)
- [Clear Clip Queue](#action.clear_tiktok_queue)
- [OBS Studio Control](#action.obs_control)
- [Streamlabs Desktop Control](#action.streamlabs_control)
- [Roll Credits](#action.roll_credits)
- [Clear Credits Session](#action.clear_credits_session)
- [Undo Clear Credits Session](#action.undo_clear_credits_session)
- [Send keystrokes](#action.send_keystrokes)
- [Launch application](#action.launch_application)
- [Launch Steam Game](#action.launch_steam_game)
- [Launch Epic Game](#action.launch_epic_game)
- [Launch Ubisoft Game](#action.launch_ubisoft_game)
- [Launch EA Game](#action.launch_ea_game)
- [Launch Battle.net Game](#action.launch_battlenet_game)
- [Advanced: run command text](#action.run_command)
- [Start trivia](#action.trivia)
- [AI prompt (coming soon)](#action.ai_prompt)
- [Fetch webhook](#action.fetch_webhook)
- [Run Streamer.bot Action](#action.streamerbot_action)
- [First chat ever](#trigger.first_chat)
- [{user}](#variable.trigger.first_chat.user)
- [{platform}](#variable.trigger.first_chat.platform)
- [{username}](#variable.trigger.first_chat.username)
- [{displayName}](#variable.trigger.first_chat.displayName)
- [{userId}](#variable.trigger.first_chat.userId)
- [{eventId}](#variable.trigger.first_chat.eventId)
- [{roomId}](#variable.trigger.first_chat.roomId)
- [First chat this stream (Welcome Back)](#trigger.viewer_join)
- [{user}](#variable.trigger.viewer_join.user)
- [{platform}](#variable.trigger.viewer_join.platform)
- [{username}](#variable.trigger.viewer_join.username)
- [{displayName}](#variable.trigger.viewer_join.displayName)
- [{userId}](#variable.trigger.viewer_join.userId)
- [{eventId}](#variable.trigger.viewer_join.eventId)
- [{roomId}](#variable.trigger.viewer_join.roomId)
- [First message this stream](#trigger.viewer_first_message)
- [{user}](#variable.trigger.viewer_first_message.user)
- [{platform}](#variable.trigger.viewer_first_message.platform)
- [{username}](#variable.trigger.viewer_first_message.username)
- [{displayName}](#variable.trigger.viewer_first_message.displayName)
- [{userId}](#variable.trigger.viewer_first_message.userId)
- [{eventId}](#variable.trigger.viewer_first_message.eventId)
- [{roomId}](#variable.trigger.viewer_first_message.roomId)
- [First chat of the day](#trigger.first_chat_today)
- [{user}](#variable.trigger.first_chat_today.user)
- [{platform}](#variable.trigger.first_chat_today.platform)
- [Viewer birthday](#trigger.is_birthday)
- [{user}](#variable.trigger.is_birthday.user)
- [{platform}](#variable.trigger.is_birthday.platform)
- [{birthday}](#variable.trigger.is_birthday.birthday)
- [{birthdayAge}](#variable.trigger.is_birthday.birthdayAge)
- [{age}](#variable.trigger.is_birthday.age)
- [{agemessage}](#variable.trigger.is_birthday.agemessage)
- [New follow](#trigger.follow)
- [{user}](#variable.trigger.follow.user)
- [{username}](#variable.trigger.follow.username)
- [{displayName}](#variable.trigger.follow.displayName)
- [{userId}](#variable.trigger.follow.userId)
- [{eventId}](#variable.trigger.follow.eventId)
- [{roomId}](#variable.trigger.follow.roomId)
- [Subscription](#trigger.subscribe)
- [{user}](#variable.trigger.subscribe.user)
- [{username}](#variable.trigger.subscribe.username)
- [{displayName}](#variable.trigger.subscribe.displayName)
- [{userId}](#variable.trigger.subscribe.userId)
- [{eventId}](#variable.trigger.subscribe.eventId)
- [{roomId}](#variable.trigger.subscribe.roomId)
- [{months}](#variable.trigger.subscribe.months)
- [{tier}](#variable.trigger.subscribe.tier)
- [{message}](#variable.trigger.subscribe.message)
- [{count}](#variable.trigger.subscribe.count)
- [{subscriptionKind}](#variable.trigger.subscribe.subscriptionKind)
- [TikTok gift](#trigger.tiktok_gift)
- [{user}](#variable.trigger.tiktok_gift.user)
- [{username}](#variable.trigger.tiktok_gift.username)
- [{displayName}](#variable.trigger.tiktok_gift.displayName)
- [{userId}](#variable.trigger.tiktok_gift.userId)
- [{eventId}](#variable.trigger.tiktok_gift.eventId)
- [{roomId}](#variable.trigger.tiktok_gift.roomId)
- [{gift}](#variable.trigger.tiktok_gift.gift)
- [{giftId}](#variable.trigger.tiktok_gift.giftId)
- [{count}](#variable.trigger.tiktok_gift.count)
- [{diamonds}](#variable.trigger.tiktok_gift.diamonds)
- [{amount}](#variable.trigger.tiktok_gift.amount)
- [TikTok share](#trigger.tiktok_share)
- [{user}](#variable.trigger.tiktok_share.user)
- [{username}](#variable.trigger.tiktok_share.username)
- [{displayName}](#variable.trigger.tiktok_share.displayName)
- [{userId}](#variable.trigger.tiktok_share.userId)
- [{eventId}](#variable.trigger.tiktok_share.eventId)
- [{roomId}](#variable.trigger.tiktok_share.roomId)
- [{shareCount}](#variable.trigger.tiktok_share.shareCount)
- [TikTok likes](#trigger.tiktok_like)
- [{user}](#variable.trigger.tiktok_like.user)
- [{username}](#variable.trigger.tiktok_like.username)
- [{displayName}](#variable.trigger.tiktok_like.displayName)
- [{userId}](#variable.trigger.tiktok_like.userId)
- [{eventId}](#variable.trigger.tiktok_like.eventId)
- [{roomId}](#variable.trigger.tiktok_like.roomId)
- [{likes}](#variable.trigger.tiktok_like.likes)
- [{totalLikes}](#variable.trigger.tiktok_like.totalLikes)
- [TikTok question](#trigger.tiktok_question)
- [{user}](#variable.trigger.tiktok_question.user)
- [{username}](#variable.trigger.tiktok_question.username)
- [{displayName}](#variable.trigger.tiktok_question.displayName)
- [{userId}](#variable.trigger.tiktok_question.userId)
- [{eventId}](#variable.trigger.tiktok_question.eventId)
- [{roomId}](#variable.trigger.tiktok_question.roomId)
- [{question}](#variable.trigger.tiktok_question.question)
- [{message}](#variable.trigger.tiktok_question.message)
- [Gift subscription](#trigger.gift_sub)
- [{gifter}](#variable.trigger.gift_sub.gifter)
- [{count}](#variable.trigger.gift_sub.count)
- [{tier}](#variable.trigger.gift_sub.tier)
- [{user}](#variable.trigger.gift_sub.user)
- [Bits / KICKs](#trigger.cheer)
- [{user}](#variable.trigger.cheer.user)
- [{bits}](#variable.trigger.cheer.bits)
- [{message}](#variable.trigger.cheer.message)
- [Incoming raid](#trigger.raid)
- [{user}](#variable.trigger.raid.user)
- [{target}](#variable.trigger.raid.target)
- [{target.url}](#variable.trigger.raid.target.url)
- [{target.game}](#variable.trigger.raid.target.game)
- [{target.title}](#variable.trigger.raid.target.title)
- [{viewers}](#variable.trigger.raid.viewers)
- [{username}](#variable.trigger.raid.username)
- [{displayName}](#variable.trigger.raid.displayName)
- [{userId}](#variable.trigger.raid.userId)
- [{eventId}](#variable.trigger.raid.eventId)
- [{roomId}](#variable.trigger.raid.roomId)
- [Raid started](#trigger.raid_started)
- [{target}](#variable.trigger.raid_started.target)
- [{targetDisplayName}](#variable.trigger.raid_started.targetDisplayName)
- [{targetId}](#variable.trigger.raid_started.targetId)
- [{viewers}](#variable.trigger.raid_started.viewers)
- [{user}](#variable.trigger.raid_started.user)
- [{username}](#variable.trigger.raid_started.username)
- [Channel reward redemption](#trigger.channel_point_redeem)
- [{user}](#variable.trigger.channel_point_redeem.user)
- [{user.points}](#variable.trigger.channel_point_redeem.user.points)
- [{user.pointsRank}](#variable.trigger.channel_point_redeem.user.pointsRank)
- [{reward}](#variable.trigger.channel_point_redeem.reward)
- [{message}](#variable.trigger.channel_point_redeem.message)
- [{username}](#variable.trigger.channel_point_redeem.username)
- [{input}](#variable.trigger.channel_point_redeem.input)
- [Imported app event](#trigger.imported_app_event)
- [{app}](#variable.trigger.imported_app_event.app)
- [{library}](#variable.trigger.imported_app_event.library)
- [{libraryId}](#variable.trigger.imported_app_event.libraryId)
- [{eventStream}](#variable.trigger.imported_app_event.eventStream)
- [{eventStreamId}](#variable.trigger.imported_app_event.eventStreamId)
- [{eventText}](#variable.trigger.imported_app_event.eventText)
- [{eventJson}](#variable.trigger.imported_app_event.eventJson)
- [{event.key}](#variable.trigger.imported_app_event.event.key)
- [{event.value}](#variable.trigger.imported_app_event.event.value)
- [Ad break](#trigger.ad_break)
- [{duration}](#variable.trigger.ad_break.duration)
- [{is_automatic}](#variable.trigger.ad_break.is_automatic)
- [Hype Train](#trigger.hype_train)
- [{level}](#variable.trigger.hype_train.level)
- [{goal}](#variable.trigger.hype_train.goal)
- [Poll ended](#trigger.poll_end)
- [{title}](#variable.trigger.poll_end.title)
- [{winner}](#variable.trigger.poll_end.winner)
- [{winner_votes}](#variable.trigger.poll_end.winner_votes)
- [Prediction locked](#trigger.prediction_lock)
- [{title}](#variable.trigger.prediction_lock.title)
- [Super Chat / Super Sticker](#trigger.superchat)
- [{user}](#variable.trigger.superchat.user)
- [{amount}](#variable.trigger.superchat.amount)
- [{message}](#variable.trigger.superchat.message)
- [OBS scene change](#trigger.obs_scene_change)
- [{scene}](#variable.trigger.obs_scene_change.scene)
- [{previousScene}](#variable.trigger.obs_scene_change.previousScene)
- [{platform}](#variable.trigger.obs_scene_change.platform)
- [Streamlabs Desktop scene change](#trigger.streamlabs_scene_change)
- [{scene}](#variable.trigger.streamlabs_scene_change.scene)
- [{previousScene}](#variable.trigger.streamlabs_scene_change.previousScene)
- [{platform}](#variable.trigger.streamlabs_scene_change.platform)
- [Streamlabs Desktop output status](#trigger.streamlabs_output_change)
- [{output}](#variable.trigger.streamlabs_output_change.output)
- [{transition}](#variable.trigger.streamlabs_output_change.transition)
- [{status}](#variable.trigger.streamlabs_output_change.status)
- [{previousStatus}](#variable.trigger.streamlabs_output_change.previousStatus)
- [{platform}](#variable.trigger.streamlabs_output_change.platform)
- [Streamlabs Desktop scene collection change](#trigger.streamlabs_collection_change)
- [{collection}](#variable.trigger.streamlabs_collection_change.collection)
- [{previousCollection}](#variable.trigger.streamlabs_collection_change.previousCollection)
- [{platform}](#variable.trigger.streamlabs_collection_change.platform)
- [Streamlabs Desktop scene item visibility](#trigger.streamlabs_scene_item_visibility)
- [{scene}](#variable.trigger.streamlabs_scene_item_visibility.scene)
- [{source}](#variable.trigger.streamlabs_scene_item_visibility.source)
- [{visibility}](#variable.trigger.streamlabs_scene_item_visibility.visibility)
- [{previousVisibility}](#variable.trigger.streamlabs_scene_item_visibility.previousVisibility)
- [{platform}](#variable.trigger.streamlabs_scene_item_visibility.platform)
- [Streamlabs Desktop source mute change](#trigger.streamlabs_source_mute)
- [{source}](#variable.trigger.streamlabs_source_mute.source)
- [{muteState}](#variable.trigger.streamlabs_source_mute.muteState)
- [{previousMuteState}](#variable.trigger.streamlabs_source_mute.previousMuteState)
- [{platform}](#variable.trigger.streamlabs_source_mute.platform)
- [Chat message contains / equals](#trigger.chat_contains)
- [{user}](#variable.trigger.chat_contains.user)
- [{username}](#variable.trigger.chat_contains.username)
- [{message}](#variable.trigger.chat_contains.message)
- [{match}](#variable.trigger.chat_contains.match)
- [{user}](#variable.global.user)
- [{sender.name}](#variable.global.sender.name)
- [{sender.id}](#variable.global.sender.id)
- [{platform.userUrl}](#variable.global.platform.userUrl)
- [{sender.points}](#variable.global.sender.points)
- [{sender.pointsRank}](#variable.global.sender.pointsRank)
- [{target}](#variable.global.target)
- [{target.name}](#variable.global.target.name)
- [{target.url}](#variable.global.target.url)
- [{target.game}](#variable.global.target.game)
- [{target.title}](#variable.global.target.title)
- [{target.points}](#variable.global.target.points)
- [{target.pointsRank}](#variable.global.target.pointsRank)
- [{message}](#variable.global.message)
- [{messageSuffix}](#variable.global.messageSuffix)
- [{arg:1}](#variable.global.arg)
- [{command}](#variable.global.command)
- [{messageId}](#variable.global.messageId)
- [{platform}](#variable.global.platform)
- [{role}](#variable.global.role)
- [{roles}](#variable.global.roles)
- [{authorityLevel}](#variable.global.authorityLevel)
- [{pointsName}](#variable.global.pointsName)
- [{counter:deaths}](#variable.global.counter)
- [{usercounter:Check In}](#variable.global.usercounter)
- [{target.usercounter:Check In}](#variable.global.target.usercounter)
- [{channel}](#variable.global.channel)
- [{channel.displayName}](#variable.global.channel.displayName)
- [{channel.id}](#variable.global.channel.id)
- [{channel.platform}](#variable.global.channel.platform)
- [{channel.isLive}](#variable.global.channel.isLive)
- [{channel.chatters}](#variable.global.channel.chatters)
- [{channel.viewers}](#variable.global.channel.viewers)
- [{tiktok.viewerCount}](#variable.global.tiktok.viewerCount)
- [{tiktok.totalLikes}](#variable.global.tiktok.totalLikes)
- [{tiktok.roomId}](#variable.global.tiktok.roomId)
- [{tiktok.goalProgress}](#variable.global.tiktok.goalProgress)
- [{tiktok.goalTarget}](#variable.global.tiktok.goalTarget)
- [{channel.title}](#variable.global.channel.title)
- [{channel.category}](#variable.global.channel.category)
- [{channel.uptime}](#variable.global.channel.uptime)
- [{sender.game}](#variable.global.sender.game)
- [{sender.stream_title}](#variable.global.sender.stream_title)
- [{time:America/Los_Angeles}](#variable.global.time)
- [{date:America/Los_Angeles}](#variable.global.date)
- [{countdown:2026-12-31 23:59}](#variable.global.countdown)
- [{random:1:100}](#variable.global.random)
- [{pick:red|green|blue}](#variable.global.pick)
- [{list:prizes}](#variable.global.list)
- [{viewer.random:current}](#variable.global.viewer.random)
- [{repeat:3:Hello!}](#variable.global.repeat)
- [{math:(10 + 5) * 2}](#variable.global.math)
- [{sender.watchtime}](#variable.global.sender.watchtime)
- [{target.watchtime}](#variable.global.target.watchtime)
- [{song}](#variable.global.song)
- [{song.artist}](#variable.global.song.artist)
- [{song.requester}](#variable.global.song.requester)
- [{quote}](#variable.global.quote)
- [{quote.text}](#variable.global.quote.text)
- [!counter](#command.counter)
- [!count](#command.count)
- [!setcounter](#command.setcounter)
- [!resetcounter](#command.resetcounter)
- [!points](#command.points)
- [!rank](#command.rank)
- [!top](#command.top)
- [!give](#command.give)
- [!bonus](#command.bonus)
- [!gamble](#command.gamble)
- [!duel](#command.duel)
- [!accept](#command.accept)
- [!deny](#command.deny)
- [!lurk](#command.lurk)
- [{user} in !lurk](#variable.command.lurk.user)
- [{messageSuffix} in !lurk](#variable.command.lurk.messageSuffix)
- [!unlurk](#command.unlurk)
- [{user} in !unlurk](#variable.command.unlurk.user)
- [!vieweroptout](#command.vieweroptout)
- [!vieweroptin](#command.vieweroptin)
- [!watchtime](#command.watchtime)
- [!cmdsearch](#command.cmdsearch)
- [!sheevchat](#command.sheevchat)
- [!settitle](#command.settitle)
- [{title} in !settitle](#variable.command.settitle.title)
- [!setcategory](#command.setcategory)
- [{game} in !setcategory](#variable.command.setcategory.game)
- [!setcolor](#command.setcolor)
- [!followage](#command.followage)
- [{user} in !followage](#variable.command.followage.user)
- [{followage} in !followage](#variable.command.followage.followage)
- [!accountage](#command.accountage)
- [{user} in !accountage](#variable.command.accountage.user)
- [{accountage} in !accountage](#variable.command.accountage.accountage)
- [!birthday](#command.birthday)
- [{user} in !birthday](#variable.command.birthday.user)
- [{birthday} in !birthday](#variable.command.birthday.birthday)
- [{birthdaycountdown} in !birthday](#variable.command.birthday.birthdaycountdown)
- [!setbirthday](#command.setbirthday)
- [{user} in !setbirthday](#variable.command.setbirthday.user)
- [{birthday} in !setbirthday](#variable.command.setbirthday.birthday)
- [!deletebirthday](#command.deletebirthday)
- [{user} in !deletebirthday](#variable.command.deletebirthday.user)
- [!tarotcards](#command.tarotcards)
- [!playclip](#command.playclip)
- [!clip](#command.clip)
- [!weather](#command.weather)
- [!trivia](#command.trivia)
- [!triviastop](#command.triviastop)
- [!quote](#command.quote)
- [!quoteadd](#command.quoteadd)
- [!quoteremove](#command.quoteremove)
- [!sr](#command.sr)
- [{user} in !sr](#variable.command.sr.user)
- [{title} in !sr](#variable.command.sr.title)
- [{artist} in !sr](#variable.command.sr.artist)
- [!song](#command.song)
- [{title} in !song](#variable.command.song.title)
- [{artist} in !song](#variable.command.song.artist)
- [{requested_by} in !song](#variable.command.song.requested_by)
- [!next](#command.next)
- [{title} in !next](#variable.command.next.title)
- [{artist} in !next](#variable.command.next.artist)
- [!queue](#command.queue)
- [{queue} in !queue](#variable.command.queue.queue)
- [!wrongsong](#command.wrongsong)
- [{user} in !wrongsong](#variable.command.wrongsong.user)
- [{title} in !wrongsong](#variable.command.wrongsong.title)
- [!voteskip](#command.voteskip)
- [{user} in !voteskip](#variable.command.voteskip.user)
- [{votes} in !voteskip](#variable.command.voteskip.votes)
- [{threshold} in !voteskip](#variable.command.voteskip.threshold)
- [!songskip](#command.songskip)
- [{user} in !songskip](#variable.command.songskip.user)
- [!songpause](#command.songpause)
- [!songresume](#command.songresume)
- [!songclear](#command.songclear)
- [!volume](#command.volume)
- [{vol} in !volume](#variable.command.volume.vol)
- [!songapprove](#command.songapprove)
- [!songreject](#command.songreject)
- [!loadplaylist](#command.loadplaylist)
- [!bansong](#command.bansong)
- [{title} in !bansong](#variable.command.bansong.title)
- [!cmds](#command.cmds)
- [{commands} in !cmds](#variable.command.cmds.commands)
- [!togglesr](#command.togglesr)
- [{state} in !togglesr](#variable.command.togglesr.state)
- [Automation](#context.automation)
- [Timer](#context.timer)
- [Custom command](#context.command)
- [SheevPad action button](#context.pad)
- [Action output routing](#routing.action-targets)
- [Variable resolution](#routing.variables)
- [Installed actions, events and games](#routing.extensions)
- [SheevPad target](#navigation.pad.target)
- [SheevPad next](#navigation.pad.next)
- [SheevPad previous](#navigation.pad.previous)
- [SheevPad favorite](#navigation.pad.favorite)
- [Set up an automatic raid response, snooze ads and pause music](#context.raid-response)
- [{delay}](#variable.action.chat_delay.delay)
- [{lastActionOk}](#variable.imported.lastActionOk)
- [{lastActionType}](#variable.imported.lastActionType)
- [{lastActionId}](#variable.imported.lastActionId)
- [{lastActionLabel}](#variable.imported.lastActionLabel)
- [{lastActionNamespace}](#variable.imported.lastActionNamespace)
- [{lastActionOutputKeys}](#variable.imported.lastActionOutputKeys)
- [{lastActionOutputSummary}](#variable.imported.lastActionOutputSummary)
- [{lastActionMissingOutputKeys}](#variable.imported.lastActionMissingOutputKeys)
- [{lastActionValueCount}](#variable.imported.lastActionValueCount)
- [{lastActionResponseJson}](#variable.imported.lastActionResponseJson)
- [{lastActionValuesJson}](#variable.imported.lastActionValuesJson)
- [{lastActionRaw}](#variable.imported.lastActionRaw)
- [{last.<key>}](#variable.imported.mapping.last)
- [{<namespace>.<key>}](#variable.imported.mapping.namespace)
- [{<actionId>.<key>}](#variable.imported.mapping.action)

<a id="action.conversation_topic_refresh"></a>

## Refresh Conversation Starters

Check for newly prepared questions and download only a changed package.

ID: `action.conversation_topic_refresh`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: Conversation Starters account access, topics.read entitlement and prepared question service.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Refresh Conversation Starters, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Conversation Starters account access, topics.read entitlement and prepared question service.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Download a changed prepared question package; unchanged packages are retained.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "conversation_topic_refresh"
    },
    "timer": {
      "type": "conversation_topic_refresh"
    },
    "command": {
      "type": "conversation_topic_refresh"
    },
    "pad": {
      "type": "conversation_topic_refresh"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Refresh Conversation Starters, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/ai-topics/conversation-topic-actions.js` — `CONVERSATION_TOPIC_ACTIONS.conversation_topic_refresh`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.conversation_topic_next"></a>

## Select Next Conversation Starter

Select one unused prepared question, or reuse the current active question.

ID: `action.conversation_topic_next`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: Conversation Starters access and a prepared question pool.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Select Next Conversation Starter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Conversation Starters access and a prepared question pool.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Reuse the active question or select and present an unused question; fail if none is available.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "conversation_topic_next"
    },
    "timer": {
      "type": "conversation_topic_next"
    },
    "command": {
      "type": "conversation_topic_next"
    },
    "pad": {
      "type": "conversation_topic_next"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Select Next Conversation Starter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/ai-topics/conversation-topic-actions.js` — `CONVERSATION_TOPIC_ACTIONS.conversation_topic_next`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.conversation_topic_send"></a>

## Send Current Conversation Starter

Send the current question, mark it used after a successful delivery, and advance to the next one.

ID: `action.conversation_topic_send`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: Conversation Starters access, prepared questions and at least one selected connected chat.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Send Current Conversation Starter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Conversation Starters access, prepared questions and at least one selected connected chat.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Send to selected connected chats; no explicit toggles means all four. Mark used only after successful delivery and select the next question. No selected/connected chats is an error.",
  "fields": [
    {
      "key": "twitch",
      "type": "checkbox",
      "label": "Twitch",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Send to selected connected chats; no explicit toggles means all four. Mark used only after successful delivery and select the next question. No selected/connected chats is an error.",
      "dynamicSource": null
    },
    {
      "key": "youtube",
      "type": "checkbox",
      "label": "YouTube",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Send to selected connected chats; no explicit toggles means all four. Mark used only after successful delivery and select the next question. No selected/connected chats is an error.",
      "dynamicSource": null
    },
    {
      "key": "kick",
      "type": "checkbox",
      "label": "Kick",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Send to selected connected chats; no explicit toggles means all four. Mark used only after successful delivery and select the next question. No selected/connected chats is an error.",
      "dynamicSource": null
    },
    {
      "key": "tiktok",
      "type": "checkbox",
      "label": "TikTok",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Send to selected connected chats; no explicit toggles means all four. Mark used only after successful delivery and select the next question. No selected/connected chats is an error.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "conversation_topic_send",
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    },
    "timer": {
      "type": "conversation_topic_send",
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    },
    "command": {
      "type": "conversation_topic_send",
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    },
    "pad": {
      "type": "conversation_topic_send",
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Send Current Conversation Starter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "twitch": true,
  "youtube": false,
  "kick": false,
  "tiktok": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/ai-topics/conversation-topic-actions.js` — `CONVERSATION_TOPIC_ACTIONS.conversation_topic_send`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.conversation_topic_mark_used"></a>

## Mark Conversation Starter Used

Mark the current question used and advance to the next one.

ID: `action.conversation_topic_mark_used`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: Conversation Starters access and an active question.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Mark Conversation Starter Used, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Conversation Starters access and an active question.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Mark the active question used and advance; fail when no question is selected.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "conversation_topic_mark_used"
    },
    "timer": {
      "type": "conversation_topic_mark_used"
    },
    "command": {
      "type": "conversation_topic_mark_used"
    },
    "pad": {
      "type": "conversation_topic_mark_used"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Mark Conversation Starter Used, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/ai-topics/conversation-topic-actions.js` — `CONVERSATION_TOPIC_ACTIONS.conversation_topic_mark_used`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.conversation_topic_release"></a>

## Release Conversation Starter

Return the current question to the unused queue without marking it used.

ID: `action.conversation_topic_release`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: Conversation Starters access and an active question.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Release Conversation Starter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Conversation Starters access and an active question.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Return the active question to the unused queue without marking it used; fail when none is selected.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "conversation_topic_release"
    },
    "timer": {
      "type": "conversation_topic_release"
    },
    "command": {
      "type": "conversation_topic_release"
    },
    "pad": {
      "type": "conversation_topic_release"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Release Conversation Starter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/ai-topics/conversation-topic-actions.js` — `CONVERSATION_TOPIC_ACTIONS.conversation_topic_release`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_personality_set"></a>

## Set Bot Voice

Activate a saved voice or create a custom one from action text and command variables. Response Rules still apply.

ID: `action.ai_personality_set`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: A.I. account access; saved voice or voice-generation service.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Set Bot Voice, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A.I. account access; saved voice or voice-generation service.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Saved mode activates profileId. Custom mode generates and activates a voice from customGuidance; empty guidance fails. The Bot Voice editor is synchronized.",
  "fields": [
    {
      "key": "mode",
      "type": "select",
      "label": "Voice source",
      "default": "saved",
      "options": [
        {
          "value": "saved",
          "label": "Saved voice"
        },
        {
          "value": "custom",
          "label": "Custom voice instructions"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "saved",
        "timer": "saved",
        "command": "saved",
        "pad": "saved"
      },
      "runtimeFallbackNote": "Saved mode activates profileId. Custom mode generates and activates a voice from customGuidance; empty guidance fails. The Bot Voice editor is synchronized.",
      "dynamicSource": null
    },
    {
      "key": "profileId",
      "type": "ai_personality_select",
      "label": "Saved voice",
      "visibleWhen": {
        "mode": [
          "",
          "saved"
        ]
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Saved mode activates profileId. Custom mode generates and activates a voice from customGuidance; empty guidance fails. The Bot Voice editor is synchronized.",
      "dynamicSource": "Local Saved voice picker; select an existing resource, never invent its ID."
    },
    {
      "key": "customGuidance",
      "type": "textarea",
      "label": "Custom voice instructions",
      "placeholder": "Describe how the bot should sound, or use variables such as {message}.",
      "maxlength": 500,
      "visibleWhen": {
        "mode": "custom"
      },
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Saved mode activates profileId. Custom mode generates and activates a voice from customGuidance; empty guidance fails. The Bot Voice editor is synchronized.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_personality_set",
      "mode": "saved",
      "profileId": "",
      "customGuidance": ""
    },
    "timer": {
      "type": "ai_personality_set",
      "mode": "saved",
      "profileId": "",
      "customGuidance": ""
    },
    "command": {
      "type": "ai_personality_set",
      "mode": "saved",
      "profileId": "",
      "customGuidance": ""
    },
    "pad": {
      "type": "ai_personality_set",
      "mode": "saved",
      "profileId": "",
      "customGuidance": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Set Bot Voice, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "mode": "saved",
  "profileId": "fixture-voice"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_personality_set`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_generated_raid_shoutout"></a>

## Generate raid greeting

Generate and send a short greeting using only the incoming raider identity, optional bio, latest title/category, and active Bot Voice.

ID: `action.ai_generated_raid_shoutout`. Status: **gated**. Contexts: automation, command, pad.

Requirements: Incoming raid trigger, A.I. raid.summary entitlement and provider metadata.

- Incoming raid generation is currently supported for Twitch and Kick events only.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate raid greeting, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Incoming raid trigger, A.I. raid.summary entitlement and provider metadata.",
    "accountFeature": {
      "moduleId": "ai_002_shoutouts_raids",
      "featureId": "raid.summary"
    },
    "operatingSystems": []
  },
  "behavior": "Requires Incoming raid on Twitch or Kick, even if selected from another builder. Uses the triggering raider identity and active Bot Voice.",
  "fields": [],
  "declaredContexts": [
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [
    "{user}"
  ],
  "defaultsByContext": {
    "automation": {
      "type": "ai_generated_raid_shoutout",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_generated_raid_shoutout",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_generated_raid_shoutout",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_generated_raid_shoutout",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate raid greeting, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_generated_raid_shoutout`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_generated_shoutout"></a>

## Generate creator introduction

Generate and send a voice-aware introduction using the creator's available profile, latest title, and category.

ID: `action.ai_generated_shoutout`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: A.I. shoutout.message entitlement and connected output chat.

- TikTok creator-profile lookup is unavailable; generated output may still be sent to TikTok.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate creator introduction, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A.I. shoutout.message entitlement and connected output chat.",
    "accountFeature": {
      "moduleId": "ai_002_shoutouts_raids",
      "featureId": "shoutout.message"
    },
    "operatingSystems": []
  },
  "behavior": "Blank username uses {user}; remove leading @. Creator platform event means originating platform. Sends generated text to selected output targets. TikTok creator lookup is unavailable.",
  "fields": [
    {
      "key": "username",
      "type": "text",
      "label": "Creator username",
      "placeholder": "{user} or a channel username",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Blank username uses {user}; remove leading @. Creator platform event means originating platform. Sends generated text to selected output targets. TikTok creator lookup is unavailable.",
      "dynamicSource": null
    },
    {
      "key": "creatorPlatform",
      "type": "select",
      "label": "Creator platform",
      "default": "event",
      "options": [
        {
          "value": "event",
          "label": "Same platform as trigger"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "event",
        "command": "event",
        "pad": "event"
      },
      "runtimeFallbackNote": "Blank username uses {user}; remove leading @. Creator platform event means originating platform. Sends generated text to selected output targets. TikTok creator lookup is unavailable.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Blank username uses {user}; remove leading @. Creator platform event means originating platform. Sends generated text to selected output targets. TikTok creator lookup is unavailable.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_generated_shoutout",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_generated_shoutout",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_generated_shoutout",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_generated_shoutout",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate creator introduction, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "username": "ExampleCreator",
  "creatorPlatform": "twitch",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_generated_shoutout`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_generated_welcome"></a>

## Generate viewer greeting

Generate a short voice-aware greeting for a first-time chatter, returning viewer, or follower on the triggering platform.

ID: `action.ai_generated_welcome`. Status: **gated**. Contexts: automation, command, pad.

Requirements: Supported viewer trigger and A.I. welcome.message entitlement.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate viewer greeting, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Supported viewer trigger and A.I. welcome.message entitlement.",
    "accountFeature": {
      "moduleId": "ai_003_welcomes_lurks",
      "featureId": "welcome.message"
    },
    "operatingSystems": []
  },
  "behavior": "Only First chat ever, Welcome Back or New follow event contexts are accepted; send on the originating platform.",
  "fields": [],
  "declaredContexts": [
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [
    "{user}"
  ],
  "defaultsByContext": {
    "automation": {
      "type": "ai_generated_welcome",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_generated_welcome",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_generated_welcome",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_generated_welcome",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate viewer greeting, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_generated_welcome`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_generated_event_celebration"></a>

## Generate community reaction

Celebrate the triggering support or community event in chat, an Overlay Builder alert, or both.

ID: `action.ai_generated_event_celebration`. Status: **gated**. Contexts: automation, command, pad.

Requirements: A.I. event.celebration entitlement; Alert Box placement for overlay output.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate community reaction, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A.I. event.celebration entitlement; Alert Box placement for overlay output.",
    "accountFeature": {
      "moduleId": "ai_004_event_celebrations",
      "featureId": "event.celebration"
    },
    "operatingSystems": []
  },
  "behavior": "Output defaults to chat; overlay/both also dispatch an alert with generated text. Alert duration falls back to 8000 ms. Requires a supported community event.",
  "fields": [
    {
      "key": "outputMode",
      "type": "select",
      "label": "Output",
      "default": "chat",
      "options": [
        {
          "value": "chat",
          "label": "Chat only"
        },
        {
          "value": "overlay",
          "label": "Overlay alert only"
        },
        {
          "value": "both",
          "label": "Chat and overlay alert"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "chat",
        "timer": "chat",
        "command": "chat",
        "pad": "chat"
      },
      "runtimeFallbackNote": "Output defaults to chat; overlay/both also dispatch an alert with generated text. Alert duration falls back to 8000 ms. Requires a supported community event.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send chat to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Output defaults to chat; overlay/both also dispatch an alert with generated text. Alert duration falls back to 8000 ms. Requires a supported community event.",
      "dynamicSource": null
    },
    {
      "key": "overlaySlug",
      "type": "theme_select",
      "label": "Overlay source",
      "source": "overlay_builder.overlays",
      "labelKey": "overlayName",
      "visibleWhen": {
        "outputMode": [
          "overlay",
          "both"
        ]
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Output defaults to chat; overlay/both also dispatch an alert with generated text. Alert duration falls back to 8000 ms. Requires a supported community event.",
      "dynamicSource": "overlay_builder.overlays"
    },
    {
      "key": "presetId",
      "type": "theme_select",
      "label": "Alert preset",
      "source": "alert_presets.local",
      "labelKey": "presetName",
      "visibleWhen": {
        "outputMode": [
          "overlay",
          "both"
        ]
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Output defaults to chat; overlay/both also dispatch an alert with generated text. Alert duration falls back to 8000 ms. Requires a supported community event.",
      "dynamicSource": "alert_presets.local"
    },
    {
      "key": "durationMs",
      "type": "number",
      "label": "Alert duration (ms)",
      "default": 8000,
      "min": 1000,
      "max": 60000,
      "visibleWhen": {
        "outputMode": [
          "overlay",
          "both"
        ]
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 8000,
        "timer": 8000,
        "command": 8000,
        "pad": 8000
      },
      "runtimeFallbackNote": "Output defaults to chat; overlay/both also dispatch an alert with generated text. Alert duration falls back to 8000 ms. Requires a supported community event.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_generated_event_celebration",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_generated_event_celebration",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_generated_event_celebration",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_generated_event_celebration",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate community reaction, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "outputMode": "chat",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_generated_event_celebration`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_stream_showstarter"></a>

## Generate stream opening message

Open the show with a fresh message in the active Bot Voice. Optional guidance can name the planned segment or mood.

ID: `action.ai_stream_showstarter`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: A.I. stream.showstarter entitlement and connected chat.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate stream opening message, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A.I. stream.showstarter entitlement and connected chat.",
    "accountFeature": {
      "moduleId": "ai_005_stream_flow",
      "featureId": "stream.showstarter"
    },
    "operatingSystems": []
  },
  "behavior": "Generate a stream opening in the active Bot Voice. prompt is optional literal guidance; send to chosen output targets.",
  "fields": [
    {
      "key": "prompt",
      "type": "text",
      "label": "Optional opening guidance",
      "placeholder": "Tonight is community game night",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Generate a stream opening in the active Bot Voice. prompt is optional literal guidance; send to chosen output targets.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Generate a stream opening in the active Bot Voice. prompt is optional literal guidance; send to chosen output targets.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_stream_showstarter",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_stream_showstarter",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_stream_showstarter",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_stream_showstarter",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate stream opening message, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "prompt": "Community game night",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_stream_showstarter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_stream_ad_followup"></a>

## Generate after-ad message

After the triggering ad finishes, welcome chat back with a fresh message in the active Bot Voice.

ID: `action.ai_stream_ad_followup`. Status: **gated**. Contexts: automation, command, pad.

Requirements: Ad break trigger and A.I. stream.ad_followup entitlement.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate after-ad message, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Ad break trigger and A.I. stream.ad_followup entitlement.",
    "accountFeature": {
      "moduleId": "ai_005_stream_flow",
      "featureId": "stream.ad_followup"
    },
    "operatingSystems": []
  },
  "behavior": "Requires Ad break context. Wait until the known ad end plus postDelayMs (default 1000, clamped 0–30000) before generating. prompt is literal guidance.",
  "fields": [
    {
      "key": "postDelayMs",
      "type": "number",
      "label": "Extra delay after ad (ms)",
      "default": 1000,
      "min": 0,
      "max": 30000,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 1000,
        "timer": 1000,
        "command": 1000,
        "pad": 1000
      },
      "runtimeFallbackNote": "Requires Ad break context. Wait until the known ad end plus postDelayMs (default 1000, clamped 0–30000) before generating. prompt is literal guidance.",
      "dynamicSource": null
    },
    {
      "key": "prompt",
      "type": "text",
      "label": "Optional follow-up guidance",
      "placeholder": "Remind everyone what we were doing",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Requires Ad break context. Wait until the known ad end plus postDelayMs (default 1000, clamped 0–30000) before generating. prompt is literal guidance.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Requires Ad break context. Wait until the known ad end plus postDelayMs (default 1000, clamped 0–30000) before generating. prompt is literal guidance.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_stream_ad_followup",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_stream_ad_followup",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_stream_ad_followup",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_stream_ad_followup",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate after-ad message, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "postDelayMs": 1000,
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_stream_ad_followup`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_stream_chat_recap"></a>

## Generate recent chat summary

Summarize recent meaningful viewer conversation without quoting private or filtered chat.

ID: `action.ai_stream_chat_recap`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: A.I. stream.chat_recap entitlement and recent eligible chat.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate recent chat summary, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A.I. stream.chat_recap entitlement and recent eligible chat.",
    "accountFeature": {
      "moduleId": "ai_005_stream_flow",
      "featureId": "stream.chat_recap"
    },
    "operatingSystems": []
  },
  "behavior": "Summarize recent meaningful conversation from selected context platforms, using optional literal prompt guidance; send to the same targets.",
  "fields": [
    {
      "key": "prompt",
      "type": "text",
      "label": "Optional summary focus",
      "placeholder": "Focus on viewer suggestions",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Summarize recent meaningful conversation from selected context platforms, using optional literal prompt guidance; send to the same targets.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Summarize recent meaningful conversation from selected context platforms, using optional literal prompt guidance; send to the same targets.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_stream_chat_recap",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_stream_chat_recap",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_stream_chat_recap",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_stream_chat_recap",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate recent chat summary, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_stream_chat_recap`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_smart_timer_announcement"></a>

## Generate scheduled message variations

The first run writes and stores 10 Bot Voice variations of this announcement. Each later run sends the next unused message; after all 10 are used, the following run prepares a new set.

ID: `action.ai_smart_timer_announcement`. Status: **gated**. Contexts: timer, command, pad.

Requirements: Timer context and A.I. timer.announcement entitlement.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate scheduled message variations, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Timer context and A.I. timer.announcement entitlement.",
    "accountFeature": {
      "moduleId": "ai_006_smart_timers",
      "featureId": "timer.announcement"
    },
    "operatingSystems": []
  },
  "behavior": "Resolve baseMessage and goal; generate/store ten variations on first run, then send each unused variation in turn. A later run prepares a new batch after exhaustion.",
  "fields": [
    {
      "key": "baseMessage",
      "type": "textarea",
      "label": "Base announcement",
      "placeholder": "Join our community game night every Friday!",
      "maxlength": 500,
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve baseMessage and goal; generate/store ten variations on first run, then send each unused variation in turn. A later run prepares a new batch after exhaustion.",
      "dynamicSource": null
    },
    {
      "key": "goal",
      "type": "text",
      "label": "Optional goal",
      "placeholder": "Friendly and inviting without sounding repetitive",
      "maxlength": 240,
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve baseMessage and goal; generate/store ten variations on first run, then send each unused variation in turn. A later run prepares a new batch after exhaustion.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer"
  ],
  "pickerContexts": [
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_smart_timer_announcement",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_smart_timer_announcement",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_smart_timer_announcement",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_smart_timer_announcement",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate scheduled message variations, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "baseMessage": "Community night is Friday!",
  "goal": "Friendly"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_smart_timer_announcement`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_creative_utility"></a>

## Generate with Writing Assistant

Transform source text with a selected writing tool, then send the result to the chosen chat.

ID: `action.ai_creative_utility`. Status: **gated**. Contexts: automation, timer, command, pad.

Requirements: A.I. creative.generate entitlement and connected chat.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category A.I., select Generate with Writing Assistant, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A.I. creative.generate entitlement and connected chat.",
    "accountFeature": {
      "moduleId": "ai_007_creative_utilities",
      "featureId": "creative.generate"
    },
    "operatingSystems": []
  },
  "behavior": "Resolve source text and guidance; tool defaults to rewrite. targetLanguage is literal and applies to translate. Send generated text to selected targets.",
  "fields": [
    {
      "key": "mode",
      "type": "select",
      "label": "Tool",
      "default": "rewrite",
      "options": [
        {
          "value": "rewrite",
          "label": "Rewrite"
        },
        {
          "value": "hype",
          "label": "Add hype"
        },
        {
          "value": "calm",
          "label": "Calm tone"
        },
        {
          "value": "shorten",
          "label": "Shorten"
        },
        {
          "value": "translate",
          "label": "Translate"
        },
        {
          "value": "poll",
          "label": "Poll draft"
        },
        {
          "value": "stream_title",
          "label": "Stream title"
        },
        {
          "value": "social_post",
          "label": "Social post"
        },
        {
          "value": "clip_caption",
          "label": "Clip caption"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "rewrite",
        "timer": "rewrite",
        "command": "rewrite",
        "pad": "rewrite"
      },
      "runtimeFallbackNote": "Resolve source text and guidance; tool defaults to rewrite. targetLanguage is literal and applies to translate. Send generated text to selected targets.",
      "dynamicSource": null
    },
    {
      "key": "text",
      "type": "textarea",
      "label": "Source text",
      "placeholder": "Write or insert variables to transform",
      "maxlength": 1000,
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve source text and guidance; tool defaults to rewrite. targetLanguage is literal and applies to translate. Send generated text to selected targets.",
      "dynamicSource": null
    },
    {
      "key": "guidance",
      "type": "text",
      "label": "Optional guidance",
      "placeholder": "Keep the important date and call to action",
      "maxlength": 240,
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve source text and guidance; tool defaults to rewrite. targetLanguage is literal and applies to translate. Send generated text to selected targets.",
      "dynamicSource": null
    },
    {
      "key": "targetLanguage",
      "type": "text",
      "label": "Target language",
      "placeholder": "Spanish",
      "maxlength": 80,
      "visibleWhen": {
        "mode": "translate"
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve source text and guidance; tool defaults to rewrite. targetLanguage is literal and applies to translate. Send generated text to selected targets.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve source text and guidance; tool defaults to rewrite. targetLanguage is literal and applies to translate. Send generated text to selected targets.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_creative_utility",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_creative_utility",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_creative_utility",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_creative_utility",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category A.I., select Generate with Writing Assistant, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "mode": "rewrite",
  "text": "Community night is Friday!",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_creative_utility`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.pause"></a>

## Pause / wait

Wait before continuing to the next action in this sequence.

ID: `action.pause`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: No external connection.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Pause / wait, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "No external connection.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Await a pause before the next action. Parse whole seconds; missing/zero/invalid falls back to 5; clamp 1–3600.",
  "fields": [
    {
      "key": "seconds",
      "type": "number",
      "label": "Pause seconds",
      "min": 1,
      "max": 3600,
      "default": 5,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 5,
        "timer": 5,
        "command": 5,
        "pad": 5
      },
      "runtimeFallbackNote": "Await a pause before the next action. Parse whole seconds; missing/zero/invalid falls back to 5; clamp 1–3600.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "pause",
      "seconds": 5
    },
    "timer": {
      "type": "pause",
      "seconds": 5
    },
    "command": {
      "type": "pause",
      "seconds": 5
    },
    "pad": {
      "type": "pause",
      "seconds": 5
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Pause / wait, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "seconds": 5
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.pause`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.chat"></a>

## Send chat message

Send a message to the event/timer platform. Automations may target all platforms; timers still obey their platform and online-only rules.

ID: `action.chat`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Connected output chat; reply mode also needs the triggering message identity.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Send chat message, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected output chat; reply mode also needs the triggering message identity.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve message; blank output does nothing. event/missing target uses origin; all means Twitch + YouTube + Kick. Reply style applies only to the originating platform with an actor message ID. Timers scope delivery to their eligible platform.",
  "fields": [
    {
      "key": "message",
      "type": "textarea",
      "label": "Message",
      "placeholder": "Thanks for the raid @{user}! Welcome {viewers} raiders!",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve message; blank output does nothing. event/missing target uses origin; all means Twitch + YouTube + Kick. Reply style applies only to the originating platform with an actor message ID. Timers scope delivery to their eligible platform.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch only"
        },
        {
          "value": "youtube",
          "label": "YouTube only"
        },
        {
          "value": "kick",
          "label": "Kick only"
        },
        {
          "value": "tiktok",
          "label": "TikTok only"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve message; blank output does nothing. event/missing target uses origin; all means Twitch + YouTube + Kick. Reply style applies only to the originating platform with an actor message ID. Timers scope delivery to their eligible platform.",
      "dynamicSource": null
    },
    {
      "key": "replyMode",
      "type": "select",
      "label": "Response style",
      "default": "normal",
      "contexts": [
        "automation",
        "command"
      ],
      "options": [
        {
          "value": "normal",
          "label": "Send normal message"
        },
        {
          "value": "reply",
          "label": "Reply to triggering message where supported"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "normal",
        "timer": "normal",
        "command": "normal",
        "pad": "normal"
      },
      "runtimeFallbackNote": "Resolve message; blank output does nothing. event/missing target uses origin; all means Twitch + YouTube + Kick. Reply style applies only to the originating platform with an actor message ID. Timers scope delivery to their eligible platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "chat",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "chat",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "chat",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "chat",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Send chat message, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "message": "Hello {user}!",
  "platform": "event",
  "replyMode": "normal"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.chat`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.announcement"></a>

## Send announcement

Send a native Twitch announcement when possible. Other platforms fall back to a normal announcement-style chat message.

ID: `action.announcement`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Connected output chat; Twitch announcement permissions for native delivery.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Stream Platform Commands, select Send announcement, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected output chat; Twitch announcement permissions for native delivery.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve message; blank does nothing. color falls back to primary. Native Twitch announcement when available; other outputs use announcement-style normal chat.",
  "fields": [
    {
      "key": "message",
      "type": "textarea",
      "label": "Announcement",
      "placeholder": "Important stream update!",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve message; blank does nothing. color falls back to primary. Native Twitch announcement when available; other outputs use announcement-style normal chat.",
      "dynamicSource": null
    },
    {
      "key": "color",
      "type": "select",
      "label": "Twitch color",
      "options": [
        {
          "value": "primary",
          "label": "Primary"
        },
        {
          "value": "blue",
          "label": "Blue"
        },
        {
          "value": "green",
          "label": "Green"
        },
        {
          "value": "orange",
          "label": "Orange"
        },
        {
          "value": "purple",
          "label": "Purple"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "primary",
        "timer": "primary",
        "command": "primary",
        "pad": "primary"
      },
      "runtimeFallbackNote": "Resolve message; blank does nothing. color falls back to primary. Native Twitch announcement when available; other outputs use announcement-style normal chat.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve message; blank does nothing. color falls back to primary. Native Twitch announcement when available; other outputs use announcement-style normal chat.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "announcement",
      "message": "",
      "platform": "event",
      "color": "primary"
    },
    "timer": {
      "type": "announcement",
      "message": "",
      "platform": "all",
      "color": "primary"
    },
    "command": {
      "type": "announcement",
      "message": "",
      "platform": "event",
      "color": "primary"
    },
    "pad": {
      "type": "announcement",
      "message": "",
      "platform": "all",
      "color": "primary"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Stream Platform Commands, select Send announcement, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "message": "Community night is Friday!",
  "platform": "twitch",
  "color": "primary"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.announcement`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.chat_delay"></a>

## Send chat message (delayed)

Send a message after a delay. Useful for countdowns before ad breaks.

ID: `action.chat_delay`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Connected output chat when the scheduled callback runs.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Send chat message (delayed), and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected output chat when the scheduled callback runs.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Schedule delivery and immediately continue the sequence. Missing delay_sec is 0 at runtime (editor initializes 30); runtime clamps only the lower bound to 0. Resolve message at delivery with local {delay}. Errors are logged inside the delayed callback.",
  "fields": [
    {
      "key": "message",
      "type": "textarea",
      "label": "Message",
      "placeholder": "⚠️ Ad break in {delay}s!",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Schedule delivery and immediately continue the sequence. Missing delay_sec is 0 at runtime (editor initializes 30); runtime clamps only the lower bound to 0. Resolve message at delivery with local {delay}. Errors are logged inside the delayed callback.",
      "dynamicSource": null
    },
    {
      "key": "delay_sec",
      "type": "number",
      "label": "Delay (seconds)",
      "min": 1,
      "max": 3600,
      "default": 30,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 30,
        "timer": 30,
        "command": 30,
        "pad": 30
      },
      "runtimeFallbackNote": "Schedule delivery and immediately continue the sequence. Missing delay_sec is 0 at runtime (editor initializes 30); runtime clamps only the lower bound to 0. Resolve message at delivery with local {delay}. Errors are logged inside the delayed callback.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Send to",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch only"
        },
        {
          "value": "youtube",
          "label": "YouTube only"
        },
        {
          "value": "kick",
          "label": "Kick only"
        },
        {
          "value": "tiktok",
          "label": "TikTok only"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Schedule delivery and immediately continue the sequence. Missing delay_sec is 0 at runtime (editor initializes 30); runtime clamps only the lower bound to 0. Resolve message at delivery with local {delay}. Errors are logged inside the delayed callback.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "chat_delay",
      "message": "",
      "platform": "event",
      "delay_sec": 30
    },
    "timer": {
      "type": "chat_delay",
      "message": "",
      "platform": "all",
      "delay_sec": 30
    },
    "command": {
      "type": "chat_delay",
      "message": "",
      "platform": "event",
      "delay_sec": 30
    },
    "pad": {
      "type": "chat_delay",
      "message": "",
      "platform": "all",
      "delay_sec": 30
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [
    "variable.action.chat_delay.delay"
  ],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Send chat message (delayed), and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "message": "The delay was {delay} seconds.",
  "delay_sec": 30,
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.chat_delay`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.shoutout"></a>

## Shoutout

Send a native Twitch shoutout for the triggering user. Requires an event with a {user}.

ID: `action.shoutout`. Status: **supported**. Contexts: automation, command, pad.

Requirements: Twitch event, connected broadcaster and shoutout permissions/cooldown eligibility.

- Native shoutouts are a Twitch-only API action.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Stream Platform Commands, select Shoutout, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Twitch event, connected broadcaster and shoutout permissions/cooldown eligibility.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Native Twitch shoutout only; non-Twitch origin fails. Literal username_override takes precedence over trigger user; no target does nothing. This is separate from generated introductions.",
  "fields": [
    {
      "key": "username_override",
      "type": "text",
      "label": "Username (blank = trigger user)",
      "placeholder": "",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Native Twitch shoutout only; non-Twitch origin fails. Literal username_override takes precedence over trigger user; no target does nothing. This is separate from generated introductions.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [
    "{user}"
  ],
  "defaultsByContext": {
    "automation": {
      "type": "shoutout",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "shoutout",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "shoutout",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "shoutout",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Stream Platform Commands, select Shoutout, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "username_override": "ExampleCreator"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.shoutout`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.song_request"></a>

## Song request

Add a song or search query to the song request queue. This works even if the public !sr chat command is disabled.

ID: `action.song_request`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Song request playback/queue configuration and supported media source.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Music Controls, select Song request, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Song request playback/queue configuration and supported media source.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run registered !sr as an automation actor, even when the public command is disabled. Blank query falls back to event input/message. Responses are suppressed unless sendResponse is true; the default response uses captured command output.",
  "fields": [
    {
      "key": "query",
      "type": "textarea",
      "label": "Song or search text",
      "placeholder": "Never Gonna Give You Up, a YouTube URL, or {message}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{message}",
        "timer": "",
        "command": "{message}",
        "pad": ""
      },
      "runtimeFallbackNote": "Run registered !sr as an automation actor, even when the public command is disabled. Blank query falls back to event input/message. Responses are suppressed unless sendResponse is true; the default response uses captured command output.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run registered !sr as an automation actor, even when the public command is disabled. Blank query falls back to event input/message. Responses are suppressed unless sendResponse is true; the default response uses captured command output.",
      "dynamicSource": null
    },
    {
      "key": "sendResponse",
      "type": "checkbox",
      "label": "Send chat response",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Run registered !sr as an automation actor, even when the public command is disabled. Blank query falls back to event input/message. Responses are suppressed unless sendResponse is true; the default response uses captured command output.",
      "dynamicSource": null
    },
    {
      "key": "response",
      "type": "textarea",
      "label": "Response",
      "placeholder": "@{user} — \"{title}\" by {artist} added to the queue!",
      "default": "@{user} — \"{title}\" by {artist} added to the queue!",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "@{user} — \"{title}\" by {artist} added to the queue!",
        "timer": "@{user} — \"{title}\" by {artist} added to the queue!",
        "command": "@{user} — \"{title}\" by {artist} added to the queue!",
        "pad": "@{user} — \"{title}\" by {artist} added to the queue!"
      },
      "runtimeFallbackNote": "Run registered !sr as an automation actor, even when the public command is disabled. Blank query falls back to event input/message. Responses are suppressed unless sendResponse is true; the default response uses captured command output.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "song_request",
      "message": "",
      "platform": "event",
      "query": "{message}",
      "sendResponse": false,
      "response": "@{user} — \"{title}\" by {artist} added to the queue!"
    },
    "timer": {
      "type": "song_request",
      "message": "",
      "platform": "all",
      "query": "",
      "sendResponse": false,
      "response": "@{user} — \"{title}\" by {artist} added to the queue!"
    },
    "command": {
      "type": "song_request",
      "message": "",
      "platform": "event",
      "query": "{message}",
      "sendResponse": false,
      "response": "@{user} — \"{title}\" by {artist} added to the queue!"
    },
    "pad": {
      "type": "song_request",
      "message": "",
      "platform": "all",
      "query": "",
      "sendResponse": false,
      "response": "@{user} — \"{title}\" by {artist} added to the queue!"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Music Controls, select Song request, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "query": "Example song",
  "platform": "twitch",
  "sendResponse": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.song_request`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.song_now_playing"></a>

## Current song

Post the currently playing song.

ID: `action.song_now_playing`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Active song/playback state.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Music Controls, select Current song, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Active song/playback state.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run !song silently; only send chat output when sendResponse is true. Default response uses captured output; custom response resolves variables.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run !song silently; only send chat output when sendResponse is true. Default response uses captured output; custom response resolves variables.",
      "dynamicSource": null
    },
    {
      "key": "sendResponse",
      "type": "checkbox",
      "label": "Send chat response",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Run !song silently; only send chat output when sendResponse is true. Default response uses captured output; custom response resolves variables.",
      "dynamicSource": null
    },
    {
      "key": "response",
      "type": "textarea",
      "label": "Response",
      "placeholder": "Now playing: {title} by {artist}{requested_by}",
      "default": "Now playing: {title} by {artist}{requested_by}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "Now playing: {title} by {artist}{requested_by}",
        "timer": "Now playing: {title} by {artist}{requested_by}",
        "command": "Now playing: {title} by {artist}{requested_by}",
        "pad": "Now playing: {title} by {artist}{requested_by}"
      },
      "runtimeFallbackNote": "Run !song silently; only send chat output when sendResponse is true. Default response uses captured output; custom response resolves variables.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "song_now_playing",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Now playing: {title} by {artist}{requested_by}"
    },
    "timer": {
      "type": "song_now_playing",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Now playing: {title} by {artist}{requested_by}"
    },
    "command": {
      "type": "song_now_playing",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Now playing: {title} by {artist}{requested_by}"
    },
    "pad": {
      "type": "song_now_playing",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Now playing: {title} by {artist}{requested_by}"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Music Controls, select Current song, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch",
  "sendResponse": true
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.song_now_playing`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.song_queue"></a>

## Show song queue

Post the current song request queue.

ID: `action.song_queue`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Configured song request queue.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Music Controls, select Show song queue, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Configured song request queue.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run !queue silently; chat output is opt-in via sendResponse. Default response uses captured output.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run !queue silently; chat output is opt-in via sendResponse. Default response uses captured output.",
      "dynamicSource": null
    },
    {
      "key": "sendResponse",
      "type": "checkbox",
      "label": "Send chat response",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Run !queue silently; chat output is opt-in via sendResponse. Default response uses captured output.",
      "dynamicSource": null
    },
    {
      "key": "response",
      "type": "textarea",
      "label": "Response",
      "placeholder": "Queue: {queue}",
      "default": "Queue: {queue}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "Queue: {queue}",
        "timer": "Queue: {queue}",
        "command": "Queue: {queue}",
        "pad": "Queue: {queue}"
      },
      "runtimeFallbackNote": "Run !queue silently; chat output is opt-in via sendResponse. Default response uses captured output.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "song_queue",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Queue: {queue}"
    },
    "timer": {
      "type": "song_queue",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Queue: {queue}"
    },
    "command": {
      "type": "song_queue",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Queue: {queue}"
    },
    "pad": {
      "type": "song_queue",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Queue: {queue}"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Music Controls, select Show song queue, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch",
  "sendResponse": true
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.song_queue`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.song_skip"></a>

## Skip song

Skip the current song request.

ID: `action.song_skip`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Active song request playback.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Music Controls, select Skip song, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Active song request playback.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run !songskip; chat output is opt-in via sendResponse.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run !songskip; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    },
    {
      "key": "sendResponse",
      "type": "checkbox",
      "label": "Send chat response",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Run !songskip; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    },
    {
      "key": "response",
      "type": "textarea",
      "label": "Response",
      "placeholder": "@{user} skipped the current song.",
      "default": "@{user} skipped the current song.",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "@{user} skipped the current song.",
        "timer": "@{user} skipped the current song.",
        "command": "@{user} skipped the current song.",
        "pad": "@{user} skipped the current song."
      },
      "runtimeFallbackNote": "Run !songskip; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "song_skip",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "@{user} skipped the current song."
    },
    "timer": {
      "type": "song_skip",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "@{user} skipped the current song."
    },
    "command": {
      "type": "song_skip",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "@{user} skipped the current song."
    },
    "pad": {
      "type": "song_skip",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "@{user} skipped the current song."
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Music Controls, select Skip song, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch",
  "sendResponse": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.song_skip`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.song_pause"></a>

## Pause song

Pause song request playback.

ID: `action.song_pause`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Song request playback.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Music Controls, select Pause song, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Song request playback.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run !songpause; chat output is opt-in via sendResponse.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run !songpause; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    },
    {
      "key": "sendResponse",
      "type": "checkbox",
      "label": "Send chat response",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Run !songpause; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    },
    {
      "key": "response",
      "type": "textarea",
      "label": "Response",
      "placeholder": "Playback paused.",
      "default": "Playback paused.",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "Playback paused.",
        "timer": "Playback paused.",
        "command": "Playback paused.",
        "pad": "Playback paused."
      },
      "runtimeFallbackNote": "Run !songpause; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "song_pause",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Playback paused."
    },
    "timer": {
      "type": "song_pause",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Playback paused."
    },
    "command": {
      "type": "song_pause",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Playback paused."
    },
    "pad": {
      "type": "song_pause",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Playback paused."
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Music Controls, select Pause song, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch",
  "sendResponse": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.song_pause`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.song_resume"></a>

## Resume song

Resume song request playback.

ID: `action.song_resume`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Paused song request playback.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Music Controls, select Resume song, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Paused song request playback.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run !songresume; chat output is opt-in via sendResponse.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run !songresume; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    },
    {
      "key": "sendResponse",
      "type": "checkbox",
      "label": "Send chat response",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Run !songresume; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    },
    {
      "key": "response",
      "type": "textarea",
      "label": "Response",
      "placeholder": "Playback resumed.",
      "default": "Playback resumed.",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "Playback resumed.",
        "timer": "Playback resumed.",
        "command": "Playback resumed.",
        "pad": "Playback resumed."
      },
      "runtimeFallbackNote": "Run !songresume; chat output is opt-in via sendResponse.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "song_resume",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Playback resumed."
    },
    "timer": {
      "type": "song_resume",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Playback resumed."
    },
    "command": {
      "type": "song_resume",
      "message": "",
      "platform": "event",
      "sendResponse": false,
      "response": "Playback resumed."
    },
    "pad": {
      "type": "song_resume",
      "message": "",
      "platform": "all",
      "sendResponse": false,
      "response": "Playback resumed."
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Music Controls, select Resume song, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch",
  "sendResponse": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.song_resume`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.bonus_points"></a>

## Give bonus loyalty

Award bonus loyalty currency to a viewer. Blank username uses the triggering viewer when available.

ID: `action.bonus_points`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Loyalty enabled and a resolvable viewer identity.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Give bonus loyalty, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Loyalty enabled and a resolvable viewer identity.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Blank username uses the event user. Resolve amount; require a positive safe whole number. Award per target platform and send the result. Matching trigger identity is retained only on the originating platform.",
  "fields": [
    {
      "key": "username",
      "type": "text",
      "label": "Username",
      "placeholder": "{user}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{user}",
        "timer": "",
        "command": "{user}",
        "pad": ""
      },
      "runtimeFallbackNote": "Blank username uses the event user. Resolve amount; require a positive safe whole number. Award per target platform and send the result. Matching trigger identity is retained only on the originating platform.",
      "dynamicSource": null
    },
    {
      "key": "amount",
      "type": "text",
      "label": "Loyalty amount",
      "placeholder": "500",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "100",
        "timer": "100",
        "command": "100",
        "pad": "100"
      },
      "runtimeFallbackNote": "Blank username uses the event user. Resolve amount; require a positive safe whole number. Award per target platform and send the result. Matching trigger identity is retained only on the originating platform.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Blank username uses the event user. Resolve amount; require a positive safe whole number. Award per target platform and send the result. Matching trigger identity is retained only on the originating platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "bonus_points",
      "message": "",
      "platform": "event",
      "username": "{user}",
      "amount": "100"
    },
    "timer": {
      "type": "bonus_points",
      "message": "",
      "platform": "all",
      "username": "",
      "amount": "100"
    },
    "command": {
      "type": "bonus_points",
      "message": "",
      "platform": "event",
      "username": "{user}",
      "amount": "100"
    },
    "pad": {
      "type": "bonus_points",
      "message": "",
      "platform": "all",
      "username": "",
      "amount": "100"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Give bonus loyalty, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "username": "ExampleViewer",
  "amount": "100",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.bonus_points`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.set_loyalty_point_name"></a>

## Set loyalty name

Change the loyalty currency name everywhere in SheevChat without changing viewer balances or other loyalty settings.

ID: `action.set_loyalty_point_name`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Loyalty settings available.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Set loyalty name, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Loyalty settings available.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve and require a nonempty name; the field allows 32 characters. Changes the displayed currency name without altering balances.",
  "fields": [
    {
      "key": "pointsName",
      "type": "text",
      "label": "Loyalty name",
      "placeholder": "points",
      "maxlength": 32,
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve and require a nonempty name; the field allows 32 characters. Changes the displayed currency name without altering balances.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "set_loyalty_point_name",
      "pointsName": ""
    },
    "timer": {
      "type": "set_loyalty_point_name",
      "pointsName": ""
    },
    "command": {
      "type": "set_loyalty_point_name",
      "pointsName": ""
    },
    "pad": {
      "type": "set_loyalty_point_name",
      "pointsName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Set loyalty name, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "pointsName": "stars"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.set_loyalty_point_name`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.windows_set_default_playback"></a>

## Set Windows playback device

Change the Windows default playback endpoint. Console + Multimedia covers normal app audio; Communications is separate for calling apps.

ID: `action.windows_set_default_playback`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Windows and an available playback endpoint selected from the local list.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Set Windows playback device, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Windows and an available playback endpoint selected from the local list.",
    "accountFeature": null,
    "operatingSystems": [
      "windows"
    ]
  },
  "behavior": "Select a local playback endpoint. Roles default to console_multimedia; communications and all are separate choices. Open apps may retain their current audio stream.",
  "fields": [
    {
      "key": "deviceId",
      "type": "windows_audio_device_select",
      "label": "Playback device",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Select a local playback endpoint. Roles default to console_multimedia; communications and all are separate choices. Open apps may retain their current audio stream.",
      "dynamicSource": "Local Playback device picker; select an existing resource, never invent its ID."
    },
    {
      "key": "roles",
      "type": "select",
      "label": "Windows default roles",
      "default": "console_multimedia",
      "options": [
        {
          "value": "console_multimedia",
          "label": "Console + Multimedia (recommended)"
        },
        {
          "value": "communications",
          "label": "Communications only"
        },
        {
          "value": "all",
          "label": "All roles"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "console_multimedia",
        "timer": "console_multimedia",
        "command": "console_multimedia",
        "pad": "console_multimedia"
      },
      "runtimeFallbackNote": "Select a local playback endpoint. Roles default to console_multimedia; communications and all are separate choices. Open apps may retain their current audio stream.",
      "dynamicSource": null
    },
    {
      "key": "migrationNote",
      "type": "info",
      "label": "Already-open apps may keep their existing device until they reopen their audio stream.",
      "configurable": false,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Select a local playback endpoint. Roles default to console_multimedia; communications and all are separate choices. Open apps may retain their current audio stream.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "windows_set_default_playback",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    },
    "timer": {
      "type": "windows_set_default_playback",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    },
    "command": {
      "type": "windows_set_default_playback",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    },
    "pad": {
      "type": "windows_set_default_playback",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Set Windows playback device, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "deviceId": "fixture-playback",
  "roles": "console_multimedia"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.windows_set_default_playback`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.windows_set_default_input"></a>

## Set Windows input device

Change the Windows default microphone or capture endpoint. Console + Multimedia covers normal app input; Communications is separate for calling apps.

ID: `action.windows_set_default_input`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Windows and an available recording endpoint selected from the local list.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Set Windows input device, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Windows and an available recording endpoint selected from the local list.",
    "accountFeature": null,
    "operatingSystems": [
      "windows"
    ]
  },
  "behavior": "Select a local recording endpoint. Roles default to console_multimedia. Open apps may retain the old input until they reopen their stream.",
  "fields": [
    {
      "key": "deviceId",
      "type": "windows_audio_input_device_select",
      "label": "Input device",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Select a local recording endpoint. Roles default to console_multimedia. Open apps may retain the old input until they reopen their stream.",
      "dynamicSource": "Local Input device picker; select an existing resource, never invent its ID."
    },
    {
      "key": "roles",
      "type": "select",
      "label": "Windows default roles",
      "default": "console_multimedia",
      "options": [
        {
          "value": "console_multimedia",
          "label": "Console + Multimedia (recommended)"
        },
        {
          "value": "communications",
          "label": "Communications only"
        },
        {
          "value": "all",
          "label": "All roles"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "console_multimedia",
        "timer": "console_multimedia",
        "command": "console_multimedia",
        "pad": "console_multimedia"
      },
      "runtimeFallbackNote": "Select a local recording endpoint. Roles default to console_multimedia. Open apps may retain the old input until they reopen their stream.",
      "dynamicSource": null
    },
    {
      "key": "migrationNote",
      "type": "info",
      "label": "Already-open apps may keep their existing input until they reopen their audio stream.",
      "configurable": false,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Select a local recording endpoint. Roles default to console_multimedia. Open apps may retain the old input until they reopen their stream.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "windows_set_default_input",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    },
    "timer": {
      "type": "windows_set_default_input",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    },
    "command": {
      "type": "windows_set_default_input",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    },
    "pad": {
      "type": "windows_set_default_input",
      "deviceId": "",
      "deviceName": "",
      "roles": "console_multimedia"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Set Windows input device, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "deviceId": "fixture-input",
  "roles": "console_multimedia"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.windows_set_default_input`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.windows_set_system_volume"></a>

## Set Windows system volume

Set the master volume on the current default Multimedia playback device.

ID: `action.windows_set_system_volume`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Windows audio service and a default Multimedia endpoint.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Set Windows system volume, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Windows audio service and a default Multimedia endpoint.",
    "accountFeature": null,
    "operatingSystems": [
      "windows"
    ]
  },
  "behavior": "Set current default Multimedia playback master volume; missing volume defaults to 50. Valid UI range is 0–100 percent.",
  "fields": [
    {
      "key": "volume",
      "type": "number",
      "label": "System volume percent",
      "min": 0,
      "max": 100,
      "default": 50,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 50,
        "timer": 50,
        "command": 50,
        "pad": 50
      },
      "runtimeFallbackNote": "Set current default Multimedia playback master volume; missing volume defaults to 50. Valid UI range is 0–100 percent.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "windows_set_system_volume",
      "volume": 50
    },
    "timer": {
      "type": "windows_set_system_volume",
      "volume": 50
    },
    "command": {
      "type": "windows_set_system_volume",
      "volume": 50
    },
    "pad": {
      "type": "windows_set_system_volume",
      "volume": 50
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Set Windows system volume, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "volume": 50
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.windows_set_system_volume`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.windows_set_system_mute"></a>

## Set Windows system mute

Mute, unmute, or toggle the current default Multimedia playback device.

ID: `action.windows_set_system_mute`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Windows audio service and a default Multimedia endpoint.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Set Windows system mute, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Windows audio service and a default Multimedia endpoint.",
    "accountFeature": null,
    "operatingSystems": [
      "windows"
    ]
  },
  "behavior": "Mode defaults to toggle; mute/unmute set explicit state on the default Multimedia playback endpoint.",
  "fields": [
    {
      "key": "mode",
      "type": "select",
      "label": "Mute action",
      "default": "toggle",
      "options": [
        {
          "value": "toggle",
          "label": "Toggle mute"
        },
        {
          "value": "mute",
          "label": "Mute"
        },
        {
          "value": "unmute",
          "label": "Unmute"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "toggle",
        "timer": "toggle",
        "command": "toggle",
        "pad": "toggle"
      },
      "runtimeFallbackNote": "Mode defaults to toggle; mute/unmute set explicit state on the default Multimedia playback endpoint.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "windows_set_system_mute",
      "mode": "toggle"
    },
    "timer": {
      "type": "windows_set_system_mute",
      "mode": "toggle"
    },
    "command": {
      "type": "windows_set_system_mute",
      "mode": "toggle"
    },
    "pad": {
      "type": "windows_set_system_mute",
      "mode": "toggle"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Set Windows system mute, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "mode": "toggle"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.windows_set_system_mute`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.twitch_snooze_upcoming_ad"></a>

## Snooze upcoming Twitch ad

Use one available Twitch ad snooze. In an Incoming raid Automation, optionally skip this action unless the next ad falls within a chosen window.

ID: `action.twitch_snooze_upcoming_ad`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Twitch broadcaster ad-management access and an available snooze. Use Incoming raid context for a captured ad window.

- Ad snoozing is a Twitch-only API action.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Stream Platform Commands, select Snooze upcoming Twitch ad, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Twitch broadcaster ad-management access and an available snooze. Use Incoming raid context for a captured ad window.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "withinMinutes defaults to 0 and clamps 0–180. A positive window skips when the captured upcoming-ad schedule is outside the window or unavailable; 0 attempts a snooze without this test.",
  "fields": [
    {
      "key": "withinMinutes",
      "type": "number",
      "label": "Only if next ad is within minutes (0 = always)",
      "min": 0,
      "max": 180,
      "default": 0,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 0,
        "timer": 0,
        "command": 0,
        "pad": 0
      },
      "runtimeFallbackNote": "withinMinutes defaults to 0 and clamps 0–180. A positive window skips when the captured upcoming-ad schedule is outside the window or unavailable; 0 attempts a snooze without this test.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "twitch_snooze_upcoming_ad"
    },
    "timer": {
      "type": "twitch_snooze_upcoming_ad"
    },
    "command": {
      "type": "twitch_snooze_upcoming_ad"
    },
    "pad": {
      "type": "twitch_snooze_upcoming_ad"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Stream Platform Commands, select Snooze upcoming Twitch ad, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "withinMinutes": 0
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.twitch_snooze_upcoming_ad`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.top_points"></a>

## Show top loyalty

Post the loyalty leaderboard.

ID: `action.top_points`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Loyalty enabled.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Show top loyalty, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Loyalty enabled.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run registered !top as an automation actor and post its reply per output target.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run registered !top as an automation actor and post its reply per output target.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "top_points",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "top_points",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "top_points",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "top_points",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Show top loyalty, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.top_points`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.random_quote"></a>

## Post random quote

Post a random saved quote, or search if filter text is provided.

ID: `action.random_quote`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: At least one saved quote for a result.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Post random quote, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "At least one saved quote for a result.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run !quote with optional resolved filter/ID; blank chooses a random saved quote.",
  "fields": [
    {
      "key": "filter",
      "type": "text",
      "label": "Optional search text or quote ID",
      "placeholder": "",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Run !quote with optional resolved filter/ID; blank chooses a random saved quote.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Run !quote with optional resolved filter/ID; blank chooses a random saved quote.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "random_quote",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "random_quote",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "random_quote",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "random_quote",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Post random quote, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "filter": "",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.random_quote`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.add_quote"></a>

## Add quote

Save a quote to the quote database.

ID: `action.add_quote`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Quote storage available.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Add quote, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Quote storage available.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve quote_text and pass it to !quoteadd; saves through the normal quote command handler.",
  "fields": [
    {
      "key": "quote_text",
      "type": "textarea",
      "label": "Quote text",
      "placeholder": "{user}: {message}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{user}: {message}",
        "timer": "",
        "command": "{user}: {message}",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve quote_text and pass it to !quoteadd; saves through the normal quote command handler.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve quote_text and pass it to !quoteadd; saves through the normal quote command handler.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "add_quote",
      "message": "",
      "platform": "event",
      "quote_text": "{user}: {message}"
    },
    "timer": {
      "type": "add_quote",
      "message": "",
      "platform": "all",
      "quote_text": ""
    },
    "command": {
      "type": "add_quote",
      "message": "",
      "platform": "event",
      "quote_text": "{user}: {message}"
    },
    "pad": {
      "type": "add_quote",
      "message": "",
      "platform": "all",
      "quote_text": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Add quote, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "quote_text": "An example quote",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.add_quote`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.increment_counter"></a>

## Increment counter

Add to a named counter. Amount defaults to 1.

ID: `action.increment_counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Named counter or permission to create it through the command handler.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Increment counter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Named counter or permission to create it through the command handler.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve counter_name and amount; missing amount defaults to 1. Dispatch !count on each chosen platform.",
  "fields": [
    {
      "key": "counter_name",
      "type": "text",
      "label": "Counter name",
      "placeholder": "deaths",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve counter_name and amount; missing amount defaults to 1. Dispatch !count on each chosen platform.",
      "dynamicSource": null
    },
    {
      "key": "amount",
      "type": "text",
      "label": "Amount",
      "placeholder": "1",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "1",
        "timer": "1",
        "command": "1",
        "pad": "1"
      },
      "runtimeFallbackNote": "Resolve counter_name and amount; missing amount defaults to 1. Dispatch !count on each chosen platform.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve counter_name and amount; missing amount defaults to 1. Dispatch !count on each chosen platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "increment_counter",
      "message": "",
      "platform": "event",
      "counter_name": "",
      "amount": "1"
    },
    "timer": {
      "type": "increment_counter",
      "message": "",
      "platform": "all",
      "counter_name": "",
      "amount": "1"
    },
    "command": {
      "type": "increment_counter",
      "message": "",
      "platform": "event",
      "counter_name": "",
      "amount": "1"
    },
    "pad": {
      "type": "increment_counter",
      "message": "",
      "platform": "all",
      "counter_name": "",
      "amount": "1"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Increment counter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "counter_name": "deaths",
  "amount": "1",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.increment_counter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.set_counter"></a>

## Set counter

Set a named counter to a specific value.

ID: `action.set_counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Counter storage available.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Set counter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Counter storage available.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve counter_name and value; missing value defaults to 0. Dispatch !setcounter.",
  "fields": [
    {
      "key": "counter_name",
      "type": "text",
      "label": "Counter name",
      "placeholder": "deaths",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve counter_name and value; missing value defaults to 0. Dispatch !setcounter.",
      "dynamicSource": null
    },
    {
      "key": "value",
      "type": "text",
      "label": "Value",
      "placeholder": "0",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "0",
        "timer": "0",
        "command": "0",
        "pad": "0"
      },
      "runtimeFallbackNote": "Resolve counter_name and value; missing value defaults to 0. Dispatch !setcounter.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve counter_name and value; missing value defaults to 0. Dispatch !setcounter.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "set_counter",
      "message": "",
      "platform": "event",
      "counter_name": "",
      "value": "0"
    },
    "timer": {
      "type": "set_counter",
      "message": "",
      "platform": "all",
      "counter_name": "",
      "value": "0"
    },
    "command": {
      "type": "set_counter",
      "message": "",
      "platform": "event",
      "counter_name": "",
      "value": "0"
    },
    "pad": {
      "type": "set_counter",
      "message": "",
      "platform": "all",
      "counter_name": "",
      "value": "0"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Set counter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "counter_name": "deaths",
  "value": "5",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.set_counter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.reset_counter"></a>

## Reset counter

Reset a named counter back to zero.

ID: `action.reset_counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: A named counter.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Reset counter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A named counter.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve counter name through !resetcounter and reset it to zero.",
  "fields": [
    {
      "key": "counter_name",
      "type": "text",
      "label": "Counter name",
      "placeholder": "deaths",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve counter name through !resetcounter and reset it to zero.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve counter name through !resetcounter and reset it to zero.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "reset_counter",
      "message": "",
      "platform": "event",
      "counter_name": ""
    },
    "timer": {
      "type": "reset_counter",
      "message": "",
      "platform": "all",
      "counter_name": ""
    },
    "command": {
      "type": "reset_counter",
      "message": "",
      "platform": "event",
      "counter_name": ""
    },
    "pad": {
      "type": "reset_counter",
      "message": "",
      "platform": "all",
      "counter_name": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Reset counter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "counter_name": "deaths",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.reset_counter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.increment_user_counter"></a>

## Increment user counter

Add to one viewer inside a user counter category. Blank username uses the triggering viewer.

ID: `action.increment_user_counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: User counter category and viewer identity.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Increment user counter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "User counter category and viewer identity.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve category, username and amount; blank username uses event user, missing amount is 1. Adjust one viewer per target platform.",
  "fields": [
    {
      "key": "category",
      "type": "text",
      "label": "Counter category",
      "placeholder": "Check In",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category, username and amount; blank username uses event user, missing amount is 1. Adjust one viewer per target platform.",
      "dynamicSource": null
    },
    {
      "key": "username",
      "type": "text",
      "label": "Username",
      "placeholder": "{user}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{user}",
        "timer": "",
        "command": "{user}",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category, username and amount; blank username uses event user, missing amount is 1. Adjust one viewer per target platform.",
      "dynamicSource": null
    },
    {
      "key": "amount",
      "type": "text",
      "label": "Amount",
      "placeholder": "1",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "1",
        "timer": "1",
        "command": "1",
        "pad": "1"
      },
      "runtimeFallbackNote": "Resolve category, username and amount; blank username uses event user, missing amount is 1. Adjust one viewer per target platform.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve category, username and amount; blank username uses event user, missing amount is 1. Adjust one viewer per target platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "increment_user_counter",
      "message": "",
      "platform": "event",
      "category": "",
      "username": "{user}",
      "amount": "1"
    },
    "timer": {
      "type": "increment_user_counter",
      "message": "",
      "platform": "all",
      "category": "",
      "username": "",
      "amount": "1"
    },
    "command": {
      "type": "increment_user_counter",
      "message": "",
      "platform": "event",
      "category": "",
      "username": "{user}",
      "amount": "1"
    },
    "pad": {
      "type": "increment_user_counter",
      "message": "",
      "platform": "all",
      "category": "",
      "username": "",
      "amount": "1"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Increment user counter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "category": "Check In",
  "username": "ExampleViewer",
  "amount": "1",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.increment_user_counter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.set_user_counter"></a>

## Set user counter

Set one viewer value inside a user counter category.

ID: `action.set_user_counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: User counter category and viewer identity.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Set user counter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "User counter category and viewer identity.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve category, username and value; blank username uses event user, missing value is 0. Set the viewer value per target platform.",
  "fields": [
    {
      "key": "category",
      "type": "text",
      "label": "Counter category",
      "placeholder": "Check In",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category, username and value; blank username uses event user, missing value is 0. Set the viewer value per target platform.",
      "dynamicSource": null
    },
    {
      "key": "username",
      "type": "text",
      "label": "Username",
      "placeholder": "{user}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{user}",
        "timer": "",
        "command": "{user}",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category, username and value; blank username uses event user, missing value is 0. Set the viewer value per target platform.",
      "dynamicSource": null
    },
    {
      "key": "value",
      "type": "text",
      "label": "Value",
      "placeholder": "0",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "0",
        "timer": "0",
        "command": "0",
        "pad": "0"
      },
      "runtimeFallbackNote": "Resolve category, username and value; blank username uses event user, missing value is 0. Set the viewer value per target platform.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve category, username and value; blank username uses event user, missing value is 0. Set the viewer value per target platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "set_user_counter",
      "message": "",
      "platform": "event",
      "category": "",
      "username": "{user}",
      "value": "0"
    },
    "timer": {
      "type": "set_user_counter",
      "message": "",
      "platform": "all",
      "category": "",
      "username": "",
      "value": "0"
    },
    "command": {
      "type": "set_user_counter",
      "message": "",
      "platform": "event",
      "category": "",
      "username": "{user}",
      "value": "0"
    },
    "pad": {
      "type": "set_user_counter",
      "message": "",
      "platform": "all",
      "category": "",
      "username": "",
      "value": "0"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Set user counter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "category": "Check In",
  "username": "ExampleViewer",
  "value": "5",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.set_user_counter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.reset_user_counter"></a>

## Reset user counter

Reset one viewer value inside a user counter category.

ID: `action.reset_user_counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: User counter category and viewer identity.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Reset user counter, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "User counter category and viewer identity.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve category and username; blank username uses event user. Set the viewer value to zero per target platform.",
  "fields": [
    {
      "key": "category",
      "type": "text",
      "label": "Counter category",
      "placeholder": "Check In",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category and username; blank username uses event user. Set the viewer value to zero per target platform.",
      "dynamicSource": null
    },
    {
      "key": "username",
      "type": "text",
      "label": "Username",
      "placeholder": "{user}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{user}",
        "timer": "",
        "command": "{user}",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category and username; blank username uses event user. Set the viewer value to zero per target platform.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve category and username; blank username uses event user. Set the viewer value to zero per target platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "reset_user_counter",
      "message": "",
      "platform": "event",
      "category": "",
      "username": "{user}"
    },
    "timer": {
      "type": "reset_user_counter",
      "message": "",
      "platform": "all",
      "category": "",
      "username": ""
    },
    "command": {
      "type": "reset_user_counter",
      "message": "",
      "platform": "event",
      "category": "",
      "username": "{user}"
    },
    "pad": {
      "type": "reset_user_counter",
      "message": "",
      "platform": "all",
      "category": "",
      "username": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Reset user counter, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "category": "Check In",
  "username": "ExampleViewer",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.reset_user_counter`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.watchtime_lookup"></a>

## Show watchtime

Post watchtime for a viewer. Blank username uses the triggering viewer when available.

ID: `action.watchtime_lookup`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Tracked viewer watchtime.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Show watchtime, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Tracked viewer watchtime.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Blank username uses event user. Resolve and run !watchtime as an automation actor.",
  "fields": [
    {
      "key": "username",
      "type": "text",
      "label": "Username",
      "placeholder": "{user}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{user}",
        "timer": "",
        "command": "{user}",
        "pad": ""
      },
      "runtimeFallbackNote": "Blank username uses event user. Resolve and run !watchtime as an automation actor.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Blank username uses event user. Resolve and run !watchtime as an automation actor.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "watchtime_lookup",
      "message": "",
      "platform": "event",
      "username": "{user}"
    },
    "timer": {
      "type": "watchtime_lookup",
      "message": "",
      "platform": "all",
      "username": ""
    },
    "command": {
      "type": "watchtime_lookup",
      "message": "",
      "platform": "event",
      "username": "{user}"
    },
    "pad": {
      "type": "watchtime_lookup",
      "message": "",
      "platform": "all",
      "username": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Show watchtime, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "username": "ExampleViewer",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.watchtime_lookup`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.stop_trivia"></a>

## Stop trivia

Stop the one active unified trivia game on every participating platform.

ID: `action.stop_trivia`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Trivia runtime; no independent per-platform game is created.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Stop trivia, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Trivia runtime; no independent per-platform game is created.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Stop the single shared active trivia game across participating platforms; no target fields.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "stop_trivia",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "stop_trivia",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "stop_trivia",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "stop_trivia",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Stop trivia, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.stop_trivia`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.set_stream_title"></a>

## Set stream title

Update the stream title on selected platforms. Supports command variables.

ID: `action.set_stream_title`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Connected selected broadcaster accounts with metadata update permissions. TikTok title updates are unsupported.

- TikTok does not expose a supported stream-title update API.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Stream Platform Commands, select Set stream title, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected selected broadcaster accounts with metadata update permissions. TikTok title updates are unsupported.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve title and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Timers restrict toggles to the current eligible platform.",
  "fields": [
    {
      "key": "title",
      "type": "textarea",
      "label": "Title",
      "placeholder": "Tonight: {channel.category} with chat",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Timers restrict toggles to the current eligible platform.",
      "dynamicSource": null
    },
    {
      "key": "twitch",
      "type": "checkbox",
      "label": "Twitch",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Resolve title and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Timers restrict toggles to the current eligible platform.",
      "dynamicSource": null
    },
    {
      "key": "youtube",
      "type": "checkbox",
      "label": "YouTube",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Resolve title and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Timers restrict toggles to the current eligible platform.",
      "dynamicSource": null
    },
    {
      "key": "kick",
      "type": "checkbox",
      "label": "Kick",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Resolve title and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Timers restrict toggles to the current eligible platform.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "set_stream_title",
      "title": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "timer": {
      "type": "set_stream_title",
      "title": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "command": {
      "type": "set_stream_title",
      "title": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "pad": {
      "type": "set_stream_title",
      "title": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Stream Platform Commands, select Set stream title, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "title": "Community night",
  "twitch": true,
  "youtube": false,
  "kick": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.set_stream_title`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.set_stream_category"></a>

## Set stream category

Update the category/game on selected platforms. YouTube also accepts a numeric category ID.

ID: `action.set_stream_category`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Connected selected broadcaster accounts with category update permissions. TikTok is unsupported.

- TikTok does not expose a supported stream-category update API.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Stream Platform Commands, select Set stream category, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected selected broadcaster accounts with category update permissions. TikTok is unsupported.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve category and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Provider category resolution may fail independently.",
  "fields": [
    {
      "key": "category",
      "type": "text",
      "label": "Category / game",
      "placeholder": "Just Chatting",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve category and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Provider category resolution may fail independently.",
      "dynamicSource": null
    },
    {
      "key": "twitch",
      "type": "checkbox",
      "label": "Twitch",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Resolve category and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Provider category resolution may fail independently.",
      "dynamicSource": null
    },
    {
      "key": "youtube",
      "type": "checkbox",
      "label": "YouTube",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Resolve category and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Provider category resolution may fail independently.",
      "dynamicSource": null
    },
    {
      "key": "kick",
      "type": "checkbox",
      "label": "Kick",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Resolve category and trim; blank does nothing. Apply to selected Twitch/YouTube/Kick toggles; missing toggles select all three. Provider category resolution may fail independently.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "set_stream_category",
      "category": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "timer": {
      "type": "set_stream_category",
      "category": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "command": {
      "type": "set_stream_category",
      "category": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "pad": {
      "type": "set_stream_category",
      "category": "",
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Stream Platform Commands, select Set stream category, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "category": "Just Chatting",
  "twitch": true,
  "youtube": false,
  "kick": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.set_stream_category`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.change_theme"></a>

## Chat Overlay

Apply a saved Chat Overlay theme preset. Future overlay theme packs will use this same picker.

ID: `action.change_theme`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: A compatible saved chat overlay theme.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Change Theme, select Chat Overlay, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A compatible saved chat overlay theme.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Apply a saved chat overlay preset; preset selection is a saved resource ID, not a CSS payload.",
  "fields": [
    {
      "key": "presetId",
      "type": "theme_select",
      "label": "Chat Overlay preset",
      "source": "overlay_presets.chat",
      "labelKey": "presetName",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Apply a saved chat overlay preset; preset selection is a saved resource ID, not a CSS payload.",
      "dynamicSource": "overlay_presets.chat"
    },
    {
      "key": "transitionStyle",
      "type": "select",
      "label": "Transition",
      "default": "none",
      "options": [
        {
          "value": "none",
          "label": "None"
        },
        {
          "value": "fade",
          "label": "Fade"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "none",
        "timer": "none",
        "command": "none",
        "pad": "none"
      },
      "runtimeFallbackNote": "Apply a saved chat overlay preset; preset selection is a saved resource ID, not a CSS payload.",
      "dynamicSource": null
    },
    {
      "key": "transitionMs",
      "type": "number",
      "label": "Transition time (ms)",
      "default": 0,
      "min": 0,
      "max": 30000,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 0,
        "timer": 0,
        "command": 0,
        "pad": 0
      },
      "runtimeFallbackNote": "Apply a saved chat overlay preset; preset selection is a saved resource ID, not a CSS payload.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "change_theme",
      "target": "chat_overlay",
      "presetId": "",
      "presetName": ""
    },
    "timer": {
      "type": "change_theme",
      "target": "chat_overlay",
      "presetId": "",
      "presetName": ""
    },
    "command": {
      "type": "change_theme",
      "target": "chat_overlay",
      "presetId": "",
      "presetName": ""
    },
    "pad": {
      "type": "change_theme",
      "target": "chat_overlay",
      "presetId": "",
      "presetName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Change Theme, select Chat Overlay, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "target": "chat_overlay",
  "presetId": "fixture-theme"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.change_theme`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.change_master_overlay"></a>

## Master Overlay

Switch the dynamic Master Overlay source to an existing Overlay Builder overlay.

ID: `action.change_master_overlay`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: A saved Overlay Builder source and running master overlay.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Change Theme, select Master Overlay, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A saved Overlay Builder source and running master overlay.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Switch the master overlay to a saved Overlay Builder source with the selected transition; requires a saved source.",
  "fields": [
    {
      "key": "overlaySlug",
      "type": "theme_select",
      "label": "Master Overlay target",
      "source": "overlay_builder.saved_overlays",
      "labelKey": "overlayName",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Switch the master overlay to a saved Overlay Builder source with the selected transition; requires a saved source.",
      "dynamicSource": "overlay_builder.saved_overlays"
    },
    {
      "key": "transitionStyle",
      "type": "select",
      "label": "Transition",
      "default": "none",
      "options": [
        {
          "value": "none",
          "label": "None"
        },
        {
          "value": "fade",
          "label": "Fade"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "none",
        "timer": "none",
        "command": "none",
        "pad": "none"
      },
      "runtimeFallbackNote": "Switch the master overlay to a saved Overlay Builder source with the selected transition; requires a saved source.",
      "dynamicSource": null
    },
    {
      "key": "transitionMs",
      "type": "number",
      "label": "Transition time (ms)",
      "default": 0,
      "min": 0,
      "max": 30000,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 0,
        "timer": 0,
        "command": 0,
        "pad": 0
      },
      "runtimeFallbackNote": "Switch the master overlay to a saved Overlay Builder source with the selected transition; requires a saved source.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "change_master_overlay",
      "overlaySlug": "",
      "overlayName": "",
      "transitionStyle": "none",
      "transitionMs": 0
    },
    "timer": {
      "type": "change_master_overlay",
      "overlaySlug": "",
      "overlayName": "",
      "transitionStyle": "none",
      "transitionMs": 0
    },
    "command": {
      "type": "change_master_overlay",
      "overlaySlug": "",
      "overlayName": "",
      "transitionStyle": "none",
      "transitionMs": 0
    },
    "pad": {
      "type": "change_master_overlay",
      "overlaySlug": "",
      "overlayName": "",
      "transitionStyle": "none",
      "transitionMs": 0
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Change Theme, select Master Overlay, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "overlaySlug": "fixture-overlay",
  "transitionStyle": "none",
  "transitionMs": 0
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.change_master_overlay`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ui_resizing"></a>

## UI Resizing

Adjust SheevChat UI font-size sliders from commands, automations, timers, or SheevPad.

ID: `action.ui_resizing`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: SheevChat renderer connected.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category SheevChat, select UI Resizing, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "SheevChat renderer connected.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Adjust the selected app font area by a step clamped 1–8. Missing direction increases; decrease applies a negative step; target defaults to all.",
  "fields": [
    {
      "key": "target",
      "type": "select",
      "label": "Resize",
      "default": "all",
      "options": [
        {
          "value": "all",
          "label": "All UI font sliders"
        },
        {
          "value": "chat",
          "label": "Chat font"
        },
        {
          "value": "events",
          "label": "Events font"
        },
        {
          "value": "viewers",
          "label": "Viewers font"
        },
        {
          "value": "sidebar",
          "label": "Sidebar font"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "all",
        "timer": "all",
        "command": "all",
        "pad": "all"
      },
      "runtimeFallbackNote": "Adjust the selected app font area by a step clamped 1–8. Missing direction increases; decrease applies a negative step; target defaults to all.",
      "dynamicSource": null
    },
    {
      "key": "direction",
      "type": "select",
      "label": "Direction",
      "default": "increase",
      "options": [
        {
          "value": "increase",
          "label": "Increase"
        },
        {
          "value": "decrease",
          "label": "Decrease"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "increase",
        "timer": "increase",
        "command": "increase",
        "pad": "increase"
      },
      "runtimeFallbackNote": "Adjust the selected app font area by a step clamped 1–8. Missing direction increases; decrease applies a negative step; target defaults to all.",
      "dynamicSource": null
    },
    {
      "key": "amount",
      "type": "number",
      "label": "Step size",
      "default": 1,
      "min": 1,
      "max": 8,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 1,
        "timer": 1,
        "command": 1,
        "pad": 1
      },
      "runtimeFallbackNote": "Adjust the selected app font area by a step clamped 1–8. Missing direction increases; decrease applies a negative step; target defaults to all.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ui_resizing",
      "target": "all",
      "direction": "increase",
      "amount": 1
    },
    "timer": {
      "type": "ui_resizing",
      "target": "all",
      "direction": "increase",
      "amount": 1
    },
    "command": {
      "type": "ui_resizing",
      "target": "all",
      "direction": "increase",
      "amount": 1
    },
    "pad": {
      "type": "ui_resizing",
      "target": "all",
      "direction": "increase",
      "amount": 1
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category SheevChat, select UI Resizing, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "target": "all",
  "direction": "increase",
  "amount": 1
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ui_resizing`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.trigger_alert"></a>

## Trigger Alert

Send an alert payload to Overlay Builder Alert Box widgets. Event variables from raids, subs, follows, cheers, and custom triggers can be used in the text fields.

ID: `action.trigger_alert`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Saved Alert Box preset/placement and running Overlay Builder browser source.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Send to Overlay, select Trigger Alert, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Saved Alert Box preset/placement and running Overlay Builder browser source.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
  "fields": [
    {
      "key": "overlaySlug",
      "type": "theme_select",
      "label": "Overlay source",
      "source": "overlay_builder.overlays",
      "labelKey": "overlayName",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": "overlay_builder.overlays"
    },
    {
      "key": "presetId",
      "type": "theme_select",
      "label": "Alert preset",
      "source": "alert_presets.local",
      "labelKey": "presetName",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": "alert_presets.local"
    },
    {
      "key": "alertType",
      "type": "select",
      "label": "Alert context",
      "default": "custom",
      "options": [
        {
          "value": "custom",
          "label": "Custom"
        },
        {
          "value": "follow",
          "label": "Follow"
        },
        {
          "value": "sub",
          "label": "Subscription"
        },
        {
          "value": "gift_sub",
          "label": "Gift sub"
        },
        {
          "value": "raid",
          "label": "Raid"
        },
        {
          "value": "cheer",
          "label": "Bits / KICKs"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "custom",
        "timer": "custom",
        "command": "custom",
        "pad": "custom"
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": null
    },
    {
      "key": "title",
      "type": "text",
      "label": "Title",
      "placeholder": "Alert",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": null
    },
    {
      "key": "message",
      "type": "textarea",
      "label": "Message",
      "placeholder": "{user} triggered an alert!",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": null
    },
    {
      "key": "mediaId",
      "type": "media_select",
      "label": "Visual media",
      "mediaTypes": "image,gif,video",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": "Local Visual media picker; select an existing resource, never invent its ID."
    },
    {
      "key": "soundId",
      "type": "media_select",
      "label": "Sound",
      "mediaTypes": "audio",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": "Local Sound picker; select an existing resource, never invent its ID."
    },
    {
      "key": "durationMs",
      "type": "number",
      "label": "Duration (ms)",
      "default": 8000,
      "min": 1000,
      "max": 60000,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 8000,
        "timer": 8000,
        "command": 8000,
        "pad": 8000
      },
      "runtimeFallbackNote": "Resolve title/message, then dispatch to Alert Box placements using selected overlay/preset/media. Blank resource values allow downstream preset/default resolution. Duration is milliseconds; do not treat seconds as milliseconds.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "trigger_alert",
      "message": "",
      "overlaySlug": "",
      "overlayName": "",
      "presetId": "",
      "presetName": "",
      "title": "",
      "mediaId": "",
      "soundId": ""
    },
    "timer": {
      "type": "trigger_alert",
      "message": "",
      "overlaySlug": "",
      "overlayName": "",
      "presetId": "",
      "presetName": "",
      "title": "",
      "mediaId": "",
      "soundId": ""
    },
    "command": {
      "type": "trigger_alert",
      "message": "",
      "overlaySlug": "",
      "overlayName": "",
      "presetId": "",
      "presetName": "",
      "title": "",
      "mediaId": "",
      "soundId": ""
    },
    "pad": {
      "type": "trigger_alert",
      "message": "",
      "overlaySlug": "",
      "overlayName": "",
      "presetId": "",
      "presetName": "",
      "title": "",
      "mediaId": "",
      "soundId": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Send to Overlay, select Trigger Alert, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "overlaySlug": "fixture-overlay",
  "presetId": "fixture-alert",
  "title": "Hello",
  "message": "Welcome {user}!",
  "durationMs": 8000
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.trigger_alert`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.trigger_marketplace_widget"></a>

## Trigger Marketplace Widget

Send a button/action event to a Marketplace Item widget in Overlay Builder.

ID: `action.trigger_marketplace_widget`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Installed active Marketplace widget, placed surface and its declared action contract.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Overlay Widgets, select Trigger Marketplace Widget, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Installed active Marketplace widget, placed surface and its declared action contract.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve buttonKey (runtime blank fallback run; editor initializes spinWheel) and payloadJson. Invalid JSON becomes a message payload rather than a parse failure. Target actions must exist on the installed widget.",
  "fields": [
    {
      "key": "widgetTarget",
      "type": "theme_select",
      "label": "Marketplace widget",
      "source": "overlay_builder.marketplace_widgets",
      "labelKey": "widgetName",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve buttonKey (runtime blank fallback run; editor initializes spinWheel) and payloadJson. Invalid JSON becomes a message payload rather than a parse failure. Target actions must exist on the installed widget.",
      "dynamicSource": "overlay_builder.marketplace_widgets"
    },
    {
      "key": "buttonKey",
      "type": "text",
      "label": "Widget action",
      "placeholder": "spinWheel",
      "default": "spinWheel",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "spinWheel",
        "timer": "spinWheel",
        "command": "spinWheel",
        "pad": "spinWheel"
      },
      "runtimeFallbackNote": "Resolve buttonKey (runtime blank fallback run; editor initializes spinWheel) and payloadJson. Invalid JSON becomes a message payload rather than a parse failure. Target actions must exist on the installed widget.",
      "dynamicSource": null
    },
    {
      "key": "payloadJson",
      "type": "textarea",
      "label": "Payload JSON",
      "placeholder": "{\"source\":\"channel-point\"}",
      "default": "",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve buttonKey (runtime blank fallback run; editor initializes spinWheel) and payloadJson. Invalid JSON becomes a message payload rather than a parse failure. Target actions must exist on the installed widget.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "trigger_marketplace_widget",
      "widgetTarget": "",
      "widgetName": "",
      "buttonKey": "spinWheel",
      "payloadJson": ""
    },
    "timer": {
      "type": "trigger_marketplace_widget",
      "widgetTarget": "",
      "widgetName": "",
      "buttonKey": "spinWheel",
      "payloadJson": ""
    },
    "command": {
      "type": "trigger_marketplace_widget",
      "widgetTarget": "",
      "widgetName": "",
      "buttonKey": "spinWheel",
      "payloadJson": ""
    },
    "pad": {
      "type": "trigger_marketplace_widget",
      "widgetTarget": "",
      "widgetName": "",
      "buttonKey": "spinWheel",
      "payloadJson": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Overlay Widgets, select Trigger Marketplace Widget, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "widgetTarget": "fixture-widget",
  "buttonKey": "run",
  "payloadJson": "{}"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.trigger_marketplace_widget`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.send_overlay_tts"></a>

## Send TTS/Text Payload

Speak text through every running Overlay Builder browser source. This does not play desktop TTS audio.

ID: `action.send_overlay_tts`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Running Overlay Builder browser source and configured supported TTS voice.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Send to Overlay, select Send TTS/Text Payload, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Running Overlay Builder browser source and configured supported TTS voice.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve text; blank does nothing. Speak through running Overlay Builder browser sources, not desktop TTS. Global voice is used unless a supported piper: or kokoro: override is selected.",
  "fields": [
    {
      "key": "text",
      "type": "textarea",
      "label": "Text",
      "placeholder": "{user} redeemed {reward}: {message}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Speak through running Overlay Builder browser sources, not desktop TTS. Global voice is used unless a supported piper: or kokoro: override is selected.",
      "dynamicSource": null
    },
    {
      "key": "ttsVoice",
      "type": "tts_voice_select",
      "label": "TTS voice",
      "default": "",
      "helpText": "Use global keeps the TTS voice selected in Settings > Audio. Piper/Kokoro overrides generate OBS/browser-source audio with that voice.",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Speak through running Overlay Builder browser sources, not desktop TTS. Global voice is used unless a supported piper: or kokoro: override is selected.",
      "dynamicSource": "Local TTS voice picker; select an existing resource, never invent its ID."
    },
    {
      "key": "overlayAudioInfo",
      "type": "info",
      "label": "Plays automatically through all running Overlay Builder browser sources. No receiver widget or routing setup is required.",
      "configurable": false,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Speak through running Overlay Builder browser sources, not desktop TTS. Global voice is used unless a supported piper: or kokoro: override is selected.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "send_overlay_tts",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "send_overlay_tts",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "send_overlay_tts",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "send_overlay_tts",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Send to Overlay, select Send TTS/Text Payload, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "text": "Welcome {user}!",
  "ttsVoice": ""
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.send_overlay_tts`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.send_overlay_audio"></a>

## Play Audio Payload

Play a Media Library audio item through every running Overlay Builder browser source. This does not play desktop audio.

ID: `action.send_overlay_audio`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Audio item in Media Library and running Overlay Builder browser source.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Send to Overlay, select Play Audio Payload, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Audio item in Media Library and running Overlay Builder browser source.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve mediaId and require an audio library item. Play in running browser sources, not the desktop window. Volume is a saved percent 0–100, editor default 100.",
  "fields": [
    {
      "key": "mediaId",
      "type": "media_select",
      "label": "Audio",
      "mediaTypes": "audio",
      "emptyHint": "No audio files in Media Library yet. Upload an audio file, then refresh this list.",
      "helpText": "The selected file plays automatically through running Overlay Builder browser sources.",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve mediaId and require an audio library item. Play in running browser sources, not the desktop window. Volume is a saved percent 0–100, editor default 100.",
      "dynamicSource": "Local Audio picker; select an existing resource, never invent its ID."
    },
    {
      "key": "volume",
      "type": "number",
      "label": "Volume (%)",
      "default": 100,
      "min": 0,
      "max": 100,
      "helpText": "Saved on this command, automation, timer, or SheevPad action.",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 100,
        "timer": 100,
        "command": 100,
        "pad": 100
      },
      "runtimeFallbackNote": "Resolve mediaId and require an audio library item. Play in running browser sources, not the desktop window. Volume is a saved percent 0–100, editor default 100.",
      "dynamicSource": null
    },
    {
      "key": "audioInfo",
      "type": "info",
      "label": "No receiver widget or routing setup is required. This does not play through the SheevChat desktop window.",
      "configurable": false,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve mediaId and require an audio library item. Play in running browser sources, not the desktop window. Volume is a saved percent 0–100, editor default 100.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "send_overlay_audio",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "send_overlay_audio",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "send_overlay_audio",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "send_overlay_audio",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Send to Overlay, select Play Audio Payload, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "mediaId": "fixture-audio",
  "volume": 100
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.send_overlay_audio`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.send_overlay_text"></a>

## Send Text Payload

Send a generic text payload to overlay widgets. Useful for custom widgets that display queue, prompt, or status text.

ID: `action.send_overlay_text`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: A running compatible overlay receiver subscribed to the selected routing channel.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Send to Overlay, select Send Text Payload, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A running compatible overlay receiver subscribed to the selected routing channel.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
  "fields": [
    {
      "key": "text",
      "type": "textarea",
      "label": "Text",
      "placeholder": "Overlay message with {variables}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": null
    },
    {
      "key": "channel",
      "type": "select",
      "label": "Payload channel",
      "default": "text",
      "options": [
        {
          "value": "tts",
          "label": "TTS"
        },
        {
          "value": "audio",
          "label": "Audio"
        },
        {
          "value": "text",
          "label": "Text"
        },
        {
          "value": "default",
          "label": "Default"
        },
        {
          "value": "alerts",
          "label": "Alerts"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "text",
        "timer": "text",
        "command": "text",
        "pad": "text"
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": null
    },
    {
      "key": "targetMode",
      "type": "select",
      "label": "Send to",
      "default": "broadcast",
      "options": [
        {
          "value": "broadcast",
          "label": "All listening overlay widgets"
        },
        {
          "value": "overlay",
          "label": "Specific overlay"
        },
        {
          "value": "widget",
          "label": "Specific widget"
        },
        {
          "value": "channel",
          "label": "Matching channel only"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "broadcast",
        "timer": "broadcast",
        "command": "broadcast",
        "pad": "broadcast"
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": null
    },
    {
      "key": "overlaySlug",
      "type": "theme_select",
      "label": "Overlay",
      "source": "overlay_builder.overlays",
      "labelKey": "overlayName",
      "visibleWhen": {
        "targetMode": "overlay"
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": "overlay_builder.overlays"
    },
    {
      "key": "widgetId",
      "type": "text",
      "label": "Widget ID",
      "placeholder": "overlay widget id",
      "visibleWhen": {
        "targetMode": "widget"
      },
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": null
    },
    {
      "key": "priority",
      "type": "number",
      "label": "Priority",
      "default": 0,
      "min": 0,
      "max": 100,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 0,
        "timer": 0,
        "command": 0,
        "pad": 0
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": null
    },
    {
      "key": "ttlMs",
      "type": "number",
      "label": "Expires after (ms)",
      "default": 300000,
      "min": 1000,
      "max": 3600000,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 300000,
        "timer": 300000,
        "command": 300000,
        "pad": 300000
      },
      "runtimeFallbackNote": "Resolve text; blank does nothing. Publish to receivers using targetMode (default broadcast), channel (text), selected overlay/widget, priority and TTL.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "send_overlay_text",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "send_overlay_text",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "send_overlay_text",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "send_overlay_text",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Send to Overlay, select Send Text Payload, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "text": "Community night",
  "targetMode": "broadcast",
  "channel": "text",
  "priority": 0,
  "ttlMs": 300000
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.send_overlay_text`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.create_twitch_clip"></a>

## Create Twitch Clip

Create a clip from the connected Twitch broadcaster stream. Twitch supports requested lengths from 5 to 60 seconds.

ID: `action.create_twitch_clip`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Live connected Twitch broadcaster with clip creation access.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Stream Platform Commands, select Create Twitch Clip, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Live connected Twitch broadcaster with clip creation access.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Request a Twitch clip from the broadcaster stream; allowed length 5–60 seconds, editor default 60. postToChat defaults true unless false or string false.",
  "fields": [
    {
      "key": "duration",
      "type": "number",
      "label": "Clip length (seconds)",
      "default": 60,
      "min": 5,
      "max": 60,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 60,
        "timer": 60,
        "command": 60,
        "pad": 60
      },
      "runtimeFallbackNote": "Request a Twitch clip from the broadcaster stream; allowed length 5–60 seconds, editor default 60. postToChat defaults true unless false or string false.",
      "dynamicSource": null
    },
    {
      "key": "postToChat",
      "type": "checkbox",
      "label": "Post clip link to Twitch chat",
      "default": true,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": true,
        "timer": true,
        "command": true,
        "pad": true
      },
      "runtimeFallbackNote": "Request a Twitch clip from the broadcaster stream; allowed length 5–60 seconds, editor default 60. postToChat defaults true unless false or string false.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "create_twitch_clip",
      "duration": 60,
      "postToChat": true
    },
    "timer": {
      "type": "create_twitch_clip",
      "duration": 60,
      "postToChat": true
    },
    "command": {
      "type": "create_twitch_clip",
      "duration": 60,
      "postToChat": true
    },
    "pad": {
      "type": "create_twitch_clip",
      "duration": 60,
      "postToChat": true
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Stream Platform Commands, select Create Twitch Clip, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "duration": 30,
  "postToChat": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.create_twitch_clip`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.queue_clip"></a>

## Queue Clip

Queue a supported short-form clip URL for the Clip Overlay. Supports variables, so channel point messages can be passed in.

ID: `action.queue_clip`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Supported short-video URL, required clip tools and Clip Overlay.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Queue Video, select Queue Clip, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Supported short-video URL, required clip tools and Clip Overlay.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve URL or fall back to event input/message; blank fails. Queue a supported short video for the Clip Overlay; media downloading/validation is handled by clip tools.",
  "fields": [
    {
      "key": "url",
      "type": "textarea",
      "label": "Clip URL",
      "placeholder": "{message}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{message}",
        "timer": "",
        "command": "{message}",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve URL or fall back to event input/message; blank fails. Queue a supported short video for the Clip Overlay; media downloading/validation is handled by clip tools.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "queue_clip",
      "url": "{message}"
    },
    "timer": {
      "type": "queue_clip",
      "url": ""
    },
    "command": {
      "type": "queue_clip",
      "url": "{message}"
    },
    "pad": {
      "type": "queue_clip",
      "url": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Queue Video, select Queue Clip, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "url": "https://www.twitch.tv/example/clip/ExampleClip"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.queue_clip`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.queue_tiktok_clip"></a>

## Queue Clip

Legacy action name. Queue a supported clip URL for the Clip Overlay.

ID: `action.queue_tiktok_clip`. Status: **legacy**. Contexts: not offered in new-action picker.

Requirements: Same requirements as Queue Clip.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. This action is hidden from new-action selection. Consult its limitations and replacement entry; do not instruct users to select it in Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Same requirements as Queue Clip.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Legacy ID delegates to Queue Clip; it is not restricted to TikTok. Hidden from new-action selection.",
  "fields": [
    {
      "key": "url",
      "type": "textarea",
      "label": "Clip URL",
      "placeholder": "{message}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{message}",
        "timer": "",
        "command": "{message}",
        "pad": ""
      },
      "runtimeFallbackNote": "Legacy ID delegates to Queue Clip; it is not restricted to TikTok. Hidden from new-action selection.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [],
  "hiddenFromPicker": true,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "queue_tiktok_clip",
      "url": "{message}"
    },
    "timer": {
      "type": "queue_tiktok_clip",
      "url": ""
    },
    "command": {
      "type": "queue_tiktok_clip",
      "url": "{message}"
    },
    "pad": {
      "type": "queue_tiktok_clip",
      "url": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "This action is hidden from new-action selection. Consult its limitations and replacement entry; do not instruct users to select it in Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

Related: [action.queue_clip](#action.queue_clip)

Source: `src/features/automations.js` — `ACTION_REGISTRY.queue_tiktok_clip`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.skip_current_clip"></a>

## Skip Current Clip

Skip the active Clip Overlay video and continue to the next ready clip.

ID: `action.skip_current_clip`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Clip queue runtime.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Queue Video, select Skip Current Clip, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Clip queue runtime.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Skip the active clip and advance to the next ready queued item.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "skip_current_clip"
    },
    "timer": {
      "type": "skip_current_clip"
    },
    "command": {
      "type": "skip_current_clip"
    },
    "pad": {
      "type": "skip_current_clip"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Queue Video, select Skip Current Clip, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.skip_current_clip`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.clear_clip_queue"></a>

## Clear Clip Queue

Clear pending clip downloads, ready clips, and the active Clip Overlay playback.

ID: `action.clear_clip_queue`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Clip queue runtime.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Queue Video, select Clear Clip Queue, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Clip queue runtime.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Clear pending downloads, ready clips and active playback.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "clear_clip_queue"
    },
    "timer": {
      "type": "clear_clip_queue"
    },
    "command": {
      "type": "clear_clip_queue"
    },
    "pad": {
      "type": "clear_clip_queue"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Queue Video, select Clear Clip Queue, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.clear_clip_queue`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.set_clip_command_enabled"></a>

## Set Clip Command Enabled

Enable or disable the !playclip chat command.

ID: `action.set_clip_command_enabled`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Clip command configuration.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Queue Video, select Set Clip Command Enabled, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Clip command configuration.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Set !playclip enabled state; missing enabled defaults true. String false disables.",
  "fields": [
    {
      "key": "enabled",
      "type": "select",
      "label": "State",
      "default": "true",
      "options": [
        {
          "value": "true",
          "label": "Enabled"
        },
        {
          "value": "false",
          "label": "Disabled"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "true",
        "timer": "true",
        "command": "true",
        "pad": "true"
      },
      "runtimeFallbackNote": "Set !playclip enabled state; missing enabled defaults true. String false disables.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "set_clip_command_enabled",
      "enabled": "true"
    },
    "timer": {
      "type": "set_clip_command_enabled",
      "enabled": "true"
    },
    "command": {
      "type": "set_clip_command_enabled",
      "enabled": "true"
    },
    "pad": {
      "type": "set_clip_command_enabled",
      "enabled": "true"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Queue Video, select Set Clip Command Enabled, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "enabled": "true"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.set_clip_command_enabled`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.toggle_clip_command_enabled"></a>

## Toggle Clip Command Enabled

Toggle the !playclip chat command on or off.

ID: `action.toggle_clip_command_enabled`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Clip command configuration.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Queue Video, select Toggle Clip Command Enabled, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Clip command configuration.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Invert !playclip enabled state.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "toggle_clip_command_enabled"
    },
    "timer": {
      "type": "toggle_clip_command_enabled"
    },
    "command": {
      "type": "toggle_clip_command_enabled"
    },
    "pad": {
      "type": "toggle_clip_command_enabled"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Queue Video, select Toggle Clip Command Enabled, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.toggle_clip_command_enabled`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.clear_tiktok_queue"></a>

## Clear Clip Queue

Legacy action name. Clear pending clip downloads, ready clips, and active Clip Overlay playback.

ID: `action.clear_tiktok_queue`. Status: **legacy**. Contexts: not offered in new-action picker.

Requirements: Clip queue runtime.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. This action is hidden from new-action selection. Consult its limitations and replacement entry; do not instruct users to select it in Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Clip queue runtime.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Legacy ID delegates to Clear Clip Queue. Hidden from new-action selection.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [],
  "hiddenFromPicker": true,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "clear_tiktok_queue"
    },
    "timer": {
      "type": "clear_tiktok_queue"
    },
    "command": {
      "type": "clear_tiktok_queue"
    },
    "pad": {
      "type": "clear_tiktok_queue"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "This action is hidden from new-action selection. Consult its limitations and replacement entry; do not instruct users to select it in Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

Related: [action.clear_clip_queue](#action.clear_clip_queue)

Source: `src/features/automations.js` — `ACTION_REGISTRY.clear_tiktok_queue`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.obs_control"></a>

## OBS Studio Control

Run an OBS Studio WebSocket action. Uses the OBS settings from Settings > Connect.

ID: `action.obs_control`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: OBS Studio WebSocket connection configured in Settings > Connect.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category OBS Studio Control, select OBS Studio Control, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "OBS Studio WebSocket connection configured in Settings > Connect.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
  "fields": [
    {
      "key": "operation",
      "type": "select",
      "label": "OBS action",
      "options": [
        {
          "value": "get_status",
          "label": "Connection - Get status"
        },
        {
          "value": "refresh_browser_sources",
          "label": "Connection - Refresh SheevChat browser sources"
        },
        {
          "value": "get_current_scene",
          "label": "Scenes - Get current scene"
        },
        {
          "value": "set_current_scene",
          "label": "Scenes - Set scene"
        },
        {
          "value": "previous_scene",
          "label": "Scenes - Return to previous scene"
        },
        {
          "value": "source_visibility",
          "label": "Sources - Toggle / set source visibility"
        },
        {
          "value": "source_mute",
          "label": "Audio - Toggle / set source mute"
        },
        {
          "value": "stream_toggle",
          "label": "Stream / Record - Toggle streaming"
        },
        {
          "value": "stream_start",
          "label": "Stream / Record - Start streaming"
        },
        {
          "value": "stream_stop",
          "label": "Stream / Record - Stop streaming"
        },
        {
          "value": "record_toggle",
          "label": "Stream / Record - Toggle recording"
        },
        {
          "value": "record_start",
          "label": "Stream / Record - Start recording"
        },
        {
          "value": "record_stop",
          "label": "Stream / Record - Stop recording"
        },
        {
          "value": "replay_toggle",
          "label": "Stream / Record - Toggle replay buffer"
        },
        {
          "value": "replay_start",
          "label": "Stream / Record - Start replay buffer"
        },
        {
          "value": "replay_stop",
          "label": "Stream / Record - Stop replay buffer"
        },
        {
          "value": "replay_save",
          "label": "Stream / Record - Save replay"
        },
        {
          "value": "browser_url",
          "label": "Advanced - Set browser source URL"
        },
        {
          "value": "raw_request",
          "label": "Advanced - Raw OBS request"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "get_status",
        "timer": "get_status",
        "command": "get_status",
        "pad": "get_status"
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "sceneName",
      "type": "text",
      "label": "Scene name",
      "placeholder": "Select scene",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "sourceName",
      "type": "text",
      "label": "Source name",
      "placeholder": "Select source",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "enabled",
      "type": "select",
      "label": "State",
      "options": [
        {
          "value": "true",
          "label": "On / visible / muted"
        },
        {
          "value": "false",
          "label": "Off / hidden / unmuted"
        },
        {
          "value": "toggle",
          "label": "Toggle"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "url",
      "type": "text",
      "label": "Browser URL",
      "placeholder": "http://localhost:3000/overlay",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "requestType",
      "type": "text",
      "label": "Raw request type",
      "placeholder": "GetVersion",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "requestData",
      "type": "textarea",
      "label": "Raw request data JSON",
      "placeholder": "{\"sceneName\":\"Starting Soon\"}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the OBS Studio lane. Operation defaults get_status. Variable substitution covers scene/source names, URL and raw request fields. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "obs_control",
      "operation": "get_status"
    },
    "timer": {
      "type": "obs_control",
      "operation": "get_status"
    },
    "command": {
      "type": "obs_control",
      "operation": "get_status"
    },
    "pad": {
      "type": "obs_control",
      "operation": "get_status"
    }
  },
  "variants": [
    {
      "value": "get_status",
      "label": "Connection - Get status",
      "fields": [],
      "behavior": "Read connection/output status. Does not create a template variable."
    },
    {
      "value": "refresh_browser_sources",
      "label": "Connection - Refresh SheevChat browser sources",
      "fields": [],
      "behavior": "OBS only: refresh SheevChat browser sources using the OBS refresh path."
    },
    {
      "value": "get_current_scene",
      "label": "Scenes - Get current scene",
      "fields": [],
      "behavior": "Read current program scene. Does not create a template variable."
    },
    {
      "value": "set_current_scene",
      "label": "Scenes - Set scene",
      "fields": [
        "sceneName"
      ],
      "behavior": "Select a current scene and remember the previous scene for return."
    },
    {
      "value": "previous_scene",
      "label": "Scenes - Return to previous scene",
      "fields": [],
      "behavior": "Return to the remembered previous scene; fail if none is available."
    },
    {
      "value": "source_visibility",
      "label": "Sources - Toggle / set source visibility",
      "fields": [
        "sceneName",
        "sourceName",
        "enabled"
      ],
      "behavior": "Resolve an exact scene item, including grouped items when reported. A saved sceneItemId/sourceSceneName disambiguates selection."
    },
    {
      "value": "source_mute",
      "label": "Audio - Toggle / set source mute",
      "fields": [
        "sourceName",
        "enabled"
      ],
      "behavior": "Mute/unmute the selected audio source; missing state toggles."
    },
    {
      "value": "stream_toggle",
      "label": "Stream / Record - Toggle streaming",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "stream_start",
      "label": "Stream / Record - Start streaming",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "stream_stop",
      "label": "Stream / Record - Stop streaming",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "record_toggle",
      "label": "Stream / Record - Toggle recording",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "record_start",
      "label": "Stream / Record - Start recording",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "record_stop",
      "label": "Stream / Record - Stop recording",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_toggle",
      "label": "Stream / Record - Toggle replay buffer",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_start",
      "label": "Stream / Record - Start replay buffer",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_stop",
      "label": "Stream / Record - Stop replay buffer",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_save",
      "label": "Stream / Record - Save replay",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "browser_url",
      "label": "Advanced - Set browser source URL",
      "fields": [
        "sourceName",
        "url"
      ],
      "behavior": "Require source and nonempty URL; update browser source URL."
    },
    {
      "value": "raw_request",
      "label": "Advanced - Raw OBS request",
      "fields": [
        "requestType",
        "requestData"
      ],
      "behavior": "Require request type; blank JSON is {}; invalid JSON fails."
    }
  ],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category OBS Studio Control, select OBS Studio Control, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "operation": "get_current_scene"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.obs_control`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.streamlabs_control"></a>

## Streamlabs Desktop Control

Run a Streamlabs Desktop local API action. Uses the Streamlabs Desktop settings from Settings > Connect.

ID: `action.streamlabs_control`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Streamlabs Desktop local API connection configured in Settings > Connect.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Streamlabs Desktop Control, select Streamlabs Desktop Control, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Streamlabs Desktop local API connection configured in Settings > Connect.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
  "fields": [
    {
      "key": "operation",
      "type": "select",
      "label": "Streamlabs action",
      "options": [
        {
          "value": "get_status",
          "label": "Connection - Get status"
        },
        {
          "value": "refresh_catalog",
          "label": "Connection - Refresh scene/source catalog"
        },
        {
          "value": "get_current_scene",
          "label": "Scenes - Get current scene"
        },
        {
          "value": "set_current_scene",
          "label": "Scenes - Set scene"
        },
        {
          "value": "previous_scene",
          "label": "Scenes - Return to previous scene"
        },
        {
          "value": "source_visibility",
          "label": "Sources - Toggle / set source visibility"
        },
        {
          "value": "source_mute",
          "label": "Audio - Toggle / set source mute"
        },
        {
          "value": "stream_toggle",
          "label": "Stream / Record - Toggle streaming"
        },
        {
          "value": "stream_start",
          "label": "Stream / Record - Start streaming"
        },
        {
          "value": "stream_stop",
          "label": "Stream / Record - Stop streaming"
        },
        {
          "value": "record_toggle",
          "label": "Stream / Record - Toggle recording"
        },
        {
          "value": "record_start",
          "label": "Stream / Record - Start recording"
        },
        {
          "value": "record_stop",
          "label": "Stream / Record - Stop recording"
        },
        {
          "value": "replay_toggle",
          "label": "Stream / Record - Toggle replay buffer"
        },
        {
          "value": "replay_start",
          "label": "Stream / Record - Start replay buffer"
        },
        {
          "value": "replay_stop",
          "label": "Stream / Record - Stop replay buffer"
        },
        {
          "value": "replay_save",
          "label": "Stream / Record - Save replay"
        },
        {
          "value": "browser_url",
          "label": "Advanced - Set browser source URL"
        },
        {
          "value": "raw_request",
          "label": "Advanced - Raw Streamlabs request"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "get_status",
        "timer": "get_status",
        "command": "get_status",
        "pad": "get_status"
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "sceneName",
      "type": "text",
      "label": "Scene name",
      "placeholder": "Select scene",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "sourceName",
      "type": "text",
      "label": "Source name",
      "placeholder": "Select source",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "visibilityTarget",
      "type": "select",
      "label": "Visibility target",
      "options": [
        {
          "value": "linked",
          "label": "Linked source — all instances"
        },
        {
          "value": "item",
          "label": "Selected scene item only"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "enabled",
      "type": "select",
      "label": "State",
      "options": [
        {
          "value": "true",
          "label": "On / visible / muted"
        },
        {
          "value": "false",
          "label": "Off / hidden / unmuted"
        },
        {
          "value": "toggle",
          "label": "Toggle"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "url",
      "type": "text",
      "label": "Browser URL",
      "placeholder": "http://localhost:3000/overlay",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "resource",
      "type": "text",
      "label": "Raw resource",
      "placeholder": "ScenesService",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "method",
      "type": "text",
      "label": "Raw method",
      "placeholder": "getScenes",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    },
    {
      "key": "argsJson",
      "type": "textarea",
      "label": "Raw args JSON",
      "placeholder": "[]",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Execute only in the Streamlabs Desktop lane. Operation defaults get_status. Linked source visibility updates all instances; item visibility updates the selected scene item. Return values are not automatically exported as template variables.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "streamlabs_control",
      "operation": "get_status"
    },
    "timer": {
      "type": "streamlabs_control",
      "operation": "get_status"
    },
    "command": {
      "type": "streamlabs_control",
      "operation": "get_status"
    },
    "pad": {
      "type": "streamlabs_control",
      "operation": "get_status"
    }
  },
  "variants": [
    {
      "value": "get_status",
      "label": "Connection - Get status",
      "fields": [],
      "behavior": "Read connection/output status. Does not create a template variable."
    },
    {
      "value": "refresh_catalog",
      "label": "Connection - Refresh scene/source catalog",
      "fields": [],
      "behavior": "Streamlabs only: refresh scene/source catalog; not the OBS browser refresh action."
    },
    {
      "value": "get_current_scene",
      "label": "Scenes - Get current scene",
      "fields": [],
      "behavior": "Read current program scene. Does not create a template variable."
    },
    {
      "value": "set_current_scene",
      "label": "Scenes - Set scene",
      "fields": [
        "sceneName"
      ],
      "behavior": "Select a current scene and remember the previous scene for return."
    },
    {
      "value": "previous_scene",
      "label": "Scenes - Return to previous scene",
      "fields": [],
      "behavior": "Return to the remembered previous scene; fail if none is available."
    },
    {
      "value": "source_visibility",
      "label": "Sources - Toggle / set source visibility",
      "fields": [
        "sceneName",
        "sourceName",
        "visibilityTarget",
        "enabled"
      ],
      "behavior": "linked (default) changes all instances of the source; item changes only selected itemResourceId. Select targets from the Streamlabs catalog."
    },
    {
      "value": "source_mute",
      "label": "Audio - Toggle / set source mute",
      "fields": [
        "sourceName",
        "enabled"
      ],
      "behavior": "Mute/unmute the selected audio source; missing state toggles."
    },
    {
      "value": "stream_toggle",
      "label": "Stream / Record - Toggle streaming",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "stream_start",
      "label": "Stream / Record - Start streaming",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "stream_stop",
      "label": "Stream / Record - Stop streaming",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "record_toggle",
      "label": "Stream / Record - Toggle recording",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "record_start",
      "label": "Stream / Record - Start recording",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "record_stop",
      "label": "Stream / Record - Stop recording",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_toggle",
      "label": "Stream / Record - Toggle replay buffer",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_start",
      "label": "Stream / Record - Start replay buffer",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_stop",
      "label": "Stream / Record - Stop replay buffer",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "replay_save",
      "label": "Stream / Record - Save replay",
      "fields": [],
      "behavior": "Control the named output in this provider only; start/stop/toggle/save have their literal meanings. Replay save requires an active replay buffer."
    },
    {
      "value": "browser_url",
      "label": "Advanced - Set browser source URL",
      "fields": [
        "sourceName",
        "url"
      ],
      "behavior": "Require source and nonempty URL; update browser source URL."
    },
    {
      "value": "raw_request",
      "label": "Advanced - Raw Streamlabs request",
      "fields": [
        "resource",
        "method",
        "argsJson"
      ],
      "behavior": "Require resource/method; blank args JSON is []; invalid JSON fails."
    }
  ],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Streamlabs Desktop Control, select Streamlabs Desktop Control, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "operation": "get_current_scene"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.streamlabs_control`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.roll_credits"></a>

## Roll Credits

Start the Credits overlay scroll for the current stream credits session.

ID: `action.roll_credits`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Running Credits overlay.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Credits, select Roll Credits, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Running Credits overlay.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Mode reset returns the overlay to waiting; every other/missing mode rolls the current session.",
  "fields": [
    {
      "key": "mode",
      "type": "select",
      "label": "Credits mode",
      "options": [
        {
          "value": "roll",
          "label": "Roll credits now"
        },
        {
          "value": "reset",
          "label": "Reset overlay to waiting"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "roll",
        "timer": "roll",
        "command": "roll",
        "pad": "roll"
      },
      "runtimeFallbackNote": "Mode reset returns the overlay to waiting; every other/missing mode rolls the current session.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "roll_credits",
      "mode": "roll"
    },
    "timer": {
      "type": "roll_credits",
      "mode": "roll"
    },
    "command": {
      "type": "roll_credits",
      "mode": "roll"
    },
    "pad": {
      "type": "roll_credits",
      "mode": "roll"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Credits, select Roll Credits, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "mode": "roll"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.roll_credits`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.clear_credits_session"></a>

## Clear Credits Session

Clear the current stream credits session and save a restore point for Undo Clear.

ID: `action.clear_credits_session`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Credits session storage.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Credits, select Clear Credits Session, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Credits session storage.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Clear the current stream credits session and retain a restore point.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "clear_credits_session",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "clear_credits_session",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "clear_credits_session",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "clear_credits_session",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Credits, select Clear Credits Session, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.clear_credits_session`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.undo_clear_credits_session"></a>

## Undo Clear Credits Session

Restore the most recently cleared current stream credits session.

ID: `action.undo_clear_credits_session`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: An available credits restore point.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Credits, select Undo Clear Credits Session, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "An available credits restore point.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Restore the latest credits-session clear restore point.",
  "fields": [],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "undo_clear_credits_session",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "undo_clear_credits_session",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "undo_clear_credits_session",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "undo_clear_credits_session",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Credits, select Undo Clear Credits Session, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.undo_clear_credits_session`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.send_keystrokes"></a>

## Send keystrokes

Send a Windows keyboard macro to the active app. Use ^ for Ctrl, + for Shift, % for Alt. Supports {ENTER}, {TAB}, and {WAIT 500} on separate lines.

ID: `action.send_keystrokes`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Windows and the intended application focused.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Send keystrokes, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Windows and the intended application focused.",
    "accountFeature": null,
    "operatingSystems": [
      "windows"
    ]
  },
  "behavior": "Resolve the keyboard macro and send it to the active Windows application. ^ is Ctrl, + Shift, % Alt. Special keys and separate {WAIT 500} lines use SendKeys syntax, not template variable syntax.",
  "fields": [
    {
      "key": "keys",
      "type": "textarea",
      "label": "Keystroke macro",
      "placeholder": "^+s\n{WAIT 250}\n%{TAB}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve the keyboard macro and send it to the active Windows application. ^ is Ctrl, + Shift, % Alt. Special keys and separate {WAIT 500} lines use SendKeys syntax, not template variable syntax.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "send_keystrokes",
      "keys": ""
    },
    "timer": {
      "type": "send_keystrokes",
      "keys": ""
    },
    "command": {
      "type": "send_keystrokes",
      "keys": ""
    },
    "pad": {
      "type": "send_keystrokes",
      "keys": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Send keystrokes, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "keys": "{F13}"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.send_keystrokes`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.launch_application"></a>

## Launch application

Open a local app or file on the SheevChat PC. Optional arguments are split like a normal command line.

ID: `action.launch_application`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Locally installed application and a valid selectable executable/path.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Launch Application/Game, select Launch application, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Locally installed application and a valid selectable executable/path.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve path, args and workingDir; blank path does nothing. Uses the existing application-launch guard. Existing generic app processes are not started twice.",
  "fields": [
    {
      "key": "path",
      "type": "text",
      "label": "Application or file path",
      "placeholder": "C:\\Program Files\\App\\App.exe",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve path, args and workingDir; blank path does nothing. Uses the existing application-launch guard. Existing generic app processes are not started twice.",
      "dynamicSource": null
    },
    {
      "key": "args",
      "type": "text",
      "label": "Arguments",
      "placeholder": "",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve path, args and workingDir; blank path does nothing. Uses the existing application-launch guard. Existing generic app processes are not started twice.",
      "dynamicSource": null
    },
    {
      "key": "workingDir",
      "type": "text",
      "label": "Working folder",
      "placeholder": "",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve path, args and workingDir; blank path does nothing. Uses the existing application-launch guard. Existing generic app processes are not started twice.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "launch_application",
      "path": "",
      "args": "",
      "workingDir": ""
    },
    "timer": {
      "type": "launch_application",
      "path": "",
      "args": "",
      "workingDir": ""
    },
    "command": {
      "type": "launch_application",
      "path": "",
      "args": "",
      "workingDir": ""
    },
    "pad": {
      "type": "launch_application",
      "path": "",
      "args": "",
      "workingDir": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Launch Application/Game, select Launch application, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "path": "C:\\Example\\Example.exe",
  "args": "",
  "workingDir": ""
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.launch_application`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.launch_steam_game"></a>

## Launch Steam Game

Launch an installed Steam game on the SheevChat PC using its Steam AppID.

ID: `action.launch_steam_game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Installed Steam game selected from local discovery.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Launch Application/Game, select Launch Steam Game, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Installed Steam game selected from local discovery.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve appId, require selection and invoke Steam launch.",
  "fields": [
    {
      "key": "appId",
      "type": "steam_game_select",
      "label": "Game",
      "labelKey": "gameName",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve appId, require selection and invoke Steam launch.",
      "dynamicSource": "Local Game picker; select an existing resource, never invent its ID."
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "launch_steam_game",
      "appId": "",
      "gameName": ""
    },
    "timer": {
      "type": "launch_steam_game",
      "appId": "",
      "gameName": ""
    },
    "command": {
      "type": "launch_steam_game",
      "appId": "",
      "gameName": ""
    },
    "pad": {
      "type": "launch_steam_game",
      "appId": "",
      "gameName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Launch Application/Game, select Launch Steam Game, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "appId": "fixture-steam-game"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.launch_steam_game`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.launch_epic_game"></a>

## Launch Epic Game

Launch an installed Epic Games title using Epic Games Launcher. Direct title launch is experimental until verified per machine.

ID: `action.launch_epic_game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Installed Epic game and launcher.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Launch Application/Game, select Launch Epic Game, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Installed Epic game and launcher.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve gameId, require selection and invoke Epic Games Launcher. Direct title launch remains experimental per machine.",
  "fields": [
    {
      "key": "gameId",
      "type": "epic_game_select",
      "label": "Game",
      "labelKey": "gameName",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve gameId, require selection and invoke Epic Games Launcher. Direct title launch remains experimental per machine.",
      "dynamicSource": "Local Game picker; select an existing resource, never invent its ID."
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "launch_epic_game",
      "gameId": "",
      "gameName": ""
    },
    "timer": {
      "type": "launch_epic_game",
      "gameId": "",
      "gameName": ""
    },
    "command": {
      "type": "launch_epic_game",
      "gameId": "",
      "gameName": ""
    },
    "pad": {
      "type": "launch_epic_game",
      "gameId": "",
      "gameName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Launch Application/Game, select Launch Epic Game, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "gameId": "fixture-epic-game"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.launch_epic_game`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.launch_ubisoft_game"></a>

## Launch Ubisoft Game

Launch an installed Ubisoft Connect game using a verified local Ubisoft game ID.

ID: `action.launch_ubisoft_game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Installed Ubisoft game and Ubisoft Connect.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Launch Application/Game, select Launch Ubisoft Game, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Installed Ubisoft game and Ubisoft Connect.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve gameId, require selection and use the discovered local Ubisoft ID.",
  "fields": [
    {
      "key": "gameId",
      "type": "ubisoft_game_select",
      "label": "Game",
      "labelKey": "gameName",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve gameId, require selection and use the discovered local Ubisoft ID.",
      "dynamicSource": "Local Game picker; select an existing resource, never invent its ID."
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "launch_ubisoft_game",
      "gameId": "",
      "gameName": ""
    },
    "timer": {
      "type": "launch_ubisoft_game",
      "gameId": "",
      "gameName": ""
    },
    "command": {
      "type": "launch_ubisoft_game",
      "gameId": "",
      "gameName": ""
    },
    "pad": {
      "type": "launch_ubisoft_game",
      "gameId": "",
      "gameName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Launch Application/Game, select Launch Ubisoft Game, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "gameId": "fixture-ubisoft-game"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.launch_ubisoft_game`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.launch_ea_game"></a>

## Launch EA Game

Launch an installed EA game directly when an executable is available, otherwise open the EA app.

ID: `action.launch_ea_game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Installed EA game and EA app.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Launch Application/Game, select Launch EA Game, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Installed EA game and EA app.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve gameId; launch the installed executable when available, otherwise open the EA app.",
  "fields": [
    {
      "key": "gameId",
      "type": "ea_game_select",
      "label": "Game",
      "labelKey": "gameName",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve gameId; launch the installed executable when available, otherwise open the EA app.",
      "dynamicSource": "Local Game picker; select an existing resource, never invent its ID."
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "launch_ea_game",
      "gameId": "",
      "gameName": ""
    },
    "timer": {
      "type": "launch_ea_game",
      "gameId": "",
      "gameName": ""
    },
    "command": {
      "type": "launch_ea_game",
      "gameId": "",
      "gameName": ""
    },
    "pad": {
      "type": "launch_ea_game",
      "gameId": "",
      "gameName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Launch Application/Game, select Launch EA Game, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "gameId": "fixture-ea-game"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.launch_ea_game`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.launch_battlenet_game"></a>

## Launch Battle.net Game

Launch an installed Battle.net game through the Battle.net desktop app.

ID: `action.launch_battlenet_game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Installed Battle.net game and launcher.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Launch Application/Game, select Launch Battle.net Game, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Installed Battle.net game and launcher.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve gameId; launch through the Battle.net desktop app.",
  "fields": [
    {
      "key": "gameId",
      "type": "battlenet_game_select",
      "label": "Game",
      "labelKey": "gameName",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Resolve gameId; launch through the Battle.net desktop app.",
      "dynamicSource": "Local Game picker; select an existing resource, never invent its ID."
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "launch_battlenet_game",
      "gameId": "",
      "gameName": ""
    },
    "timer": {
      "type": "launch_battlenet_game",
      "gameId": "",
      "gameName": ""
    },
    "command": {
      "type": "launch_battlenet_game",
      "gameId": "",
      "gameName": ""
    },
    "pad": {
      "type": "launch_battlenet_game",
      "gameId": "",
      "gameName": ""
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Launch Application/Game, select Launch Battle.net Game, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "gameId": "fixture-battlenet-game"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.launch_battlenet_game`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.run_command"></a>

## Advanced: run command text

Advanced fallback for power users. Prefer the friendly bot actions above when possible.

ID: `action.run_command`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: An existing supported command on the selected platform; no TikTok option is offered.

- Arbitrary command text does not have one safe TikTok response contract; use the corresponding friendly action instead.
- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Advanced: run command text, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "An existing supported command on the selected platform; no TikTok option is offered.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve command text; blank does nothing. Dispatch a registered command first, then full command routing for custom/Marketplace commands. Uses broadcaster automation authority, bypassing public-command enabled/platform checks where supported. This is not a shell or arbitrary script action.",
  "fields": [
    {
      "key": "command",
      "type": "text",
      "label": "Command text",
      "placeholder": "!quote or !sr {message}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve command text; blank does nothing. Dispatch a registered command first, then full command routing for custom/Marketplace commands. Uses broadcaster automation authority, bypassing public-command enabled/platform checks where supported. This is not a shell or arbitrary script action.",
      "dynamicSource": null
    },
    {
      "key": "platform",
      "type": "select",
      "label": "Platform",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Resolve command text; blank does nothing. Dispatch a registered command first, then full command routing for custom/Marketplace commands. Uses broadcaster automation authority, bypassing public-command enabled/platform checks where supported. This is not a shell or arbitrary script action.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "run_command",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "run_command",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "run_command",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "run_command",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Advanced: run command text, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "command": "!quote",
  "platform": "twitch"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.run_command`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.trivia"></a>

## Start trivia

Start one shared trivia game across the base target and any additional selected platforms.

ID: `action.trivia`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Configured trivia runtime/question source.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Chat Bot Commands, select Start trivia, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Configured trivia runtime/question source.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Start one shared trivia game across base target plus explicitly checked extra platforms. Base defaults event; none means extras only; all retains Twitch + YouTube + Kick. Missing runtime dependency does nothing.",
  "fields": [
    {
      "key": "platform",
      "type": "select",
      "label": "Base target",
      "options": [
        {
          "value": "event",
          "label": "Same platform as event / timer"
        },
        {
          "value": "none",
          "label": "Selected platforms only"
        },
        {
          "value": "twitch",
          "label": "Twitch"
        },
        {
          "value": "youtube",
          "label": "YouTube"
        },
        {
          "value": "kick",
          "label": "Kick"
        },
        {
          "value": "tiktok",
          "label": "TikTok"
        },
        {
          "value": "all",
          "label": "Twitch + YouTube + Kick"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "event",
        "timer": "all",
        "command": "event",
        "pad": "all"
      },
      "runtimeFallbackNote": "Start one shared trivia game across base target plus explicitly checked extra platforms. Base defaults event; none means extras only; all retains Twitch + YouTube + Kick. Missing runtime dependency does nothing.",
      "dynamicSource": null
    },
    {
      "key": "twitch",
      "type": "checkbox",
      "label": "Also run on Twitch",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Start one shared trivia game across base target plus explicitly checked extra platforms. Base defaults event; none means extras only; all retains Twitch + YouTube + Kick. Missing runtime dependency does nothing.",
      "dynamicSource": null
    },
    {
      "key": "youtube",
      "type": "checkbox",
      "label": "Also run on YouTube",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Start one shared trivia game across base target plus explicitly checked extra platforms. Base defaults event; none means extras only; all retains Twitch + YouTube + Kick. Missing runtime dependency does nothing.",
      "dynamicSource": null
    },
    {
      "key": "kick",
      "type": "checkbox",
      "label": "Also run on Kick",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Start one shared trivia game across base target plus explicitly checked extra platforms. Base defaults event; none means extras only; all retains Twitch + YouTube + Kick. Missing runtime dependency does nothing.",
      "dynamicSource": null
    },
    {
      "key": "tiktok",
      "type": "checkbox",
      "label": "Also run on TikTok",
      "default": false,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": false,
        "timer": false,
        "command": false,
        "pad": false
      },
      "runtimeFallbackNote": "Start one shared trivia game across base target plus explicitly checked extra platforms. Base defaults event; none means extras only; all retains Twitch + YouTube + Kick. Missing runtime dependency does nothing.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "trivia",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "trivia",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "trivia",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "trivia",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Chat Bot Commands, select Start trivia, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "platform": "twitch",
  "twitch": false,
  "youtube": false,
  "kick": false,
  "tiktok": false
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.trivia`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.ai_prompt"></a>

## AI prompt (coming soon)

Send the event context to an AI and use the response in chat.

ID: `action.ai_prompt`. Status: **unavailable**. Contexts: not offered in new-action picker.

Requirements: Not implemented.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. This action is hidden from new-action selection. Consult its limitations and replacement entry; do not instruct users to select it in Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Not implemented.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Unavailable placeholder: logs that integration is not implemented. Hidden from the action picker. Use a supported entitled A.I. action instead.",
  "fields": [
    {
      "key": "prompt",
      "type": "textarea",
      "label": "Prompt template",
      "placeholder": "A viewer named {user} just raided with {viewers} viewers. Write a short, hype welcome message.",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Unavailable placeholder: logs that integration is not implemented. Hidden from the action picker. Use a supported entitled A.I. action instead.",
      "dynamicSource": null
    },
    {
      "key": "_stub",
      "type": "info",
      "label": "AI integration coming in a future update.",
      "configurable": false,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Unavailable placeholder: logs that integration is not implemented. Hidden from the action picker. Use a supported entitled A.I. action instead.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [],
  "hiddenFromPicker": true,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "ai_prompt",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "ai_prompt",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "ai_prompt",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "ai_prompt",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "This action is hidden from new-action selection. Consult its limitations and replacement entry; do not instruct users to select it in Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

Related: [action.ai_creative_utility](#action.ai_creative_utility)

Source: `src/features/automations.js` — `ACTION_REGISTRY.ai_prompt`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.fetch_webhook"></a>

## Fetch webhook

Send an HTTP request to a URL. Useful for triggering external services, n8n/Zapier webhooks, or home automation. Variable substitution supported in URL and body.

ID: `action.fetch_webhook`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: A reachable endpoint you control; correct authentication/JSON supplied explicitly.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Fetch webhook, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "A reachable endpoint you control; correct authentication/JSON supplied explicitly.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Resolve URL/body through the provided global variable resolver; the simple event-key fallback is used only when that resolver is absent. Blank URL does nothing; method defaults GET. POST/PUT may send body; headers are literal JSON and malformed headers are ignored. Request failures are logged; response body is not exposed to later actions.",
  "fields": [
    {
      "key": "url",
      "type": "text",
      "label": "URL",
      "placeholder": "https://hooks.zapier.com/hooks/catch/...",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve URL/body through the provided global variable resolver; the simple event-key fallback is used only when that resolver is absent. Blank URL does nothing; method defaults GET. POST/PUT may send body; headers are literal JSON and malformed headers are ignored. Request failures are logged; response body is not exposed to later actions.",
      "dynamicSource": null
    },
    {
      "key": "method",
      "type": "select",
      "label": "Method",
      "options": [
        {
          "value": "GET",
          "label": "GET"
        },
        {
          "value": "POST",
          "label": "POST"
        },
        {
          "value": "PUT",
          "label": "PUT"
        }
      ],
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve URL/body through the provided global variable resolver; the simple event-key fallback is used only when that resolver is absent. Blank URL does nothing; method defaults GET. POST/PUT may send body; headers are literal JSON and malformed headers are ignored. Request failures are logged; response body is not exposed to later actions.",
      "dynamicSource": null
    },
    {
      "key": "body",
      "type": "textarea",
      "label": "Body (POST/PUT only)",
      "placeholder": "{\"user\":\"{user}\",\"event\":\"{message}\"}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve URL/body through the provided global variable resolver; the simple event-key fallback is used only when that resolver is absent. Blank URL does nothing; method defaults GET. POST/PUT may send body; headers are literal JSON and malformed headers are ignored. Request failures are logged; response body is not exposed to later actions.",
      "dynamicSource": null
    },
    {
      "key": "headers",
      "type": "text",
      "label": "Extra headers (JSON)",
      "placeholder": "{\"Authorization\":\"Bearer token123\"}",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": null,
        "timer": null,
        "command": null,
        "pad": null
      },
      "runtimeFallbackNote": "Resolve URL/body through the provided global variable resolver; the simple event-key fallback is used only when that resolver is absent. Blank URL does nothing; method defaults GET. POST/PUT may send body; headers are literal JSON and malformed headers are ignored. Request failures are logged; response body is not exposed to later actions.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "fetch_webhook",
      "message": "",
      "platform": "event"
    },
    "timer": {
      "type": "fetch_webhook",
      "message": "",
      "platform": "all"
    },
    "command": {
      "type": "fetch_webhook",
      "message": "",
      "platform": "event"
    },
    "pad": {
      "type": "fetch_webhook",
      "message": "",
      "platform": "all"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Fetch webhook, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "url": "https://example.com/webhook",
  "method": "POST",
  "body": "{\"user\":\"{user}\"}",
  "headers": "{}"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.fetch_webhook`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="action.streamerbot_action"></a>

## Run Streamer.bot Action

Runs a Streamer.bot action through a local WebSocket connection. Used by Streamer.bot command migration.

ID: `action.streamerbot_action`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Streamer.bot WebSocket server enabled and a valid action ID/name.

- Picker availability does not supply missing event variables. Check prerequisites and originating provider.
- An action return value is not automatically a sequence variable. Only documented producers create template outputs.

### Configure in the app

Open: Do > Advanced Actions (commands only) > Add action


1. Choose action category Utilities, select Run Streamer.bot Action, and click Add action.
2. Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.
3. Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.
4. Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Streamer.bot WebSocket server enabled and a valid action ID/name.",
    "accountFeature": null,
    "operatingSystems": []
  },
  "behavior": "Run a Streamer.bot action over local WebSocket, preferring actionId with actionName fallback. argsJson resolves through the global variable engine and must parse as JSON; simple event substitution is only a resolver-error fallback. User/username/platform/message arguments are supplied and can be overridden by parsed args. Host/port defaults are 127.0.0.1:8080.",
  "fields": [
    {
      "key": "host",
      "type": "text",
      "label": "Host",
      "placeholder": "127.0.0.1",
      "default": "127.0.0.1",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "127.0.0.1",
        "timer": "127.0.0.1",
        "command": "127.0.0.1",
        "pad": "127.0.0.1"
      },
      "runtimeFallbackNote": "Run a Streamer.bot action over local WebSocket, preferring actionId with actionName fallback. argsJson resolves through the global variable engine and must parse as JSON; simple event substitution is only a resolver-error fallback. User/username/platform/message arguments are supplied and can be overridden by parsed args. Host/port defaults are 127.0.0.1:8080.",
      "dynamicSource": null
    },
    {
      "key": "port",
      "type": "number",
      "label": "Port",
      "min": 1,
      "max": 65535,
      "default": 8080,
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": 8080,
        "timer": 8080,
        "command": 8080,
        "pad": 8080
      },
      "runtimeFallbackNote": "Run a Streamer.bot action over local WebSocket, preferring actionId with actionName fallback. argsJson resolves through the global variable engine and must parse as JSON; simple event substitution is only a resolver-error fallback. User/username/platform/message arguments are supplied and can be overridden by parsed args. Host/port defaults are 127.0.0.1:8080.",
      "dynamicSource": null
    },
    {
      "key": "actionId",
      "type": "text",
      "label": "Action ID",
      "placeholder": "Preferred when available",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Run a Streamer.bot action over local WebSocket, preferring actionId with actionName fallback. argsJson resolves through the global variable engine and must parse as JSON; simple event substitution is only a resolver-error fallback. User/username/platform/message arguments are supplied and can be overridden by parsed args. Host/port defaults are 127.0.0.1:8080.",
      "dynamicSource": null
    },
    {
      "key": "actionName",
      "type": "text",
      "label": "Action Name",
      "placeholder": "Fallback if ID is not available",
      "configurable": true,
      "supportsVariables": false,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "",
        "timer": "",
        "command": "",
        "pad": ""
      },
      "runtimeFallbackNote": "Run a Streamer.bot action over local WebSocket, preferring actionId with actionName fallback. argsJson resolves through the global variable engine and must parse as JSON; simple event substitution is only a resolver-error fallback. User/username/platform/message arguments are supplied and can be overridden by parsed args. Host/port defaults are 127.0.0.1:8080.",
      "dynamicSource": null
    },
    {
      "key": "argsJson",
      "type": "textarea",
      "label": "Arguments JSON",
      "placeholder": "{\"user\":\"{user}\",\"platform\":\"{platform}\"}",
      "configurable": true,
      "supportsVariables": true,
      "required": false,
      "requirementNote": "Required metadata is supplemented by the action behavior and operation requirements; blank input may skip or fail as described.",
      "editorDefaults": {
        "automation": "{}",
        "timer": "{}",
        "command": "{}",
        "pad": "{}"
      },
      "runtimeFallbackNote": "Run a Streamer.bot action over local WebSocket, preferring actionId with actionName fallback. argsJson resolves through the global variable engine and must parse as JSON; simple event substitution is only a resolver-error fallback. User/username/platform/message arguments are supplied and can be overridden by parsed args. Host/port defaults are 127.0.0.1:8080.",
      "dynamicSource": null
    }
  ],
  "declaredContexts": [
    "timer",
    "automation",
    "command",
    "pad"
  ],
  "pickerContexts": [
    "automation",
    "timer",
    "command",
    "pad"
  ],
  "hiddenFromPicker": false,
  "requiredVariables": [],
  "defaultsByContext": {
    "automation": {
      "type": "streamerbot_action",
      "host": "127.0.0.1",
      "port": 8080,
      "actionId": "",
      "actionName": "",
      "argsJson": "{}"
    },
    "timer": {
      "type": "streamerbot_action",
      "host": "127.0.0.1",
      "port": 8080,
      "actionId": "",
      "actionName": "",
      "argsJson": "{}"
    },
    "command": {
      "type": "streamerbot_action",
      "host": "127.0.0.1",
      "port": 8080,
      "actionId": "",
      "actionName": "",
      "argsJson": "{}"
    },
    "pad": {
      "type": "streamerbot_action",
      "host": "127.0.0.1",
      "port": 8080,
      "actionId": "",
      "actionName": "",
      "argsJson": "{}"
    }
  },
  "variants": [],
  "failureBehavior": "See the behavior for local skips/errors and context entries for sequence continuation.",
  "outputs": [],
  "ui": {
    "path": [
      "Do",
      "Advanced Actions (commands only)",
      "Add action"
    ],
    "initialFields": [],
    "steps": [
      "Choose action category Utilities, select Run Streamer.bot Action, and click Add action.",
      "Expand the action card. Configure the Fields below; check Editor defaults for your context and any operation-dependent fields.",
      "Choose resource values from real app pickers. Set output Platform separately from the trigger Where setting when the action offers it.",
      "Use Move action up / Move action down to position this action, then save the containing command, automation, timer or SheevPad button."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "host": "127.0.0.1",
  "port": 8080,
  "actionId": "fixture-action",
  "argsJson": "{}"
}
```

Related: [context.automation](#context.automation), [context.timer](#context.timer), [context.command](#context.command), [context.pad](#context.pad)

Source: `src/features/automations.js` — `ACTION_REGISTRY.streamerbot_action`; `public/index.html` — `getBuilderActionEntries / createDefaultAction`.

<a id="trigger.first_chat"></a>

## First chat ever

Fires the very first time a viewer sends a chat message on any platform.

ID: `trigger.first_chat`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Chat & viewers.
2. Choose Trigger event: First chat ever.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history.",
  "filters": [],
  "variableIds": [
    "variable.trigger.first_chat.user",
    "variable.trigger.first_chat.platform",
    "variable.trigger.first_chat.username",
    "variable.trigger.first_chat.displayName",
    "variable.trigger.first_chat.userId",
    "variable.trigger.first_chat.eventId",
    "variable.trigger.first_chat.roomId"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Chat & viewers.",
      "Choose Trigger event: First chat ever.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "first_chat",
  "triggerPlatform": "all",
  "triggerFilters": {}
}
```

Related: [variable.trigger.first_chat.user](#variable.trigger.first_chat.user), [variable.trigger.first_chat.platform](#variable.trigger.first_chat.platform), [variable.trigger.first_chat.username](#variable.trigger.first_chat.username), [variable.trigger.first_chat.displayName](#variable.trigger.first_chat.displayName), [variable.trigger.first_chat.userId](#variable.trigger.first_chat.userId), [variable.trigger.first_chat.eventId](#variable.trigger.first_chat.eventId), [variable.trigger.first_chat.roomId](#variable.trigger.first_chat.roomId), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.first_chat`.

<a id="variable.trigger.first_chat.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.first_chat.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="variable.trigger.first_chat.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.first_chat.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="variable.trigger.first_chat.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.first_chat.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="variable.trigger.first_chat.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.first_chat.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="variable.trigger.first_chat.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.first_chat.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="variable.trigger.first_chat.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.first_chat.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="variable.trigger.first_chat.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.first_chat.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.first_chat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches the first-chat-ever flag; the viewer has not previously chatted in tracked history."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.first_chat](#trigger.first_chat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat.extract`.

<a id="trigger.viewer_join"></a>

## First chat this stream (Welcome Back)

Fires the first time a viewer sends a message this stream session — the same event that shows the Welcome Back badge. Optionally filter to specific usernames.

ID: `trigger.viewer_join`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Chat & viewers.
2. Choose Trigger event: First chat this stream (Welcome Back).
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line.",
  "filters": [
    {
      "key": "usernames",
      "type": "textarea",
      "label": "Usernames (one per line)",
      "placeholder": "StreamerBot\nMyFriend\n..."
    }
  ],
  "variableIds": [
    "variable.trigger.viewer_join.user",
    "variable.trigger.viewer_join.platform",
    "variable.trigger.viewer_join.username",
    "variable.trigger.viewer_join.displayName",
    "variable.trigger.viewer_join.userId",
    "variable.trigger.viewer_join.eventId",
    "variable.trigger.viewer_join.roomId"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Chat & viewers.",
      "Choose Trigger event: First chat this stream (Welcome Back).",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "viewer_join",
  "triggerPlatform": "all",
  "triggerFilters": {
    "usernames": ""
  }
}
```

Related: [variable.trigger.viewer_join.user](#variable.trigger.viewer_join.user), [variable.trigger.viewer_join.platform](#variable.trigger.viewer_join.platform), [variable.trigger.viewer_join.username](#variable.trigger.viewer_join.username), [variable.trigger.viewer_join.displayName](#variable.trigger.viewer_join.displayName), [variable.trigger.viewer_join.userId](#variable.trigger.viewer_join.userId), [variable.trigger.viewer_join.eventId](#variable.trigger.viewer_join.eventId), [variable.trigger.viewer_join.roomId](#variable.trigger.viewer_join.roomId), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.viewer_join`.

<a id="variable.trigger.viewer_join.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.viewer_join.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="variable.trigger.viewer_join.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.viewer_join.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="variable.trigger.viewer_join.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.viewer_join.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="variable.trigger.viewer_join.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.viewer_join.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="variable.trigger.viewer_join.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.viewer_join.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="variable.trigger.viewer_join.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.viewer_join.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="variable.trigger.viewer_join.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.viewer_join.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.viewer_join",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the dedicated viewer_join event, first-session flag and not first-ever. Optional usernames are trimmed, case-insensitive, one per line."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.viewer_join](#trigger.viewer_join)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_join.extract`.

<a id="trigger.viewer_first_message"></a>

## First message this stream

Fires on a viewer’s first message of the stream, including their first-ever message. Optionally filter to specific usernames.

ID: `trigger.viewer_first_message`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Chat & viewers.
2. Choose Trigger event: First message this stream.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back.",
  "filters": [
    {
      "key": "usernames",
      "type": "textarea",
      "label": "Usernames (one per line)",
      "placeholder": "StreamerBot\nMyFriend\n..."
    }
  ],
  "variableIds": [
    "variable.trigger.viewer_first_message.user",
    "variable.trigger.viewer_first_message.platform",
    "variable.trigger.viewer_first_message.username",
    "variable.trigger.viewer_first_message.displayName",
    "variable.trigger.viewer_first_message.userId",
    "variable.trigger.viewer_first_message.eventId",
    "variable.trigger.viewer_first_message.roomId"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Chat & viewers.",
      "Choose Trigger event: First message this stream.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "viewer_first_message",
  "triggerPlatform": "all",
  "triggerFilters": {
    "usernames": ""
  }
}
```

Related: [variable.trigger.viewer_first_message.user](#variable.trigger.viewer_first_message.user), [variable.trigger.viewer_first_message.platform](#variable.trigger.viewer_first_message.platform), [variable.trigger.viewer_first_message.username](#variable.trigger.viewer_first_message.username), [variable.trigger.viewer_first_message.displayName](#variable.trigger.viewer_first_message.displayName), [variable.trigger.viewer_first_message.userId](#variable.trigger.viewer_first_message.userId), [variable.trigger.viewer_first_message.eventId](#variable.trigger.viewer_first_message.eventId), [variable.trigger.viewer_first_message.roomId](#variable.trigger.viewer_first_message.roomId), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.viewer_first_message`.

<a id="variable.trigger.viewer_first_message.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.viewer_first_message.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="variable.trigger.viewer_first_message.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.viewer_first_message.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="variable.trigger.viewer_first_message.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.viewer_first_message.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="variable.trigger.viewer_first_message.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.viewer_first_message.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="variable.trigger.viewer_first_message.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.viewer_first_message.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="variable.trigger.viewer_first_message.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.viewer_first_message.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="variable.trigger.viewer_first_message.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.viewer_first_message.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.viewer_first_message",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires viewer_first_message and first-session flag. Optional usernames are trimmed, case-insensitive, one per line. Separate from Welcome Back."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.viewer_first_message](#trigger.viewer_first_message)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.viewer_first_message.extract`.

<a id="trigger.first_chat_today"></a>

## First chat of the day

Fires on a viewer's first chat message of the calendar day (resets at midnight). Good for daily greetings or announcing daily loyalty bonuses.

ID: `trigger.first_chat_today`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Chat & viewers.
2. Choose Trigger event: First chat of the day.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Matches the first-today flag supplied by viewer tracking; day boundaries follow the app tracking calendar.",
  "filters": [],
  "variableIds": [
    "variable.trigger.first_chat_today.user",
    "variable.trigger.first_chat_today.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Chat & viewers.",
      "Choose Trigger event: First chat of the day.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "first_chat_today",
  "triggerPlatform": "all",
  "triggerFilters": {}
}
```

Related: [variable.trigger.first_chat_today.user](#variable.trigger.first_chat_today.user), [variable.trigger.first_chat_today.platform](#variable.trigger.first_chat_today.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat_today`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.first_chat_today`.

<a id="variable.trigger.first_chat_today.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.first_chat_today.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.first_chat_today",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Matches the first-today flag supplied by viewer tracking; day boundaries follow the app tracking calendar."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.first_chat_today](#trigger.first_chat_today)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat_today.extract`.

<a id="variable.trigger.first_chat_today.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.first_chat_today.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.first_chat_today",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Matches the first-today flag supplied by viewer tracking; day boundaries follow the app tracking calendar."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.first_chat_today](#trigger.first_chat_today)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.first_chat_today.extract`.

<a id="trigger.is_birthday"></a>

## Viewer birthday

Fires once per stream session when a viewer with a saved birthday chats on their birthday.

ID: `trigger.is_birthday`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Chat & viewers.
2. Choose Trigger event: Viewer birthday.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year.",
  "filters": [],
  "variableIds": [
    "variable.trigger.is_birthday.user",
    "variable.trigger.is_birthday.platform",
    "variable.trigger.is_birthday.birthday",
    "variable.trigger.is_birthday.birthdayAge",
    "variable.trigger.is_birthday.age",
    "variable.trigger.is_birthday.agemessage"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Chat & viewers.",
      "Choose Trigger event: Viewer birthday.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "is_birthday",
  "triggerPlatform": "all",
  "triggerFilters": {}
}
```

Related: [variable.trigger.is_birthday.user](#variable.trigger.is_birthday.user), [variable.trigger.is_birthday.platform](#variable.trigger.is_birthday.platform), [variable.trigger.is_birthday.birthday](#variable.trigger.is_birthday.birthday), [variable.trigger.is_birthday.birthdayAge](#variable.trigger.is_birthday.birthdayAge), [variable.trigger.is_birthday.age](#variable.trigger.is_birthday.age), [variable.trigger.is_birthday.agemessage](#variable.trigger.is_birthday.agemessage), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.is_birthday`.

<a id="variable.trigger.is_birthday.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.is_birthday.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.is_birthday",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.is_birthday](#trigger.is_birthday)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday.extract`.

<a id="variable.trigger.is_birthday.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.is_birthday.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.is_birthday",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.is_birthday](#trigger.is_birthday)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday.extract`.

<a id="variable.trigger.is_birthday.birthday"></a>

## {birthday}

Saved formatted birthday.

ID: `variable.trigger.is_birthday.birthday`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{birthday}",
  "canonicalKey": "birthday",
  "aliases": [],
  "producer": "trigger.is_birthday",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{birthday}
```

Related: [trigger.is_birthday](#trigger.is_birthday)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday.extract`.

<a id="variable.trigger.is_birthday.birthdayAge"></a>

## {birthdayAge}

Birthday age when a birth year is known; otherwise empty.

ID: `variable.trigger.is_birthday.birthdayAge`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{birthdayAge}",
  "canonicalKey": "birthdayAge",
  "aliases": [],
  "producer": "trigger.is_birthday",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{birthdayAge}
```

Related: [trigger.is_birthday](#trigger.is_birthday)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday.extract`.

<a id="variable.trigger.is_birthday.age"></a>

## {age}

Birthday age, with birthdayAge fallback.

ID: `variable.trigger.is_birthday.age`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{age}",
  "canonicalKey": "age",
  "aliases": [],
  "producer": "trigger.is_birthday",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{age}
```

Related: [trigger.is_birthday](#trigger.is_birthday)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday.extract`.

<a id="variable.trigger.is_birthday.agemessage"></a>

## {agemessage}

Optional birthday age message; empty when unavailable.

ID: `variable.trigger.is_birthday.agemessage`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{agemessage}",
  "canonicalKey": "agemessage",
  "aliases": [],
  "producer": "trigger.is_birthday",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Requires the birthday event and birthday flag. Saved birthday and once-per-stream viewer tracking are prerequisites; age may be blank without a birth year."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{agemessage}
```

Related: [trigger.is_birthday](#trigger.is_birthday)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.is_birthday.extract`.

<a id="trigger.follow"></a>

## New follow

Fires when a viewer follows on Twitch, Kick, or TikTok. YouTube does not expose a live follow event.

ID: `trigger.follow`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: New follow.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists.",
  "filters": [],
  "variableIds": [
    "variable.trigger.follow.user",
    "variable.trigger.follow.username",
    "variable.trigger.follow.displayName",
    "variable.trigger.follow.userId",
    "variable.trigger.follow.eventId",
    "variable.trigger.follow.roomId"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: New follow.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "follow",
  "triggerPlatform": "twitch",
  "triggerFilters": {}
}
```

Related: [variable.trigger.follow.user](#variable.trigger.follow.user), [variable.trigger.follow.username](#variable.trigger.follow.username), [variable.trigger.follow.displayName](#variable.trigger.follow.displayName), [variable.trigger.follow.userId](#variable.trigger.follow.userId), [variable.trigger.follow.eventId](#variable.trigger.follow.eventId), [variable.trigger.follow.roomId](#variable.trigger.follow.roomId), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.follow`.

<a id="variable.trigger.follow.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.follow.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.follow",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.follow](#trigger.follow)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow.extract`.

<a id="variable.trigger.follow.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.follow.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.follow",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.follow](#trigger.follow)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow.extract`.

<a id="variable.trigger.follow.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.follow.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.follow",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.follow](#trigger.follow)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow.extract`.

<a id="variable.trigger.follow.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.follow.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.follow",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.follow](#trigger.follow)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow.extract`.

<a id="variable.trigger.follow.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.follow.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.follow",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.follow](#trigger.follow)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow.extract`.

<a id="variable.trigger.follow.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.follow.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.follow",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Matches New follow from Twitch, Kick or TikTok; no YouTube follow event exists."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.follow](#trigger.follow)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.follow.extract`.

<a id="trigger.subscribe"></a>

## Subscription

Fires on a new subscription or resub.

ID: `trigger.subscribe`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Monetization.
2. Choose Trigger event: Subscription.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions.",
  "filters": [
    {
      "key": "min_months",
      "type": "number",
      "label": "Minimum months (0 = any)",
      "min": 0,
      "default": 0
    },
    {
      "key": "min_count",
      "type": "number",
      "label": "Minimum count (0 = any)",
      "min": 0,
      "default": 0
    },
    {
      "key": "subscription_kind",
      "type": "select",
      "label": "TikTok subscription type",
      "options": [
        {
          "value": "",
          "label": "Any type"
        },
        {
          "value": "subscribe",
          "label": "New subscription"
        },
        {
          "value": "resubscribe",
          "label": "Resubscription"
        },
        {
          "value": "subscription_gift",
          "label": "Gifted subscription"
        },
        {
          "value": "super_fan",
          "label": "Super Fan"
        }
      ]
    }
  ],
  "variableIds": [
    "variable.trigger.subscribe.user",
    "variable.trigger.subscribe.username",
    "variable.trigger.subscribe.displayName",
    "variable.trigger.subscribe.userId",
    "variable.trigger.subscribe.eventId",
    "variable.trigger.subscribe.roomId",
    "variable.trigger.subscribe.months",
    "variable.trigger.subscribe.tier",
    "variable.trigger.subscribe.message",
    "variable.trigger.subscribe.count",
    "variable.trigger.subscribe.subscriptionKind"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Monetization.",
      "Choose Trigger event: Subscription.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "subscribe",
  "triggerPlatform": "twitch",
  "triggerFilters": {
    "min_months": 0,
    "min_count": 0,
    "subscription_kind": ""
  }
}
```

Related: [variable.trigger.subscribe.user](#variable.trigger.subscribe.user), [variable.trigger.subscribe.username](#variable.trigger.subscribe.username), [variable.trigger.subscribe.displayName](#variable.trigger.subscribe.displayName), [variable.trigger.subscribe.userId](#variable.trigger.subscribe.userId), [variable.trigger.subscribe.eventId](#variable.trigger.subscribe.eventId), [variable.trigger.subscribe.roomId](#variable.trigger.subscribe.roomId), [variable.trigger.subscribe.months](#variable.trigger.subscribe.months), [variable.trigger.subscribe.tier](#variable.trigger.subscribe.tier), [variable.trigger.subscribe.message](#variable.trigger.subscribe.message), [variable.trigger.subscribe.count](#variable.trigger.subscribe.count), [variable.trigger.subscribe.subscriptionKind](#variable.trigger.subscribe.subscriptionKind), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.subscribe`.

<a id="variable.trigger.subscribe.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.subscribe.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.subscribe.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.subscribe.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.subscribe.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.subscribe.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.subscribe.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.months"></a>

## {months}

Subscription month count; missing value defaults to 1.

ID: `variable.trigger.subscribe.months`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{months}",
  "canonicalKey": "months",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 1,
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{months}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.tier"></a>

## {tier}

Provider subscription tier; missing value defaults to 1000.

ID: `variable.trigger.subscribe.tier`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{tier}",
  "canonicalKey": "tier",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "1000",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{tier}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.message"></a>

## {message}

Event text; reward redemptions use viewer input, TikTok questions use the question text.

ID: `variable.trigger.subscribe.message`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{message}",
  "canonicalKey": "message",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{message}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.count"></a>

## {count}

Subscription/gift count from the event; extraction defaults to 1.

ID: `variable.trigger.subscribe.count`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{count}",
  "canonicalKey": "count",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 1,
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{count}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="variable.trigger.subscribe.subscriptionKind"></a>

## {subscriptionKind}

TikTok subscription subtype, empty when absent.

ID: `variable.trigger.subscribe.subscriptionKind`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{subscriptionKind}",
  "canonicalKey": "subscriptionKind",
  "aliases": [],
  "producer": "trigger.subscribe",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Subscription months/count must meet both minimums. Missing event months/count are treated as 1. A nonblank TikTok type filter matches subscriptionKind exactly, including gifted subscriptions."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{subscriptionKind}
```

Related: [trigger.subscribe](#trigger.subscribe)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.subscribe.extract`.

<a id="trigger.tiktok_gift"></a>

## TikTok gift

Fires once when a TikTok gift or gift streak is finalized.

ID: `trigger.tiktok_gift`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Monetization.
2. Choose Trigger event: TikTok gift.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "tiktok"
    ]
  },
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply.",
  "filters": [
    {
      "key": "gift_name",
      "type": "text",
      "label": "Gift name (blank = any)"
    },
    {
      "key": "min_count",
      "type": "number",
      "label": "Minimum count (0 = any)",
      "min": 0,
      "default": 0
    },
    {
      "key": "min_diamonds",
      "type": "number",
      "label": "Minimum diamonds (0 = any)",
      "min": 0,
      "default": 0
    }
  ],
  "variableIds": [
    "variable.trigger.tiktok_gift.user",
    "variable.trigger.tiktok_gift.username",
    "variable.trigger.tiktok_gift.displayName",
    "variable.trigger.tiktok_gift.userId",
    "variable.trigger.tiktok_gift.eventId",
    "variable.trigger.tiktok_gift.roomId",
    "variable.trigger.tiktok_gift.gift",
    "variable.trigger.tiktok_gift.giftId",
    "variable.trigger.tiktok_gift.count",
    "variable.trigger.tiktok_gift.diamonds",
    "variable.trigger.tiktok_gift.amount"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Monetization.",
      "Choose Trigger event: TikTok gift.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "tiktok_gift",
  "triggerPlatform": "tiktok",
  "triggerFilters": {
    "gift_name": "",
    "min_count": 0,
    "min_diamonds": 0
  }
}
```

Related: [variable.trigger.tiktok_gift.user](#variable.trigger.tiktok_gift.user), [variable.trigger.tiktok_gift.username](#variable.trigger.tiktok_gift.username), [variable.trigger.tiktok_gift.displayName](#variable.trigger.tiktok_gift.displayName), [variable.trigger.tiktok_gift.userId](#variable.trigger.tiktok_gift.userId), [variable.trigger.tiktok_gift.eventId](#variable.trigger.tiktok_gift.eventId), [variable.trigger.tiktok_gift.roomId](#variable.trigger.tiktok_gift.roomId), [variable.trigger.tiktok_gift.gift](#variable.trigger.tiktok_gift.gift), [variable.trigger.tiktok_gift.giftId](#variable.trigger.tiktok_gift.giftId), [variable.trigger.tiktok_gift.count](#variable.trigger.tiktok_gift.count), [variable.trigger.tiktok_gift.diamonds](#variable.trigger.tiktok_gift.diamonds), [variable.trigger.tiktok_gift.amount](#variable.trigger.tiktok_gift.amount), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.tiktok_gift`.

<a id="variable.trigger.tiktok_gift.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.tiktok_gift.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.tiktok_gift.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.tiktok_gift.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.tiktok_gift.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.tiktok_gift.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.tiktok_gift.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.gift"></a>

## {gift}

TikTok gift name.

ID: `variable.trigger.tiktok_gift.gift`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{gift}",
  "canonicalKey": "gift",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{gift}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.giftId"></a>

## {giftId}

TikTok gift identifier.

ID: `variable.trigger.tiktok_gift.giftId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{giftId}",
  "canonicalKey": "giftId",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{giftId}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.count"></a>

## {count}

Subscription/gift count from the event; extraction defaults to 1.

ID: `variable.trigger.tiktok_gift.count`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{count}",
  "canonicalKey": "count",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 1,
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{count}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.diamonds"></a>

## {diamonds}

Finalized gift diamond count, or 0.

ID: `variable.trigger.tiktok_gift.diamonds`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{diamonds}",
  "canonicalKey": "diamonds",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{diamonds}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="variable.trigger.tiktok_gift.amount"></a>

## {amount}

Provider-normalized gift amount or Super Chat amount; do not assume cross-provider currency equivalence.

ID: `variable.trigger.tiktok_gift.amount`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{amount}",
  "canonicalKey": "amount",
  "aliases": [],
  "producer": "trigger.tiktok_gift",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Finalized gift/streak only; optional gift name is exact case-insensitive. Count and diamond thresholds both apply."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{amount}
```

Related: [trigger.tiktok_gift](#trigger.tiktok_gift)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_gift.extract`.

<a id="trigger.tiktok_share"></a>

## TikTok share

Fires when a viewer shares the TikTok LIVE.

ID: `trigger.tiktok_share`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: TikTok share.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "tiktok"
    ]
  },
  "behavior": "One mapped share event; shareCount is the provider value or 0.",
  "filters": [],
  "variableIds": [
    "variable.trigger.tiktok_share.user",
    "variable.trigger.tiktok_share.username",
    "variable.trigger.tiktok_share.displayName",
    "variable.trigger.tiktok_share.userId",
    "variable.trigger.tiktok_share.eventId",
    "variable.trigger.tiktok_share.roomId",
    "variable.trigger.tiktok_share.shareCount"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: TikTok share.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "tiktok_share",
  "triggerPlatform": "tiktok",
  "triggerFilters": {}
}
```

Related: [variable.trigger.tiktok_share.user](#variable.trigger.tiktok_share.user), [variable.trigger.tiktok_share.username](#variable.trigger.tiktok_share.username), [variable.trigger.tiktok_share.displayName](#variable.trigger.tiktok_share.displayName), [variable.trigger.tiktok_share.userId](#variable.trigger.tiktok_share.userId), [variable.trigger.tiktok_share.eventId](#variable.trigger.tiktok_share.eventId), [variable.trigger.tiktok_share.roomId](#variable.trigger.tiktok_share.roomId), [variable.trigger.tiktok_share.shareCount](#variable.trigger.tiktok_share.shareCount), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.tiktok_share`.

<a id="variable.trigger.tiktok_share.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.tiktok_share.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="variable.trigger.tiktok_share.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.tiktok_share.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="variable.trigger.tiktok_share.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.tiktok_share.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="variable.trigger.tiktok_share.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.tiktok_share.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="variable.trigger.tiktok_share.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.tiktok_share.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="variable.trigger.tiktok_share.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.tiktok_share.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="variable.trigger.tiktok_share.shareCount"></a>

## {shareCount}

TikTok share counter supplied by event, or 0.

ID: `variable.trigger.tiktok_share.shareCount`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{shareCount}",
  "canonicalKey": "shareCount",
  "aliases": [],
  "producer": "trigger.tiktok_share",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "One mapped share event; shareCount is the provider value or 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{shareCount}
```

Related: [trigger.tiktok_share](#trigger.tiktok_share)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_share.extract`.

<a id="trigger.tiktok_like"></a>

## TikTok likes

Fires for a TikTok like batch.

ID: `trigger.tiktok_like`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: TikTok likes.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "tiktok"
    ]
  },
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter.",
  "filters": [
    {
      "key": "min_likes",
      "type": "number",
      "label": "Minimum likes in batch",
      "min": 1,
      "default": 1
    }
  ],
  "variableIds": [
    "variable.trigger.tiktok_like.user",
    "variable.trigger.tiktok_like.username",
    "variable.trigger.tiktok_like.displayName",
    "variable.trigger.tiktok_like.userId",
    "variable.trigger.tiktok_like.eventId",
    "variable.trigger.tiktok_like.roomId",
    "variable.trigger.tiktok_like.likes",
    "variable.trigger.tiktok_like.totalLikes"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: TikTok likes.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "tiktok_like",
  "triggerPlatform": "tiktok",
  "triggerFilters": {
    "min_likes": 1
  }
}
```

Related: [variable.trigger.tiktok_like.user](#variable.trigger.tiktok_like.user), [variable.trigger.tiktok_like.username](#variable.trigger.tiktok_like.username), [variable.trigger.tiktok_like.displayName](#variable.trigger.tiktok_like.displayName), [variable.trigger.tiktok_like.userId](#variable.trigger.tiktok_like.userId), [variable.trigger.tiktok_like.eventId](#variable.trigger.tiktok_like.eventId), [variable.trigger.tiktok_like.roomId](#variable.trigger.tiktok_like.roomId), [variable.trigger.tiktok_like.likes](#variable.trigger.tiktok_like.likes), [variable.trigger.tiktok_like.totalLikes](#variable.trigger.tiktok_like.totalLikes), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.tiktok_like`.

<a id="variable.trigger.tiktok_like.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.tiktok_like.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.tiktok_like.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.tiktok_like.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.tiktok_like.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.tiktok_like.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.tiktok_like.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.likes"></a>

## {likes}

Likes in the current TikTok batch, or 0.

ID: `variable.trigger.tiktok_like.likes`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{likes}",
  "canonicalKey": "likes",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{likes}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="variable.trigger.tiktok_like.totalLikes"></a>

## {totalLikes}

TikTok stream total likes, or 0.

ID: `variable.trigger.tiktok_like.totalLikes`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{totalLikes}",
  "canonicalKey": "totalLikes",
  "aliases": [],
  "producer": "trigger.tiktok_like",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Match a like batch with likes >= min_likes (default 1); totalLikes is a separate stream counter."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{totalLikes}
```

Related: [trigger.tiktok_like](#trigger.tiktok_like)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_like.extract`.

<a id="trigger.tiktok_question"></a>

## TikTok question

Fires when TikTok emits a viewer question.

ID: `trigger.tiktok_question`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: TikTok question.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "tiktok"
    ]
  },
  "behavior": "Mapped viewer question; both question and message refer to its question text.",
  "filters": [],
  "variableIds": [
    "variable.trigger.tiktok_question.user",
    "variable.trigger.tiktok_question.username",
    "variable.trigger.tiktok_question.displayName",
    "variable.trigger.tiktok_question.userId",
    "variable.trigger.tiktok_question.eventId",
    "variable.trigger.tiktok_question.roomId",
    "variable.trigger.tiktok_question.question",
    "variable.trigger.tiktok_question.message"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: TikTok question.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "tiktok_question",
  "triggerPlatform": "tiktok",
  "triggerFilters": {}
}
```

Related: [variable.trigger.tiktok_question.user](#variable.trigger.tiktok_question.user), [variable.trigger.tiktok_question.username](#variable.trigger.tiktok_question.username), [variable.trigger.tiktok_question.displayName](#variable.trigger.tiktok_question.displayName), [variable.trigger.tiktok_question.userId](#variable.trigger.tiktok_question.userId), [variable.trigger.tiktok_question.eventId](#variable.trigger.tiktok_question.eventId), [variable.trigger.tiktok_question.roomId](#variable.trigger.tiktok_question.roomId), [variable.trigger.tiktok_question.question](#variable.trigger.tiktok_question.question), [variable.trigger.tiktok_question.message](#variable.trigger.tiktok_question.message), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.tiktok_question`.

<a id="variable.trigger.tiktok_question.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.tiktok_question.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.tiktok_question.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.tiktok_question.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.tiktok_question.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.tiktok_question.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.tiktok_question.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.question"></a>

## {question}

TikTok viewer question text.

ID: `variable.trigger.tiktok_question.question`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{question}",
  "canonicalKey": "question",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{question}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="variable.trigger.tiktok_question.message"></a>

## {message}

Event text; reward redemptions use viewer input, TikTok questions use the question text.

ID: `variable.trigger.tiktok_question.message`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{message}",
  "canonicalKey": "message",
  "aliases": [],
  "producer": "trigger.tiktok_question",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped viewer question; both question and message refer to its question text."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{message}
```

Related: [trigger.tiktok_question](#trigger.tiktok_question)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.tiktok_question.extract`.

<a id="trigger.gift_sub"></a>

## Gift subscription

Fires when subs are gifted to the community.

ID: `trigger.gift_sub`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Monetization.
2. Choose Trigger event: Gift subscription.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick"
    ]
  },
  "behavior": "Gift count must meet minimum; missing count is 1. TikTok gifted subscriptions use Subscription instead.",
  "filters": [
    {
      "key": "min_count",
      "type": "number",
      "label": "Minimum gift count (0 = any)",
      "min": 0,
      "default": 0
    }
  ],
  "variableIds": [
    "variable.trigger.gift_sub.gifter",
    "variable.trigger.gift_sub.count",
    "variable.trigger.gift_sub.tier",
    "variable.trigger.gift_sub.user"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Monetization.",
      "Choose Trigger event: Gift subscription.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "gift_sub",
  "triggerPlatform": "twitch",
  "triggerFilters": {
    "min_count": 0
  }
}
```

Related: [variable.trigger.gift_sub.gifter](#variable.trigger.gift_sub.gifter), [variable.trigger.gift_sub.count](#variable.trigger.gift_sub.count), [variable.trigger.gift_sub.tier](#variable.trigger.gift_sub.tier), [variable.trigger.gift_sub.user](#variable.trigger.gift_sub.user), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.gift_sub`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.gift_sub`.

<a id="variable.trigger.gift_sub.gifter"></a>

## {gifter}

Gift subscription sender username.

ID: `variable.trigger.gift_sub.gifter`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{gifter}",
  "canonicalKey": "gifter",
  "aliases": [],
  "producer": "trigger.gift_sub",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Gift count must meet minimum; missing count is 1. TikTok gifted subscriptions use Subscription instead."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{gifter}
```

Related: [trigger.gift_sub](#trigger.gift_sub)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.gift_sub.extract`.

<a id="variable.trigger.gift_sub.count"></a>

## {count}

Subscription/gift count from the event; extraction defaults to 1.

ID: `variable.trigger.gift_sub.count`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{count}",
  "canonicalKey": "count",
  "aliases": [],
  "producer": "trigger.gift_sub",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 1,
  "behavior": "Gift count must meet minimum; missing count is 1. TikTok gifted subscriptions use Subscription instead."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{count}
```

Related: [trigger.gift_sub](#trigger.gift_sub)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.gift_sub.extract`.

<a id="variable.trigger.gift_sub.tier"></a>

## {tier}

Provider subscription tier; missing value defaults to 1000.

ID: `variable.trigger.gift_sub.tier`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{tier}",
  "canonicalKey": "tier",
  "aliases": [],
  "producer": "trigger.gift_sub",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "1000",
  "behavior": "Gift count must meet minimum; missing count is 1. TikTok gifted subscriptions use Subscription instead."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{tier}
```

Related: [trigger.gift_sub](#trigger.gift_sub)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.gift_sub.extract`.

<a id="variable.trigger.gift_sub.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.gift_sub.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.gift_sub",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Gift count must meet minimum; missing count is 1. TikTok gifted subscriptions use Subscription instead."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.gift_sub](#trigger.gift_sub)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.gift_sub.extract`.

<a id="trigger.cheer"></a>

## Bits / KICKs

Fires when a viewer sends Twitch bits or Kick KICKs.

ID: `trigger.cheer`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Monetization.
2. Choose Trigger event: Bits / KICKs.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "kick"
    ]
  },
  "behavior": "Twitch bits or Kick KICKs count must meet min_bits; the shared variable is named bits.",
  "filters": [
    {
      "key": "min_bits",
      "type": "number",
      "label": "Minimum amount (0 = any)",
      "min": 0,
      "default": 0
    }
  ],
  "variableIds": [
    "variable.trigger.cheer.user",
    "variable.trigger.cheer.bits",
    "variable.trigger.cheer.message"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Monetization.",
      "Choose Trigger event: Bits / KICKs.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "cheer",
  "triggerPlatform": "twitch",
  "triggerFilters": {
    "min_bits": 0
  }
}
```

Related: [variable.trigger.cheer.user](#variable.trigger.cheer.user), [variable.trigger.cheer.bits](#variable.trigger.cheer.bits), [variable.trigger.cheer.message](#variable.trigger.cheer.message), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.cheer`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.cheer`.

<a id="variable.trigger.cheer.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.cheer.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.cheer",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Twitch bits or Kick KICKs count must meet min_bits; the shared variable is named bits."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.cheer](#trigger.cheer)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.cheer.extract`.

<a id="variable.trigger.cheer.bits"></a>

## {bits}

Twitch bits or Kick KICKs amount, or 0.

ID: `variable.trigger.cheer.bits`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{bits}",
  "canonicalKey": "bits",
  "aliases": [],
  "producer": "trigger.cheer",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Twitch bits or Kick KICKs count must meet min_bits; the shared variable is named bits."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{bits}
```

Related: [trigger.cheer](#trigger.cheer)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.cheer.extract`.

<a id="variable.trigger.cheer.message"></a>

## {message}

Event text; reward redemptions use viewer input, TikTok questions use the question text.

ID: `variable.trigger.cheer.message`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{message}",
  "canonicalKey": "message",
  "aliases": [],
  "producer": "trigger.cheer",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Twitch bits or Kick KICKs count must meet min_bits; the shared variable is named bits."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{message}
```

Related: [trigger.cheer](#trigger.cheer)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.cheer.extract`.

<a id="trigger.raid"></a>

## Incoming raid

Fires when another streamer raids the channel.

ID: `trigger.raid`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Raids.
2. Choose Trigger event: Incoming raid.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "kick"
    ]
  },
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster.",
  "filters": [
    {
      "key": "min_viewers",
      "type": "number",
      "label": "Minimum viewers (0 = any)",
      "min": 0,
      "default": 0
    },
    {
      "key": "upcoming_ad_within_minutes",
      "type": "number",
      "label": "Only if next Twitch ad is within minutes (0 = off)",
      "min": 0,
      "max": 180,
      "default": 0
    }
  ],
  "variableIds": [
    "variable.trigger.raid.user",
    "variable.trigger.raid.target",
    "variable.trigger.raid.target.url",
    "variable.trigger.raid.target.game",
    "variable.trigger.raid.target.title",
    "variable.trigger.raid.viewers",
    "variable.trigger.raid.username",
    "variable.trigger.raid.displayName",
    "variable.trigger.raid.userId",
    "variable.trigger.raid.eventId",
    "variable.trigger.raid.roomId"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Raids.",
      "Choose Trigger event: Incoming raid.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "raid",
  "triggerPlatform": "twitch",
  "triggerFilters": {
    "min_viewers": 0,
    "upcoming_ad_within_minutes": 0
  }
}
```

Related: [variable.trigger.raid.user](#variable.trigger.raid.user), [variable.trigger.raid.target](#variable.trigger.raid.target), [variable.trigger.raid.target.url](#variable.trigger.raid.target.url), [variable.trigger.raid.target.game](#variable.trigger.raid.target.game), [variable.trigger.raid.target.title](#variable.trigger.raid.target.title), [variable.trigger.raid.viewers](#variable.trigger.raid.viewers), [variable.trigger.raid.username](#variable.trigger.raid.username), [variable.trigger.raid.displayName](#variable.trigger.raid.displayName), [variable.trigger.raid.userId](#variable.trigger.raid.userId), [variable.trigger.raid.eventId](#variable.trigger.raid.eventId), [variable.trigger.raid.roomId](#variable.trigger.raid.roomId), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.raid`.

<a id="variable.trigger.raid.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.raid.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.target"></a>

## {target}

Raider username for incoming raids; destination login for outgoing raids.

ID: `variable.trigger.raid.target`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{target}",
  "canonicalKey": "target",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{target}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.target.url"></a>

## {target.url}

Profile URL for the target username on the current platform

ID: `variable.trigger.raid.target.url`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{target.url}",
  "canonicalKey": "target.url",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised for this trigger; resolved by global variable engine after event substitution.",
  "emptyEventFallback": null,
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{target.url}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.target.game"></a>

## {target.game}

Target channel category/game on the current platform

ID: `variable.trigger.raid.target.game`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{target.game}",
  "canonicalKey": "target.game",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised for this trigger; resolved by global variable engine after event substitution.",
  "emptyEventFallback": null,
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{target.game}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.target.title"></a>

## {target.title}

Target channel title on the current platform

ID: `variable.trigger.raid.target.title`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{target.title}",
  "canonicalKey": "target.title",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised for this trigger; resolved by global variable engine after event substitution.",
  "emptyEventFallback": null,
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{target.title}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.viewers"></a>

## {viewers}

Incoming raid size or outgoing raid viewer count, or 0.

ID: `variable.trigger.raid.viewers`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{viewers}",
  "canonicalKey": "viewers",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{viewers}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.raid.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.displayName"></a>

## {displayName}

Event display name with username fallback.

ID: `variable.trigger.raid.displayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{displayName}",
  "canonicalKey": "displayName",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{displayName}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.userId"></a>

## {userId}

Provider user ID when supplied; otherwise empty.

ID: `variable.trigger.raid.userId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{userId}",
  "canonicalKey": "userId",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{userId}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.eventId"></a>

## {eventId}

Event/message identity when supplied; otherwise empty.

ID: `variable.trigger.raid.eventId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventId}",
  "canonicalKey": "eventId",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventId}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="variable.trigger.raid.roomId"></a>

## {roomId}

Provider room identifier when supplied; otherwise empty.

ID: `variable.trigger.raid.roomId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{roomId}",
  "canonicalKey": "roomId",
  "aliases": [],
  "producer": "trigger.raid",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Incoming raid viewers must meet minimum. Positive upcoming-ad window applies only to Twitch with a known eligible schedule. target is the raider, not the receiving broadcaster."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{roomId}
```

Related: [trigger.raid](#trigger.raid)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid.extract`.

<a id="trigger.raid_started"></a>

## Raid started

Fires once when the broadcaster successfully starts an outgoing raid through SheevChat.

ID: `trigger.raid_started`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Raids.
2. Choose Trigger event: Raid started.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "kick"
    ]
  },
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination.",
  "filters": [],
  "variableIds": [
    "variable.trigger.raid_started.target",
    "variable.trigger.raid_started.targetDisplayName",
    "variable.trigger.raid_started.targetId",
    "variable.trigger.raid_started.viewers",
    "variable.trigger.raid_started.user",
    "variable.trigger.raid_started.username"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Raids.",
      "Choose Trigger event: Raid started.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "raid_started",
  "triggerPlatform": "twitch",
  "triggerFilters": {}
}
```

Related: [variable.trigger.raid_started.target](#variable.trigger.raid_started.target), [variable.trigger.raid_started.targetDisplayName](#variable.trigger.raid_started.targetDisplayName), [variable.trigger.raid_started.targetId](#variable.trigger.raid_started.targetId), [variable.trigger.raid_started.viewers](#variable.trigger.raid_started.viewers), [variable.trigger.raid_started.user](#variable.trigger.raid_started.user), [variable.trigger.raid_started.username](#variable.trigger.raid_started.username), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.raid_started`.

<a id="variable.trigger.raid_started.target"></a>

## {target}

Raider username for incoming raids; destination login for outgoing raids.

ID: `variable.trigger.raid_started.target`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{target}",
  "canonicalKey": "target",
  "aliases": [],
  "producer": "trigger.raid_started",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{target}
```

Related: [trigger.raid_started](#trigger.raid_started)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started.extract`.

<a id="variable.trigger.raid_started.targetDisplayName"></a>

## {targetDisplayName}

Outgoing raid destination display name with login fallback.

ID: `variable.trigger.raid_started.targetDisplayName`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{targetDisplayName}",
  "canonicalKey": "targetDisplayName",
  "aliases": [],
  "producer": "trigger.raid_started",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{targetDisplayName}
```

Related: [trigger.raid_started](#trigger.raid_started)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started.extract`.

<a id="variable.trigger.raid_started.targetId"></a>

## {targetId}

Outgoing raid destination provider ID.

ID: `variable.trigger.raid_started.targetId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{targetId}",
  "canonicalKey": "targetId",
  "aliases": [],
  "producer": "trigger.raid_started",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{targetId}
```

Related: [trigger.raid_started](#trigger.raid_started)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started.extract`.

<a id="variable.trigger.raid_started.viewers"></a>

## {viewers}

Incoming raid size or outgoing raid viewer count, or 0.

ID: `variable.trigger.raid_started.viewers`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{viewers}",
  "canonicalKey": "viewers",
  "aliases": [],
  "producer": "trigger.raid_started",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{viewers}
```

Related: [trigger.raid_started](#trigger.raid_started)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started.extract`.

<a id="variable.trigger.raid_started.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.raid_started.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.raid_started",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.raid_started](#trigger.raid_started)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started.extract`.

<a id="variable.trigger.raid_started.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.raid_started.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.raid_started",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Emitted after SheevChat successfully starts an outgoing raid; not every raid initiated externally. Target identity describes the destination."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.raid_started](#trigger.raid_started)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.raid_started.extract`.

<a id="trigger.channel_point_redeem"></a>

## Channel reward redemption

Fires when a viewer redeems a Twitch channel point reward or Kick channel reward.

ID: `trigger.channel_point_redeem`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: Channel reward redemption.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "kick"
    ]
  },
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input.",
  "filters": [
    {
      "key": "reward_id",
      "type": "rewards_dropdown",
      "label": "Reward (blank = any reward)"
    }
  ],
  "variableIds": [
    "variable.trigger.channel_point_redeem.user",
    "variable.trigger.channel_point_redeem.user.points",
    "variable.trigger.channel_point_redeem.user.pointsRank",
    "variable.trigger.channel_point_redeem.reward",
    "variable.trigger.channel_point_redeem.message",
    "variable.trigger.channel_point_redeem.username",
    "variable.trigger.channel_point_redeem.input"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: Channel reward redemption.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "channel_point_redeem",
  "triggerPlatform": "twitch",
  "triggerFilters": {
    "reward_id": ""
  }
}
```

Related: [variable.trigger.channel_point_redeem.user](#variable.trigger.channel_point_redeem.user), [variable.trigger.channel_point_redeem.user.points](#variable.trigger.channel_point_redeem.user.points), [variable.trigger.channel_point_redeem.user.pointsRank](#variable.trigger.channel_point_redeem.user.pointsRank), [variable.trigger.channel_point_redeem.reward](#variable.trigger.channel_point_redeem.reward), [variable.trigger.channel_point_redeem.message](#variable.trigger.channel_point_redeem.message), [variable.trigger.channel_point_redeem.username](#variable.trigger.channel_point_redeem.username), [variable.trigger.channel_point_redeem.input](#variable.trigger.channel_point_redeem.input), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.channel_point_redeem`.

<a id="variable.trigger.channel_point_redeem.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.channel_point_redeem.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="variable.trigger.channel_point_redeem.user.points"></a>

## {user.points}

Command sender current loyalty currency

ID: `variable.trigger.channel_point_redeem.user.points`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user.points}",
  "canonicalKey": "user.points",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised for this trigger; resolved by global variable engine after event substitution.",
  "emptyEventFallback": null,
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user.points}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="variable.trigger.channel_point_redeem.user.pointsRank"></a>

## {user.pointsRank}

Command sender loyalty rank

ID: `variable.trigger.channel_point_redeem.user.pointsRank`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user.pointsRank}",
  "canonicalKey": "user.pointsRank",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised for this trigger; resolved by global variable engine after event substitution.",
  "emptyEventFallback": null,
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user.pointsRank}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="variable.trigger.channel_point_redeem.reward"></a>

## {reward}

Redeemed reward name.

ID: `variable.trigger.channel_point_redeem.reward`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{reward}",
  "canonicalKey": "reward",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{reward}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="variable.trigger.channel_point_redeem.message"></a>

## {message}

Event text; reward redemptions use viewer input, TikTok questions use the question text.

ID: `variable.trigger.channel_point_redeem.message`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{message}",
  "canonicalKey": "message",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{message}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="variable.trigger.channel_point_redeem.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.channel_point_redeem.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="variable.trigger.channel_point_redeem.input"></a>

## {input}

Reward redemption viewer input; mirrors message in action context.

ID: `variable.trigger.channel_point_redeem.input`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{input}",
  "canonicalKey": "input",
  "aliases": [],
  "producer": "trigger.channel_point_redeem",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank reward accepts any mapped redemption; otherwise reward ID matches exactly. input/message are the viewer reward input."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{input}
```

Related: [trigger.channel_point_redeem](#trigger.channel_point_redeem)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.channel_point_redeem.extract`.

<a id="trigger.imported_app_event"></a>

## Imported app event

Fires when an installed action library event stream receives a matching mapped event. Choose a specific library and event stream for normal use.

ID: `trigger.imported_app_event`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: Imported app event.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "app"
    ]
  },
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables.",
  "filters": [
    {
      "key": "library_id",
      "type": "action_library_dropdown",
      "label": "Action library"
    },
    {
      "key": "subscription_id",
      "type": "action_library_subscription_dropdown",
      "label": "Event stream"
    },
    {
      "key": "event_key",
      "type": "text",
      "label": "Mapped value key (optional)",
      "placeholder": "state, user, scene"
    },
    {
      "key": "event_value",
      "type": "text",
      "label": "Mapped value equals (optional)",
      "placeholder": "ready"
    }
  ],
  "variableIds": [
    "variable.trigger.imported_app_event.app",
    "variable.trigger.imported_app_event.library",
    "variable.trigger.imported_app_event.libraryId",
    "variable.trigger.imported_app_event.eventStream",
    "variable.trigger.imported_app_event.eventStreamId",
    "variable.trigger.imported_app_event.eventText",
    "variable.trigger.imported_app_event.eventJson",
    "variable.trigger.imported_app_event.event.key",
    "variable.trigger.imported_app_event.event.value"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: Imported app event.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "imported_app_event",
  "triggerPlatform": "app",
  "triggerFilters": {
    "library_id": "",
    "subscription_id": "",
    "event_key": "",
    "event_value": ""
  }
}
```

Related: [variable.trigger.imported_app_event.app](#variable.trigger.imported_app_event.app), [variable.trigger.imported_app_event.library](#variable.trigger.imported_app_event.library), [variable.trigger.imported_app_event.libraryId](#variable.trigger.imported_app_event.libraryId), [variable.trigger.imported_app_event.eventStream](#variable.trigger.imported_app_event.eventStream), [variable.trigger.imported_app_event.eventStreamId](#variable.trigger.imported_app_event.eventStreamId), [variable.trigger.imported_app_event.eventText](#variable.trigger.imported_app_event.eventText), [variable.trigger.imported_app_event.eventJson](#variable.trigger.imported_app_event.eventJson), [variable.trigger.imported_app_event.event.key](#variable.trigger.imported_app_event.event.key), [variable.trigger.imported_app_event.event.value](#variable.trigger.imported_app_event.event.value), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.imported_app_event`.

<a id="variable.trigger.imported_app_event.app"></a>

## {app}

Installed event library name with ID fallback.

ID: `variable.trigger.imported_app_event.app`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{app}",
  "canonicalKey": "app",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{app}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.library"></a>

## {library}

Installed event library name with ID fallback.

ID: `variable.trigger.imported_app_event.library`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{library}",
  "canonicalKey": "library",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{library}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.libraryId"></a>

## {libraryId}

Installed library ID.

ID: `variable.trigger.imported_app_event.libraryId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{libraryId}",
  "canonicalKey": "libraryId",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{libraryId}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.eventStream"></a>

## {eventStream}

Subscription label with ID fallback.

ID: `variable.trigger.imported_app_event.eventStream`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventStream}",
  "canonicalKey": "eventStream",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventStream}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.eventStreamId"></a>

## {eventStreamId}

Subscription ID.

ID: `variable.trigger.imported_app_event.eventStreamId`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventStreamId}",
  "canonicalKey": "eventStreamId",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventStreamId}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.eventText"></a>

## {eventText}

Mapped imported event text.

ID: `variable.trigger.imported_app_event.eventText`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventText}",
  "canonicalKey": "eventText",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventText}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.eventJson"></a>

## {eventJson}

Imported event JSON string when supplied.

ID: `variable.trigger.imported_app_event.eventJson`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{eventJson}",
  "canonicalKey": "eventJson",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{eventJson}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.event.key"></a>

## {event.key}

Mapped event key when supplied.

ID: `variable.trigger.imported_app_event.event.key`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{event.key}",
  "canonicalKey": "event.key",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised by this trigger; only populated when the corresponding event mapping supplies the value.",
  "emptyEventFallback": null,
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{event.key}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="variable.trigger.imported_app_event.event.value"></a>

## {event.value}

Mapped event value when supplied.

ID: `variable.trigger.imported_app_event.event.value`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{event.value}",
  "canonicalKey": "event.value",
  "aliases": [],
  "producer": "trigger.imported_app_event",
  "lifetime": "Current action sequence.",
  "resolution": "Advertised by this trigger; only populated when the corresponding event mapping supplies the value.",
  "emptyEventFallback": null,
  "behavior": "Optional library/stream IDs compare case-insensitively. A mapped key with no expected value must be nonempty; otherwise compare its string value case-insensitively. Package mappings can add arbitrary event.<key> variables."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{event.value}
```

Related: [trigger.imported_app_event](#trigger.imported_app_event)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.imported_app_event.extract`.

<a id="trigger.ad_break"></a>

## Ad break

Fires when an ad break starts, with an optional time offset.

ID: `trigger.ad_break`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: Ad break.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch"
    ]
  },
  "behavior": "Match ad-start with optional automatic/manual filter. Positive offset delays actions; negative offsets clamp to immediate and do not schedule a pre-ad action.",
  "filters": [
    {
      "key": "offset_sec",
      "type": "number",
      "label": "Offset (seconds, negative = before if supported)",
      "min": -300,
      "max": 300,
      "default": 0
    },
    {
      "key": "is_automatic",
      "type": "select",
      "label": "Ad type",
      "options": [
        {
          "value": "",
          "label": "Any"
        },
        {
          "value": "true",
          "label": "Automatic only"
        },
        {
          "value": "false",
          "label": "Manual only"
        }
      ]
    }
  ],
  "variableIds": [
    "variable.trigger.ad_break.duration",
    "variable.trigger.ad_break.is_automatic"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "offset_sec positive delays; negative clamps to 0.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: Ad break.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "ad_break",
  "triggerPlatform": "twitch",
  "triggerFilters": {
    "offset_sec": 0,
    "is_automatic": ""
  }
}
```

Related: [variable.trigger.ad_break.duration](#variable.trigger.ad_break.duration), [variable.trigger.ad_break.is_automatic](#variable.trigger.ad_break.is_automatic), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.ad_break`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.ad_break`.

<a id="variable.trigger.ad_break.duration"></a>

## {duration}

Ad duration in seconds, or 0.

ID: `variable.trigger.ad_break.duration`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{duration}",
  "canonicalKey": "duration",
  "aliases": [],
  "producer": "trigger.ad_break",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Match ad-start with optional automatic/manual filter. Positive offset delays actions; negative offsets clamp to immediate and do not schedule a pre-ad action."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{duration}
```

Related: [trigger.ad_break](#trigger.ad_break)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.ad_break.extract`.

<a id="variable.trigger.ad_break.is_automatic"></a>

## {is_automatic}

Ad type as yes/no.

ID: `variable.trigger.ad_break.is_automatic`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{is_automatic}",
  "canonicalKey": "is_automatic",
  "aliases": [],
  "producer": "trigger.ad_break",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "no",
  "behavior": "Match ad-start with optional automatic/manual filter. Positive offset delays actions; negative offsets clamp to immediate and do not schedule a pre-ad action."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{is_automatic}
```

Related: [trigger.ad_break](#trigger.ad_break)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.ad_break.extract`.

<a id="trigger.hype_train"></a>

## Hype Train

Fires when a Hype Train begins.

ID: `trigger.hype_train`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: Hype Train.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch"
    ]
  },
  "behavior": "Mapped Hype Train begin event; level defaults 1 and goal 0.",
  "filters": [],
  "variableIds": [
    "variable.trigger.hype_train.level",
    "variable.trigger.hype_train.goal"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: Hype Train.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "hype_train",
  "triggerPlatform": "twitch",
  "triggerFilters": {}
}
```

Related: [variable.trigger.hype_train.level](#variable.trigger.hype_train.level), [variable.trigger.hype_train.goal](#variable.trigger.hype_train.goal), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.hype_train`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.hype_train`.

<a id="variable.trigger.hype_train.level"></a>

## {level}

Hype Train level, default 1.

ID: `variable.trigger.hype_train.level`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{level}",
  "canonicalKey": "level",
  "aliases": [],
  "producer": "trigger.hype_train",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 1,
  "behavior": "Mapped Hype Train begin event; level defaults 1 and goal 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{level}
```

Related: [trigger.hype_train](#trigger.hype_train)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.hype_train.extract`.

<a id="variable.trigger.hype_train.goal"></a>

## {goal}

Hype Train goal, default 0.

ID: `variable.trigger.hype_train.goal`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{goal}",
  "canonicalKey": "goal",
  "aliases": [],
  "producer": "trigger.hype_train",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Mapped Hype Train begin event; level defaults 1 and goal 0."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{goal}
```

Related: [trigger.hype_train](#trigger.hype_train)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.hype_train.extract`.

<a id="trigger.poll_end"></a>

## Poll ended

Fires when a Twitch poll ends.

ID: `trigger.poll_end`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: Poll ended.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch"
    ]
  },
  "behavior": "Mapped completed Twitch poll; title, winning choice and votes refer to that poll, not stream metadata.",
  "filters": [],
  "variableIds": [
    "variable.trigger.poll_end.title",
    "variable.trigger.poll_end.winner",
    "variable.trigger.poll_end.winner_votes"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: Poll ended.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "poll_end",
  "triggerPlatform": "twitch",
  "triggerFilters": {}
}
```

Related: [variable.trigger.poll_end.title](#variable.trigger.poll_end.title), [variable.trigger.poll_end.winner](#variable.trigger.poll_end.winner), [variable.trigger.poll_end.winner_votes](#variable.trigger.poll_end.winner_votes), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.poll_end`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.poll_end`.

<a id="variable.trigger.poll_end.title"></a>

## {title}

Poll or prediction title in these event contexts; not the channel title.

ID: `variable.trigger.poll_end.title`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "trigger.poll_end",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped completed Twitch poll; title, winning choice and votes refer to that poll, not stream metadata."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{title}
```

Related: [trigger.poll_end](#trigger.poll_end)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.poll_end.extract`.

<a id="variable.trigger.poll_end.winner"></a>

## {winner}

Winning poll choice.

ID: `variable.trigger.poll_end.winner`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{winner}",
  "canonicalKey": "winner",
  "aliases": [],
  "producer": "trigger.poll_end",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped completed Twitch poll; title, winning choice and votes refer to that poll, not stream metadata."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{winner}
```

Related: [trigger.poll_end](#trigger.poll_end)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.poll_end.extract`.

<a id="variable.trigger.poll_end.winner_votes"></a>

## {winner_votes}

Winning poll vote count, or 0.

ID: `variable.trigger.poll_end.winner_votes`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{winner_votes}",
  "canonicalKey": "winner_votes",
  "aliases": [],
  "producer": "trigger.poll_end",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Mapped completed Twitch poll; title, winning choice and votes refer to that poll, not stream metadata."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{winner_votes}
```

Related: [trigger.poll_end](#trigger.poll_end)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.poll_end.extract`.

<a id="trigger.prediction_lock"></a>

## Prediction locked

Fires when a Twitch prediction is locked for voting.

ID: `trigger.prediction_lock`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Platform events.
2. Choose the incoming Platform first.
3. Choose Trigger event: Prediction locked.
4. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
5. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch"
    ]
  },
  "behavior": "Mapped Twitch prediction lock; title is the prediction title.",
  "filters": [],
  "variableIds": [
    "variable.trigger.prediction_lock.title"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Platform events.",
      "Choose the incoming Platform first.",
      "Choose Trigger event: Prediction locked.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "prediction_lock",
  "triggerPlatform": "twitch",
  "triggerFilters": {}
}
```

Related: [variable.trigger.prediction_lock.title](#variable.trigger.prediction_lock.title), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.prediction_lock`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.prediction_lock`.

<a id="variable.trigger.prediction_lock.title"></a>

## {title}

Poll or prediction title in these event contexts; not the channel title.

ID: `variable.trigger.prediction_lock.title`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "trigger.prediction_lock",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped Twitch prediction lock; title is the prediction title."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{title}
```

Related: [trigger.prediction_lock](#trigger.prediction_lock)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.prediction_lock.extract`.

<a id="trigger.superchat"></a>

## Super Chat / Super Sticker

Fires when a viewer sends a Super Chat or Super Sticker.

ID: `trigger.superchat`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Monetization.
2. Choose Trigger event: Super Chat / Super Sticker.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "youtube"
    ]
  },
  "behavior": "Mapped YouTube Super Chat/Sticker with amount >= min_amount. Uses normalized event amount; do not infer universal currency conversion from the dollar label.",
  "filters": [
    {
      "key": "min_amount",
      "type": "number",
      "label": "Minimum amount ($, 0 = any)",
      "min": 0,
      "default": 0
    }
  ],
  "variableIds": [
    "variable.trigger.superchat.user",
    "variable.trigger.superchat.amount",
    "variable.trigger.superchat.message"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Monetization.",
      "Choose Trigger event: Super Chat / Super Sticker.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "superchat",
  "triggerPlatform": "youtube",
  "triggerFilters": {
    "min_amount": 0
  }
}
```

Related: [variable.trigger.superchat.user](#variable.trigger.superchat.user), [variable.trigger.superchat.amount](#variable.trigger.superchat.amount), [variable.trigger.superchat.message](#variable.trigger.superchat.message), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.superchat`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.superchat`.

<a id="variable.trigger.superchat.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.superchat.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.superchat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Mapped YouTube Super Chat/Sticker with amount >= min_amount. Uses normalized event amount; do not infer universal currency conversion from the dollar label."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.superchat](#trigger.superchat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.superchat.extract`.

<a id="variable.trigger.superchat.amount"></a>

## {amount}

Provider-normalized gift amount or Super Chat amount; do not assume cross-provider currency equivalence.

ID: `variable.trigger.superchat.amount`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{amount}",
  "canonicalKey": "amount",
  "aliases": [],
  "producer": "trigger.superchat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": 0,
  "behavior": "Mapped YouTube Super Chat/Sticker with amount >= min_amount. Uses normalized event amount; do not infer universal currency conversion from the dollar label."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{amount}
```

Related: [trigger.superchat](#trigger.superchat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.superchat.extract`.

<a id="variable.trigger.superchat.message"></a>

## {message}

Event text; reward redemptions use viewer input, TikTok questions use the question text.

ID: `variable.trigger.superchat.message`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{message}",
  "canonicalKey": "message",
  "aliases": [],
  "producer": "trigger.superchat",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Mapped YouTube Super Chat/Sticker with amount >= min_amount. Uses normalized event amount; do not infer universal currency conversion from the dollar label."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{message}
```

Related: [trigger.superchat](#trigger.superchat)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.superchat.extract`.

<a id="trigger.obs_scene_change"></a>

## OBS scene change

Fires when OBS changes to a selected program scene. Leave the scene blank to react to any scene change.

ID: `trigger.obs_scene_change`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: OBS scene change.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "obs"
    ]
  },
  "behavior": "Program-scene change; blank selects any scene, otherwise trimmed case-insensitive scene-name equality. Requires OBS connection.",
  "filters": [
    {
      "key": "sceneName",
      "type": "obs_scene_dropdown",
      "label": "Scene (blank = any scene)"
    }
  ],
  "variableIds": [
    "variable.trigger.obs_scene_change.scene",
    "variable.trigger.obs_scene_change.previousScene",
    "variable.trigger.obs_scene_change.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: OBS scene change.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "obs_scene_change",
  "triggerPlatform": "obs",
  "triggerFilters": {
    "sceneName": ""
  }
}
```

Related: [variable.trigger.obs_scene_change.scene](#variable.trigger.obs_scene_change.scene), [variable.trigger.obs_scene_change.previousScene](#variable.trigger.obs_scene_change.previousScene), [variable.trigger.obs_scene_change.platform](#variable.trigger.obs_scene_change.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.obs_scene_change`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.obs_scene_change`.

<a id="variable.trigger.obs_scene_change.scene"></a>

## {scene}

New active scene name.

ID: `variable.trigger.obs_scene_change.scene`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{scene}",
  "canonicalKey": "scene",
  "aliases": [],
  "producer": "trigger.obs_scene_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Program-scene change; blank selects any scene, otherwise trimmed case-insensitive scene-name equality. Requires OBS connection."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{scene}
```

Related: [trigger.obs_scene_change](#trigger.obs_scene_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.obs_scene_change.extract`.

<a id="variable.trigger.obs_scene_change.previousScene"></a>

## {previousScene}

Previous scene name.

ID: `variable.trigger.obs_scene_change.previousScene`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{previousScene}",
  "canonicalKey": "previousScene",
  "aliases": [],
  "producer": "trigger.obs_scene_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Program-scene change; blank selects any scene, otherwise trimmed case-insensitive scene-name equality. Requires OBS connection."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{previousScene}
```

Related: [trigger.obs_scene_change](#trigger.obs_scene_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.obs_scene_change.extract`.

<a id="variable.trigger.obs_scene_change.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.obs_scene_change.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.obs_scene_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "obs",
  "behavior": "Program-scene change; blank selects any scene, otherwise trimmed case-insensitive scene-name equality. Requires OBS connection."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.obs_scene_change](#trigger.obs_scene_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.obs_scene_change.extract`.

<a id="trigger.streamlabs_scene_change"></a>

## Streamlabs Desktop scene change

Fires when Streamlabs Desktop switches to a selected scene. Leave the scene blank to react to any scene change.

ID: `trigger.streamlabs_scene_change`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: Streamlabs Desktop scene change.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "streamlabs"
    ]
  },
  "behavior": "Blank selects any scene, otherwise exact selected scene ID equality. Requires Streamlabs Desktop connection.",
  "filters": [
    {
      "key": "sceneId",
      "type": "streamlabs_scene_dropdown",
      "label": "Scene (blank = any scene)"
    }
  ],
  "variableIds": [
    "variable.trigger.streamlabs_scene_change.scene",
    "variable.trigger.streamlabs_scene_change.previousScene",
    "variable.trigger.streamlabs_scene_change.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: Streamlabs Desktop scene change.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "streamlabs_scene_change",
  "triggerPlatform": "streamlabs",
  "triggerFilters": {
    "sceneId": ""
  }
}
```

Related: [variable.trigger.streamlabs_scene_change.scene](#variable.trigger.streamlabs_scene_change.scene), [variable.trigger.streamlabs_scene_change.previousScene](#variable.trigger.streamlabs_scene_change.previousScene), [variable.trigger.streamlabs_scene_change.platform](#variable.trigger.streamlabs_scene_change.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_change`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.streamlabs_scene_change`.

<a id="variable.trigger.streamlabs_scene_change.scene"></a>

## {scene}

New active scene name.

ID: `variable.trigger.streamlabs_scene_change.scene`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{scene}",
  "canonicalKey": "scene",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank selects any scene, otherwise exact selected scene ID equality. Requires Streamlabs Desktop connection."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{scene}
```

Related: [trigger.streamlabs_scene_change](#trigger.streamlabs_scene_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_change.extract`.

<a id="variable.trigger.streamlabs_scene_change.previousScene"></a>

## {previousScene}

Previous scene name.

ID: `variable.trigger.streamlabs_scene_change.previousScene`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{previousScene}",
  "canonicalKey": "previousScene",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank selects any scene, otherwise exact selected scene ID equality. Requires Streamlabs Desktop connection."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{previousScene}
```

Related: [trigger.streamlabs_scene_change](#trigger.streamlabs_scene_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_change.extract`.

<a id="variable.trigger.streamlabs_scene_change.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.streamlabs_scene_change.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "streamlabs",
  "behavior": "Blank selects any scene, otherwise exact selected scene ID equality. Requires Streamlabs Desktop connection."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.streamlabs_scene_change](#trigger.streamlabs_scene_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_change.extract`.

<a id="trigger.streamlabs_output_change"></a>

## Streamlabs Desktop output status

Fires after a Streamlabs stream, recording, or replay buffer actually starts or stops. Transient statuses do not fire.

ID: `trigger.streamlabs_output_change`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: Streamlabs Desktop output status.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "streamlabs"
    ]
  },
  "behavior": "Only settled stream/record/replay start/stop transitions. Output defaults stream; transition defaults started. Transient statuses do not fire.",
  "filters": [
    {
      "key": "output",
      "type": "select",
      "label": "Output",
      "default": "stream",
      "options": [
        {
          "value": "stream",
          "label": "Stream"
        },
        {
          "value": "record",
          "label": "Recording"
        },
        {
          "value": "replay",
          "label": "Replay buffer"
        }
      ]
    },
    {
      "key": "transition",
      "type": "select",
      "label": "When",
      "default": "started",
      "options": [
        {
          "value": "started",
          "label": "Started"
        },
        {
          "value": "stopped",
          "label": "Stopped"
        }
      ]
    }
  ],
  "variableIds": [
    "variable.trigger.streamlabs_output_change.output",
    "variable.trigger.streamlabs_output_change.transition",
    "variable.trigger.streamlabs_output_change.status",
    "variable.trigger.streamlabs_output_change.previousStatus",
    "variable.trigger.streamlabs_output_change.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: Streamlabs Desktop output status.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "streamlabs_output_change",
  "triggerPlatform": "streamlabs",
  "triggerFilters": {
    "output": "stream",
    "transition": "started"
  }
}
```

Related: [variable.trigger.streamlabs_output_change.output](#variable.trigger.streamlabs_output_change.output), [variable.trigger.streamlabs_output_change.transition](#variable.trigger.streamlabs_output_change.transition), [variable.trigger.streamlabs_output_change.status](#variable.trigger.streamlabs_output_change.status), [variable.trigger.streamlabs_output_change.previousStatus](#variable.trigger.streamlabs_output_change.previousStatus), [variable.trigger.streamlabs_output_change.platform](#variable.trigger.streamlabs_output_change.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_output_change`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.streamlabs_output_change`.

<a id="variable.trigger.streamlabs_output_change.output"></a>

## {output}

Streamlabs output family: stream, record or replay.

ID: `variable.trigger.streamlabs_output_change.output`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{output}",
  "canonicalKey": "output",
  "aliases": [],
  "producer": "trigger.streamlabs_output_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Only settled stream/record/replay start/stop transitions. Output defaults stream; transition defaults started. Transient statuses do not fire."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{output}
```

Related: [trigger.streamlabs_output_change](#trigger.streamlabs_output_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_output_change.extract`.

<a id="variable.trigger.streamlabs_output_change.transition"></a>

## {transition}

Settled output transition: started or stopped.

ID: `variable.trigger.streamlabs_output_change.transition`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{transition}",
  "canonicalKey": "transition",
  "aliases": [],
  "producer": "trigger.streamlabs_output_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Only settled stream/record/replay start/stop transitions. Output defaults stream; transition defaults started. Transient statuses do not fire."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{transition}
```

Related: [trigger.streamlabs_output_change](#trigger.streamlabs_output_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_output_change.extract`.

<a id="variable.trigger.streamlabs_output_change.status"></a>

## {status}

New Streamlabs output status.

ID: `variable.trigger.streamlabs_output_change.status`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{status}",
  "canonicalKey": "status",
  "aliases": [],
  "producer": "trigger.streamlabs_output_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Only settled stream/record/replay start/stop transitions. Output defaults stream; transition defaults started. Transient statuses do not fire."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{status}
```

Related: [trigger.streamlabs_output_change](#trigger.streamlabs_output_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_output_change.extract`.

<a id="variable.trigger.streamlabs_output_change.previousStatus"></a>

## {previousStatus}

Previous output status.

ID: `variable.trigger.streamlabs_output_change.previousStatus`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{previousStatus}",
  "canonicalKey": "previousStatus",
  "aliases": [],
  "producer": "trigger.streamlabs_output_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Only settled stream/record/replay start/stop transitions. Output defaults stream; transition defaults started. Transient statuses do not fire."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{previousStatus}
```

Related: [trigger.streamlabs_output_change](#trigger.streamlabs_output_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_output_change.extract`.

<a id="variable.trigger.streamlabs_output_change.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.streamlabs_output_change.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.streamlabs_output_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "streamlabs",
  "behavior": "Only settled stream/record/replay start/stop transitions. Output defaults stream; transition defaults started. Transient statuses do not fire."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.streamlabs_output_change](#trigger.streamlabs_output_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_output_change.extract`.

<a id="trigger.streamlabs_collection_change"></a>

## Streamlabs Desktop scene collection change

Fires when Streamlabs Desktop switches to a selected scene collection. Leave blank for any collection.

ID: `trigger.streamlabs_collection_change`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: Streamlabs Desktop scene collection change.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "streamlabs"
    ]
  },
  "behavior": "Blank selects any collection, otherwise exact selected collection ID equality.",
  "filters": [
    {
      "key": "collectionId",
      "type": "streamlabs_collection_dropdown",
      "label": "Scene collection (blank = any)"
    }
  ],
  "variableIds": [
    "variable.trigger.streamlabs_collection_change.collection",
    "variable.trigger.streamlabs_collection_change.previousCollection",
    "variable.trigger.streamlabs_collection_change.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: Streamlabs Desktop scene collection change.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "streamlabs_collection_change",
  "triggerPlatform": "streamlabs",
  "triggerFilters": {
    "collectionId": ""
  }
}
```

Related: [variable.trigger.streamlabs_collection_change.collection](#variable.trigger.streamlabs_collection_change.collection), [variable.trigger.streamlabs_collection_change.previousCollection](#variable.trigger.streamlabs_collection_change.previousCollection), [variable.trigger.streamlabs_collection_change.platform](#variable.trigger.streamlabs_collection_change.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_collection_change`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.streamlabs_collection_change`.

<a id="variable.trigger.streamlabs_collection_change.collection"></a>

## {collection}

New Streamlabs scene collection name.

ID: `variable.trigger.streamlabs_collection_change.collection`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{collection}",
  "canonicalKey": "collection",
  "aliases": [],
  "producer": "trigger.streamlabs_collection_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank selects any collection, otherwise exact selected collection ID equality."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{collection}
```

Related: [trigger.streamlabs_collection_change](#trigger.streamlabs_collection_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_collection_change.extract`.

<a id="variable.trigger.streamlabs_collection_change.previousCollection"></a>

## {previousCollection}

Previous scene collection name.

ID: `variable.trigger.streamlabs_collection_change.previousCollection`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{previousCollection}",
  "canonicalKey": "previousCollection",
  "aliases": [],
  "producer": "trigger.streamlabs_collection_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Blank selects any collection, otherwise exact selected collection ID equality."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{previousCollection}
```

Related: [trigger.streamlabs_collection_change](#trigger.streamlabs_collection_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_collection_change.extract`.

<a id="variable.trigger.streamlabs_collection_change.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.streamlabs_collection_change.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.streamlabs_collection_change",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "streamlabs",
  "behavior": "Blank selects any collection, otherwise exact selected collection ID equality."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.streamlabs_collection_change](#trigger.streamlabs_collection_change)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_collection_change.extract`.

<a id="trigger.streamlabs_scene_item_visibility"></a>

## Streamlabs Desktop scene item visibility

Fires when one exact Streamlabs scene-item instance is shown or hidden. Leave the item blank for any identified item.

ID: `trigger.streamlabs_scene_item_visibility`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: Streamlabs Desktop scene item visibility.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "streamlabs"
    ]
  },
  "behavior": "Exact item resource ID if selected, otherwise any identified item. Visibility defaults shown. This is an instance event, not linked-source fanout.",
  "filters": [
    {
      "key": "itemResourceId",
      "type": "streamlabs_scene_item_dropdown",
      "label": "Scene item (blank = any)"
    },
    {
      "key": "visibility",
      "type": "select",
      "label": "When",
      "default": "shown",
      "options": [
        {
          "value": "shown",
          "label": "Shown"
        },
        {
          "value": "hidden",
          "label": "Hidden"
        }
      ]
    }
  ],
  "variableIds": [
    "variable.trigger.streamlabs_scene_item_visibility.scene",
    "variable.trigger.streamlabs_scene_item_visibility.source",
    "variable.trigger.streamlabs_scene_item_visibility.visibility",
    "variable.trigger.streamlabs_scene_item_visibility.previousVisibility",
    "variable.trigger.streamlabs_scene_item_visibility.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: Streamlabs Desktop scene item visibility.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "streamlabs_scene_item_visibility",
  "triggerPlatform": "streamlabs",
  "triggerFilters": {
    "itemResourceId": "",
    "visibility": "shown"
  }
}
```

Related: [variable.trigger.streamlabs_scene_item_visibility.scene](#variable.trigger.streamlabs_scene_item_visibility.scene), [variable.trigger.streamlabs_scene_item_visibility.source](#variable.trigger.streamlabs_scene_item_visibility.source), [variable.trigger.streamlabs_scene_item_visibility.visibility](#variable.trigger.streamlabs_scene_item_visibility.visibility), [variable.trigger.streamlabs_scene_item_visibility.previousVisibility](#variable.trigger.streamlabs_scene_item_visibility.previousVisibility), [variable.trigger.streamlabs_scene_item_visibility.platform](#variable.trigger.streamlabs_scene_item_visibility.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_item_visibility`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.streamlabs_scene_item_visibility`.

<a id="variable.trigger.streamlabs_scene_item_visibility.scene"></a>

## {scene}

New active scene name.

ID: `variable.trigger.streamlabs_scene_item_visibility.scene`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{scene}",
  "canonicalKey": "scene",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_item_visibility",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact item resource ID if selected, otherwise any identified item. Visibility defaults shown. This is an instance event, not linked-source fanout."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{scene}
```

Related: [trigger.streamlabs_scene_item_visibility](#trigger.streamlabs_scene_item_visibility)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_item_visibility.extract`.

<a id="variable.trigger.streamlabs_scene_item_visibility.source"></a>

## {source}

Affected Streamlabs source name.

ID: `variable.trigger.streamlabs_scene_item_visibility.source`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{source}",
  "canonicalKey": "source",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_item_visibility",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact item resource ID if selected, otherwise any identified item. Visibility defaults shown. This is an instance event, not linked-source fanout."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{source}
```

Related: [trigger.streamlabs_scene_item_visibility](#trigger.streamlabs_scene_item_visibility)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_item_visibility.extract`.

<a id="variable.trigger.streamlabs_scene_item_visibility.visibility"></a>

## {visibility}

New scene-item visibility.

ID: `variable.trigger.streamlabs_scene_item_visibility.visibility`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{visibility}",
  "canonicalKey": "visibility",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_item_visibility",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact item resource ID if selected, otherwise any identified item. Visibility defaults shown. This is an instance event, not linked-source fanout."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{visibility}
```

Related: [trigger.streamlabs_scene_item_visibility](#trigger.streamlabs_scene_item_visibility)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_item_visibility.extract`.

<a id="variable.trigger.streamlabs_scene_item_visibility.previousVisibility"></a>

## {previousVisibility}

Previous scene-item visibility.

ID: `variable.trigger.streamlabs_scene_item_visibility.previousVisibility`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{previousVisibility}",
  "canonicalKey": "previousVisibility",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_item_visibility",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact item resource ID if selected, otherwise any identified item. Visibility defaults shown. This is an instance event, not linked-source fanout."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{previousVisibility}
```

Related: [trigger.streamlabs_scene_item_visibility](#trigger.streamlabs_scene_item_visibility)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_item_visibility.extract`.

<a id="variable.trigger.streamlabs_scene_item_visibility.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.streamlabs_scene_item_visibility.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.streamlabs_scene_item_visibility",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "streamlabs",
  "behavior": "Exact item resource ID if selected, otherwise any identified item. Visibility defaults shown. This is an instance event, not linked-source fanout."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.streamlabs_scene_item_visibility](#trigger.streamlabs_scene_item_visibility)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_scene_item_visibility.extract`.

<a id="trigger.streamlabs_source_mute"></a>

## Streamlabs Desktop source mute change

Fires when an identified Streamlabs source is muted or unmuted. Leave the source blank for any identified source.

ID: `trigger.streamlabs_source_mute`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Broadcast software & installed apps.
2. Choose Trigger event: Streamlabs Desktop source mute change.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "streamlabs"
    ]
  },
  "behavior": "Exact source ID if selected, otherwise any identified audio source. State defaults muted.",
  "filters": [
    {
      "key": "sourceId",
      "type": "streamlabs_audio_source_dropdown",
      "label": "Audio source (blank = any)"
    },
    {
      "key": "muteState",
      "type": "select",
      "label": "When",
      "default": "muted",
      "options": [
        {
          "value": "muted",
          "label": "Muted"
        },
        {
          "value": "unmuted",
          "label": "Unmuted"
        }
      ]
    }
  ],
  "variableIds": [
    "variable.trigger.streamlabs_source_mute.source",
    "variable.trigger.streamlabs_source_mute.muteState",
    "variable.trigger.streamlabs_source_mute.previousMuteState",
    "variable.trigger.streamlabs_source_mute.platform"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Broadcast software & installed apps.",
      "Choose Trigger event: Streamlabs Desktop source mute change.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "streamlabs_source_mute",
  "triggerPlatform": "streamlabs",
  "triggerFilters": {
    "sourceId": "",
    "muteState": "muted"
  }
}
```

Related: [variable.trigger.streamlabs_source_mute.source](#variable.trigger.streamlabs_source_mute.source), [variable.trigger.streamlabs_source_mute.muteState](#variable.trigger.streamlabs_source_mute.muteState), [variable.trigger.streamlabs_source_mute.previousMuteState](#variable.trigger.streamlabs_source_mute.previousMuteState), [variable.trigger.streamlabs_source_mute.platform](#variable.trigger.streamlabs_source_mute.platform), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_source_mute`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.streamlabs_source_mute`.

<a id="variable.trigger.streamlabs_source_mute.source"></a>

## {source}

Affected Streamlabs source name.

ID: `variable.trigger.streamlabs_source_mute.source`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{source}",
  "canonicalKey": "source",
  "aliases": [],
  "producer": "trigger.streamlabs_source_mute",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact source ID if selected, otherwise any identified audio source. State defaults muted."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{source}
```

Related: [trigger.streamlabs_source_mute](#trigger.streamlabs_source_mute)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_source_mute.extract`.

<a id="variable.trigger.streamlabs_source_mute.muteState"></a>

## {muteState}

New source mute state.

ID: `variable.trigger.streamlabs_source_mute.muteState`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{muteState}",
  "canonicalKey": "muteState",
  "aliases": [],
  "producer": "trigger.streamlabs_source_mute",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact source ID if selected, otherwise any identified audio source. State defaults muted."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{muteState}
```

Related: [trigger.streamlabs_source_mute](#trigger.streamlabs_source_mute)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_source_mute.extract`.

<a id="variable.trigger.streamlabs_source_mute.previousMuteState"></a>

## {previousMuteState}

Previous source mute state.

ID: `variable.trigger.streamlabs_source_mute.previousMuteState`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{previousMuteState}",
  "canonicalKey": "previousMuteState",
  "aliases": [],
  "producer": "trigger.streamlabs_source_mute",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Exact source ID if selected, otherwise any identified audio source. State defaults muted."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{previousMuteState}
```

Related: [trigger.streamlabs_source_mute](#trigger.streamlabs_source_mute)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_source_mute.extract`.

<a id="variable.trigger.streamlabs_source_mute.platform"></a>

## {platform}

Originating provider, including obs/streamlabs for local events; not necessarily a chat destination.

ID: `variable.trigger.streamlabs_source_mute.platform`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{platform}",
  "canonicalKey": "platform",
  "aliases": [],
  "producer": "trigger.streamlabs_source_mute",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "streamlabs",
  "behavior": "Exact source ID if selected, otherwise any identified audio source. State defaults muted."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{platform}
```

Related: [trigger.streamlabs_source_mute](#trigger.streamlabs_source_mute)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.streamlabs_source_mute.extract`.

<a id="trigger.chat_contains"></a>

## Chat message contains / equals

Fires when a chat message matches a keyword, pattern, or exact phrase.

ID: `trigger.chat_contains`. Status: **supported**. Contexts: automation.

Requirements: Connected supported event provider; enabled automation and matching filters.

- Minimum authority is exposed in the editor but is not enforced by this matcher.

### Configure in the app

Open: Bot > Automations > + New > When


1. Choose Trigger category: Chat & viewers.
2. Choose Trigger event: Chat message contains / equals.
3. Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.
4. Open Do, add actions, then Create Automation or Save Changes.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Connected supported event provider; enabled automation and matching filters.",
    "inboundProviders": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "behavior": "Nonempty pattern required. Equals compares trimmed text case-insensitively. Contains treats ordinary text literally; /pattern/flags uses JavaScript regex, invalid regex never matches. The authority field is displayed but match() does not enforce it; do not rely on this filter as an access-control gate.",
  "filters": [
    {
      "key": "pattern",
      "type": "text",
      "label": "Keyword or regex (wrap in /.../ for regex)",
      "placeholder": "hello|hi there"
    },
    {
      "key": "matchMode",
      "type": "select",
      "label": "Match mode",
      "options": [
        {
          "value": "contains",
          "label": "Contains (default)"
        },
        {
          "value": "equals",
          "label": "Equals (exact match)"
        }
      ]
    },
    {
      "key": "authority",
      "type": "select",
      "label": "Minimum authority",
      "options": [
        {
          "value": "anyone",
          "label": "Anyone"
        },
        {
          "value": "subscriber",
          "label": "Subscriber+"
        },
        {
          "value": "moderator",
          "label": "Moderator+"
        },
        {
          "value": "broadcaster",
          "label": "Broadcaster only"
        }
      ]
    }
  ],
  "variableIds": [
    "variable.trigger.chat_contains.user",
    "variable.trigger.chat_contains.username",
    "variable.trigger.chat_contains.message",
    "variable.trigger.chat_contains.match"
  ],
  "cooldown": "Automation cooldownSec defaults 0; keyed by automation ID and event platform; held in memory until restart.",
  "delay": "No additional trigger delay.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New",
      "When"
    ],
    "initialFields": [],
    "steps": [
      "Choose Trigger category: Chat & viewers.",
      "Choose Trigger event: Chat message contains / equals.",
      "Fill the Trigger filters below, set Cooldown (seconds), then open Where and choose a supported Platform.",
      "Open Do, add actions, then Create Automation or Save Changes."
    ]
  }
}
```

### Example

Trigger selection and filter defaults; supply a real target/pattern when required.

```json
{
  "triggerType": "chat_contains",
  "triggerPlatform": "all",
  "triggerFilters": {
    "pattern": "",
    "matchMode": "contains",
    "authority": "anyone"
  }
}
```

Related: [variable.trigger.chat_contains.user](#variable.trigger.chat_contains.user), [variable.trigger.chat_contains.username](#variable.trigger.chat_contains.username), [variable.trigger.chat_contains.message](#variable.trigger.chat_contains.message), [variable.trigger.chat_contains.match](#variable.trigger.chat_contains.match), [context.automation](#context.automation)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.chat_contains`; `src/features/automation-provider-capabilities.js` — `AUTOMATION_TRIGGER_PLATFORMS.chat_contains`.

<a id="variable.trigger.chat_contains.user"></a>

## {user}

Viewer display name/username supplied by this event; outgoing raids use destination identity.

ID: `variable.trigger.chat_contains.user`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "trigger.chat_contains",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Nonempty pattern required. Equals compares trimmed text case-insensitively. Contains treats ordinary text literally; /pattern/flags uses JavaScript regex, invalid regex never matches. The authority field is displayed but match() does not enforce it; do not rely on this filter as an access-control gate."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{user}
```

Related: [trigger.chat_contains](#trigger.chat_contains)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.chat_contains.extract`.

<a id="variable.trigger.chat_contains.username"></a>

## {username}

Normalized or provider-supplied event username, not an arbitrary command argument.

ID: `variable.trigger.chat_contains.username`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{username}",
  "canonicalKey": "username",
  "aliases": [],
  "producer": "trigger.chat_contains",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": null,
  "behavior": "Nonempty pattern required. Equals compares trimmed text case-insensitively. Contains treats ordinary text literally; /pattern/flags uses JavaScript regex, invalid regex never matches. The authority field is displayed but match() does not enforce it; do not rely on this filter as an access-control gate."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{username}
```

Related: [trigger.chat_contains](#trigger.chat_contains)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.chat_contains.extract`.

<a id="variable.trigger.chat_contains.message"></a>

## {message}

Event text; reward redemptions use viewer input, TikTok questions use the question text.

ID: `variable.trigger.chat_contains.message`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{message}",
  "canonicalKey": "message",
  "aliases": [],
  "producer": "trigger.chat_contains",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Nonempty pattern required. Equals compares trimmed text case-insensitively. Contains treats ordinary text literally; /pattern/flags uses JavaScript regex, invalid regex never matches. The authority field is displayed but match() does not enforce it; do not rely on this filter as an access-control gate."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{message}
```

Related: [trigger.chat_contains](#trigger.chat_contains)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.chat_contains.extract`.

<a id="variable.trigger.chat_contains.match"></a>

## {match}

Matched literal/regex substring; equals mode uses the complete trimmed matching text.

ID: `variable.trigger.chat_contains.match`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{match}",
  "canonicalKey": "match",
  "aliases": [],
  "producer": "trigger.chat_contains",
  "lifetime": "Current action sequence.",
  "resolution": "Produced by event extraction. Missing provider values use the extractor fallback.",
  "emptyEventFallback": "",
  "behavior": "Nonempty pattern required. Equals compares trimmed text case-insensitively. Contains treats ordinary text literally; /pattern/flags uses JavaScript regex, invalid regex never matches. The authority field is displayed but match() does not enforce it; do not rely on this filter as an access-control gate."
}
```

### Example

Only use with this trigger and a field that supports variables.

```text
{match}
```

Related: [trigger.chat_contains](#trigger.chat_contains)

Source: `src/features/automations.js` — `TRIGGER_REGISTRY.chat_contains.extract`.

<a id="variable.global.user"></a>

## {user}

Command sender display name

ID: `variable.global.user`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "user",
  "aliases": [
    "sender"
  ],
  "category": "User",
  "description": "Command sender display name",
  "canonicalKey": "user",
  "syntax": "{user}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Command sender display name",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{user}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.user`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.name"></a>

## {sender.name}

Command sender normalized username

ID: `variable.global.sender.name`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "sender.name",
  "category": "User",
  "description": "Command sender normalized username",
  "canonicalKey": "sender.name",
  "syntax": "{sender.name}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Command sender normalized username",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.name}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.name`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.id"></a>

## {sender.id}

Platform user ID when supplied by chat

ID: `variable.global.sender.id`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Depends on the incoming platform event

### Contract

```json
{
  "availability": "runtime",
  "key": "sender.id",
  "category": "User",
  "description": "Platform user ID when supplied by chat",
  "availabilityNote": "Depends on the incoming platform event",
  "canonicalKey": "sender.id",
  "syntax": "{sender.id}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Platform user ID when supplied by chat",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.id}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.id`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.platform.userUrl"></a>

## {platform.userUrl}

Profile URL for the command sender on the current platform

ID: `variable.global.platform.userUrl`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: YouTube prefers channel ID when supplied; otherwise uses the visible username as a handle.

### Contract

```json
{
  "availability": "runtime",
  "key": "platform.userUrl",
  "aliases": [
    "sender.url",
    "user.url",
    "profile.url"
  ],
  "category": "User",
  "description": "Profile URL for the command sender on the current platform",
  "availabilityNote": "YouTube prefers channel ID when supplied; otherwise uses the visible username as a handle.",
  "platforms": [
    "twitch",
    "youtube",
    "kick",
    "tiktok"
  ],
  "canonicalKey": "platform.userUrl",
  "syntax": "{platform.userUrl}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Profile URL for the command sender on the current platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{platform.userUrl}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.platform.userUrl`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.points"></a>

## {sender.points}

Command sender current loyalty currency

ID: `variable.global.sender.points`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "sender.points",
  "aliases": [
    "user.points"
  ],
  "category": "Loyalty",
  "description": "Command sender current loyalty currency",
  "canonicalKey": "sender.points",
  "syntax": "{sender.points}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Command sender current loyalty currency",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.points}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.points`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.pointsRank"></a>

## {sender.pointsRank}

Command sender loyalty rank

ID: `variable.global.sender.pointsRank`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "sender.pointsRank",
  "aliases": [
    "user.pointsRank"
  ],
  "category": "Loyalty",
  "description": "Command sender loyalty rank",
  "canonicalKey": "sender.pointsRank",
  "syntax": "{sender.pointsRank}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Command sender loyalty rank",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.pointsRank}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.pointsRank`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target"></a>

## {target}

First argument as a username, falling back to sender

ID: `variable.global.target`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target",
  "category": "User",
  "description": "First argument as a username, falling back to sender",
  "canonicalKey": "target",
  "syntax": "{target}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "First argument as a username, falling back to sender",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.name"></a>

## {target.name}

Target normalized username

ID: `variable.global.target.name`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target.name",
  "category": "User",
  "description": "Target normalized username",
  "canonicalKey": "target.name",
  "syntax": "{target.name}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Target normalized username",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.name}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.name`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.url"></a>

## {target.url}

Profile URL for the target username on the current platform

ID: `variable.global.target.url`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target.url",
  "category": "User",
  "description": "Profile URL for the target username on the current platform",
  "platforms": [
    "twitch",
    "youtube",
    "kick",
    "tiktok"
  ],
  "canonicalKey": "target.url",
  "syntax": "{target.url}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Profile URL for the target username on the current platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.url}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.url`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.game"></a>

## {target.game}

Target channel category/game on the current platform

ID: `variable.global.target.game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.

### Contract

```json
{
  "availability": "runtime",
  "key": "target.game",
  "aliases": [
    "target.category"
  ],
  "category": "User",
  "description": "Target channel category/game on the current platform",
  "availabilityNote": "Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.",
  "platforms": [
    "twitch",
    "kick"
  ],
  "canonicalKey": "target.game",
  "syntax": "{target.game}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Target channel category/game on the current platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.game}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.game`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.title"></a>

## {target.title}

Target channel title on the current platform

ID: `variable.global.target.title`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.

### Contract

```json
{
  "availability": "runtime",
  "key": "target.title",
  "aliases": [
    "target.stream_title"
  ],
  "category": "User",
  "description": "Target channel title on the current platform",
  "availabilityNote": "Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.",
  "platforms": [
    "twitch",
    "kick"
  ],
  "canonicalKey": "target.title",
  "syntax": "{target.title}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Target channel title on the current platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.title}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.title`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.points"></a>

## {target.points}

Target current loyalty currency on this platform

ID: `variable.global.target.points`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target.points",
  "category": "Loyalty",
  "description": "Target current loyalty currency on this platform",
  "canonicalKey": "target.points",
  "syntax": "{target.points}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Target current loyalty currency on this platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.points}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.points`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.pointsRank"></a>

## {target.pointsRank}

Target loyalty rank

ID: `variable.global.target.pointsRank`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target.pointsRank",
  "category": "Loyalty",
  "description": "Target loyalty rank",
  "canonicalKey": "target.pointsRank",
  "syntax": "{target.pointsRank}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Target loyalty rank",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.pointsRank}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.pointsRank`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.message"></a>

## {message}

All text entered after the command

ID: `variable.global.message`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "message",
  "aliases": [
    "args"
  ],
  "category": "Command",
  "description": "All text entered after the command",
  "canonicalKey": "message",
  "syntax": "{message}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "All text entered after the command",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{message}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.message`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.messageSuffix"></a>

## {messageSuffix}

Optional command text wrapped for a natural reply

ID: `variable.global.messageSuffix`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "messageSuffix",
  "category": "Command",
  "description": "Optional command text wrapped for a natural reply",
  "canonicalKey": "messageSuffix",
  "syntax": "{messageSuffix}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Optional command text wrapped for a natural reply",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{messageSuffix}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.messageSuffix`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.arg"></a>

## {arg:1}

One command argument, numbered from 1

ID: `variable.global.arg`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "arg",
  "syntax": "{arg:1}",
  "category": "Command",
  "description": "One command argument, numbered from 1",
  "fallback": "",
  "canonicalKey": "arg",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "One-based argument index; missing/invalid index uses 1; missing argument is empty.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{arg:1}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.arg`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.command"></a>

## {command}

Command name without its prefix

ID: `variable.global.command`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "command",
  "category": "Command",
  "description": "Command name without its prefix",
  "canonicalKey": "command",
  "syntax": "{command}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Command name without its prefix",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{command}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.command`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.messageId"></a>

## {messageId}

Triggering platform message ID when available

ID: `variable.global.messageId`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Depends on the incoming platform event

### Contract

```json
{
  "availability": "runtime",
  "key": "messageId",
  "category": "Command",
  "description": "Triggering platform message ID when available",
  "availabilityNote": "Depends on the incoming platform event",
  "canonicalKey": "messageId",
  "syntax": "{messageId}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Triggering platform message ID when available",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{messageId}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.messageId`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.platform"></a>

## {platform}

Platform where the command was used

ID: `variable.global.platform`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "platform",
  "category": "Channel",
  "description": "Platform where the command was used",
  "canonicalKey": "platform",
  "syntax": "{platform}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Platform where the command was used",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{platform}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.platform`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.role"></a>

## {role}

Viewer highest normalized authority role

ID: `variable.global.role`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "role",
  "category": "Authority",
  "description": "Viewer highest normalized authority role",
  "canonicalKey": "role",
  "syntax": "{role}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Viewer highest normalized authority role",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{role}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.role`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.roles"></a>

## {roles}

All normalized viewer roles, comma-separated

ID: `variable.global.roles`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "roles",
  "category": "Authority",
  "description": "All normalized viewer roles, comma-separated",
  "canonicalKey": "roles",
  "syntax": "{roles}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "All normalized viewer roles, comma-separated",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{roles}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.roles`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.authorityLevel"></a>

## {authorityLevel}

Normalized numeric authority level

ID: `variable.global.authorityLevel`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "authorityLevel",
  "category": "Authority",
  "description": "Normalized numeric authority level",
  "canonicalKey": "authorityLevel",
  "syntax": "{authorityLevel}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Normalized numeric authority level",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{authorityLevel}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.authorityLevel`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.pointsName"></a>

## {pointsName}

Configured loyalty currency name

ID: `variable.global.pointsName`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "pointsName",
  "category": "Loyalty",
  "description": "Configured loyalty currency name",
  "canonicalKey": "pointsName",
  "syntax": "{pointsName}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Configured loyalty currency name",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{pointsName}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.pointsName`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.counter"></a>

## {counter:deaths}

Read a platform-specific counter, then fall back to global

ID: `variable.global.counter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "counter",
  "syntax": "{counter:deaths}",
  "category": "Counters",
  "description": "Read a platform-specific counter, then fall back to global",
  "fallback": "0",
  "canonicalKey": "counter",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Arguments: optional global/platform scope, then counter name. Auto scope checks platform then global. Missing value is 0.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{counter:deaths}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.counter`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.usercounter"></a>

## {usercounter:Check In}

Read the command sender value inside a user counter category

ID: `variable.global.usercounter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "usercounter",
  "syntax": "{usercounter:Check In}",
  "category": "Counters",
  "description": "Read the command sender value inside a user counter category",
  "fallback": "0",
  "canonicalKey": "usercounter",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Category name may contain spaces/colons. Reads sender value, missing/invalid category returns 0.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{usercounter:Check In}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.usercounter`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.usercounter"></a>

## {target.usercounter:Check In}

Read the target viewer value inside a user counter category

ID: `variable.global.target.usercounter`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target.usercounter",
  "syntax": "{target.usercounter:Check In}",
  "category": "Counters",
  "description": "Read the target viewer value inside a user counter category",
  "fallback": "0",
  "canonicalKey": "target.usercounter",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Category name may contain spaces/colons. Reads target value; missing/invalid category returns 0.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.usercounter:Check In}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.usercounter`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel"></a>

## {channel}

Connected channel username

ID: `variable.global.channel`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "channel",
  "category": "Channel",
  "description": "Connected channel username",
  "canonicalKey": "channel",
  "syntax": "{channel}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Connected channel username",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.displayName"></a>

## {channel.displayName}

Connected channel display name

ID: `variable.global.channel.displayName`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "channel.displayName",
  "category": "Channel",
  "description": "Connected channel display name",
  "canonicalKey": "channel.displayName",
  "syntax": "{channel.displayName}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Connected channel display name",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.displayName}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.displayName`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.id"></a>

## {channel.id}

Platform channel ID

ID: `variable.global.channel.id`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "channel.id",
  "category": "Channel",
  "description": "Platform channel ID",
  "canonicalKey": "channel.id",
  "syntax": "{channel.id}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Platform channel ID",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.id}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.id`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.platform"></a>

## {channel.platform}

Connected platform name

ID: `variable.global.channel.platform`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "channel.platform",
  "category": "Channel",
  "description": "Connected platform name",
  "canonicalKey": "channel.platform",
  "syntax": "{channel.platform}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Connected platform name",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.platform}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.platform`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.isLive"></a>

## {channel.isLive}

Whether the current platform is live

ID: `variable.global.channel.isLive`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "channel.isLive",
  "category": "Stream",
  "description": "Whether the current platform is live",
  "canonicalKey": "channel.isLive",
  "syntax": "{channel.isLive}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Whether the current platform is live",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.isLive}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.isLive`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.chatters"></a>

## {channel.chatters}

Chatters observed in the current session

ID: `variable.global.channel.chatters`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "channel.chatters",
  "category": "Stream",
  "description": "Chatters observed in the current session",
  "canonicalKey": "channel.chatters",
  "syntax": "{channel.chatters}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Chatters observed in the current session",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.chatters}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.chatters`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.viewers"></a>

## {channel.viewers}

Current viewer count when exposed by the platform

ID: `variable.global.channel.viewers`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Available while the platform API exposes live viewer data

### Contract

```json
{
  "availability": "runtime",
  "key": "channel.viewers",
  "category": "Stream",
  "description": "Current viewer count when exposed by the platform",
  "availabilityNote": "Available while the platform API exposes live viewer data",
  "canonicalKey": "channel.viewers",
  "syntax": "{channel.viewers}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current viewer count when exposed by the platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.viewers}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.viewers`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.tiktok.viewerCount"></a>

## {tiktok.viewerCount}

Current TikTok LIVE viewer count

ID: `variable.global.tiktok.viewerCount`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": "runtime",
  "key": "tiktok.viewerCount",
  "category": "Stream",
  "description": "Current TikTok LIVE viewer count",
  "platforms": [
    "tiktok"
  ],
  "canonicalKey": "tiktok.viewerCount",
  "syntax": "{tiktok.viewerCount}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current TikTok LIVE viewer count",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{tiktok.viewerCount}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.tiktok.viewerCount`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.tiktok.totalLikes"></a>

## {tiktok.totalLikes}

Current TikTok LIVE total likes

ID: `variable.global.tiktok.totalLikes`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": "runtime",
  "key": "tiktok.totalLikes",
  "category": "Stream",
  "description": "Current TikTok LIVE total likes",
  "platforms": [
    "tiktok"
  ],
  "canonicalKey": "tiktok.totalLikes",
  "syntax": "{tiktok.totalLikes}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current TikTok LIVE total likes",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{tiktok.totalLikes}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.tiktok.totalLikes`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.tiktok.roomId"></a>

## {tiktok.roomId}

Current TikTok LIVE room identifier

ID: `variable.global.tiktok.roomId`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": "runtime",
  "key": "tiktok.roomId",
  "category": "Stream",
  "description": "Current TikTok LIVE room identifier",
  "platforms": [
    "tiktok"
  ],
  "canonicalKey": "tiktok.roomId",
  "syntax": "{tiktok.roomId}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current TikTok LIVE room identifier",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{tiktok.roomId}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.tiktok.roomId`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.tiktok.goalProgress"></a>

## {tiktok.goalProgress}

Current TikTok LIVE goal progress

ID: `variable.global.tiktok.goalProgress`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": "runtime",
  "key": "tiktok.goalProgress",
  "category": "Stream",
  "description": "Current TikTok LIVE goal progress",
  "platforms": [
    "tiktok"
  ],
  "canonicalKey": "tiktok.goalProgress",
  "syntax": "{tiktok.goalProgress}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current TikTok LIVE goal progress",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{tiktok.goalProgress}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.tiktok.goalProgress`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.tiktok.goalTarget"></a>

## {tiktok.goalTarget}

Current TikTok LIVE goal target

ID: `variable.global.tiktok.goalTarget`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": "runtime",
  "key": "tiktok.goalTarget",
  "category": "Stream",
  "description": "Current TikTok LIVE goal target",
  "platforms": [
    "tiktok"
  ],
  "canonicalKey": "tiktok.goalTarget",
  "syntax": "{tiktok.goalTarget}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current TikTok LIVE goal target",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{tiktok.goalTarget}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.tiktok.goalTarget`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.title"></a>

## {channel.title}

Current stream title

ID: `variable.global.channel.title`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Requires accessible channel or live-stream data

### Contract

```json
{
  "availability": "runtime",
  "key": "channel.title",
  "aliases": [
    "title"
  ],
  "category": "Stream",
  "description": "Current stream title",
  "availabilityNote": "Requires accessible channel or live-stream data",
  "canonicalKey": "channel.title",
  "syntax": "{channel.title}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current stream title",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.title}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.title`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.category"></a>

## {channel.category}

Current stream category or game

ID: `variable.global.channel.category`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Requires accessible channel or live-stream data

### Contract

```json
{
  "availability": "runtime",
  "key": "channel.category",
  "aliases": [
    "game"
  ],
  "category": "Stream",
  "description": "Current stream category or game",
  "availabilityNote": "Requires accessible channel or live-stream data",
  "canonicalKey": "channel.category",
  "syntax": "{channel.category}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current stream category or game",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.category}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.category`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.channel.uptime"></a>

## {channel.uptime}

Current live duration

ID: `variable.global.channel.uptime`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Available when a live start time is known

### Contract

```json
{
  "availability": "runtime",
  "key": "channel.uptime",
  "aliases": [
    "uptime"
  ],
  "category": "Stream",
  "description": "Current live duration",
  "availabilityNote": "Available when a live start time is known",
  "canonicalKey": "channel.uptime",
  "syntax": "{channel.uptime}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Current live duration",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{channel.uptime}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.channel.uptime`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.game"></a>

## {sender.game}

The sender's channel category/game on the current platform

ID: `variable.global.sender.game`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.

### Contract

```json
{
  "availability": "runtime",
  "key": "sender.game",
  "aliases": [
    "sender.category"
  ],
  "category": "User",
  "description": "The sender's channel category/game on the current platform",
  "availabilityNote": "Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.",
  "platforms": [
    "twitch",
    "kick"
  ],
  "canonicalKey": "sender.game",
  "syntax": "{sender.game}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "The sender's channel category/game on the current platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.game}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.game`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.stream_title"></a>

## {sender.stream_title}

The sender's channel title on the current platform

ID: `variable.global.sender.stream_title`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.

### Contract

```json
{
  "availability": "runtime",
  "key": "sender.stream_title",
  "aliases": [
    "sender.title"
  ],
  "category": "User",
  "description": "The sender's channel title on the current platform",
  "availabilityNote": "Twitch and Kick only. Returns Unavailable when unsupported or when channel metadata is unavailable.",
  "platforms": [
    "twitch",
    "kick"
  ],
  "canonicalKey": "sender.stream_title",
  "syntax": "{sender.stream_title}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "The sender's channel title on the current platform",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.stream_title}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.stream_title`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.time"></a>

## {time:America/Los_Angeles}

Current time, optionally in an IANA timezone

ID: `variable.global.time`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "time",
  "syntax": "{time:America/Los_Angeles}",
  "category": "Time",
  "description": "Current time, optionally in an IANA timezone",
  "canonicalKey": "time",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Optional IANA timezone. Invalid timezone falls back to Unavailable; display follows host locale.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{time:America/Los_Angeles}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.time`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.date"></a>

## {date:America/Los_Angeles}

Current date, optionally in an IANA timezone

ID: `variable.global.date`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "date",
  "syntax": "{date:America/Los_Angeles}",
  "category": "Time",
  "description": "Current date, optionally in an IANA timezone",
  "canonicalKey": "date",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Optional IANA timezone. Invalid timezone falls back to Unavailable; display follows host locale.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{date:America/Los_Angeles}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.date`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.countdown"></a>

## {countdown:2026-12-31 23:59}

Time remaining until a target date/time (YYYY-MM-DD or YYYY-MM-DD HH:MM)

ID: `variable.global.countdown`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "countdown",
  "syntax": "{countdown:2026-12-31 23:59}",
  "category": "Time",
  "description": "Time remaining until a target date/time (YYYY-MM-DD or YYYY-MM-DD HH:MM)",
  "canonicalKey": "countdown",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Rejoin colon arguments as a date/time. Invalid date returns [invalid date]; elapsed returns Event has passed!; timezone-less input follows host Date parsing.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{countdown:2026-12-31 23:59}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.countdown`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.random"></a>

## {random:1:100}

Random whole number in an inclusive range

ID: `variable.global.random`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "random",
  "syntax": "{random:1:100}",
  "category": "Utility",
  "description": "Random whole number in an inclusive range",
  "canonicalKey": "random",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Inclusive integer min/max, defaults 1/100. Reversed bounds swap; invalid or range over 1e9 falls back to Unavailable.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{random:1:100}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.random`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.pick"></a>

## {pick:red|green|blue}

Randomly select one pipe-separated choice

ID: `variable.global.pick`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "pick",
  "syntax": "{pick:red|green|blue}",
  "category": "Utility",
  "description": "Randomly select one pipe-separated choice",
  "canonicalKey": "pick",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Pipe-separated nonempty trimmed choices, first 50 only. Colon characters are rejoined; no choices falls back to Unavailable.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{pick:red|green|blue}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.pick`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.list"></a>

## {list:prizes}

Randomly select an entry from a named Data Manager list

ID: `variable.global.list`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: The named list must exist and contain at least one item

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "The named list must exist and contain at least one item",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "list",
  "syntax": "{list:prizes}",
  "category": "Utility",
  "description": "Randomly select an entry from a named Data Manager list",
  "availabilityNote": "The named list must exist and contain at least one item",
  "canonicalKey": "list",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Named Data Manager list must exist and contain items; selection is random.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{list:prizes}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.list`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.viewer.random"></a>

## {viewer.random:current}

Random eligible current-session viewer; use current, all, or a platform name

ID: `variable.global.viewer.random`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Uses Twitch live chatters and viewers observed this session on YouTube, Kick, and TikTok. Excludes SheevChat, broadcasters, Bot-tagged accounts, and opted-out viewers.

### Contract

```json
{
  "availability": "runtime",
  "key": "viewer.random",
  "syntax": "{viewer.random:current}",
  "category": "User",
  "description": "Random eligible current-session viewer; use current, all, or a platform name",
  "fallback": "",
  "availabilityNote": "Uses Twitch live chatters and viewers observed this session on YouTube, Kick, and TikTok. Excludes SheevChat, broadcasters, Bot-tagged accounts, and opted-out viewers.",
  "canonicalKey": "viewer.random",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Argument current (default), all or platform. Excludes broadcasters, bots, SheevChat and opted-out viewers; absence returns empty.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{viewer.random:current}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.viewer.random`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.repeat"></a>

## {repeat:3:Hello!}

Repeat text up to ten times

ID: `variable.global.repeat`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "repeat",
  "syntax": "{repeat:3:Hello!}",
  "category": "Utility",
  "description": "Repeat text up to ten times",
  "canonicalKey": "repeat",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Count clamps 0–10; remaining colon arguments form repeated text separated by spaces.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{repeat:3:Hello!}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.repeat`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.math"></a>

## {math:(10 + 5) * 2}

Safely evaluate basic arithmetic

ID: `variable.global.math`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "math",
  "syntax": "{math:(10 + 5) * 2}",
  "category": "Utility",
  "description": "Safely evaluate basic arithmetic",
  "canonicalKey": "math",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Basic + - * / % and parentheses, maximum 100 expression characters; division by zero/nonfinite/absolute result over 1e15 fails to Unavailable. No script execution.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{math:(10 + 5) * 2}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.math`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.sender.watchtime"></a>

## {sender.watchtime}

Command sender's total watchtime

ID: `variable.global.sender.watchtime`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "sender.watchtime",
  "aliases": [
    "watchtime",
    "user.watchtime"
  ],
  "category": "Loyalty",
  "description": "Command sender's total watchtime",
  "canonicalKey": "sender.watchtime",
  "syntax": "{sender.watchtime}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Command sender's total watchtime",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{sender.watchtime}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.sender.watchtime`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.target.watchtime"></a>

## {target.watchtime}

Target viewer's total watchtime

ID: `variable.global.target.watchtime`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "target.watchtime",
  "category": "Loyalty",
  "description": "Target viewer's total watchtime",
  "canonicalKey": "target.watchtime",
  "syntax": "{target.watchtime}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Target viewer's total watchtime",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{target.watchtime}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.target.watchtime`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.song"></a>

## {song}

Currently playing song title

ID: `variable.global.song`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Requires an active song or Spotify session

### Contract

```json
{
  "availability": "runtime",
  "key": "song",
  "aliases": [
    "song.title"
  ],
  "category": "Music",
  "description": "Currently playing song title",
  "availabilityNote": "Requires an active song or Spotify session",
  "canonicalKey": "song",
  "syntax": "{song}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Currently playing song title",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{song}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.song`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.song.artist"></a>

## {song.artist}

Currently playing song artist

ID: `variable.global.song.artist`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Requires an active song or Spotify session

### Contract

```json
{
  "availability": "runtime",
  "key": "song.artist",
  "aliases": [
    "artist"
  ],
  "category": "Music",
  "description": "Currently playing song artist",
  "availabilityNote": "Requires an active song or Spotify session",
  "canonicalKey": "song.artist",
  "syntax": "{song.artist}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Currently playing song artist",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{song.artist}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.song.artist`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.song.requester"></a>

## {song.requester}

Who requested the current song

ID: `variable.global.song.requester`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Only available for song requests (not Spotify direct)

### Contract

```json
{
  "availability": "runtime",
  "key": "song.requester",
  "aliases": [
    "requested_by"
  ],
  "category": "Music",
  "description": "Who requested the current song",
  "availabilityNote": "Only available for song requests (not Spotify direct)",
  "canonicalKey": "song.requester",
  "syntax": "{song.requester}",
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "Who requested the current song",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{song.requester}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.song.requester`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.quote"></a>

## {quote}

A random saved quote from Data Manager

ID: `variable.global.quote`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Requires at least one saved quote

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Requires at least one saved quote",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "quote",
  "category": "Utility",
  "description": "A random saved quote from Data Manager",
  "availabilityNote": "Requires at least one saved quote",
  "canonicalKey": "quote",
  "syntax": "{quote}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "A random saved quote from Data Manager",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{quote}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.quote`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="variable.global.quote.text"></a>

## {quote.text}

Random quote text only (no attribution)

ID: `variable.global.quote.text`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Values depend on the invocation context; timers and buttons do not have an incoming viewer.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Values depend on the invocation context; timers and buttons do not have an incoming viewer.",
    "providers": [
      "twitch",
      "youtube",
      "kick",
      "tiktok"
    ]
  },
  "key": "quote.text",
  "category": "Utility",
  "description": "Random quote text only (no attribution)",
  "canonicalKey": "quote.text",
  "syntax": "{quote.text}",
  "aliases": [],
  "producer": "Global command variable engine, resolved on demand.",
  "fallback": "Unavailable",
  "fallbackNote": "This fallback applies on null/error/timeout; a resolver may return its own 0, empty string or descriptive value instead.",
  "behavior": "A fresh independent random quote is selected on each resolution; do not assume it matches a separate {quote} token.",
  "lifetime": "Resolved for this template; data may be live, cached or persisted according to its provider."
}
```

### Example

A single variable expression; context and data prerequisites still apply.

```text
{quote.text}
```

Related: [routing.variables](#routing.variables)

Source: `server.js` — `COMMAND_VARIABLE_DEFINITIONS.quote.text`; `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="command.counter"></a>

## !counter

Read a named counter; automatic scope checks platform then global.

ID: `command.counter`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!counter <name> [global|platform]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Read a named counter; automatic scope checks platform then global.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!counter <name> [global|platform]
```

Source: `server.js` — `DEFAULT_COMMANDS.counter`.

<a id="command.count"></a>

## !count

Adjust/create a counter; moderator handling applies; missing scope is global.

ID: `command.count`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!count <name> [amount] [global|platform]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Adjust/create a counter; moderator handling applies; missing scope is global.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!count <name> [amount] [global|platform]
```

Source: `server.js` — `DEFAULT_COMMANDS.count`.

<a id="command.setcounter"></a>

## !setcounter

Set an exact counter value; moderator handling applies.

ID: `command.setcounter`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!setcounter <name> <value> [global|platform]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Set an exact counter value; moderator handling applies.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!setcounter <name> <value> [global|platform]
```

Source: `server.js` — `DEFAULT_COMMANDS.setcounter`.

<a id="command.resetcounter"></a>

## !resetcounter

Reset a counter; moderator handling applies.

ID: `command.resetcounter`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!resetcounter <name> [global|platform]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Reset a counter; moderator handling applies.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!resetcounter <name> [global|platform]
```

Source: `server.js` — `DEFAULT_COMMANDS.resetcounter`.

<a id="command.points"></a>

## !points

Read own or target balance.

ID: `command.points`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!points [username]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Read own or target balance.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!points [username]
```

Source: `server.js` — `DEFAULT_COMMANDS.points`.

<a id="command.rank"></a>

## !rank

Read own or target loyalty rank.

ID: `command.rank`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!rank [username]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Read own or target loyalty rank.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!rank [username]
```

Source: `server.js` — `DEFAULT_COMMANDS.rank`.

<a id="command.top"></a>

## !top

Show the loyalty leaderboard.

ID: `command.top`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!top",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Show the loyalty leaderboard.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!top
```

Source: `server.js` — `DEFAULT_COMMANDS.top`.

<a id="command.give"></a>

## !give

Transfer loyalty currency.

ID: `command.give`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!give <username> <amount>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Transfer loyalty currency.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!give <username> <amount>
```

Source: `server.js` — `DEFAULT_COMMANDS.give`.

<a id="command.bonus"></a>

## !bonus

Award currency; broadcaster, or moderator when allowModerators is enabled.

ID: `command.bonus`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!bonus <username> <amount>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "allowModerators": false,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Award currency; broadcaster, or moderator when allowModerators is enabled.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!bonus <username> <amount>
```

Source: `server.js` — `DEFAULT_COMMANDS.bonus`.

<a id="command.gamble"></a>

## !gamble

Bet currency using configured win chance.

ID: `command.gamble`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!gamble <amount>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "winChance": 50,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Bet currency using configured win chance.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!gamble <amount>
```

Source: `server.js` — `DEFAULT_COMMANDS.gamble`.

<a id="command.duel"></a>

## !duel

Challenge a viewer; acceptance expires after configured acceptSec.

ID: `command.duel`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!duel <username> <amount>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "acceptSec": 30
  },
  "behavior": "Challenge a viewer; acceptance expires after configured acceptSec.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!duel <username> <amount>
```

Source: `server.js` — `DEFAULT_COMMANDS.duel`.

<a id="command.accept"></a>

## !accept

Accept a pending duel.

ID: `command.accept`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!accept",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone"
  },
  "behavior": "Accept a pending duel.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!accept
```

Source: `server.js` — `DEFAULT_COMMANDS.accept`.

<a id="command.deny"></a>

## !deny

Decline a pending duel.

ID: `command.deny`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!deny",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone"
  },
  "behavior": "Decline a pending duel.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!deny
```

Source: `server.js` — `DEFAULT_COMMANDS.deny`.

<a id="command.lurk"></a>

## !lurk

Mark away and send the configured social reply.

ID: `command.lurk`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!lurk [message]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user} - thanks for the lurk! 🫡{messageSuffix}",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Mark away and send the configured social reply.",
  "aliases": [],
  "responseVariables": [
    "user",
    "messageSuffix"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!lurk [message]
```

Related: [variable.command.lurk.user](#variable.command.lurk.user), [variable.command.lurk.messageSuffix](#variable.command.lurk.messageSuffix)

Source: `server.js` — `DEFAULT_COMMANDS.lurk`.

<a id="variable.command.lurk.user"></a>

## {user} in !lurk

Response value in the lurk command handler's own template.

ID: `variable.command.lurk.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.lurk",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.lurk](#command.lurk)

Source: `server.js` — `DEFAULT_COMMANDS.lurk`.

<a id="variable.command.lurk.messageSuffix"></a>

## {messageSuffix} in !lurk

Response value in the lurk command handler's own template.

ID: `variable.command.lurk.messageSuffix`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{messageSuffix}",
  "canonicalKey": "messageSuffix",
  "aliases": [],
  "producer": "command.lurk",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{messageSuffix}
```

Related: [command.lurk](#command.lurk)

Source: `server.js` — `DEFAULT_COMMANDS.lurk`.

<a id="command.unlurk"></a>

## !unlurk

Return from lurking.

ID: `command.unlurk`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!unlurk",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user} - welcome back! 👋",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Return from lurking.",
  "aliases": [],
  "responseVariables": [
    "user"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!unlurk
```

Related: [variable.command.unlurk.user](#variable.command.unlurk.user)

Source: `server.js` — `DEFAULT_COMMANDS.unlurk`.

<a id="variable.command.unlurk.user"></a>

## {user} in !unlurk

Response value in the unlurk command handler's own template.

ID: `variable.command.unlurk.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.unlurk",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.unlurk](#command.unlurk)

Source: `server.js` — `DEFAULT_COMMANDS.unlurk`.

<a id="command.vieweroptout"></a>

## !vieweroptout

Exclude from random viewer selection; default scope is current platform; naming another viewer requires moderator authority.

ID: `command.vieweroptout`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!vieweroptout [all] [username]",
  "defaults": {
    "enabled": true,
    "aliases": [
      "randomvieweroptout"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 2,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Exclude from random viewer selection; default scope is current platform; naming another viewer requires moderator authority.",
  "aliases": [
    "randomvieweroptout"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!vieweroptout [all] [username]
```

Source: `server.js` — `DEFAULT_COMMANDS.vieweroptout`.

<a id="command.vieweroptin"></a>

## !vieweroptin

Rejoin random viewer selection; default scope is current platform; naming another viewer requires moderator authority.

ID: `command.vieweroptin`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!vieweroptin [all] [username]",
  "defaults": {
    "enabled": true,
    "aliases": [
      "randomvieweroptin"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 2,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Rejoin random viewer selection; default scope is current platform; naming another viewer requires moderator authority.",
  "aliases": [
    "randomvieweroptin"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!vieweroptin [all] [username]
```

Source: `server.js` — `DEFAULT_COMMANDS.vieweroptin`.

<a id="command.watchtime"></a>

## !watchtime

Show tracked total watchtime.

ID: `command.watchtime`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!watchtime [username]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Show tracked total watchtime.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!watchtime [username]
```

Source: `server.js` — `DEFAULT_COMMANDS.watchtime`.

<a id="command.cmdsearch"></a>

## !cmdsearch

Search commands eligible for the current viewer/platform.

ID: `command.cmdsearch`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!cmdsearch [search text]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 10,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Search commands eligible for the current viewer/platform.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!cmdsearch [search text]
```

Source: `server.js` — `DEFAULT_COMMANDS.cmdsearch`.

<a id="command.sheevchat"></a>

## !sheevchat

Hidden built-in application information command.

ID: `command.sheevchat`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!sheevchat",
  "defaults": {
    "enabled": true,
    "hidden": true,
    "aliases": [
      "sheevbot",
      "sheeveschat",
      "sheevesbot"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 300,
    "globalCooldownSec": 30,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Hidden built-in application information command.",
  "aliases": [
    "sheevbot",
    "sheeveschat",
    "sheevesbot"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!sheevchat
```

Source: `server.js` — `DEFAULT_COMMANDS.sheevchat`.

<a id="command.settitle"></a>

## !settitle

Update the current platform stream title; no supported TikTok API.

ID: `command.settitle`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!settitle <title>",
  "defaults": {
    "enabled": false,
    "aliases": [
      "st"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "responseTemplate": "Title set to: {title}",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Update the current platform stream title; no supported TikTok API.",
  "aliases": [
    "st"
  ],
  "responseVariables": [
    "title"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!settitle <title>
```

Related: [variable.command.settitle.title](#variable.command.settitle.title)

Source: `server.js` — `DEFAULT_COMMANDS.settitle`.

<a id="variable.command.settitle.title"></a>

## {title} in !settitle

Response value in the settitle command handler's own template.

ID: `variable.command.settitle.title`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "command.settitle",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{title}
```

Related: [command.settitle](#command.settitle)

Source: `server.js` — `DEFAULT_COMMANDS.settitle`.

<a id="command.setcategory"></a>

## !setcategory

Update current platform category/game; no supported TikTok API.

ID: `command.setcategory`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!setcategory <category>",
  "defaults": {
    "enabled": false,
    "aliases": [
      "setgame",
      "sc",
      "sg"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "responseTemplate": "Game set to: {game}",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Update current platform category/game; no supported TikTok API.",
  "aliases": [
    "setgame",
    "sc",
    "sg"
  ],
  "responseVariables": [
    "game"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!setcategory <category>
```

Related: [variable.command.setcategory.game](#variable.command.setcategory.game)

Source: `server.js` — `DEFAULT_COMMANDS.setcategory`.

<a id="variable.command.setcategory.game"></a>

## {game} in !setcategory

Response value in the setcategory command handler's own template.

ID: `variable.command.setcategory.game`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{game}",
  "canonicalKey": "game",
  "aliases": [],
  "producer": "command.setcategory",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{game}
```

Related: [command.setcategory](#command.setcategory)

Source: `server.js` — `DEFAULT_COMMANDS.setcategory`.

<a id="command.setcolor"></a>

## !setcolor

Set private SheevChat username display color.

ID: `command.setcolor`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!setcolor <name|hex|reset>",
  "defaults": {
    "enabled": true,
    "aliases": [
      "color",
      "namecolor"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 10,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Set private SheevChat username display color.",
  "aliases": [
    "color",
    "namecolor"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!setcolor <name|hex|reset>
```

Source: `server.js` — `DEFAULT_COMMANDS.setcolor`.

<a id="command.followage"></a>

## !followage

Following duration; Twitch only.

ID: `command.followage`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!followage [username]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user} has been following for {followage}.",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Following duration; Twitch only.",
  "aliases": [],
  "responseVariables": [
    "user",
    "followage"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!followage [username]
```

Related: [variable.command.followage.user](#variable.command.followage.user), [variable.command.followage.followage](#variable.command.followage.followage)

Source: `server.js` — `DEFAULT_COMMANDS.followage`.

<a id="variable.command.followage.user"></a>

## {user} in !followage

Response value in the followage command handler's own template.

ID: `variable.command.followage.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.followage",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.followage](#command.followage)

Source: `server.js` — `DEFAULT_COMMANDS.followage`.

<a id="variable.command.followage.followage"></a>

## {followage} in !followage

Response value in the followage command handler's own template.

ID: `variable.command.followage.followage`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{followage}",
  "canonicalKey": "followage",
  "aliases": [],
  "producer": "command.followage",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{followage}
```

Related: [command.followage](#command.followage)

Source: `server.js` — `DEFAULT_COMMANDS.followage`.

<a id="command.accountage"></a>

## !accountage

Account age; Twitch and Kick only.

ID: `command.accountage`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!accountage [username]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user}'s account was created {accountage} ago.",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Account age; Twitch and Kick only.",
  "aliases": [],
  "responseVariables": [
    "user",
    "accountage"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!accountage [username]
```

Related: [variable.command.accountage.user](#variable.command.accountage.user), [variable.command.accountage.accountage](#variable.command.accountage.accountage)

Source: `server.js` — `DEFAULT_COMMANDS.accountage`.

<a id="variable.command.accountage.user"></a>

## {user} in !accountage

Response value in the accountage command handler's own template.

ID: `variable.command.accountage.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.accountage",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.accountage](#command.accountage)

Source: `server.js` — `DEFAULT_COMMANDS.accountage`.

<a id="variable.command.accountage.accountage"></a>

## {accountage} in !accountage

Response value in the accountage command handler's own template.

ID: `variable.command.accountage.accountage`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{accountage}",
  "canonicalKey": "accountage",
  "aliases": [],
  "producer": "command.accountage",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{accountage}
```

Related: [command.accountage](#command.accountage)

Source: `server.js` — `DEFAULT_COMMANDS.accountage`.

<a id="command.birthday"></a>

## !birthday

Look up saved birthday/countdown.

ID: `command.birthday`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!birthday [username]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user}'s birthday is {birthday} - {birthdaycountdown}!",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Look up saved birthday/countdown.",
  "aliases": [],
  "responseVariables": [
    "user",
    "birthday",
    "birthdaycountdown"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!birthday [username]
```

Related: [variable.command.birthday.user](#variable.command.birthday.user), [variable.command.birthday.birthday](#variable.command.birthday.birthday), [variable.command.birthday.birthdaycountdown](#variable.command.birthday.birthdaycountdown)

Source: `server.js` — `DEFAULT_COMMANDS.birthday`.

<a id="variable.command.birthday.user"></a>

## {user} in !birthday

Response value in the birthday command handler's own template.

ID: `variable.command.birthday.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.birthday",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.birthday](#command.birthday)

Source: `server.js` — `DEFAULT_COMMANDS.birthday`.

<a id="variable.command.birthday.birthday"></a>

## {birthday} in !birthday

Response value in the birthday command handler's own template.

ID: `variable.command.birthday.birthday`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{birthday}",
  "canonicalKey": "birthday",
  "aliases": [],
  "producer": "command.birthday",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{birthday}
```

Related: [command.birthday](#command.birthday)

Source: `server.js` — `DEFAULT_COMMANDS.birthday`.

<a id="variable.command.birthday.birthdaycountdown"></a>

## {birthdaycountdown} in !birthday

Response value in the birthday command handler's own template.

ID: `variable.command.birthday.birthdaycountdown`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{birthdaycountdown}",
  "canonicalKey": "birthdaycountdown",
  "aliases": [],
  "producer": "command.birthday",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{birthdaycountdown}
```

Related: [command.birthday](#command.birthday)

Source: `server.js` — `DEFAULT_COMMANDS.birthday`.

<a id="command.setbirthday"></a>

## !setbirthday

Save birthday using configured MM-DD or DD-MM format, with optional year.

ID: `command.setbirthday`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!setbirthday <date>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 30,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user} - birthday set to {birthday}!",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Save birthday using configured MM-DD or DD-MM format, with optional year.",
  "aliases": [],
  "responseVariables": [
    "user",
    "birthday"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!setbirthday <date>
```

Related: [variable.command.setbirthday.user](#variable.command.setbirthday.user), [variable.command.setbirthday.birthday](#variable.command.setbirthday.birthday)

Source: `server.js` — `DEFAULT_COMMANDS.setbirthday`.

<a id="variable.command.setbirthday.user"></a>

## {user} in !setbirthday

Response value in the setbirthday command handler's own template.

ID: `variable.command.setbirthday.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.setbirthday",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.setbirthday](#command.setbirthday)

Source: `server.js` — `DEFAULT_COMMANDS.setbirthday`.

<a id="variable.command.setbirthday.birthday"></a>

## {birthday} in !setbirthday

Response value in the setbirthday command handler's own template.

ID: `variable.command.setbirthday.birthday`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{birthday}",
  "canonicalKey": "birthday",
  "aliases": [],
  "producer": "command.setbirthday",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{birthday}
```

Related: [command.setbirthday](#command.setbirthday)

Source: `server.js` — `DEFAULT_COMMANDS.setbirthday`.

<a id="command.deletebirthday"></a>

## !deletebirthday

Delete own birthday; another viewer requires moderator handling.

ID: `command.deletebirthday`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!deletebirthday [username]",
  "defaults": {
    "enabled": true,
    "aliases": [
      "bddelete",
      "removebirthday"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 10,
    "globalCooldownSec": 5,
    "responseTemplate": "@{user} - birthday removed.",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Delete own birthday; another viewer requires moderator handling.",
  "aliases": [
    "bddelete",
    "removebirthday"
  ],
  "responseVariables": [
    "user"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!deletebirthday [username]
```

Related: [variable.command.deletebirthday.user](#variable.command.deletebirthday.user)

Source: `server.js` — `DEFAULT_COMMANDS.deletebirthday`.

<a id="variable.command.deletebirthday.user"></a>

## {user} in !deletebirthday

Response value in the deletebirthday command handler's own template.

ID: `variable.command.deletebirthday.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.deletebirthday",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.deletebirthday](#command.deletebirthday)

Source: `server.js` — `DEFAULT_COMMANDS.deletebirthday`.

<a id="command.tarotcards"></a>

## !tarotcards

Draw Past / Present / Future tarot cards.

ID: `command.tarotcards`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!tarotcards",
  "defaults": {
    "enabled": true,
    "aliases": [
      "tarot",
      "cards"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 30,
    "globalCooldownSec": 10,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Draw Past / Present / Future tarot cards.",
  "aliases": [
    "tarot",
    "cards"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!tarotcards
```

Source: `server.js` — `DEFAULT_COMMANDS.tarotcards`.

<a id="command.playclip"></a>

## !playclip

Queue supported short-form video; disabled by default, with configured limits and eligible sources.

ID: `command.playclip`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!playclip <URL>",
  "defaults": {
    "enabled": false,
    "aliases": [
      "tt",
      "tw",
      "yt",
      "ki",
      "tiktok"
    ],
    "requiredAuthority": "vip",
    "cooldownSec": 30,
    "globalCooldownSec": 10,
    "maxClipSec": 30,
    "clipFormat": "obs",
    "clipSources": {
      "tiktok": true,
      "youtubeShorts": true,
      "instagramReels": true,
      "twitchClips": true,
      "kickClips": true
    },
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Queue supported short-form video; disabled by default, with configured limits and eligible sources.",
  "aliases": [
    "tt",
    "tw",
    "yt",
    "ki",
    "tiktok"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!playclip <URL>
```

Source: `server.js` — `DEFAULT_COMMANDS.playclip`.

<a id="command.clip"></a>

## !clip

Create a Twitch clip of previous 5–60 seconds; missing length requests 60.

ID: `command.clip`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!clip [seconds]",
  "defaults": {
    "enabled": false,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 30,
    "globalCooldownSec": 15,
    "autoPostClip": true,
    "platforms": {
      "twitch": true,
      "youtube": false,
      "kick": false,
      "tiktok": false
    }
  },
  "behavior": "Create a Twitch clip of previous 5–60 seconds; missing length requests 60.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!clip [seconds]
```

Source: `server.js` — `DEFAULT_COMMANDS.clip`.

<a id="command.weather"></a>

## !weather

Current weather for a place or coordinates.

ID: `command.weather`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!weather <place|latitude,longitude>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 15,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Current weather for a place or coordinates.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!weather <place|latitude,longitude>
```

Source: `server.js` — `DEFAULT_COMMANDS.weather`.

<a id="command.trivia"></a>

## !trivia

Start shared trivia; disabled by default.

ID: `command.trivia`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!trivia",
  "defaults": {
    "enabled": false,
    "aliases": [
      "quiz"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Start shared trivia; disabled by default.",
  "aliases": [
    "quiz"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!trivia
```

Source: `server.js` — `DEFAULT_COMMANDS.trivia`.

<a id="command.triviastop"></a>

## !triviastop

Stop shared trivia.

ID: `command.triviastop`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!triviastop",
  "defaults": {
    "enabled": false,
    "aliases": [],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "behavior": "Stop shared trivia.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!triviastop
```

Source: `server.js` — `DEFAULT_COMMANDS.triviastop`.

<a id="command.quote"></a>

## !quote

Random quote or lookup.

ID: `command.quote`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!quote [id|search text]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Random quote or lookup.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!quote [id|search text]
```

Source: `server.js` — `DEFAULT_COMMANDS.quote`.

<a id="command.quoteadd"></a>

## !quoteadd

Save a quote.

ID: `command.quoteadd`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!quoteadd <quote text>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Save a quote.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!quoteadd <quote text>
```

Source: `server.js` — `DEFAULT_COMMANDS.quoteadd`.

<a id="command.quoteremove"></a>

## !quoteremove

Remove a saved quote.

ID: `command.quoteremove`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!quoteremove <id>",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Remove a saved quote.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!quoteremove <id>
```

Source: `server.js` — `DEFAULT_COMMANDS.quoteremove`.

<a id="command.sr"></a>

## !sr

Request a song.

ID: `command.sr`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!sr <URL|search text>",
  "defaults": {
    "enabled": true,
    "aliases": [
      "songrequest"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 30,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "@{user} â€” \"{title}\" by {artist} added to the queue!"
  },
  "behavior": "Request a song.",
  "aliases": [
    "songrequest"
  ],
  "responseVariables": [
    "user",
    "title",
    "artist"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!sr <URL|search text>
```

Related: [variable.command.sr.user](#variable.command.sr.user), [variable.command.sr.title](#variable.command.sr.title), [variable.command.sr.artist](#variable.command.sr.artist)

Source: `server.js` — `DEFAULT_COMMANDS.sr`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.sr.user"></a>

## {user} in !sr

Response value in the sr command handler's own template.

ID: `variable.command.sr.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.sr",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.sr](#command.sr)

Source: `server.js` — `DEFAULT_COMMANDS.sr`.

<a id="variable.command.sr.title"></a>

## {title} in !sr

Response value in the sr command handler's own template.

ID: `variable.command.sr.title`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "command.sr",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{title}
```

Related: [command.sr](#command.sr)

Source: `server.js` — `DEFAULT_COMMANDS.sr`.

<a id="variable.command.sr.artist"></a>

## {artist} in !sr

Response value in the sr command handler's own template.

ID: `variable.command.sr.artist`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{artist}",
  "canonicalKey": "artist",
  "aliases": [],
  "producer": "command.sr",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{artist}
```

Related: [command.sr](#command.sr)

Source: `server.js` — `DEFAULT_COMMANDS.sr`.

<a id="command.song"></a>

## !song

Current song.

ID: `command.song`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!song",
  "defaults": {
    "enabled": true,
    "aliases": [
      "currentsong"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Now playing: {title} by {artist}{requested_by}"
  },
  "behavior": "Current song.",
  "aliases": [
    "currentsong"
  ],
  "responseVariables": [
    "title",
    "artist",
    "requested_by"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!song
```

Related: [variable.command.song.title](#variable.command.song.title), [variable.command.song.artist](#variable.command.song.artist), [variable.command.song.requested_by](#variable.command.song.requested_by)

Source: `server.js` — `DEFAULT_COMMANDS.song`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.song.title"></a>

## {title} in !song

Response value in the song command handler's own template.

ID: `variable.command.song.title`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "command.song",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{title}
```

Related: [command.song](#command.song)

Source: `server.js` — `DEFAULT_COMMANDS.song`.

<a id="variable.command.song.artist"></a>

## {artist} in !song

Response value in the song command handler's own template.

ID: `variable.command.song.artist`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{artist}",
  "canonicalKey": "artist",
  "aliases": [],
  "producer": "command.song",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{artist}
```

Related: [command.song](#command.song)

Source: `server.js` — `DEFAULT_COMMANDS.song`.

<a id="variable.command.song.requested_by"></a>

## {requested_by} in !song

Response value in the song command handler's own template.

ID: `variable.command.song.requested_by`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{requested_by}",
  "canonicalKey": "requested_by",
  "aliases": [],
  "producer": "command.song",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{requested_by}
```

Related: [command.song](#command.song)

Source: `server.js` — `DEFAULT_COMMANDS.song`.

<a id="command.next"></a>

## !next

Next queued song.

ID: `command.next`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!next",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Next up: {title} by {artist}"
  },
  "behavior": "Next queued song.",
  "aliases": [],
  "responseVariables": [
    "title",
    "artist"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!next
```

Related: [variable.command.next.title](#variable.command.next.title), [variable.command.next.artist](#variable.command.next.artist)

Source: `server.js` — `DEFAULT_COMMANDS.next`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.next.title"></a>

## {title} in !next

Response value in the next command handler's own template.

ID: `variable.command.next.title`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "command.next",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{title}
```

Related: [command.next](#command.next)

Source: `server.js` — `DEFAULT_COMMANDS.next`.

<a id="variable.command.next.artist"></a>

## {artist} in !next

Response value in the next command handler's own template.

ID: `variable.command.next.artist`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{artist}",
  "canonicalKey": "artist",
  "aliases": [],
  "producer": "command.next",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{artist}
```

Related: [command.next](#command.next)

Source: `server.js` — `DEFAULT_COMMANDS.next`.

<a id="command.queue"></a>

## !queue

Show queued songs.

ID: `command.queue`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!queue",
  "defaults": {
    "enabled": true,
    "aliases": [
      "songqueue"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Queue: {queue}"
  },
  "behavior": "Show queued songs.",
  "aliases": [
    "songqueue"
  ],
  "responseVariables": [
    "queue"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!queue
```

Related: [variable.command.queue.queue](#variable.command.queue.queue)

Source: `server.js` — `DEFAULT_COMMANDS.queue`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.queue.queue"></a>

## {queue} in !queue

Response value in the queue command handler's own template.

ID: `variable.command.queue.queue`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{queue}",
  "canonicalKey": "queue",
  "aliases": [],
  "producer": "command.queue",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{queue}
```

Related: [command.queue](#command.queue)

Source: `server.js` — `DEFAULT_COMMANDS.queue`.

<a id="command.wrongsong"></a>

## !wrongsong

Remove your latest request.

ID: `command.wrongsong`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!wrongsong",
  "defaults": {
    "enabled": true,
    "aliases": [
      "remove"
    ],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "@{user} â€” \"{title}\" has been removed from the queue."
  },
  "behavior": "Remove your latest request.",
  "aliases": [
    "remove"
  ],
  "responseVariables": [
    "user",
    "title"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!wrongsong
```

Related: [variable.command.wrongsong.user](#variable.command.wrongsong.user), [variable.command.wrongsong.title](#variable.command.wrongsong.title)

Source: `server.js` — `DEFAULT_COMMANDS.wrongsong`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.wrongsong.user"></a>

## {user} in !wrongsong

Response value in the wrongsong command handler's own template.

ID: `variable.command.wrongsong.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.wrongsong",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.wrongsong](#command.wrongsong)

Source: `server.js` — `DEFAULT_COMMANDS.wrongsong`.

<a id="variable.command.wrongsong.title"></a>

## {title} in !wrongsong

Response value in the wrongsong command handler's own template.

ID: `variable.command.wrongsong.title`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "command.wrongsong",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{title}
```

Related: [command.wrongsong](#command.wrongsong)

Source: `server.js` — `DEFAULT_COMMANDS.wrongsong`.

<a id="command.voteskip"></a>

## !voteskip

Vote to skip current song.

ID: `command.voteskip`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!voteskip",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "@{user} voted to skip! ({votes}/{threshold} votes)",
    "voteskipThreshold": 3
  },
  "behavior": "Vote to skip current song.",
  "aliases": [],
  "responseVariables": [
    "user",
    "votes",
    "threshold"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!voteskip
```

Related: [variable.command.voteskip.user](#variable.command.voteskip.user), [variable.command.voteskip.votes](#variable.command.voteskip.votes), [variable.command.voteskip.threshold](#variable.command.voteskip.threshold)

Source: `server.js` — `DEFAULT_COMMANDS.voteskip`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.voteskip.user"></a>

## {user} in !voteskip

Response value in the voteskip command handler's own template.

ID: `variable.command.voteskip.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.voteskip",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.voteskip](#command.voteskip)

Source: `server.js` — `DEFAULT_COMMANDS.voteskip`.

<a id="variable.command.voteskip.votes"></a>

## {votes} in !voteskip

Response value in the voteskip command handler's own template.

ID: `variable.command.voteskip.votes`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{votes}",
  "canonicalKey": "votes",
  "aliases": [],
  "producer": "command.voteskip",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{votes}
```

Related: [command.voteskip](#command.voteskip)

Source: `server.js` — `DEFAULT_COMMANDS.voteskip`.

<a id="variable.command.voteskip.threshold"></a>

## {threshold} in !voteskip

Response value in the voteskip command handler's own template.

ID: `variable.command.voteskip.threshold`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{threshold}",
  "canonicalKey": "threshold",
  "aliases": [],
  "producer": "command.voteskip",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{threshold}
```

Related: [command.voteskip](#command.voteskip)

Source: `server.js` — `DEFAULT_COMMANDS.voteskip`.

<a id="command.songskip"></a>

## !songskip

Skip current song.

ID: `command.songskip`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!songskip",
  "defaults": {
    "enabled": true,
    "aliases": [
      "skip",
      "sskip"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "@{user} skipped the current song."
  },
  "behavior": "Skip current song.",
  "aliases": [
    "skip",
    "sskip"
  ],
  "responseVariables": [
    "user"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!songskip
```

Related: [variable.command.songskip.user](#variable.command.songskip.user)

Source: `server.js` — `DEFAULT_COMMANDS.songskip`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.songskip.user"></a>

## {user} in !songskip

Response value in the songskip command handler's own template.

ID: `variable.command.songskip.user`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{user}",
  "canonicalKey": "user",
  "aliases": [],
  "producer": "command.songskip",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{user}
```

Related: [command.songskip](#command.songskip)

Source: `server.js` — `DEFAULT_COMMANDS.songskip`.

<a id="command.songpause"></a>

## !songpause

Pause playback.

ID: `command.songpause`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!songpause",
  "defaults": {
    "enabled": true,
    "aliases": [
      "pause"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Playback paused."
  },
  "behavior": "Pause playback.",
  "aliases": [
    "pause"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!songpause
```

Source: `server.js` — `DEFAULT_COMMANDS.songpause`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="command.songresume"></a>

## !songresume

Resume playback.

ID: `command.songresume`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!songresume",
  "defaults": {
    "enabled": true,
    "aliases": [
      "play"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Playback resumed."
  },
  "behavior": "Resume playback.",
  "aliases": [
    "play"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!songresume
```

Source: `server.js` — `DEFAULT_COMMANDS.songresume`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="command.songclear"></a>

## !songclear

Clear queued songs.

ID: `command.songclear`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!songclear",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Queue cleared."
  },
  "behavior": "Clear queued songs.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!songclear
```

Source: `server.js` — `DEFAULT_COMMANDS.songclear`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="command.volume"></a>

## !volume

Read or set playback volume.

ID: `command.volume`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!volume [0–100]",
  "defaults": {
    "enabled": true,
    "aliases": [
      "vol"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Volume: {vol}%",
    "responseSetTemplate": "Volume set to {vol}%."
  },
  "behavior": "Read or set playback volume.",
  "aliases": [
    "vol"
  ],
  "responseVariables": [
    "vol"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!volume [0–100]
```

Related: [variable.command.volume.vol](#variable.command.volume.vol)

Source: `server.js` — `DEFAULT_COMMANDS.volume`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.volume.vol"></a>

## {vol} in !volume

Response value in the volume command handler's own template.

ID: `variable.command.volume.vol`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{vol}",
  "canonicalKey": "vol",
  "aliases": [],
  "producer": "command.volume",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{vol}
```

Related: [command.volume](#command.volume)

Source: `server.js` — `DEFAULT_COMMANDS.volume`.

<a id="command.songapprove"></a>

## !songapprove

Approve a pending request; missing ID selects the latest pending request.

ID: `command.songapprove`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!songapprove [request ID|last]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Approve a pending request; missing ID selects the latest pending request.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!songapprove [request ID|last]
```

Source: `server.js` — `DEFAULT_COMMANDS.songapprove`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="command.songreject"></a>

## !songreject

Reject a pending request; missing ID selects the latest pending request.

ID: `command.songreject`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!songreject [request ID|last]",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Reject a pending request; missing ID selects the latest pending request.",
  "aliases": [],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!songreject [request ID|last]
```

Source: `server.js` — `DEFAULT_COMMANDS.songreject`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="command.loadplaylist"></a>

## !loadplaylist

Load a YouTube or Spotify playlist into song requests.

ID: `command.loadplaylist`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!loadplaylist <URL>",
  "defaults": {
    "enabled": true,
    "aliases": [
      "srplaylist"
    ],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    }
  },
  "behavior": "Load a YouTube or Spotify playlist into song requests.",
  "aliases": [
    "srplaylist"
  ],
  "responseVariables": []
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!loadplaylist <URL>
```

Source: `server.js` — `DEFAULT_COMMANDS.loadplaylist`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="command.bansong"></a>

## !bansong

Block the currently playing song.

ID: `command.bansong`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!bansong",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "\"{title}\" has been added to the blocklist."
  },
  "behavior": "Block the currently playing song.",
  "aliases": [],
  "responseVariables": [
    "title"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!bansong
```

Related: [variable.command.bansong.title](#variable.command.bansong.title)

Source: `server.js` — `DEFAULT_COMMANDS.bansong`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.bansong.title"></a>

## {title} in !bansong

Response value in the bansong command handler's own template.

ID: `variable.command.bansong.title`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{title}",
  "canonicalKey": "title",
  "aliases": [],
  "producer": "command.bansong",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{title}
```

Related: [command.bansong](#command.bansong)

Source: `server.js` — `DEFAULT_COMMANDS.bansong`.

<a id="command.cmds"></a>

## !cmds

List music commands.

ID: `command.cmds`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!cmds",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "anyone",
    "cooldownSec": 30,
    "globalCooldownSec": 30,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Music commands: {commands}"
  },
  "behavior": "List music commands.",
  "aliases": [],
  "responseVariables": [
    "commands"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!cmds
```

Related: [variable.command.cmds.commands](#variable.command.cmds.commands)

Source: `server.js` — `DEFAULT_COMMANDS.cmds`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.cmds.commands"></a>

## {commands} in !cmds

Response value in the cmds command handler's own template.

ID: `variable.command.cmds.commands`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{commands}",
  "canonicalKey": "commands",
  "aliases": [],
  "producer": "command.cmds",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{commands}
```

Related: [command.cmds](#command.cmds)

Source: `server.js` — `DEFAULT_COMMANDS.cmds`.

<a id="command.togglesr"></a>

## !togglesr

Toggle song requests enabled state.

ID: `command.togglesr`. Status: **supported**. Contexts: command.

Requirements: Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply.

- Defaults describe a fresh configuration; existing settings and migration normalization may differ. Platform toggles do not guarantee that a provider API supports the command.
- Command triggers/aliases may be customized; use the effective configured trigger.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Enabled command, connected eligible platform, configured authority and cooldown; individual handler requirements also apply."
  },
  "usage": "!togglesr",
  "defaults": {
    "enabled": true,
    "aliases": [],
    "requiredAuthority": "moderator",
    "cooldownSec": 0,
    "globalCooldownSec": 0,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true
    },
    "responseTemplate": "Song requests are now {state}."
  },
  "behavior": "Toggle song requests enabled state.",
  "aliases": [],
  "responseVariables": [
    "state"
  ]
}
```

### Example

Usage notation: <required>, [optional]; replace placeholders before sending.

```text
!togglesr
```

Related: [variable.command.togglesr.state](#variable.command.togglesr.state)

Source: `server.js` — `DEFAULT_COMMANDS.togglesr`; `src/features/media/mediaCommands.js` — `handleSongRequestCommand`.

<a id="variable.command.togglesr.state"></a>

## {state} in !togglesr

Response value in the togglesr command handler's own template.

ID: `variable.command.togglesr.state`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{state}",
  "canonicalKey": "state",
  "aliases": [],
  "producer": "command.togglesr",
  "lifetime": "This command reply only.",
  "behavior": "Handler substitutions and global variables are context-dependent; this token is not exported to later actions."
}
```

### Example

Use in this command response template, not as a general action output.

```text
{state}
```

Related: [command.togglesr](#command.togglesr)

Source: `server.js` — `DEFAULT_COMMANDS.togglesr`.

<a id="context.automation"></a>

## Automation

When an enabled automation matches its trigger and Where filter, extract event variables and run actions in order. Individual failures are logged and later actions continue. Cooldown is per automation/platform, memory-only. Positive trigger offsets schedule the sequence.

ID: `context.automation`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Configure in the app

Open: Bot > Automations > + New

Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.

- **Name:** Choose a descriptive name.
- **Category:** Choose an existing organizational category or Uncategorized.
- **Enable automation:** On by default; switch off while preparing if it must not fire yet.

1. Open Bot, then Automations. Create an optional organizational category before choosing + New.
2. Fill Name, Category and the Enable automation toggle at the top of New Automation.
3. Open When. Choose Trigger category, then Trigger event. For Platform events choose Platform before Trigger event. Fill Trigger filters and Cooldown (seconds); 0 means no cooldown.
4. Open Where and select Platform from the supported options for this trigger. Changing the trigger can change the available platform choices.
5. Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.
6. Click Create Automation; use Save Changes when editing. Enable it when ready.
7. Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "fields": [
    "triggerType",
    "triggerPlatform",
    "triggerFilters",
    "cooldownSec",
    "actions"
  ],
  "defaults": {
    "triggerPlatform": "all",
    "cooldownSec": 0
  },
  "behavior": "When an enabled automation matches its trigger and Where filter, extract event variables and run actions in order. Individual failures are logged and later actions continue. Cooldown is per automation/platform, memory-only. Positive trigger offsets schedule the sequence.",
  "pickerRule": "For command/pad, the action picker exposes all nonhidden actions regardless of declared contexts. Runtime requirements still apply.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New"
    ],
    "categorySetup": "Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.",
    "initialFields": [
      {
        "label": "Name",
        "value": "Choose a descriptive name."
      },
      {
        "label": "Category",
        "value": "Choose an existing organizational category or Uncategorized."
      },
      {
        "label": "Enable automation",
        "value": "On by default; switch off while preparing if it must not fire yet."
      }
    ],
    "steps": [
      "Open Bot, then Automations. Create an optional organizational category before choosing + New.",
      "Fill Name, Category and the Enable automation toggle at the top of New Automation.",
      "Open When. Choose Trigger category, then Trigger event. For Platform events choose Platform before Trigger event. Fill Trigger filters and Cooldown (seconds); 0 means no cooldown.",
      "Open Where and select Platform from the supported options for this trigger. Changing the trigger can change the available platform choices.",
      "Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.",
      "Click Create Automation; use Save Changes when editing. Enable it when ready.",
      "Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "name": "Example welcome",
  "triggerType": "viewer_join",
  "triggerPlatform": "twitch",
  "triggerFilters": {},
  "cooldownSec": 0,
  "actions": [
    {
      "type": "chat",
      "message": "Welcome {user}!",
      "platform": "event"
    }
  ]
}
```

Source: `src/features/automations.js` — `fireEvent`.

<a id="context.timer"></a>

## Timer

Fire independently per selected platform at intervalMin (minimum 1, default 5). Require online status when onlineOnly (default true) and chatLines minimum (default 0). Reset platform line count on eligible firing. Multiple chat actions rotate sequentially/randomly: one selected chat moves to the front, then non-chat actions run. Individual failures log and continue. all/event inner targets are scoped to the eligible platform; explicit different targets are skipped.

ID: `context.timer`. Status: **supported**. Contexts: timer.

Requirements: Use the matching SheevChat version.

### Configure in the app

Open: Bot > Timers > + New

Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.

- **Name:** Choose a descriptive timer name.
- **Category:** Existing category or Uncategorized.
- **Enable timer:** On by default.

1. Open Bot, then Timers. Create an optional category before clicking + New.
2. Fill Name, Category and Enable timer.
3. Open When. Set Interval (minutes), default 5 and minimum 1, and Min chat lines, default 0. With multiple Send Chat Message actions choose Chat message rotation: Sequential or Random.
4. Open Where. Set Online only (default on) and Active on platforms (Twitch, YouTube and Kick default on; TikTok off). Each selected platform fires independently. TikTok timers only send supported chat messages.
5. Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.
6. Click Create Timer, or Save Changes when editing.
7. Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "fields": [
    "intervalMin",
    "chatLines",
    "onlineOnly",
    "platforms",
    "rotation",
    "actions"
  ],
  "defaults": {
    "intervalMin": 5,
    "chatLines": 0,
    "onlineOnly": true,
    "rotation": "sequential",
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": false
    }
  },
  "identity": "No incoming viewer. command=timer; timerId/sourceId/sourceName identify the timer.",
  "behavior": "Fire independently per selected platform at intervalMin (minimum 1, default 5). Require online status when onlineOnly (default true) and chatLines minimum (default 0). Reset platform line count on eligible firing. Multiple chat actions rotate sequentially/randomly: one selected chat moves to the front, then non-chat actions run. Individual failures log and continue. all/event inner targets are scoped to the eligible platform; explicit different targets are skipped.",
  "pickerRule": "For command/pad, the action picker exposes all nonhidden actions regardless of declared contexts. Runtime requirements still apply.",
  "ui": {
    "path": [
      "Bot",
      "Timers",
      "+ New"
    ],
    "categorySetup": "Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.",
    "initialFields": [
      {
        "label": "Name",
        "value": "Choose a descriptive timer name."
      },
      {
        "label": "Category",
        "value": "Existing category or Uncategorized."
      },
      {
        "label": "Enable timer",
        "value": "On by default."
      }
    ],
    "steps": [
      "Open Bot, then Timers. Create an optional category before clicking + New.",
      "Fill Name, Category and Enable timer.",
      "Open When. Set Interval (minutes), default 5 and minimum 1, and Min chat lines, default 0. With multiple Send Chat Message actions choose Chat message rotation: Sequential or Random.",
      "Open Where. Set Online only (default on) and Active on platforms (Twitch, YouTube and Kick default on; TikTok off). Each selected platform fires independently. TikTok timers only send supported chat messages.",
      "Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.",
      "Click Create Timer, or Save Changes when editing.",
      "Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "name": "Example reminder",
  "intervalMin": 5,
  "chatLines": 0,
  "onlineOnly": true,
  "platforms": {
    "twitch": true,
    "youtube": false,
    "kick": false,
    "tiktok": false
  },
  "actions": [
    {
      "type": "chat",
      "message": "Community night is Friday!",
      "platform": "event"
    }
  ]
}
```

Source: `server.js` — `_fireTimer / _scopeTimerActionToPlatform`.

<a id="context.command"></a>

## Custom command

Match !name or configured aliases; check enabled status, platform, authority, user/global cooldown and configured response/action output. Built-in triggers take precedence over custom commands, then Marketplace commands. Send the configured response before actions. Custom action failures log and continue; a handler returning without a throw is not proof of an external side effect. Broadcaster actors bypass user/global command cooldowns; these cooldowns persist and are scoped per platform.

ID: `context.command`. Status: **supported**. Contexts: command.

Requirements: Use the matching SheevChat version.

### Configure in the app

Open: Bot > Commands > + New

Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.

- **Command name:** Enter the trigger name; the editor already displays !.
- **Category:** Existing category or Uncategorized.
- **Enable command:** On by default.

1. Open Bot, then Commands. Create an optional category before clicking + New.
2. Fill Command name, Category and Enable command.
3. Open When. Add optional Aliases with +. Choose Who can use it (default Anyone); set User cooldown (sec) and Global cooldown (sec), both default 5.
4. Open Where. Set Active on platforms deliberately; all four platform toggles default on, but connections and platform capabilities still apply.
5. Open Do. Enter Response, or leave it blank for actions only. Choose Response style (default Send normal message). The response sends before Advanced Actions.
6. Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.
7. Click Create Command, or Save Changes when editing.
8. Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "fields": [
    "name",
    "aliases",
    "platforms",
    "requiredAuthority",
    "cooldownSec",
    "globalCooldownSec",
    "response",
    "responseReplyMode",
    "actions"
  ],
  "defaults": {
    "requiredAuthority": "anyone",
    "cooldownSec": 5,
    "globalCooldownSec": 5,
    "responseReplyMode": "normal",
    "enabled": true,
    "platforms": {
      "twitch": true,
      "youtube": true,
      "kick": true,
      "tiktok": true
    }
  },
  "limits": {
    "nameCharacters": 32,
    "aliases": 20,
    "actions": 25,
    "responseCharacters": 4000,
    "cooldownSeconds": 3600
  },
  "identity": "Incoming command sender, first-argument target and actor; synthetic automation actors differ from viewers.",
  "authorityLevels": {
    "anyone": 0,
    "follower": 1,
    "subscriber": 2,
    "vip": 3,
    "moderator": 4,
    "super_mod": 5,
    "broadcaster": 6
  },
  "behavior": "Match !name or configured aliases; check enabled status, platform, authority, user/global cooldown and configured response/action output. Built-in triggers take precedence over custom commands, then Marketplace commands. Send the configured response before actions. Custom action failures log and continue; a handler returning without a throw is not proof of an external side effect. Broadcaster actors bypass user/global command cooldowns; these cooldowns persist and are scoped per platform.",
  "pickerRule": "For command/pad, the action picker exposes all nonhidden actions regardless of declared contexts. Runtime requirements still apply.",
  "ui": {
    "path": [
      "Bot",
      "Commands",
      "+ New"
    ],
    "categorySetup": "Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.",
    "initialFields": [
      {
        "label": "Command name",
        "value": "Enter the trigger name; the editor already displays !."
      },
      {
        "label": "Category",
        "value": "Existing category or Uncategorized."
      },
      {
        "label": "Enable command",
        "value": "On by default."
      }
    ],
    "steps": [
      "Open Bot, then Commands. Create an optional category before clicking + New.",
      "Fill Command name, Category and Enable command.",
      "Open When. Add optional Aliases with +. Choose Who can use it (default Anyone); set User cooldown (sec) and Global cooldown (sec), both default 5.",
      "Open Where. Set Active on platforms deliberately; all four platform toggles default on, but connections and platform capabilities still apply.",
      "Open Do. Enter Response, or leave it blank for actions only. Choose Response style (default Send normal message). The response sends before Advanced Actions.",
      "Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.",
      "Click Create Command, or Save Changes when editing.",
      "Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "name": "hello",
  "response": "Hello {user}!"
}
```

Source: `server.js` — `handleCustomCommand / handleBotCommand`; `src/features/custom-commands.js` — `handleCustomCommand / handleBotCommand`; `src/features/command-authority.js` — `handleCustomCommand / handleBotCommand`.

<a id="context.pad"></a>

## SheevPad action button

Click an enabled action button to execute up to 20 stored actions in order. A thrown failure stops remaining actions; visual state toggles only after success. Synthetic username defaults SheevPad, role broadcaster/authority 99, command sheevpad; missing/invalid requested platform defaults Twitch. Buttons are not viewer-triggered events. Groups organize buttons; visual toggle is appearance, not external-device state.

ID: `context.pad`. Status: **supported**. Contexts: pad.

Requirements: Use the matching SheevChat version.

### Configure in the app

Open: SheevPad > Add Group / Add Button

SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.

- **Name:** Button label, up to 40 characters.
- **Type:** Action button, or Mobile navigation.
- **Group:** Choose a saved group, or Ungrouped.
- **Color:** Choose button appearance.
- **Background Image:** Optional library image; Upload Images opens the Media Library.
- **Enabled:** On by default.
- **Visual On/Off state:** Off by default; appearance only. If enabled, Current visual state sets the displayed state.

1. Open SheevPad from the app header. Create and save any groups first.
2. Choose Add Button. Fill Name, Type, Group, Color, optional Background Image and Enabled.
3. For Action button, optionally configure Visual On/Off state and Current visual state. These do not branch the action list or read external device state.
4. Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.
5. Click Save Button explicitly. Test can execute effects; use it only when safe. Preview arranges the mobile/tablet layout.
6. Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "fields": [
    "kind",
    "groupId",
    "label",
    "enabled",
    "actions",
    "visualToggle",
    "visualActive"
  ],
  "defaults": {
    "kind": "button",
    "enabled": true,
    "visualToggle": false
  },
  "limits": {
    "actionsPerButton": 20,
    "buttons": 80
  },
  "navigation": "See navigation.pad.*; navigation buttons cannot run actions.",
  "behavior": "Click an enabled action button to execute up to 20 stored actions in order. A thrown failure stops remaining actions; visual state toggles only after success. Synthetic username defaults SheevPad, role broadcaster/authority 99, command sheevpad; missing/invalid requested platform defaults Twitch. Buttons are not viewer-triggered events. Groups organize buttons; visual toggle is appearance, not external-device state.",
  "pickerRule": "For command/pad, the action picker exposes all nonhidden actions regardless of declared contexts. Runtime requirements still apply.",
  "ui": {
    "path": [
      "SheevPad",
      "Add Group / Add Button"
    ],
    "categorySetup": "SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.",
    "initialFields": [
      {
        "label": "Name",
        "value": "Button label, up to 40 characters."
      },
      {
        "label": "Type",
        "value": "Action button, or Mobile navigation."
      },
      {
        "label": "Group",
        "value": "Choose a saved group, or Ungrouped."
      },
      {
        "label": "Color",
        "value": "Choose button appearance."
      },
      {
        "label": "Background Image",
        "value": "Optional library image; Upload Images opens the Media Library."
      },
      {
        "label": "Enabled",
        "value": "On by default."
      },
      {
        "label": "Visual On/Off state",
        "value": "Off by default; appearance only. If enabled, Current visual state sets the displayed state."
      }
    ],
    "steps": [
      "Open SheevPad from the app header. Create and save any groups first.",
      "Choose Add Button. Fill Name, Type, Group, Color, optional Background Image and Enabled.",
      "For Action button, optionally configure Visual On/Off state and Current visual state. These do not branch the action list or read external device state.",
      "Open Do (for commands also expand Advanced Actions). Choose an action category and action, then click Add action; alternatively search for its exact label. Expand its card and fill the documented fields using real resource pickers. Repeat for every action. Use Move action up / Move action down to set execution order. Actions run sequentially; adding several does not create parallel execution.",
      "Click Save Button explicitly. Test can execute effects; use it only when safe. Preview arranges the mobile/tablet layout.",
      "Save, reopen and verify the persisted fields and action order. Test only when the effects are intended: chat, audio, ads and external app actions can affect connected services. A synthetic test does not establish that a real incoming event or platform permission works. Confirm a real eligible event separately during live UAT."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "kind": "button",
  "label": "Play example audio",
  "enabled": true,
  "actions": [
    {
      "type": "send_overlay_audio",
      "mediaId": "fixture-audio",
      "volume": 100
    }
  ]
}
```

Source: `server.js` — `runSheevPadButton / normalizeSheevPadConfig`; `public/index.html` — `runSheevPadButton / normalizeSheevPadConfig`; `src/features/sheevpad/visual-toggle-state.js` — `runSheevPadButton / normalizeSheevPadConfig`.

<a id="routing.action-targets"></a>

## Action output routing

event/missing means origin; all means Twitch + YouTube + Kick. Explicit TikTok is supported by eligible actions. Local obs, streamlabs or app events are not chat destinations: choose an explicit output platform when required. Stream title/category use separate three-platform toggles; Conversation Starters has four explicit toggles; trivia has base plus extra targets. Timer gates restrict inner all/event routing.

ID: `routing.action-targets`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "behavior": "event/missing means origin; all means Twitch + YouTube + Kick. Explicit TikTok is supported by eligible actions. Local obs, streamlabs or app events are not chat destinations: choose an explicit output platform when required. Stream title/category use separate three-platform toggles; Conversation Starters has four explicit toggles; trivia has base plus extra targets. Timer gates restrict inner all/event routing."
}
```

Source: `src/features/automations.js` — `targetPlatforms / ACTION_PLATFORM_CAPABILITIES`.

<a id="routing.variables"></a>

## Variable resolution

For action templates, event values substitute first, then the global engine. Context-specific title/message/target values can differ from global aliases. Global keys are case-insensitive; event substitution is case-sensitive. Colon arguments support backslash escaping. Unknown placeholders remain literal; null/error/timeout uses declared fallback (default Unavailable). Resolver timeout defaults 2500 ms; final global output cap 480 characters. No general nested-expression language.

ID: `routing.variables`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "behavior": "For action templates, event values substitute first, then the global engine. Context-specific title/message/target values can differ from global aliases. Global keys are case-insensitive; event substitution is case-sensitive. Colon arguments support backslash escaping. Unknown placeholders remain literal; null/error/timeout uses declared fallback (default Unavailable). Resolver timeout defaults 2500 ms; final global output cap 480 characters. No general nested-expression language."
}
```

Source: `src/features/command-variables.js` — `createCommandVariableEngine`.

<a id="routing.extensions"></a>

## Installed actions, events and games

The public built-in inventory does not enumerate arbitrary installed packages. Imported app events require an installed active library and subscription; library mappings define extra event.<key> values. Imported action outputs become available only after the producer runs in the current sequence. Marketplace game commands use package instructions and effective configured triggers/aliases; require compatible enabled installed packages. See the action-library and chat-game creator contracts for schemas.

ID: `routing.extensions`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "behavior": "The public built-in inventory does not enumerate arbitrary installed packages. Imported app events require an installed active library and subscription; library mappings define extra event.<key> values. Imported action outputs become available only after the producer runs in the current sequence. Marketplace game commands use package instructions and effective configured triggers/aliases; require compatible enabled installed packages. See the action-library and chat-game creator contracts for schemas."
}
```

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="navigation.pad.target"></a>

## SheevPad target

Scroll to the configured targetGroupId. The selected group must exist.

ID: `navigation.pad.target`. Status: **supported**. Contexts: mobile.

Requirements: Mobile/tablet SheevPad with groups configured.

- Client-side scroll only; no actions run. Server execution rejects navigation buttons. Missing destination gives No matching group found feedback.

### Configure in the app

Open: SheevPad > Add Button

- **Name:** Button label, up to 40 characters.
- **Type:** Action button, or Mobile navigation.
- **Group:** Choose a saved group, or Ungrouped.
- **Color:** Choose button appearance.
- **Background Image:** Optional library image; Upload Images opens the Media Library.
- **Enabled:** On by default.

1. SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.
2. Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.
3. Set Navigation = Target group.
4. Choose an existing Target Group.
5. Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Mobile/tablet SheevPad with groups configured."
  },
  "behavior": "Scroll to the configured targetGroupId. The selected group must exist.",
  "mode": "target",
  "defaultMode": "target",
  "fields": [
    "targetGroupId"
  ],
  "ui": {
    "path": [
      "SheevPad",
      "Add Button"
    ],
    "initialFields": [
      {
        "label": "Name",
        "value": "Button label, up to 40 characters."
      },
      {
        "label": "Type",
        "value": "Action button, or Mobile navigation."
      },
      {
        "label": "Group",
        "value": "Choose a saved group, or Ungrouped."
      },
      {
        "label": "Color",
        "value": "Choose button appearance."
      },
      {
        "label": "Background Image",
        "value": "Optional library image; Upload Images opens the Media Library."
      },
      {
        "label": "Enabled",
        "value": "On by default."
      }
    ],
    "steps": [
      "SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.",
      "Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.",
      "Set Navigation = Target group.",
      "Choose an existing Target Group.",
      "Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "kind": "navigation",
  "label": "Go target",
  "navMode": "target",
  "targetGroupId": "fixture-group"
}
```

Related: [context.pad](#context.pad)

Source: `public/mobile.html` — `navigateSheevPadMobile`; `server.js` — `normalizeSheevPadConfig`.

<a id="navigation.pad.next"></a>

## SheevPad next

Scroll to the next group relative to current scroll position; clamp at the last group, without wrapping.

ID: `navigation.pad.next`. Status: **supported**. Contexts: mobile.

Requirements: Mobile/tablet SheevPad with groups configured.

- Client-side scroll only; no actions run. Server execution rejects navigation buttons. Missing destination gives No matching group found feedback.

### Configure in the app

Open: SheevPad > Add Button

- **Name:** Button label, up to 40 characters.
- **Type:** Action button, or Mobile navigation.
- **Group:** Choose a saved group, or Ungrouped.
- **Color:** Choose button appearance.
- **Background Image:** Optional library image; Upload Images opens the Media Library.
- **Enabled:** On by default.

1. SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.
2. Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.
3. Set Navigation = Next group.
4. Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Mobile/tablet SheevPad with groups configured."
  },
  "behavior": "Scroll to the next group relative to current scroll position; clamp at the last group, without wrapping.",
  "mode": "next",
  "defaultMode": "target",
  "fields": [],
  "ui": {
    "path": [
      "SheevPad",
      "Add Button"
    ],
    "initialFields": [
      {
        "label": "Name",
        "value": "Button label, up to 40 characters."
      },
      {
        "label": "Type",
        "value": "Action button, or Mobile navigation."
      },
      {
        "label": "Group",
        "value": "Choose a saved group, or Ungrouped."
      },
      {
        "label": "Color",
        "value": "Choose button appearance."
      },
      {
        "label": "Background Image",
        "value": "Optional library image; Upload Images opens the Media Library."
      },
      {
        "label": "Enabled",
        "value": "On by default."
      }
    ],
    "steps": [
      "SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.",
      "Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.",
      "Set Navigation = Next group.",
      "Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "kind": "navigation",
  "label": "Go next",
  "navMode": "next"
}
```

Related: [context.pad](#context.pad)

Source: `public/mobile.html` — `navigateSheevPadMobile`; `server.js` — `normalizeSheevPadConfig`.

<a id="navigation.pad.previous"></a>

## SheevPad previous

Scroll to the previous group relative to current scroll position; clamp at the first group, without wrapping.

ID: `navigation.pad.previous`. Status: **supported**. Contexts: mobile.

Requirements: Mobile/tablet SheevPad with groups configured.

- Client-side scroll only; no actions run. Server execution rejects navigation buttons. Missing destination gives No matching group found feedback.

### Configure in the app

Open: SheevPad > Add Button

- **Name:** Button label, up to 40 characters.
- **Type:** Action button, or Mobile navigation.
- **Group:** Choose a saved group, or Ungrouped.
- **Color:** Choose button appearance.
- **Background Image:** Optional library image; Upload Images opens the Media Library.
- **Enabled:** On by default.

1. SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.
2. Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.
3. Set Navigation = Previous group.
4. Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Mobile/tablet SheevPad with groups configured."
  },
  "behavior": "Scroll to the previous group relative to current scroll position; clamp at the first group, without wrapping.",
  "mode": "previous",
  "defaultMode": "target",
  "fields": [],
  "ui": {
    "path": [
      "SheevPad",
      "Add Button"
    ],
    "initialFields": [
      {
        "label": "Name",
        "value": "Button label, up to 40 characters."
      },
      {
        "label": "Type",
        "value": "Action button, or Mobile navigation."
      },
      {
        "label": "Group",
        "value": "Choose a saved group, or Ungrouped."
      },
      {
        "label": "Color",
        "value": "Choose button appearance."
      },
      {
        "label": "Background Image",
        "value": "Optional library image; Upload Images opens the Media Library."
      },
      {
        "label": "Enabled",
        "value": "On by default."
      }
    ],
    "steps": [
      "SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.",
      "Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.",
      "Set Navigation = Previous group.",
      "Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "kind": "navigation",
  "label": "Go previous",
  "navMode": "previous"
}
```

Related: [context.pad](#context.pad)

Source: `public/mobile.html` — `navigateSheevPadMobile`; `server.js` — `normalizeSheevPadConfig`.

<a id="navigation.pad.favorite"></a>

## SheevPad favorite

Scroll to layout.favoriteGroupId; a favorite group must be configured and exist.

ID: `navigation.pad.favorite`. Status: **supported**. Contexts: mobile.

Requirements: Mobile/tablet SheevPad with groups configured.

- Client-side scroll only; no actions run. Server execution rejects navigation buttons. Missing destination gives No matching group found feedback.

### Configure in the app

Open: SheevPad > Add Button

- **Name:** Button label, up to 40 characters.
- **Type:** Action button, or Mobile navigation.
- **Group:** Choose a saved group, or Ungrouped.
- **Color:** Choose button appearance.
- **Background Image:** Optional library image; Upload Images opens the Media Library.
- **Enabled:** On by default.

1. SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.
2. Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.
3. Set Navigation = Favorite group.
4. Edit the destination group, enable Favorite group and Save Group.
5. Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Mobile/tablet SheevPad with groups configured."
  },
  "behavior": "Scroll to layout.favoriteGroupId; a favorite group must be configured and exist.",
  "mode": "favorite",
  "defaultMode": "target",
  "fields": [
    "layout.favoriteGroupId"
  ],
  "ui": {
    "path": [
      "SheevPad",
      "Add Button"
    ],
    "initialFields": [
      {
        "label": "Name",
        "value": "Button label, up to 40 characters."
      },
      {
        "label": "Type",
        "value": "Action button, or Mobile navigation."
      },
      {
        "label": "Group",
        "value": "Choose a saved group, or Ungrouped."
      },
      {
        "label": "Color",
        "value": "Choose button appearance."
      },
      {
        "label": "Background Image",
        "value": "Optional library image; Upload Images opens the Media Library."
      },
      {
        "label": "Enabled",
        "value": "On by default."
      }
    ],
    "steps": [
      "SheevPad uses Group rather than Bot Category. Choose Add Group, fill Group Name, optionally enable Favorite group, then Save Group before assigning buttons.",
      "Choose Add Button. Set Name, Type = Mobile navigation, Group, optional appearance and Enabled.",
      "Set Navigation = Favorite group.",
      "Edit the destination group, enable Favorite group and Save Group.",
      "Click Save Button. Open mobile/tablet SheevPad and tap the navigation button to check scrolling. It does not execute actions."
    ]
  }
}
```

### Example

Illustrative configuration; replace fixture resources in the editor. This is not an import file.

```json
{
  "kind": "navigation",
  "label": "Go favorite",
  "navMode": "favorite"
}
```

Related: [context.pad](#context.pad)

Source: `public/mobile.html` — `navigateSheevPadMobile`; `server.js` — `normalizeSheevPadConfig`.

<a id="context.raid-response"></a>

## Set up an automatic raid response, snooze ads and pause music

A complete editor example combining an incoming Twitch raid with an ordered welcome, ad snooze and music pause.

ID: `context.raid-response`. Status: **supported**. Contexts: automation.

Requirements: Use the matching SheevChat version.

### Configure in the app

Open: Bot > Automations > + New

Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.

- **Name:** Incoming Raid Response
- **Category:** Raids (create with + New Category first), or Uncategorized.
- **Enable automation:** Off while configuring; turn on and save when ready.

1. Connect the Twitch broadcaster account with ad-management access. Have an available ad snooze. Confirm which music source is active: Pause song controls SheevChat song playback or its configured Spotify mode; it does not pause every desktop music app.
2. Open Bot > Automations. If desired, choose + New Category, enter Raids in Category name, and Save. Click + New.
3. Set Name to Incoming Raid Response. Set Category to Raids (or Uncategorized). Switch Enable automation off while preparing.
4. Open When: Trigger category = Raids; Trigger event = Incoming raid. Set Minimum viewers (0 = any) to 0; Only if next Twitch ad is within minutes (0 = off) to 0; Cooldown (seconds) to 0. Keeping the trigger ad filter off lets the response and music pause run even if no ad is imminent.
5. Open Where: Platform = Twitch. Ad snoozing is Twitch-only; use a separate automation for other raid providers if required.
6. Open Do. Choose Chat Bot Commands > Send chat message > Add action. Expand its card. Set Message to Thanks for the raid, {user}! Welcome {viewers} raiders! Set Send to to Same platform as event.
7. Choose Stream Platform Commands > Snooze upcoming Twitch ad > Add action. Set Only if next ad is within minutes (0 = always) to 0 to attempt a snooze for every raid. Optionally use 5 to skip only the snooze action when the captured next-ad schedule is outside five minutes or missing; leave the trigger filter at 0.
8. Choose Music Controls > Pause song > Add action. Leave Send chat response off unless a playback confirmation is wanted. Leave its output Platform at Same platform as event.
9. Use Move action up / Move action down to keep Send chat message, Snooze upcoming Twitch ad, Pause song in that order. One raid starts all three in sequence, without adding a delay. They are not simultaneous or transactional; failures are logged and later automation actions continue.
10. Click Create Automation. Reopen it and verify the saved fields and order. When ready, turn Enable automation on and click Save Changes.
11. During live UAT, receive an eligible Twitch raid while music is playing and an ad snooze is available. Expect the welcome message, an attempted snooze and paused playback. Check platform results/logs as well as the UI. A synthetic event cannot prove Twitch permissions or delivery.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "behavior": "One Incoming raid automation runs three actions in sequence. Keep the trigger ad-window filter off so it does not suppress the entire response. Optional action-level ad gating affects only the snooze.",
  "ui": {
    "path": [
      "Bot",
      "Automations",
      "+ New"
    ],
    "categorySetup": "Before opening a new editor, optionally choose + New Category in the relevant Bot tab, enter Category name and click Save. In the editor choose that Category, or leave Uncategorized. Categories organize items; they do not filter stream categories or events.",
    "initialFields": [
      {
        "label": "Name",
        "value": "Incoming Raid Response"
      },
      {
        "label": "Category",
        "value": "Raids (create with + New Category first), or Uncategorized."
      },
      {
        "label": "Enable automation",
        "value": "Off while configuring; turn on and save when ready."
      }
    ],
    "steps": [
      "Connect the Twitch broadcaster account with ad-management access. Have an available ad snooze. Confirm which music source is active: Pause song controls SheevChat song playback or its configured Spotify mode; it does not pause every desktop music app.",
      "Open Bot > Automations. If desired, choose + New Category, enter Raids in Category name, and Save. Click + New.",
      "Set Name to Incoming Raid Response. Set Category to Raids (or Uncategorized). Switch Enable automation off while preparing.",
      "Open When: Trigger category = Raids; Trigger event = Incoming raid. Set Minimum viewers (0 = any) to 0; Only if next Twitch ad is within minutes (0 = off) to 0; Cooldown (seconds) to 0. Keeping the trigger ad filter off lets the response and music pause run even if no ad is imminent.",
      "Open Where: Platform = Twitch. Ad snoozing is Twitch-only; use a separate automation for other raid providers if required.",
      "Open Do. Choose Chat Bot Commands > Send chat message > Add action. Expand its card. Set Message to Thanks for the raid, {user}! Welcome {viewers} raiders! Set Send to to Same platform as event.",
      "Choose Stream Platform Commands > Snooze upcoming Twitch ad > Add action. Set Only if next ad is within minutes (0 = always) to 0 to attempt a snooze for every raid. Optionally use 5 to skip only the snooze action when the captured next-ad schedule is outside five minutes or missing; leave the trigger filter at 0.",
      "Choose Music Controls > Pause song > Add action. Leave Send chat response off unless a playback confirmation is wanted. Leave its output Platform at Same platform as event.",
      "Use Move action up / Move action down to keep Send chat message, Snooze upcoming Twitch ad, Pause song in that order. One raid starts all three in sequence, without adding a delay. They are not simultaneous or transactional; failures are logged and later automation actions continue.",
      "Click Create Automation. Reopen it and verify the saved fields and order. When ready, turn Enable automation on and click Save Changes.",
      "During live UAT, receive an eligible Twitch raid while music is playing and an ad snooze is available. Expect the welcome message, an attempted snooze and paused playback. Check platform results/logs as well as the UI. A synthetic event cannot prove Twitch permissions or delivery."
    ]
  }
}
```

Related: [context.automation](#context.automation), [trigger.raid](#trigger.raid), [action.chat](#action.chat), [action.twitch_snooze_upcoming_ad](#action.twitch_snooze_upcoming_ad), [action.song_pause](#action.song_pause)

Source: `public/index.html` — `renderAutoEditor / renderActionBuilder / botCategorySelectHtml`; `src/features/automations.js` — `raid / chat / twitch_snooze_upcoming_ad / song_pause`.

<a id="variable.action.chat_delay.delay"></a>

## {delay}

The configured delayed-chat delay in seconds, local to that delayed message.

ID: `variable.action.chat_delay.delay`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{delay}",
  "canonicalKey": "delay",
  "aliases": [],
  "producer": "action.chat_delay",
  "lifetime": "Delayed message only.",
  "behavior": "Not a general output for later actions."
}
```

### Example

Only inside Send chat message (delayed).

```text
Sending after {delay} seconds
```

Related: [action.chat_delay](#action.chat_delay)

Source: `src/features/automations.js` — `ACTION_REGISTRY.chat_delay.execute`.

<a id="variable.imported.lastActionOk"></a>

## {lastActionOk}

Imported-action response helper lastActionOk.

ID: `variable.imported.lastActionOk`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionOk}",
  "canonicalKey": "lastActionOk",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Set true when a response is applied; not a universal failure-status variable."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionOk}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionType"></a>

## {lastActionType}

Imported-action response helper lastActionType.

ID: `variable.imported.lastActionType`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionType}",
  "canonicalKey": "lastActionType",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionType}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionId"></a>

## {lastActionId}

Imported-action response helper lastActionId.

ID: `variable.imported.lastActionId`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionId}",
  "canonicalKey": "lastActionId",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionId}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionLabel"></a>

## {lastActionLabel}

Imported-action response helper lastActionLabel.

ID: `variable.imported.lastActionLabel`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionLabel}",
  "canonicalKey": "lastActionLabel",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionLabel}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionNamespace"></a>

## {lastActionNamespace}

Imported-action response helper lastActionNamespace.

ID: `variable.imported.lastActionNamespace`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionNamespace}",
  "canonicalKey": "lastActionNamespace",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionNamespace}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionOutputKeys"></a>

## {lastActionOutputKeys}

Imported-action response helper lastActionOutputKeys.

ID: `variable.imported.lastActionOutputKeys`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionOutputKeys}",
  "canonicalKey": "lastActionOutputKeys",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionOutputKeys}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionOutputSummary"></a>

## {lastActionOutputSummary}

Imported-action response helper lastActionOutputSummary.

ID: `variable.imported.lastActionOutputSummary`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionOutputSummary}",
  "canonicalKey": "lastActionOutputSummary",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionOutputSummary}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionMissingOutputKeys"></a>

## {lastActionMissingOutputKeys}

Imported-action response helper lastActionMissingOutputKeys.

ID: `variable.imported.lastActionMissingOutputKeys`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionMissingOutputKeys}",
  "canonicalKey": "lastActionMissingOutputKeys",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionMissingOutputKeys}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionValueCount"></a>

## {lastActionValueCount}

Imported-action response helper lastActionValueCount.

ID: `variable.imported.lastActionValueCount`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionValueCount}",
  "canonicalKey": "lastActionValueCount",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionValueCount}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionResponseJson"></a>

## {lastActionResponseJson}

Imported-action response helper lastActionResponseJson.

ID: `variable.imported.lastActionResponseJson`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionResponseJson}",
  "canonicalKey": "lastActionResponseJson",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionResponseJson}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionValuesJson"></a>

## {lastActionValuesJson}

Imported-action response helper lastActionValuesJson.

ID: `variable.imported.lastActionValuesJson`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionValuesJson}",
  "canonicalKey": "lastActionValuesJson",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionValuesJson}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.lastActionRaw"></a>

## {lastActionRaw}

Imported-action response helper lastActionRaw.

ID: `variable.imported.lastActionRaw`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{lastActionRaw}",
  "canonicalKey": "lastActionRaw",
  "aliases": [],
  "producer": "Imported action with response mapping.",
  "lifetime": "Current sequence, overwritten by subsequent response producers.",
  "behavior": "Describes the latest applied imported response, its mapped values or missing output keys; JSON/raw helpers are compacted to 4000 characters."
}
```

### Example

After an imported action that ingests a response; inspect the package output contract.

```text
{lastActionRaw}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.mapping.last"></a>

## {last.<key>}

Package-defined mapped response value.

ID: `variable.imported.mapping.last`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{last.<key>}",
  "canonicalKey": "last.<key>",
  "aliases": [],
  "producer": "Installed action responseMap.",
  "lifetime": "Current sequence only.",
  "behavior": "The response map supplies values. last.<key> is overwritten by a later producer of that key. Namespace and action ID forms reference the same mapped value; a sanitized namespace alias may also be present."
}
```

### Example

Replace namespace/key with the installed action’s declared output; syntax is a pattern.

```text
{last.<key>}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.mapping.namespace"></a>

## {<namespace>.<key>}

Package-defined mapped response value.

ID: `variable.imported.mapping.namespace`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{<namespace>.<key>}",
  "canonicalKey": "<namespace>.<key>",
  "aliases": [],
  "producer": "Installed action responseMap.",
  "lifetime": "Current sequence only.",
  "behavior": "The response map supplies values. last.<key> is overwritten by a later producer of that key. Namespace and action ID forms reference the same mapped value; a sanitized namespace alias may also be present."
}
```

### Example

Replace namespace/key with the installed action’s declared output; syntax is a pattern.

```text
{<namespace>.<key>}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.

<a id="variable.imported.mapping.action"></a>

## {<actionId>.<key>}

Package-defined mapped response value.

ID: `variable.imported.mapping.action`. Status: **supported**. Contexts: automation, timer, command, pad.

Requirements: Use the matching SheevChat version.

### Contract

```json
{
  "availability": {
    "verifiedIn": "2.8.0-beta.28",
    "requirements": "Use the matching SheevChat version."
  },
  "syntax": "{<actionId>.<key>}",
  "canonicalKey": "<actionId>.<key>",
  "aliases": [],
  "producer": "Installed action responseMap.",
  "lifetime": "Current sequence only.",
  "behavior": "The response map supplies values. last.<key> is overwritten by a later producer of that key. Namespace and action ID forms reference the same mapped value; a sanitized namespace alias may also be present."
}
```

### Example

Replace namespace/key with the installed action’s declared output; syntax is a pattern.

```text
{<actionId>.<key>}
```

Related: [routing.extensions](#routing.extensions)

Source: `integrations/action-library-runtime/execution.js` — `applyImportedActionResponseValues`.
