Quick controls
audio —
Stop stream stops the fan-out at once and then asks whether to shut the server down now; declining keeps it up for a restart until the idle shutdown. Fix ingest, Mute ingest and the scene buttons work through OBS Remote, which connects on its own once the server's OBS is ready: Fix ingest restarts the OBS input reading the phone feed (a clean reconnect; NOALBS, the scenes and the stream are untouched), Mute ingest mutes the phone's audio in OBS for everyone watching (the preview's own mute only affects your speakers), and the scene buttons switch the program scene.
This service runs without a cloud-OBS provider (direct mode): the stream fans out straight from the phone ingest and there is no server to start.
The last provision or shutdown ended uncertainly: the worker may still exist and still cost money. It retries the cleanup every couple of minutes while the idle shutdown is enabled; Shut down server retries it now.
Idle shutdown counts only genuine use: streaming, control actions, the phone publishing, or you interacting with this page. A passive status view does not keep the server alive. The OBS row says whether the server's OBS is up and which scene is on the program, and how many times systemd has restarted it when it has. The Anti-drop switcher row is NOALBS on the server, the process that switches the scenes when the ingest drops: the server counts as ready and Start stream is allowed only while its unit is active. The Egress agent row is the fan-out process on the server: it reports every 2 seconds, so "silent" means the legs' health below is stale and the program readout is gone with it; "reports refused" names why this service rejects what it sends; "unit" is what systemd on the server says about its process.
Ingest connection
Not configured on this box yet — re-run bootstrap.sh to pick this up.
Paste the SRTLA or SRT URL into your phone's streaming app's SRT URL field — the app auto-splits it into its own URL/Stream ID fields for you, so there's no need to enter them separately. SRTLA additionally needs the app's Egress set to Bonded to actually combine multiple links; plain SRT ignores Egress. Leave Passphrase blank. RTMPS is the fallback for a client that can't do SRT (TLS-encrypted); plain RTMP is for compatibility with a client that can't do TLS either — it sends the credential in the clear.
Preflight — ingest & program
Destinations
| ID | Name | URL | Key | Max kbps | Video | Enabled | Health | |
|---|
Add or update a destination
The OBS program is encoded once, in H.264, and copied to every enabled destination, so the encoder bitrate is capped to the lowest ceiling declared among them. A changed ceiling reaches a running server on its next heartbeat (applied while the stream is off); Start stream waits until the server confirms it. Every leg runs on the server (the worker), never on this box. H.265 destinations are not available in this build: re-encoding a leg to HEVC on the server could not keep up with the program in real time and starved the program encode, so a destination already saved with H.265 is kept but never started (its Health says so, and saving it again switches it to the H.264 copy), and a new one is refused; durable HEVC delivery is tracked for a future release. Kick and most RTMP ingests take H.264 only.
SRT destinations: ffmpeg reads latency, rcvlatency and peerlatency in microseconds, while platform documentation and OBS quote milliseconds. A value copied straight from a platform's docs is a thousand times too small and the link drops under the first retransmission; the Health column flags one when it sees it.
Anti-Drop (NOALBS)
Applied to the worker when the server next starts; a running server keeps the settings it was started with.
OBS configuration
The worker saves its scene collection and profile back here periodically, at shutdown and before the server is destroyed; the next server start restores it. Resetting discards the saved copy and stops the running worker from saving its configuration back until the next server start.
Overlays
Browser-source overlays on the cloud OBS. The shared Overlays scene is kept as the top layer of every other scene, so a widget added there shows everywhere; pick a specific scene instead to show a widget on that scene only (for example a BRB-only clip reel). An image is added by its address the same way. Each overlay has the same settings as the Stream app's overlays: a size, the corner it is anchored to with an edge spacing from that corner (it stays in the corner when resized), custom CSS, and its own audio mute. Edit changes a listed overlay in place, so it can move to another corner or change size at any time; Hide keeps it in the scene without showing it, and the Layer column moves it up or down among that scene's layers. Overlays live in the saved OBS configuration and come back with the next server start.
| Scene | Name | Address | Size | Position | Layer | Audio | |
|---|
obs-websocket on the running server, through this service (it signs in for you; starting or stopping outputs, the stream service, the encoder profile and hotkeys are refused here — this service owns those). It connects on its own once the server's OBS is ready, which is what drives the Quick controls card's Fix ingest, ingest audio mute and scene buttons; Disconnect stops that until you connect again or the server restarts. Any obs-websocket v5 client can use the same endpoint at /v1/cloud-streaming/obs-remote with the owner secret as the bearer.
Request console