Rules are the core automation system in VMSC. Every rule follows a simple pattern: when a stream event occurs, check if it passes your filters, then execute one or more actions.
A rule is an automation pipeline that connects a stream event to one or more output actions. Rules work across all supported platforms. Every rule has three stages:
Rules are evaluated in real time as events stream in from your connected platforms. When an event matches a rule's trigger type and passes every filter, the action chain executes immediately.
Rules in VMSC are not limited to a single platform. Each rule includes a platform selector displayed as a row of clickable bubbles: TikTok, Twitch, YouTube, Kick, Streamlabs, and StreamElements. You can enable multiple platforms on a single rule, so one rule can respond to events from several sources simultaneously.
When you change the selected platforms, the available event types in the trigger
dropdown update dynamically to show only the events supported by the currently selected platforms.
For example, selecting only Twitch reveals Twitch-specific events like channel_point_redeem
and hype_train_begin, while selecting TikTok shows gift, like,
and envelope.
chat trigger. No need to
duplicate the rule for each platform.
Each rule is bound to exactly one event type. The available events depend on which platforms are selected. Below are the TikTok LIVE events as an example (see the Event Types reference for all platforms):
| Event | Description | Key Data |
|---|---|---|
chat |
A viewer sends a chat message | {user}, {message} |
gift |
A viewer sends a gift | {user}, {gift}, {count}, {diamondCount} |
like |
A viewer taps the like button | {user}, {count} |
follow |
A viewer follows your account | {user} |
share |
A viewer shares the stream | {user} |
join |
A viewer enters the live room | {user} |
subscribe |
A viewer subscribes to the channel | {user} |
envelope |
A treasure chest / envelope event | {user}, {coins} |
Filters narrow down which events actually trigger a rule. You can stack multiple filters on a single rule — all filters must pass for the action chain to execute.
The structured gift filter lets you target specific gifts or gift value ranges. It is only
available on gift type rules.
{
"giftFilter": {
"giftName": "Rose",
"minDiamonds": 1,
"maxDiamonds": 100,
"minCount": 5
}
}
Numeric fields such as count and diamondCount support standard
comparison operators in filter expressions:
| Operator | Meaning | Example |
|---|---|---|
== | Equal to | count == 10 |
!= | Not equal to | count != 0 |
> | Greater than | diamondCount > 50 |
>= | Greater than or equal | diamondCount >= 100 |
< | Less than | count < 5 |
<= | Less than or equal | count <= 20 |
For chat events, you can write a regular expression to match against the message
text. This is useful for keyword triggers, command parsing, or pattern matching.
// Match messages starting with "!shock"
/^!shock/i
// Match messages containing "hello" or "hi"
/\b(hello|hi)\b/i
// Match exact command with argument
/^!osc\s+(\w+)\s+(\d+)$/
i flag for case-insensitive matching. VMSC tests
the regex against the full message string using RegExp.test().
Accumulators let you collect events over time and only fire the action when a threshold is reached. This is useful for "every N likes" or "after 100 gifts" type rules.
In count mode, the accumulator increments a counter each time the event fires. The action chain only executes when the counter reaches the configured threshold.
{
"accumulator": {
"enabled": true,
"mode": "count",
"threshold": 50,
"resetAfterTrigger": true
}
}
true, resets the counter to 0 after the action fires; if false, the counter continues accumulating and fires again at each multiple of the threshold
For example, setting threshold: 100 with resetAfterTrigger: true on a
like event will fire once every 100 likes. The counter resets after each trigger.
Cooldowns prevent a rule from firing too frequently. VMSC supports two types of cooldowns that can be used independently or together.
A global cooldown for the entire rule. After the rule fires, it will not fire again until the cooldown period has elapsed, regardless of which viewer triggered it.
{
"cooldown": {
"global": 10
}
}
In this example, the rule can fire at most once every 10 seconds.
A cooldown scoped to individual viewers. Each viewer has their own independent timer. This is useful for preventing spam from a single user while still allowing other viewers to trigger the rule.
{
"cooldown": {
"perUser": 30
}
}
In this example, each viewer can only trigger the rule once every 30 seconds, but different viewers can trigger it simultaneously.
Actions are the outputs that execute when a rule fires. Each action targets a specific output system. VMSC supports 29+ fully polished action editors, presented in a visual Action Grid UI.
When adding an action to a rule, VMSC displays a visual grid of square cards — each card represents an action type with an icon and label. The grid includes a search/filter bar at the top to quickly find actions by name, and a "+ New Action" card at the end for quick access. Click any card to open its dedicated editor.
Below is a selection of available action types. Each has a fully polished, dedicated editor panel:
| Target | Description |
|---|---|
| VRChat OSC | Send OSC messages to VRChat — toggle avatar parameters, display chatbox messages, trigger animations |
| PiShock / OpenShock | Trigger vibrations, shocks, or beeps on connected PiShock or OpenShock devices |
| Script Runner | Execute a local script or command (PowerShell, Python, batch file, etc.) |
| Overlay | Update overlay widgets — show alerts, play media, update progress bars, push event feed items |
| Webhook | Send HTTP requests to any URL (Discord, custom endpoints, etc.) — includes a Test button to fire a test request from the editor |
| Audio | Play a local audio file through the system audio output — includes a preview play button in the editor |
| Log | Write a formatted message to the VMSC event log for debugging and auditing |
| Kill Process | Terminate a running process by name or PID |
| Global Variable | Set, increment, or toggle a global variable that persists across rules |
| Countdown Timer | Start, pause, reset, or adjust a countdown timer linked to an overlay widget |
| Trigger Alert | Fire an alert through the Alert Engine |
| Voicemod | Change voice effects or trigger soundboard clips via the Voicemod integration |
| TTS | Text-to-speech output with per-action voice override — each TTS action can use a different voice |
A single rule can execute multiple actions in sequence. For example, a gift event could simultaneously:
Actions execute in the order they appear in the action list. Each action runs independently, so a failure in one action does not prevent subsequent actions from executing.
Many action fields support template variables that are replaced at runtime with data from the triggering event. Wrap variable names in curly braces:
| Variable | Description | Available On |
|---|---|---|
{user} | Display name of the viewer | All events |
{userId} | Unique TikTok user ID | All events |
{message} | Chat message text | chat |
{gift} | Gift name (e.g., "Rose") | gift |
{count} | Event count (likes, gifts) | gift, like |
{diamondCount} | Diamond value of the gift | gift |
{coins} | Coin value from envelope | envelope |
Template variables work in OSC chatbox messages, overlay text, Discord webhook content, and script arguments:
VRChat Chatbox: "{user} sent {count}x {gift}!"
Overlay Text: "New follower: {user}"
Discord Webhook: "**{user}** just gifted {count}x {gift} ({diamondCount} diamonds)"
Script Argument: --user "{user}" --gift "{gift}" --count {count}
Below is a complete rule configuration that triggers on Rose gifts of 5 or more, has a 10-second global cooldown, and sends both an OSC message to VRChat and a PiShock vibration:
{
"name": "Rose Gift Reaction",
"enabled": true,
"event": "gift",
"filters": {
"giftFilter": {
"giftName": "Rose",
"minCount": 5
}
},
"cooldown": {
"global": 10
},
"actions": [
{
"target": "vrchat-osc",
"type": "chatbox",
"message": "{user} sent {count}x Roses!"
},
{
"target": "pishock",
"type": "vibrate",
"intensity": 50,
"duration": 2
}
]
}
The Timer System sub-tab within Rules provides dedicated timer management. VMSC supports three timer types:
| Timer Type | Description |
|---|---|
| Countdown | Counts down from a set duration to zero. Fires linked actions when it reaches zero. |
| Interval | Fires linked actions repeatedly at a fixed interval (e.g., every 30 seconds). |
| Stopwatch | Counts up from zero. Useful for tracking elapsed time with linked milestone actions. |
Each timer can have linked actions that execute when the timer fires. Timers display live on the dashboard and can optionally auto-start when VMSC launches or when a stream connection is established.
For boolean-type actions — particularly VRChat OSC parameters — VMSC
supports a timed toggle mode. This sets a parameter to true for a
configured number of seconds, then automatically reverts it to false.
This is ideal for triggering temporary avatar animations, toggling accessories, or activating VRChat world features for a fixed duration without needing a separate reset rule.
The Outfit System sub-tab lets you define and manage avatar outfit presets. Outfits can be triggered by rules or switched manually. For full details, see the Outfit System dedicated page.
The Camera Pin System sub-tab provides camera position presets that can be triggered by stream events. Pin specific camera angles and switch between them via rule actions. For full details, see the Camera Pin System dedicated page.