Getting started

Install on macOS

The macOS release is a stream-concern.app bundle, distributed inside a disk image. Each release comes as three DMGs; they hold the same app and differ only in which Mac processors they contain code for:

DMG Runs on Pick it when
StreamConcern-<version>-macos-universal-<build>.dmg every supported Mac (Apple Silicon and Intel) you are not sure; this is the one the download page recommends
StreamConcern-<version>-macos-arm64-<build>.dmg Apple Silicon (M1 and later) only you know your Mac has Apple Silicon and want the smaller download
StreamConcern-<version>-macos-x86_64-<build>.dmg Intel Macs only you know your Mac has an Intel processor and want the smaller download

To check your Mac, open > About This Mac: a “Chip” line naming Apple M1 or later means Apple Silicon, a “Processor” line naming Intel means Intel. All three need macOS 14 or later. To install:

  1. Open the .dmg. It contains stream-concern.app and an /Applications symlink.
  2. Drag stream-concern.app onto the /Applications folder.
  3. Launch it from Applications.

The bundle carries its own FFmpeg libraries in Contents/Frameworks, so no system FFmpeg is required. The software H.264 encoder (OpenH264) needs a one-time download from Cisco in Settings ▸ OpenH264; the hardware encoders work without it. A build produced without Apple Developer ID credentials is only ad-hoc signed (fine for local use, not for redistribution); a distributed build is Developer ID signed and notarised. See ../release.md for how the bundle is built and signed, and for the “bring your own FFmpeg” re-signing caveat.

If you build from source instead of installing the DMG, follow the build steps in the top-level README.md (cargo run).

Install on Windows

Each Windows build comes in two forms with the same files inside:

File Pick it when
stream-concern-<version>-windows-x86_64-<build>-setup.msi the normal install; the virtual camera works with no extra step
stream-concern-<version>-windows-x86_64-<build>.zip you want a portable copy of the native Windows app you can run from any folder without installing
stream-concern-egui-<version>-windows-x86_64-<build>.zip you want a portable copy of the egui app

The installer puts both apps on the PC: stream-concern (the native Windows app) and stream-concern (egui). They share your settings and scenes, and one runs at a time. All of them need 64-bit Windows 11 (Windows 10 runs the apps but has no virtual camera); the Microsoft Visual C++ runtime is included.

Installer. Double-click the .msi, accept the licence and click Install; Windows asks for administrator approval once. It installs to C:\Program Files\stream-concern\, registers the stream-concern Virtual Camera for every user of the PC, and adds stream-concern and stream-concern (egui) to the Start menu and to Settings > Apps > Installed apps. Installing a newer build replaces the old one in place. Uninstall from Installed apps (or run the same .msi again and choose Remove): it unregisters the camera and removes the program folder. Your settings, scenes, profiles and logs live in %APPDATA%\stream-concern and are never touched by installing, upgrading or uninstalling. For an unattended install run msiexec /i stream-concern-<version>-windows-x86_64-<build>-setup.msi /quiet from an administrator prompt (msiexec /x <same file> /quiet removes it).

Portable ZIP. Extract the whole ZIP to a writable folder, keep every DLL beside stream-concern.exe (or stream-concern-egui.exe in the egui ZIP), and run it. The ZIP does not register the virtual camera: to use it, run once from an administrator PowerShell in that folder powershell -ExecutionPolicy Bypass -File .\scripts\vcam\build-windows.ps1 -Register (skip this if the installer is also on the machine).

Signature. A signed build’s installer and stream-concern.exe show the publisher in Properties > Digital Signatures; a test build without signing shows “Unknown publisher” and SmartScreen’s “Windows protected your PC” (choose More info > Run anyway). SmartScreen can still show that screen for a signed build while the publisher is new. How the build is signed and how to check a download: ../release/windows-signing.md.

Install on Linux

Build a release binary, then install it for the current desktop user:

cargo build --release
scripts/release/install-linux.sh
gtk-launch com.surlysoft.stream-concern.egui

The installer puts the binary in ~/.local/bin and installs the matching com.surlysoft.stream-concern.egui.desktop entry and icon under $XDG_DATA_HOME (normally ~/.local/share). It also installs the built FFmpeg shared libraries at the location encoded in the binary’s runpath. The software H.264 encoder (OpenH264) needs a one-time download from Cisco in Settings ▸ OpenH264. Launch from the desktop menu or with gtk-launch. On portals that support the host-application Registry API, the app also registers com.surlysoft.stream-concern.egui on its portal D-Bus connection before making portal requests, as required by the XDG Registry API. The first screen or window capture still shows the portal picker. The app stores the approved restore token locally and asks again only when the portal reports that stored selection was rejected.

The egui app used com.surlysoft.stream-concern before 2026-09-30 (that id now belongs to the default Linux app). The portal ties saved screen-capture grants to the app id, so after updating, each saved screen or window source shows the portal picker once more; the new choice is saved under the new id. Remove an old ~/.local/share/applications/com.surlysoft.stream-concern.desktop left by an earlier install if the menu shows two entries.

First launch

The window opens with:

  • a custom title bar at the top,
  • the Scenes panel on the left (toggle it from View ▸ Sources),
  • the Controls panel on the right (toggle it from View ▸ Controls),
  • the Mixer panel across the bottom,
  • the status bar at the very bottom, and
  • the composited canvas preview filling the centre.

On first run the program scene shows the built-in Test pattern — a source that needs no hardware and no permission — so you see a live picture immediately. Build your scene from there with the Add source pull-down (see Sources) — beyond screens and cameras it also adds media files, images, text overlays, an incoming RTMP Server, and Syphon/NDI interchange sources. Switch between scenes with a cut or a blend using transitions, and send the result to one or more destinations from Outputs.

The set-up wizard

On the first launch, before you have built any scenes, the Set-up wizard opens over the main window. It asks, one page at a time:

  1. What do you want to do? Stream games, stream your desktop, record, or use the picture as a camera source (the virtual camera, NDI). Pick any number.
  2. Streaming services (only when you chose streaming): tick the services you use and paste each one’s stream key. The key is saved with the service’s account in Settings ▸ Streaming Services and is never shown again. Signing in with your Twitch, YouTube, Kick or Restream account instead of pasting a key comes with connected accounts; the Sign in… button marks where it will go.
  3. Outputs: a stream output for each service, a recording when you chose Record (its format is picked for what you do and the encoders your computer has: HEVC for games when your graphics hardware has it, ProRes on a Mac when you only record), and the virtual camera and an NDI sender when you chose camera source. Untick any you do not want.
  4. Starter scenes: named scenes for what you chose, such as Gameplay (a Game Capture placeholder, your camera and a chat overlay slot), Desktop (your display, camera and chat) and Starting soon. When you already have scenes the wizard offers to add these beside them; it never replaces or deletes a scene.

Finish sets everything up and lists what was done and where to change it. Skip leaves a page’s part out, and Close leaves the wizard without changing anything; it then does not open by itself again. Run it any time from Help ▸ Set-up wizard….

After the wizard, point the Game Capture placeholder at your game (select the layer, then Add input ▸ Game Capture) and paste your chat’s URL into the chat overlay.

Permissions macOS asks for

macOS gates capture behind per-app permissions. stream-concern needs these grants, all under System Settings ▸ Privacy & Security:

You want to… Permission Where
Capture a display, window or region Screen Recording (listed as Screen & System Audio Recording on newer macOS) Privacy & Security ▸ Screen Recording
Capture desktop or per-application audio The same Screen & System Audio Recording grant Privacy & Security ▸ Screen & System Audio Recording
Capture a webcam or capture card Camera Privacy & Security ▸ Camera
Record from a microphone Microphone Privacy & Security ▸ Microphone

Notes on how the app behaves:

  • Screen Recording must be granted before capture, and macOS only applies the grant at launch. If you enable Screen Recording while the app is running, fully quit and reopen it. When the grant is missing, adding a display or window fails with a message that says exactly this.
  • Camera: when access is denied, the capture-properties panel shows “Camera access needed — grant it in System Settings › Privacy & Security › Camera, then reopen the app.”
  • Microphone: the default input opens when the app starts (it is always on the mixer), so macOS prompts for microphone access at the first launch with an input selected. If it is unavailable or denied, the Microphone strip says so and recordings continue with the rest of the mix. You can also turn the microphone off (see Audio).
  • Desktop / application audio uses ScreenCaptureKit, which is covered by the Screen & System Audio Recording grant — the same one display capture uses. Without it the capture returns a permission error. (See ../testing/audio.md for the details.)

Where your files live

The app keeps its configuration and logs in the OS configuration directory:

Item macOS path
Configuration directory ~/Library/Application Support/stream-concern
Profile (all settings) ~/Library/Application Support/stream-concern/profile.toml
Scene collection ~/Library/Application Support/stream-concern/scenes.toml
Logs ~/Library/Application Support/stream-concern/logs/stream-concern.YYYY-MM-DD.log

On other platforms the configuration directory is %APPDATA%\stream-concern (Windows) or $XDG_CONFIG_HOME/stream-concern — falling back to ~/.config/stream-concern (Linux), with logs/ beneath it.

  • profile.toml holds every setting: the canvas video geometry, audio, outputs, encoder choices and the mixer. It is loaded once at startup and never re-read while the app draws. Your stream key is stored here and is redacted (<redacted>) anywhere the profile is logged.
  • scenes.toml is a sidecar that records your scenes and their layers, so they are rebuilt on next launch.
  • portal-restore-tokens.toml (Linux only) holds machine-local portal selection grants per capture instance. It is owner-readable only and is deliberately excluded from profiles and exported scene archives.
  • Logs rotate daily; the last 7 days are kept. The startup line prints the exact log path. Set SC_LOG_DIR to write logs elsewhere. See ../troubleshooting.md for raising verbosity with RUST_LOG and reading the logs.

Where recordings go

Recordings default to ~/Movies/stream-concern on macOS (~/Videos/stream-concern on other platforms), with the timestamped filename template %CCYY-%MM-%DD %hh-%mm-%ss. Both the folder and the template are configurable per recording output — see Recording.