# Control OBS from flows

Run a flow when you switch scenes, go live, record, save a replay, show or hide an overlay or close OBS, and let flows switch scenes, save replays, record and stream, with nothing to install.

Updated 6 October 2026

## What you need

You need a Bloopbot [overlay open in OBS as a Browser Source](https://bloopbot.com/docs/widgets-in-obs#obs), the same one you already use for alerts or chat; if you have none yet, add one there first, then come back. Every Bloopbot overlay can tell Bloopbot what OBS is doing, so there is nothing to install: no plugin, no password and no extra connection. Flows can start from what OBS does straight away; to let flows make OBS do something, such as switch scenes, you change one setting on that Browser Source (see [Page permissions](https://bloopbot.com/docs/control-obs-from-flows#permissions)).

- **Your own HTML overlay counts too.** A [custom overlay](https://bloopbot.com/docs/custom-widgets#obs-link) built on Overlay SDK 1.2 or later works with OBS the same way, unless whoever made it turned that off.
- **One overlay is enough.** Several overlays, or several scenes with the overlay in each, report the same thing; each OBS event starts a flow once.
- **Keep one overlay running.** A source that OBS has shut down while its scene is off screen reports nothing, so keep **Shutdown source when not visible** unticked on at least one overlay's Browser Source, or put an overlay in every scene.
- **It works on every plan**, Free included.
- **It is OBS Studio's own feature.** It needs OBS Studio with its built-in browser. Other streaming apps may not offer it; if yours does not, the flow never starts and nothing else is affected.

Open a flow's node library from **Flows**, **+ New flow**, then **Start blank**, and search for `OBS`. The OBS triggers and actions sit under **OBS**.

## 1. What can start a flow

| Trigger | It runs when |
| --- | --- |
| **OBS changed scene** | You switch scenes in OBS. Name a scene to run only for a change to that scene. |
| **OBS started streaming** | You press Start Streaming in OBS. This is the moment OBS starts the stream, which can be a little before Twitch shows you live. |
| **OBS stopped streaming** | You press Stop Streaming in OBS, a little before Twitch shows you offline. |
| **OBS started recording** | OBS starts recording. |
| **OBS stopped recording** | OBS stops recording. |
| **OBS paused recording** | You pause a recording. |
| **OBS resumed recording** | You resume a paused recording. |
| **OBS saved a replay** | OBS saves a clip from its replay buffer, from its own button, a hotkey or anything else. |
| **OBS started virtual cam** | OBS starts its virtual camera. |
| **OBS stopped virtual cam** | OBS stops its virtual camera. |
| **OBS overlay shown/hidden** | One of your overlays is shown or hidden in OBS. Pick the overlay and whether you want it shown, hidden or either. |
| **OBS closing** | You close OBS. Use it for steps that do not need OBS, such as a chat message or a variable. |

> **OBS started streaming is not Stream starts or ends**
>
> **Stream starts or ends** runs when Twitch reports the stream live or offline, and it works without OBS. **OBS started streaming** and **OBS stopped streaming** run when OBS itself starts or stops, so use them for things that belong to the moment you press the button, and the Twitch trigger for things that need Twitch to agree you are live.

## 2. Post to chat when you switch scenes

This flow says something in chat when you switch to your **BRB** scene.

1. Open **Flows**, press **+ New flow**, then **Start blank**.
2. In **Add a node**, search for `OBS` and add **OBS changed scene**. This is the trigger.
3. Select it and open **Only when it changes to**. Pick **BRB** from the list of your scenes. If the list shows a text box instead, type the scene's name as OBS shows it. Capitals and the spaces around the name do not matter, so `brb` matches a scene called **BRB**; two scenes whose names differ only in capitals both match.
4. Add a **Send a chat message** action and connect it to the trigger's **next** output. Type `Be right back! Back in a few minutes.`
5. Give the flow a name such as “BRB message”, press **Save**, then turn it on.
6. Press **Test fire** to see the run without sending anything. The test acts as if OBS changed to your BRB scene.
7. Switch to your BRB scene in OBS. The message appears in chat.

With **Only when it changes to** left on **Any scene**, the flow runs for every scene change. To answer several scenes differently, make one flow for each scene.

## 3. Run a flow when an overlay is shown or hidden

**OBS overlay shown/hidden** runs when one of your overlays appears on screen in OBS or goes away: for example to turn a webcam border off when your BRB overlay shows. It uses the overlay's own Browser Source, so it works for every overlay you have open in OBS, not only one.

1. Add **OBS overlay shown/hidden** as the trigger of a new flow.
2. In **Overlay**, type the overlay's name as it appears under **Overlays** (a custom overlay's name works too), in any case. Leave it empty to run for every overlay.
3. In **Run when it is**, pick **Shown**, **Hidden** or **Shown or hidden**.
4. Add your steps. `$(overlay)` is the overlay's name and `$(state)` is `shown` or `hidden`, so `$(overlay) is now $(state)` reads naturally in a message.

A flow only runs when the overlay is shown or hidden, and only once Bloopbot knows how it was before. OBS says nothing about an overlay until you first show or hide it, so the first show or hide after OBS starts, or after you add the source, does not run the flow; every one after it does. Refreshing the source does not run it either, and the next time you show or hide the overlay it runs as usual.

- **Shown includes Studio Mode's Preview.** With Studio Mode on, an overlay counts as shown as soon as its scene is in **Preview**, before you transition it on air, so a flow set to **Shown** can run before viewers see the overlay.
- **Keep Shutdown source when not visible unticked.** With **Shutdown source when not visible** ticked, OBS closes the overlay each time it is hidden and opens it fresh each time it is shown, so Bloopbot never sees it change and this trigger never runs, shown or hidden.
- **Alerts in several scenes.** Leaving the setting unticked does not make alerts play twice: Bloopbot plays an alert only in the copies of an overlay that OBS is showing, and holds it while they are all hidden ([alerts in more than one scene](https://bloopbot.com/docs/alerts#several-scenes)). An overlay that still has it ticked cannot be watched by this trigger.

## 4. Use the scene in a message

`$(obs.scene)` is the scene OBS is on. Use it in any text field of any flow, not only flows that start from OBS: for example, a command that answers what you are doing.

1. Make a **Chat command** flow with the command `!scene`.
2. Add a **Send a chat message** action with the text `We're on the $(obs.scene) scene right now.`
3. Open the **Insert…** menu under the text box and look under **Your OBS** to add the token without typing it.

The variable is read when the flow starts. It is empty, never the words `$(obs.scene)`, when no overlay is open in OBS, or before OBS has told Bloopbot which scene it is on (see the permissions below).

In a flow that starts from **OBS changed scene**, `$(scene)` is the scene it changed to. `$(obs.scene)` is the same scene in that run, because Bloopbot notes the new scene before the flow starts.

## 5. Make OBS do something

These actions make OBS act from any flow. Each needs the overlay's **Page permissions** raised in OBS first, as the table in [Page permissions](https://bloopbot.com/docs/control-obs-from-flows#permissions) shows.

| Action | What it does |
| --- | --- |
| **Switch OBS scene** | Switches OBS to the scene you pick. The step waits up to 5 seconds for OBS to show the scene. |
| **Set OBS transition** | Sets the transition OBS uses for the next scene switches, such as **Cut** or **Fade**. |
| **Save OBS replay** | Saves the last moments from OBS's replay buffer as a clip on your computer. It waits up to 5 seconds for OBS to save it. The replay buffer must be running: if OBS says it is off, the step fails straight away without asking OBS. |
| **Start OBS replay buffer** | Starts the replay buffer, so **Save OBS replay** has something to save. |
| **Stop OBS replay buffer** | Stops the replay buffer. |
| **Start OBS recording** | Starts recording, as OBS's **Start Recording** button does. |
| **Stop OBS recording** | Stops the recording. |
| **Pause OBS recording** | Pauses the recording; **Resume OBS recording** carries on in the same file. |
| **Resume OBS recording** | Resumes a paused recording. |
| **Start OBS stream** | Starts streaming, with no confirmation box. |
| **Stop OBS stream** | Ends your stream, with no confirmation box. |
| **Start OBS virtual cam** | Starts OBS's virtual camera. |
| **Stop OBS virtual cam** | Stops OBS's virtual camera. |

**Switch OBS scene** and **Set OBS transition** offer the scenes and transitions OBS reported in a list. If the list shows a text box instead, type the name as OBS shows it; capitals do not matter. The other actions have nothing to set.

A scene switch usually shows in OBS within about half a second of the step starting, once the overlay has **Advanced access to OBS**. Every action other than **Switch OBS scene** and **Save OBS replay** counts as done once OBS has been told, after about a second. OBS does not confirm the others, so look at OBS to check them the first time.

Only one **Switch OBS scene** and one **Save OBS replay** wait for OBS at a time on your channel, counting flows your viewers can start apart from your own. If another of the same step from the same kind of flow is still waiting, the step fails at once with _OBS is still busy_, rather than queueing, so a reward that viewers redeem many times in a row cannot pile up. Your viewers' flows never make your own Stream Deck button or mods-only command fail this way. A switch or replay usually finishes in well under a second, so this only happens when OBS is slow to answer.

**Test fire** never reaches OBS: the **Run log** says what the step would do, and nothing changes in OBS. To check a step for real, run the flow from its real trigger, or add a **Run button** trigger and press **Run**.

## 6. Switch to BRB from chat, mods only

This flow lets you and your moderators type `!brb` to switch OBS to your **BRB** scene.

1. In OBS, open the properties of the Browser Source that shows your Bloopbot overlay, set **Page permissions** to **Advanced access to OBS (Change scenes, Start/Stop replay buffer, etc.)**, and press **OK**.
2. In Bloopbot, open **Flows**, press **+ New flow**, then **Start blank**.
3. Add a **Chat command** trigger and type `brb` as its command.
4. Add a **Who can trigger** check, set **At least** to **Moderators and up**, and connect the trigger to it.
5. Add **Switch OBS scene**, pick **BRB** in **Scene**, and connect the check's passing path to it.
6. Add a **Send a chat message** action, type `Could not switch: `, then add **Why it failed** from the **Insert…** menu under the text box. Connect the **error** output of **Switch OBS scene** to it.
7. Name the flow, press **Save**, then turn it on.
8. Type `!brb` in your chat. OBS switches to **BRB**, and the flow's **Run log** shows _OBS switched to BRB_.

If OBS does not switch, the chat message and the **Run log** say why: see [If an OBS step fails](https://bloopbot.com/docs/control-obs-from-flows#step-fails).

## 7. Page permissions and more than one OBS

Each Browser Source has a **Page permissions** setting in its properties in OBS. It decides what the overlay page may read and do in OBS, and only you can change it there. Its default, **Read access to OBS status information**, is enough for every trigger on this page but for none of the actions. To raise it:

1. In OBS, right-click the Browser Source that shows your Bloopbot overlay and choose **Properties**.
2. Scroll down to **Page permissions** and open the list.
3. Pick the level the table below gives for the actions you want, then press **OK**.

![A Browser Source's properties in OBS with the Page permissions list open. Its six options read No access to OBS, Read access to OBS status information, Read access to user information (current Scene Collection, Transitions), Basic access to OBS (Save replay buffer, etc.), Advanced access to OBS (Change scenes, Start/Stop replay buffer, etc.), ticked, and Full access to OBS (Start/Stop streaming without warning, etc.).](https://bloopbot.com/docs/screenshots/obs-page-permissions.jpg)

_OBS's Browser Source properties with the Page permissions list open: the six levels from No access to OBS up to Full access to OBS, with Advanced access to OBS ticked._

The table gives each option's full text as the dropdown shows it; elsewhere this guide uses the part before the brackets.

| To use | Set Page permissions to at least |
| --- | --- |
| Every OBS trigger | **Read access to OBS status information** (the default) |
| The scene list in the pickers, and `$(obs.scene)` before the first change | **Read access to user information (current Scene Collection, Transitions)** |
| **Save OBS replay** | **Basic access to OBS (Save replay buffer, etc.)** |
| **Switch OBS scene**, **Set OBS transition**, **Start OBS replay buffer**, **Stop OBS replay buffer** | **Advanced access to OBS (Change scenes, Start/Stop replay buffer, etc.)** |
| Recording, streaming and the virtual camera actions | **Full access to OBS (Start/Stop streaming without warning, etc.)** |

In the flow editor, select an OBS action step and it tells you when the overlay open in OBS has too little: _Your OBS source allows Read access to OBS status information — set Page permissions to Advanced access to OBS_. Change the setting in OBS and select the step again (or come back to the editor tab), and the warning goes away. If no overlay is open in OBS, the step only notes that and says what level it needs, since there is nothing to check.

Each setting includes the ones above it. Give the overlay only the level your flows need: at **Full access to OBS**, any flow that can reach the stream actions can start or end your stream.

- **What you will see.** At **Advanced access to OBS**, a flow that runs **Switch OBS scene** moves OBS to the scene in about half a second. At **Read access to OBS status information** the same step fails and the **Run log** says _Your overlay in OBS may not switch scenes_ with the level it has and the one it needs; raise the setting and run the flow again.
- **Changing a source's settings is safe.** When you change a Browser Source's properties, including **Page permissions**, OBS rebuilds the source, and the link to Bloopbot picks up again by itself within a few seconds. You do not need to restart OBS or touch the flow.
- **Treat the overlay's URL like a password.** The URL of an overlay also lets whoever holds it open that page and report OBS events, or act as your OBS link, so do not share it or show it on stream. Making a new URL for the overlay ([Make a new OBS URL…](https://bloopbot.com/docs/widgets-in-obs#obs)) stops the old one working.
- **Scene names.** At a level below **Read access to user information**, scene changes still start flows and still say which scene, but the pickers are text boxes and `$(obs.scene)` is empty until the first change.
- **Two sources, or two computers.** For scenes, streaming, recording, replays, the virtual camera and every action, Bloopbot uses one overlay page in OBS at a time: the one with the highest Page permissions, and the first one to report among equals. Another page takes over when the first falls silent. A second OBS, such as one on a second computer, is ignored while the first one is open, unless its overlay has the higher Page permissions. **OBS overlay shown/hidden** hears every overlay open in OBS.

## 8. Who can start or stop your stream

**Start OBS stream**, **Stop OBS stream**, **Stop OBS recording**, **Start OBS virtual cam** and **Stop OBS virtual cam** never run in a flow that your viewers can set off, so nobody in chat can start or end your stream or turn your camera on. To go live from a flow, start it from a mods-only command, a **Stream Deck button**, a control panel, a timer or one of the OBS triggers.

- **Viewers can set off** a flow that starts from a follow, a sub or gift sub, bits, a Power-up, a channel points reward, a raid, a hype train, a poll, a prediction, a goal, a giveaway, a store purchase, a video request, the jar, the Stream Boss, a ban or timeout, or the moderation filters.
- **Another flow's step counts too.** A flow that starts when a variable changes, a countdown ends, the credits finish, a wheel lands or viewers are pulled from your queue counts as one viewers can set off, because a viewer's flow may have caused it.
- **Chat commands and keywords** count unless a **Who can trigger** check set to **Moderators and up** or **Broadcaster only** stands between the trigger and the step, with the step on its passing path. It is about the flow, not the person: a moderator typing a command anyone may use is refused too.
- **These are fine:** mods-only commands, **Stream Deck button**, the **Run button** trigger (which your control panels use), **On a web request**, **On a timer**, **From your schedule**, **Stream starts or ends**, **Stream info changes**, **Ad break starts**, **Shield mode on or off**, **VIP added or removed**, **Mod added or removed**, and the OBS triggers, apart from the case below.
- **An event right after a viewer's flow counts as theirs.** A flow that viewers can set off may switch your scenes, save replays, start a recording, change your title or category, run an ad, turn Shield mode on or make someone a VIP or a moderator, and OBS or Twitch then reports what happened. For a short time after it does, the trigger that report starts counts as one viewers can set off: every OBS trigger for 10 seconds after any OBS step; **Stream info changes** for 15 seconds after **Set title or category**; **Ad break starts** for 10 seconds after **Run a commercial**; **Shield mode on or off** for 10 seconds after **Shield mode**; **VIP added or removed** and **Mod added or removed** for 15 seconds after **VIP** or **Moderator**.
- **So a viewer cannot reach a stop through another trigger.** A viewer's **Switch OBS scene** to **Ending** cannot end your stream through an **OBS changed scene** flow that stops it, and a viewer's new title cannot stop your recording through a **Stream info changes** flow. Bloopbot cannot tell what caused an event, so the same change made by you in that time counts too: make it again a moment later. With no viewer's flow before it, every such event is yours.
- **A bot that repeats chat counts as a moderator.** Another bot that is a moderator in your channel, such as Nightbot or StreamElements, and repeats what a viewer typed counts as a moderator, so it can run a mods-only command. Don't let such a bot echo viewer text that starts with your command prefix.
- **A web request is always yours.** **On a web request** counts as yours whoever calls its address: you, a tipping service such as Ko-fi, or another flow's web request step. Anyone you give the address to, and anything a tip can set off, can therefore stop your stream through it, so keep stream-stopping steps out of flows that tips or other services start. The same goes for two things a viewer's flow can do: call one of your control panels' links from a web request step (it presses that panel's button as you), or turn on a timer or schedule flow with **Turn a flow on or off**. Both count as yours, so keep stream-stopping steps out of those flows too.

When you save such a flow, the editor warns you on the step: its card says _Won’t run when viewers start it_, and selecting it shows why and what to use instead. **Test fire** shows the step refused. In a real run, the step fails with _Viewers can start this flow, so it may not start or stop your stream, stop your recording, or turn the virtual camera on or off_ in the **Run log**, or, after a viewer's flow set the event off, _A viewer's flow set off the event this run started on a moment before_. Switching scenes, saving replays and starting a recording are not limited.

## If a flow does not run

- **Check the overlay is open in OBS.** The overlay's Browser Source must be in your scene collection and not shut down; an overlay open only in a normal browser tab is not OBS.
- **Refresh the source.** Right-click the Browser Source and choose **Refresh**, or press **Refresh** in its properties, then change scene again.
- **Check the scene's name.** In **Only when it changes to**, a scene that does not exist in OBS any more is listed as **not in OBS now**. Pick the scene again or retype it.
- **Use Test fire** on the flow. If the test works and the real scene change does not, the flow is fine and Bloopbot is not hearing OBS: check the two points above.
- **Expect no run for another scene.** A flow with **Only when it changes to** set starts no run at all when you change to a different scene, so nothing appears in its Run log. That is what the setting is for.

## If an OBS step fails

A failed OBS step takes its **error** output, and the **Run log** shows why on the step. With nothing connected to **error**, the steps after it do not run. The step's **Why it failed** value in the **Insert…** menu holds the same reason, so a chat message can say it.

- **OBS is not connected.** No Bloopbot overlay is open in OBS. Open one as a Browser Source and keep it running.
- **Your overlay in OBS may not …** The overlay's **Page permissions** are too low for that action. The message names the level it has and the one it needs; change it in the Browser Source's properties.
- **OBS refused to …** OBS's own check said no, usually because the Page permissions were lowered a moment ago. Check the setting again.
- **OBS has no scene called …** The scene was renamed or deleted in OBS. Pick it again in **Scene**.
- **OBS did not switch to … within 5 seconds.** OBS was busy, or the overlay page stopped hearing it. Refresh the Browser Source and try again.
- **OBS's replay buffer is not running.** OBS says its replay buffer is off, so there is nothing to save. Start it in OBS, or add **Start OBS replay buffer** to a flow that runs first.
- **OBS did not save a replay within 5 seconds.** The replay buffer stopped a moment ago, or OBS was busy. Check the replay buffer is running and try again.
- **OBS is still busy with another scene switch (or replay) …** Another flow's **Switch OBS scene** (or **Save OBS replay**) of the same kind, yours or your viewers', was still waiting for OBS. Try again in a moment, or space out what starts them.
- **This version of OBS cannot …** Your OBS is older than that action. Update OBS.
- **Viewers can start this flow …** See [Who can start or stop your stream](https://bloopbot.com/docs/control-obs-from-flows#viewers).
- **Bloopbot could not note that a viewer's flow took this step …** A flow viewers can set off tried a step that sets off another trigger (an OBS step, a new title, an ad, Shield mode, a VIP or moderator change), and Bloopbot could not record that it was theirs, so it skipped the step rather than let a flow of yours act on it. Try again in a moment.
