Skip to content

The Pyre.Stream desktop app

The desktop app is the production engine. It is not a companion to an OBS you install separately: it bundles and manages its own OBS Studio and its own ffmpeg, composites your scenes on your machine, and fans one encode out to every destination from your own network card. On the local fan out path your video bytes never touch a Pyre server at all.

The main window is not a local copy of the app. It loads the same web shell that pyre.stream serves, and the app ships no local pages of its own beyond a splash screen. Everything you see in that window, the sidebar, Stream Manager, the Studio, is exactly what a browser tab would show you, with one difference: the page can tell it is running inside the app, so the desktop only controls appear.

The consequence is the useful part. A fix we ship to pyre.stream is there the next time you open the window. You are not waiting on a client update for a dashboard change, and the app version only matters for the parts that are genuinely native.

Those parts are the ones worth knowing about:

  • The managed OBS, and the scenes it renders.
  • The local RTMP listener your encoder publishes into, and the one ffmpeg process per destination that copies it out.
  • The delay, which is written to your own disk while it runs.
  • The IRL switcher, which merges a phone and a local encoder.
  • The tray icon, Streamer Mode, the quit guard and the updater.
  • Reading your OBS folder, for the scene import.
  • Reading whatever is playing on your machine, for the now playing card.
  • Watching your game, so Ad Manager can put a break between matches instead of into one.
  1. Go to pyre.stream/downloads. The page detects your platform and offers the right build first, with the other one linked underneath.

  2. On Windows, run the installer. Windows may still show a blue Windows protected your PC screen on the first launch. The installer is code signed, so this is a brand new application building reputation rather than a warning about the file. Choose More info, then Run anyway.

  3. On macOS, open the app. The Mac build is for Apple Silicon (M1 or newer). It is signed with an Apple Developer ID and notarized, so it opens with no Gatekeeper prompt.

  4. Sign in. Once you are signed in the app registers itself as one of your inputs, so it appears on the Sources page as a Computer without you adding anything. See Sources and devices.

There is also a Microsoft Store package of the Windows app. It is the same application, packaged as MSIX, with two differences that follow from how the Store works: the Store owns its updates rather than the app’s own updater, and launch at login is a Windows setting rather than a tray checkbox, because the install directory is read only and MSIX ignores the registry key the tray toggle would write.

The app lives in the system tray while it runs. Right click the icon for:

  • Pyre.Stream Desktop v<version>, which is not clickable. This is the version actually running, and it is the number to quote in a bug report. Windows’ own Installed Apps list can lag behind an auto update.
  • Show Pyre.Stream, which brings the main window back.
  • Open Streamer Mode, described below.
  • Stop Broadcast, which ends the fan out. It is only selectable while you are live, and reads Stop Broadcast (not live) the rest of the time rather than offering you a button that would do nothing.
  • Start Pyre.Stream with Windows, or Start Pyre.Stream at Login on macOS. When it is on, the app starts hidden in the tray at login, ready to stream.
  • Run studio (OBS) at launch, which is on by default. It brings your managed OBS up when the app starts, so your studio is warm and preview ready before you touch anything. It never starts a broadcast. Unticking it applies to the next launch: it does not close a studio that is already running.
  • Quit Pyre.Stream Desktop.

Hovering the icon tells you the state without opening anything. It reads Pyre.Stream — Ready (waiting for OBS) before a stream, and while you are live it carries the elapsed time and the current bitrate.

Closing the window does not quit the app. It hides to the tray, and everything that matters keeps running, including a broadcast that is on air. That is deliberate, and it is the single most surprising thing about the app, so it is worth saying plainly: the X button hides, and Quit Pyre.Stream Desktop is the only thing that actually closes it.

Streamer Mode is a second, smaller window holding a compact broadcast console: your program preview, the live bar, and your input devices. It is sized to sit beside a game rather than fill a screen.

Open it from Open Streamer Mode in the tray, from View ▸ Streamer Mode in the menu bar, or with Ctrl + Shift + S (Cmd + Shift + S on macOS).

It is a top level window rather than a child of the main one, which is deliberate: it minimizes to the taskbar and restores on its own, like any other window, instead of collapsing into a sliver whenever the main window moves.

Most of the dashboard works the same in a browser. These are the parts that need the app, and where each one is documented:

What the desktop app addsGuide
Desktop Studio, the live view of the OBS running right now, editable rather than read onlyThe Studio and your scenes
Importing the scenes you already have in OBS, because only the app can read your OBS folderThe Studio and your scenes
Local fan out, and the stream modes that depend on itStream modes and Cloud Studio
Hosting a delay, which is written to your own diskAdd a delay mid stream
Program preview, OBS video settings and bonding link health in the cockpitThe Stream Manager
Local media capture and Fix it for me, so your stream hears the music you hearSet up music and song requests
Game detection, which is what lets ad breaks land between matches rather than in oneAd Manager

One rule follows from that list rather than from any single row: on the desktop app there is no Plain mode. The app always composites in its own managed OBS, so the compositing question is not asked, and a saved setting of Plain is raised rather than honoured. Stream modes has the full picture.

Ad Manager can only move an ad break into a gap if something tells it a gap is open, and reading your game is a thing only a program on your own machine can do. That reader is here, in the app, on Windows.

Four games report to the app themselves, and they need different amounts of you:

GameWhat it needs from you
CS2One restart of the game. The config is written for you.
Dota 2One restart of the game, plus a launch option you paste into Steam yourself.
FortniteNothing at all.
League of LegendsNothing at all.

Four more report nothing to anybody, so the app reads them from your own capture instead: Overwatch, Marvel Rivals, Dead by Daylight and Apex Legends. There is nothing to set up, the reading happens on this machine and the frames never leave it, and it asks one thing of you: play one match with the checker open so Pyre can confirm it reads your screen correctly. Game detection on screen covers those four, including everything on this page’s indicator that does not apply to them.

Alongside all of them the app keeps a local check of which game is running, so the right reader is armed the moment you start playing. That check never leaves your computer: it is used to arm a detector and to light the indicator, and it is not sent to Pyre.

Shortly after the app starts, it writes one small config file into every CS2 install it can find, which matters more than it sounds: a machine can carry more than one copy of a game folder, and the one Steam actually launches is not reliably the one a single guess would find. Each copy gets its own verdict, and one unwritable folder never stops the others.

Then one thing is yours:

Restart CS2 once so it picks up the new config.

The config is read when the game starts, so a running CS2 will not notice it. That notice only appears when a file actually changed, so you are not asked to restart your game every time you open Pyre.

CS2 needs no launch option. The config alone turns reporting on.

Dota gets the same config, in its own folder, which Pyre creates if it is not there yet. Same restart:

Restart Dota 2 once so it picks up the new config.

Dota also needs a launch option, and this one is your click. The app hands you the exact string:

  1. In Steam, right click Dota 2 and choose Properties.

  2. Find the Launch Options box on the General tab.

  3. Paste -gamestateintegration into it. Keep anything that is already in there.

  4. Close the box, then start Dota 2.

Pyre will not edit Steam's settings for you, so this one is your click.

That is the reason, and it is not laziness. The launch option lives inside Steam’s own configuration file, not inside anything Pyre owns. An app that silently rewrites another application’s settings is an app you cannot trust with the rest, so Pyre writes its own config file and stops there.

Nothing to set up, and nothing to restart. Fortnite writes a log while it runs, and the app reads the new lines of it as they arrive, where Windows normally keeps it.

Nothing to set up either, and this one is the simplest of the four. The League client already talks to itself while it is open, and the app listens in on that same local conversation to know which part of a game you are in. There is nothing to paste, no config file, and no launch option, so none of the Dota 2 steps above apply here.

That conversation never leaves your machine, and Pyre only ever listens. It asks the client which phase you are in, it writes nothing back, and it reads nothing about anybody else in your game.

The one thing worth knowing: Pyre reads the client, not the match. It knows a game started and it knows a game ended, which is exactly what an ad break needs, but it cannot see what is happening inside the match. That is why the death and spectate moment stays off for League, and the settings card says so on the moment itself.

The indicator answers one question: is your game actually reporting to Pyre right now? It has to, because a config the game cannot read, a config written where the game is not looking, and no config at all all fail the same silent way. The game simply never reports, and without an indicator everything else would look healthy.

It saysWhat that means
Connected. Your game is reporting to Pyre.Working. Nothing to do.
Waiting for your game. Start it and Pyre will pick it up.Set up correctly, game not running yet.
Your game stopped reporting to Pyre. It may have closed, or its config may have been replaced.It was working and went quiet.
No supported Steam games on this machine. Fortnite and future games do not need this.Not a problem. This is most machines.
Pyre is listening, but it could not set up any of your games to report.A real failure. See below.
Pyre is not listening for your game right now.The reader is not running.

Fortnite has its own three, since it is a different mechanism: Connected. Pyre is reading Fortnite's log., Waiting for Fortnite. Start it and Pyre will pick it up., and Pyre could not find Fortnite's log file where Windows normally keeps it., which is what a relocated or redirected Windows profile looks like.

League has its own set too, since it talks to your game client rather than reading a file:

It saysWhat that means
Connected. Pyre is reading League of Legends from your game client.Working. Nothing to do.
Waiting for your League client. Open League of Legends and Pyre will pick it up.Set up correctly, client not open yet.
Pyre found your League client and is connecting to it.A moment in passing, on its way to connected.
Pyre is not watching League of Legends yet. It starts when it sees the game running.The reader is not armed. Start League and it will be.
Pyre did not accept the security certificate your League client offered, so it did not connect. This one needs an update from us.The only one here you cannot fix. Tell us, and it takes an app update.
  1. If it says it is waiting and your game is open, restart the game once. The config is read at startup, so a game that was already running when Pyre set it up has not seen it.

  2. On Dota 2, check the launch option. The config alone is not enough for Dota, and the indicator cannot tell a missing launch option from a game you have not started.

  3. If setup itself failed, the app names which of the three ways it went wrong: Pyre found {game} but could not write into its folder. That is usually a permissions problem on that drive. is the common one, and Pyre set up {game} in one place but not another. If it still does not report, the copy Steam actually runs may be the one that refused. is the duplicate folder case.

  4. If nothing can listen at all, something else on the machine has taken the port the game reports to: Another program on this machine is already using the port your game reports to, so Pyre cannot listen for it. Close it and restart Pyre.

The app can run a stream from a phone and a local encoder at the same time. Your phone publishes as one input and your own OBS publishes as the other, and the app switches between them locally, which is why this is a desktop feature rather than something the cloud does for you. The phone side arms itself for the whole session: you press Go Live on the phone and it attaches, with nothing to enable on this end. When an input drops, the other one carries the stream. When both drop, the app holds a branded Connection Lost card on air for a grace window, five minutes by default, and ends the broadcast only if nothing has come back by then. The card is the same idea as the reconnect card on the cloud path, so Continuity and failover is the guide for what viewers see.

Ending a stream that has a delay running plays the remaining footage out, so your viewers get your ending. Quitting the app during that drain would cut them off, so it is the one destructive thing here that the app stops and asks about. The dialog is titled Your viewers are still watching and says:

Pyre is still sending the last of your delayed stream.

Closing Pyre now cuts your viewers off before the ending they are still watching. Keep it open for a few more seconds, or cut now and end immediately.

Keep sending is the default and returns you to the app. Cut now and quit does exactly what it says, and it is spelled out rather than hidden behind the default button. See Add a delay mid stream.

The app checks for a new version a few seconds after it starts and every four hours after that, and downloads the update in the background.

It will not interrupt a live broadcast. If a stream is running when an update finishes downloading, the prompt is held back and re-checked every five minutes until you are idle. Only then do you see it:

Update ready

Pyre.Stream 0.0.28 is ready to install.

Pyre.Stream will restart to apply the update and reopen automatically.

Restart now applies it immediately. Later costs you nothing: the update is already downloaded and installs the next time you quit the app, so a version you deferred is not a version you lost.

The Microsoft Store build is excluded from all of this by design. The Store owns its updates, and the app never checks a feed of its own there.

  1. If an update seems stuck, check the tray menu’s top line first. That is the version genuinely running, and it settles the question faster than Installed Apps does.

  2. If you keep seeing the prompt after a restart, quit from the tray rather than closing the window, so the deferred install actually runs.