NOALBS: automatic scene switching for OBS, set up properly

Last updated: September 2026. NOALBS is not our project — it is open source, made by and for the IRL community. Version referenced: NOALBS v2.19.2.

Stream IRL for long enough and one evening your bitrate falls off a cliff mid-sentence while viewers watch a frozen face. NOALBS is the software that stops that: it watches the video actually arriving at your ingest server and, when it goes bad, tells OBS to change scene. When your signal returns, it changes back.

It is free, open source, and what most managed IRL services run underneath, ours included. This is the honest version: how it decides, the configuration that matters, and the mistakes that cost an evening.

What NOALBS is

NOALBS stands for Nginx OBS Automatic Low Bitrate Switching, and the name is a fossil: it began by reading the statistics of an nginx-rtmp server and today reads them from several kinds of ingest server. It is a single binary with a config file beside it, for Windows, macOS and Linux.

It is not a plugin and does not go inside OBS. It drives OBS from outside over obs-websocket, so it runs somewhere it can reach both your ingest server and your OBS — in practice, the same machine as OBS.

How it decides

The loop is simple, and understanding it is most of configuring it well:

  • It asks your ingest server how the stream is doing. Once a second it reads the statistics your media server publishes for the path you broadcast to: the bitrate arriving now and, over SRT, the round-trip time.
  • It compares that against your thresholds. A low threshold in kbps, an offline threshold below it, and optionally an RTT ceiling. A retry count decides how many consecutive bad readings it takes to act — which is what stops one tunnel from flipping your scene twice.
  • It tells OBS to switch, by name. Over obs-websocket, by the exact name you typed into the config. Not by index, not by a guess.
  • It comes back on its own. When the readings recover it returns to your normal scene. Often you only notice on the VOD.

What you need before you start

  • An ingest server that publishes statistics. The requirement people miss. NOALBS cannot read your bitrate from Twitch: it reads it from the server you publish to. No relay of your own, no NOALBS.
  • OBS with obs-websocket 5.x. Built into OBS 28 and newer, under Tools → WebSocket Server Settings. Enable it, set a password, note the port — 4455 by default. A retry count of around five is a sane start.
  • Three scenes, with their exact names. Normal, low and offline. The names in the config must match the names in OBS character for character.
  • Thresholds in kbps. Two numbers you cannot copy from anyone else: they depend on the bitrate you really stream at and how your connection fails.
  • Optionally, a Twitch bot account. Only for the chat commands. The switching works with no chat integration at all.

The three scenes

Build these in OBS first, with short names you will not rename later:

  • Normal. The stream as it should look: your feed, full size, with your overlay. Anything above the low threshold puts you here.
  • Low. The same feed, framed for a picture that has gone soft — smaller, cropped, or with a strip saying the connection is struggling. Nobody has to guess.
  • Offline. No live feed at all: a card, a loop, music. The difference between a rough patch and a dead broadcast.

Optional starting, ending, privacy and refresh scenes exist too. None are needed for bitrate switching, and adding them early gives you more names to get wrong.

The configuration that matters

NOALBS reads a config.json beside the binary. The field layout moves between releases — check the project's documentation for your version — but the shape of the decision is stable:

config.json
{
  "user": { "id": null, "name": "yourname", "passwordHash": null },
  "switcher": {
    "bitrateSwitcherEnabled": true,
    "onlySwitchWhenStreaming": true,
    "instantlySwitchOnRecover": true,
    "retryAttempts": 5,
    "triggers": { "low": 1200, "rtt": 2500, "offline": 400, "rttOffline": 4000 },
    "switchingScenes": { "normal": "LIVE", "low": "LOW", "offline": "BRB" },
    "streamServers": [
      {
        "streamServer": {
          "type": "Mediamtx",
          "statsUrl": "http://127.0.0.1:9997/v3/paths/get/live"
        },
        "name": "relay",
        "priority": 0,
        "enabled": true
      }
    ]
  },
  "software": {
    "type": "Obs",
    "host": "localhost",
    "port": 4455,
    "password": "your-obs-websocket-password"
  },
  "chat": null
}

Four fields decide everything:

  • switchingScenes. The three scene names, spelled exactly as OBS spells them. This is the field that silently breaks setups.
  • triggers. low drops you to the low scene, offline to the offline one. The RTT triggers only work over SRT: RTMP has no round-trip time to read.
  • retryAttempts. Roughly seconds, since the poll runs about once a second. Too low and every tunnel flips your scene; too high and viewers stare at a frozen picture first.
  • statsUrl. Your media server's statistics endpoint, ending in the path name you publish to. Get it wrong and NOALBS reports a stream that is offline forever, with no error to explain why.

Leave onlySwitchWhenStreaming on while you build, so NOALBS leaves your scenes alone until OBS is live. And keep the statistics endpoint on localhost: if OBS is on another machine, forward the port over SSH rather than opening it to the internet.

Getting the thresholds right

Guides usually hand you two numbers and wish you luck. The numbers depend on you, and there is one way to find them: stream a real walk, watch what the server reports, and set the thresholds against that. What your encoder is set to send is not what arrives — that difference is why NOALBS exists.

A method that works: stream twenty minutes on the route you actually use, note what the server reports while the picture still looks fine, then note it when it falls apart. Your low threshold goes between the two.

  • Set low against the floor, not your target. Send 6,000 kbps, set low to 5,500, and you spend the evening in your low scene. Put it where the picture stops being watchable — usually a long way below target.
  • Never set the offline trigger to zero. At zero it fires only when the bitrate is exactly nothing, so a stream limping along at 50 kbps of unwatchable slush never reaches your offline scene. Put it above zero, below your low threshold.
  • Tune the retries, not just the numbers. Most "it switches too much" complaints are a retry count of one or two, not a wrong threshold.
  • RTT is an SRT-only signal. Over SRT, a climbing round-trip time warns you before the bitrate does. Over RTMP the field does not exist.
  • Re-check them when anything changes. New encoder, new SIM, new city, new target bitrate: last season's numbers are not automatically right.

Chat commands on Twitch

With a Twitch bot account configured, NOALBS answers commands in your chat — which is what makes moderators useful while you walk down a street with a phone in one hand:

  • !fix, or !f. Refreshes the video source. The usual cure when the feed is stuck on a frozen frame even though the bitrate recovered.
  • !switch, or !ss. Forces a scene change, for when a human sees something the thresholds cannot.
  • !bitrate, or !b. Prints the current bitrate in chat, so your mods can see what is happening instead of asking you.

Who may run them is configurable: keep the lot to your moderators, or open the read-only one to everybody. The bot needs its own Twitch account and token.

The traps that cost people an evening

Almost every "NOALBS is not working" is one of these, and none produce a useful error message:

  • Scene names are case-sensitive. LIVE is not Live, and "Live " with a trailing space is a third thing. The config must match OBS character for character, emoji included.
  • Renaming a scene breaks it silently. Rename your offline scene in OBS and the switching stops that instant, with no warning. It is the most common reason a setup that worked last week does nothing tonight.
  • An offline trigger of zero. Fires only at exactly zero, so you reach your offline scene long after your viewers needed it.
  • The wrong stats URL or path name. Point it at a path nobody publishes to and NOALBS sees a permanently offline stream, holding you on the offline scene forever without saying why.
  • Nothing keeps the process alive. If NOALBS is not running, nothing switches and nothing tells you. Run it as a service that restarts itself.

What running it yourself actually involves

Installing NOALBS is an afternoon. Living with it is three commitments: an ingest server that stays up and keeps publishing statistics, a NOALBS process alive every time you go live, and a configuration in sync with an OBS you keep editing. Break one and the failure is silent — you find out on stream.

If you want the whole build, we wrote it out with the real commands: Running your own IRL relay on a VPS: what it really costs.

Or do not run it at all

On our plans there is nothing to install. We run the scene switching against our own ingest and you set it from the panel: your thresholds, your scenes and the offline card viewers get when a street goes bad. No config file, no process of yours to keep alive.

It is included rather than sold as an extra, because a relay without it shows your viewers a frozen face.

  • On every Cloud OBS plan. From €29 a month, driving the OBS we run for you, configured before you log in.
  • On the Stream Key plan too. €9 a month drives the OBS you already have: connect it to the panel and it gets the same switching, scenes and plugins untouched.
  • Not on Stream Key Lite. The €5 plan is the relay alone: one key, RTMP, SRT and SRTLA, no OBS control and no switching.
  • Chat commands on Twitch. The commands your moderators expect, on Twitch, with a Cloud OBS server.

And if you are weighing up letting someone else run the whole OBS rather than just the switching: Cloud OBS: an OBS Studio that runs on a server, not on your PC.

Scene switching covers a bad minute. For the drop that does not come back, there is a separate mechanism: Stream failover: staying on air when your connection drops.

Frequently asked questions

What does NOALBS stand for?

Nginx OBS Automatic Low Bitrate Switching. The nginx part is historical — it began by reading the statistics of an nginx-rtmp server and now works with several kinds of ingest server.

Is NOALBS free?

Yes. It is an open-source project from the IRL streaming community, free to download and run. What costs money is the ingest server it watches — a VPS you rent, or a service you subscribe to.

Does NOALBS work without a relay of my own?

No. It switches scenes on the bitrate arriving at an ingest server, so it needs a server that publishes those statistics and that it can reach. It cannot read anything useful out of Twitch.

Why is my scene not switching?

In order of likelihood: a scene name that does not match OBS exactly, a stats URL pointing at a path nobody publishes to, obs-websocket disabled or on another port, or NOALBS not actually running. None of those announce themselves.

What thresholds should I use?

There is no universal pair. Put the low threshold where your picture stops being watchable, often well under half your target bitrate, and the offline threshold above zero but below that.

Do I need NOALBS if I stream with Enhanced IRL?

No, and you could not install it on our servers anyway. Automatic scene switching is part of every Cloud OBS plan and of the Stream Key plan, set from the panel. Stream Key Lite does not include it.

The project

Useful even if you run it yourself

Written for our product, but the scene-switching and threshold parts apply to any setup:

Skip the hand-written JSON

Our config generator builds the file from a form, checks it for the mistakes that break switching silently, and hands you the .env the Twitch bot needs. It runs in your browser.

Open the NOALBS config generator

Scene switching without the config file

Included on the Stream Key plan and on every Cloud OBS plan, set from the panel. From €9 a month, cancel any time.

Create an account