A Stage is a transparent 1920×1080 web page you add to OBS as a Browser Source. It sits on top of your scoreboard or livestream and animates fired cues onto the broadcast. Multiple Stages can run side by side — one for the in-rink TV, one for the livestream, one for a podcast — and you address each one independently.
The three Stage URL types
Same Stage page, three ways to point it at content:
Game-specific Stage
URL: /showtime/{game_id}
Subscribes to one fixed game. Stays on that game forever. Best for testing, demos, or single-game setups where you don't need automatic advance.
Location-following Stage
URL: /showtime/location/{location_id}
Starts on the next game at the venue, and automatically advances to the next game when the current one completes. Best for tournament rinks where the same OBS source covers back-to-back games — you set it up once at the start of the day and never touch it again.
The auto-advance hooks into the existing scoreboard game_complete event and respects the auto-cue hold time, so a Stars-of-the-Game cue fired on game completion plays through fully before the Stage moves on.
Free (podcast) Stage
URL: /showtime/free
Non-game Stage that subscribes to the league's free Pusher channel. Receives only cues fired from the Podcast Panel (/admin/showtime/podcast). Never sees rink-Panel traffic. Use this on a podcast/show OBS scene so your hosts can fire cues without ever risking blasting them onto a live rink scoreboard.
URL parameters — naming and protecting Stages
Append these query parameters to any Stage URL:
?as=name— gives the Stage a name. The operator's Target stage field on the Panel addresses Stages by this name. Use whatever names make sense for your setup:scoreboard,livestream,podcast,lower_third,rink1, etc.?protected=1— strict mode. The Stage accepts ONLY cues that explicitly name it. Untargeted broadcast cues (Target field blank on the Panel) are ignored. Use this on the in-rink scoreboard so an off-script podcaster firing untargeted cues never blasts onto live game audio/video.?debug=1— shows a small green debug badge at the bottom-left so you can confirm the Stage is connected to the right Pusher channel and see incoming cues live. Strip this for production.
You can combine them: ?as=scoreboard&protected=1 is the most common in-rink configuration.
How target routing actually works
Every cue payload carries a target string (set from the Panel's Target stage field). Every Stage decides whether to show it:
- Default Stage (no
?as=) — accepts cues with empty target. Ignores cues addressed to any name. - Named Stage (
?as=livestream) — accepts cues with empty target (broadcast) AND cues addressed to "livestream". - Protected named Stage (
?as=scoreboard&protected=1) — accepts ONLY cues addressed to "scoreboard". Ignores broadcasts and ignores cues addressed to anyone else.
The Panel's Clear and Panic buttons obey the same target rule. To force-clear a protected Stage, the operator types its name into Target first.
Adding a Stage to OBS — step by step
- In OBS, choose the scene that should carry the cues (your scoreboard scene, your livestream scene, etc.).
- Click + in Sources → Browser.
- Name it (e.g. "Showtime — Scoreboard").
- URL: paste your Stage URL. For the most common in-rink setup:
https://yourleague.hockeysyte.com/showtime/location/5?as=scoreboard&protected=1(replace 5 with your venue's location_id). - Width:
1920. Height:1080. - Tick Refresh browser when scene becomes active so OBS reconnects cleanly each time the scene goes live.
- Click OK.
- Layer the Stage above your scoreboard / overlay / camera sources, so cues sit on top.
Getting audio cues to play through your broadcast
By default, OBS browser source audio plays only locally on the OBS machine. To route Showtime's audio cues out to your broadcast/livestream:
- Right-click the Stage browser source → Properties.
- Scroll down and tick Control audio via OBS (label varies slightly by OBS version).
- Open Edit → Advanced Audio Properties.
- Find the Stage source and set Audio Monitoring to Monitor and Output.
Now goal horns, announcer cues, and the Player Spotlight TTS all flow into your stream.
Layering with your scoreboard
The Stage is fully transparent except where a cue is currently animating. You can stack it directly over an existing scoreboard / overlay / camera scene with no other adjustment. Within the Stage, cues use three layers:
- Fullscreen — fills the broadcast frame. For goal celebrations, sponsor "takeovers", Stars of the Game.
- Lower Third — a strip across the bottom. For lineup cards, announcer captions, player spotlights that shouldn't cover the scoreboard.
- Corner — a 520×300 box in the top-right. For small sponsor logos and stingers.
You don't need to add separate browser sources for each layer — one Stage source handles all three.
Useful Stage URLs by scenario
- In-rink scoreboard TV:
/showtime/location/5?as=scoreboard&protected=1 - Livestream broadcast:
/showtime/location/5?as=livestream - Podcast set:
/showtime/free?as=podcast - Testing during setup (any URL with
&debug=1appended):/showtime/708?as=scoreboard&debug=1
Troubleshooting
- Nothing happens when I fire a cue. Add
?debug=1to the Stage URL — the badge in the bottom-left shows what channel it connected to. Make sure the Panel's Target stage matches the Stage's?as=name (or both are blank/unset). - The cue plays locally on the OBS computer but not in the livestream. Audio monitoring isn't set to Output. See "Getting audio cues to play through your broadcast" above.
- Cues appear cropped or oddly positioned. The Stage is authored at native 1920×1080. Make sure your OBS canvas is 1920×1080 and the browser source isn't scaled.
- Stage stays on a finished game and doesn't advance. You're using
/showtime/{game_id}(game-specific). Switch to/showtime/location/{location_id}for auto-advance. - Protected scoreboard isn't receiving anything. The operator's Target stage field must exactly match the Stage's
?as=name. Names are case-sensitive and trimmed.
Comments
0 comments
Please sign in to leave a comment.