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:
- Open the
.dmg. It containsstream-concern.appand an/Applicationssymlink. - Drag
stream-concern.apponto the/Applicationsfolder. - 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:
- 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.
- 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.
- 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.
- 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.mdfor 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.tomlholds 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.tomlis 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_DIRto write logs elsewhere. See../troubleshooting.mdfor raising verbosity withRUST_LOGand reading the logs.
Where recordings go
Recordings default to ~/Movies/stream-concern on macOS
(~/Videos/stream-concern on other platforms), with the OBS-style timestamped
filename template %CCYY-%MM-%DD %hh-%mm-%ss. Both the folder and the template
are configurable per recording output — see Recording.