Bitfrost FX — user manual
Everything you need to produce a broadcast: create scenes, control the scoreboard live, hook up your Stream Deck and more.
Getting started
Quick start: from sign-in to your first broadcast.
- Sign in via /auth (Google or email).
- Choose or create a workspace from the workspace picker in the top left.
- Invite teammates from Workspace settings if you're a team.
- Create scenes in the studio (the main view) — scoreboard, lower-third, ticker, lineup, or a custom scene.
- Open the control panel via the 'Control panel' button to operate the broadcast live.
- Add ONE URL to OBS: /overlay/program?workspace=YOUR_WORKSPACE_ID as a Browser Source. Anything you put live in the Program panel shows up there automatically.
Workspaces & roles
All content belongs to a workspace. You can belong to several.
- Admin: full control, can delete the workspace and invite/remove members.
- Editor: can create, edit and operate scenes and content.
- Viewer: can view scenes and the control panel, but can't change anything.
Invite from Workspace settings → Generate invite link. The link is valid for 7 days.
The studio (main view)
This is where you build and design your scenes.
- Scene list on the left: create, rename, duplicate, delete scenes.
- Canvas in the middle: live preview. Click a layer to select it, drag to move.
- Layer panel on the right: order, visibility, lock, styles and animations per layer.
- Bottom panel: media library, presets, scene settings.
Scoreboard
Score, clock, period and team names — all editable live.
Open the scoreboard block in the control panel to operate the match.
- Score: +/− buttons for home and away. Click the number to type an exact value.
- Clock: Start/Pause/Reset. Quick-adjust −10s, −1s, +1s, +10s. Quick presets 45:00 and 90:00.
- Period: type freely (1ST, 2ND, HT, FT) or use quick buttons.
- Teams: edit name and short name directly in the scoreboard block.
Lower-third
Name plates with a title and subtitle.
- Title (e.g. name) + subtitle (e.g. role).
- Show/hide with a single click — the animation runs automatically.
- Style is controlled in the layer panel in the studio (font, color, animation).
Ticker
Scrolling news bar at the bottom of the screen.
- Add or remove items in the list.
- Speed adjusted with a slider (or via Stream Deck).
- Clear the entire ticker with one click.
Lineup
Show starting elevens and player lists.
- Add teams and players under Workspace → Teams.
- Create a lineup scene and pick which team to display.
- Players are pulled in automatically based on order and shirt number.
Media library
Images, logos and videos to use in scenes.
- Upload via the media button in the bottom panel or directly when adding an image.
- Mark 'In library' to reuse it across multiple scenes.
- Files are stored per workspace.
Custom control panel in /program
Build a personal button surface below the scene list on the Program page — like a software Stream Deck.
Buttons are private per user and saved per workspace. Other operators see their own buttons.
- Go to /program. Scroll below the scene list until you see 'Control panel'.
- Click 'Add button' — the edit dialog opens immediately.
- Set label, color, which scene the button affects and what action runs.
- Save. The button shows up in the grid.
- Drag to move. Drag the small corner at the bottom right to resize.
- Right-click (or double-click) a button to edit or remove it.
- Left-click to run the button's action.
- Show / hide scene — toggles visibility just like the eye in the control panel.
- Solo — shows only the chosen scene and hides all others in one click.
- Set value in scene data — type a field (e.g. homeScore) and a value. Great for resetting or jumping to a known score.
- Increment counter — type a field and a step (e.g. +1 or -1). Perfect for score buttons.
Scene data & fields you can control
Overview of which fields you can drive with 'Set value' and 'Increment counter' in the custom control panel — or via Stream Deck.
Write the field with dot notation. For scoreboard scenes the fields are at the root (e.g. homeScore). For Custom scenes with an embedded scoreboard they live under scoreboard.* (e.g. scoreboard.homeScore).
Scoreboard fields:
- homeScore / awayScore — integers, home and away score.
- homeName / awayName — full team name (text).
- homeShort / awayShort — short name (3 letters, text).
- homeColor / awayColor — primary color as hex (#RRGGBB).
- homeLogo / awayLogo — URL to the logo (text).
- period — free text (1ST, 2ND, HT, FT, P1, P2…).
- clock — clock string (e.g. '12:34'). The server normally ticks it.
- status — optional status row (e.g. 'PAUSE', 'PEN').
Lower-third fields:
- title — title (e.g. name).
- subtitle — subtitle (e.g. role).
Bug (channel logo / small badge):
- text — the displayed text.
- position — corner: tl, tr, bl, br (top-left, top-right, bottom-left, bottom-right).
Ticker (scrolling news bar):
- items — array of strings (hard to set from a button; use the control panel directly).
- speed — integer, speed in px/s.
Lineup:
- teamName — the team name.
- formation — formation string (e.g. '4-3-3').
Scene data vs. layer names
What's the difference between a system field like homeScore and the name you give a layer yourself? And how does your custom graphic find the right layer automatically?
These are two different things that are easy to confuse:
| Scene data | Layer name | |
|---|---|---|
What is it? | Structured JSON belonging to the whole scene | Label you set on a layer in the layer panel |
Who decides the names? | The system (fixed keys like homeScore, period, clock) | You — anything, e.g. 'Home score (live)' |
Where does the value live? | In the scene data object: scene.data.homeScore | On the layer: scene.data.layers[i].text |
Used by the button? | Yes — write this in 'Set value' / 'Increment counter' | No — it's only for you as the operator |
Visible on the overlay? | Indirectly: via layers that mirror the field, or a scoreboard | Never — the name is shown only in the editor |
In a SCOREBOARD scene it's simple — all fields live directly on data:
{
"homeScore": 3,
"awayScore": 1,
"period": "P2",
"clock": "12:34"
}In a CUSTOM scene there are both free layers AND (if you've embedded a scoreboard block) a scoreboard object under data.scoreboard. Here a SMART AUTO-MAPPING (fuzzy match) is used so your text layers automatically pick up the right value:
{
"scoreboard": { "homeScore": 3, "awayScore": 1, "period": "P2" },
"layers": [
{ "type": "text", "name": "Home score (live)", "text": "0" },
{ "type": "text", "name": "Period display", "text": "" }
]
}When you change scoreboard.homeScore (e.g. via a +1 button) the system scans every text layer: if the layer name contains a known 'fragment key' the value is written into the layer's text. The match is CASE-INSENSITIVE and ignores spaces, dashes and Swedish characters (å→a, ä→a, ö→o).
Here is the full mapping in use today:
| Layer name contains… | Scene data field | Example layer names that match |
|---|---|---|
homescore | scoreboard.homeScore | 'Home score', 'Home Score (big)', 'HOMESCORE' |
homepoints | scoreboard.homeScore | 'Home points', 'Home points live' |
awayscore | scoreboard.awayScore | 'Away score', 'Awayscore' |
awaypoints | scoreboard.awayScore | 'Away points' |
homeshort | scoreboard.homeShort | 'Home short', 'HomeShortName' |
homename | scoreboard.homeName | 'Home name', 'Home team name' |
awayshort | scoreboard.awayShort | 'Away short' |
awayname | scoreboard.awayName | 'Away name' |
period | scoreboard.period | 'Period', 'Period display', 'Match period' |
clock | scoreboard.clock | 'Clock', 'Match clock', 'Big clock' |
status | scoreboard.status | 'Status', 'Match status' |
Summary for buttons:
| What you want to do | Write this in the button's 'Field' |
|---|---|
Increment home score in a scoreboard scene | homeScore |
Increment home score in a custom scene with a scoreboard block | scoreboard.homeScore |
Set period in a scoreboard scene | period |
Set period in a custom scene with a scoreboard block | scoreboard.period |
Change the text of a single text layer | Layer name does NOT work — do it in the editor |
Stream Deck integration
Trigger scoreboard, scenes, lower-third and ticker straight from a Stream Deck button.
- Click 'Stream Deck' in the top right of the control panel.
- Create a token (one is enough per Stream Deck — keep it secret).
- Pick which scene the URLs should target.
- Copy any URL from the list.
- In Stream Deck: add a button of type 'Website' (System → Open).
- Paste the URL. Enable 'Access in background' so no window pops up.
Available actions: score +/−, clock start/stop/reset/adjust/set, period, scene show/hide/toggle/solo, lower-third set text, ticker set/append/clear/speed.
https://your-domain.com/api/control?token=XXX&action=score-home-plus&scene=MatchOBS / vMix integration
All scenes go to ONE shared Program output (vMix-style).
- Program output: /overlay/program?workspace=WORKSPACE_ID — the only URL you need in OBS.
- Anything you mark 'On Air' in the control panel stacks live on the same Browser Source.
- For one-off shares there is also /overlay/program?token=SHARE_TOKEN (shows only the shared scene).
Recommended resolution: 1920x1080. The background is transparent — set CSS in OBS to 'transparent' if needed.
Keyboard shortcuts
Hotkeys in the studio (when the canvas is focused).
Troubleshooting
- Overlay shows nothing in OBS: check that the scene is visible (eye icon) in the control panel.
- The clock doesn't move: press Start. It does not start automatically.
- Stream Deck button does nothing: check that the token isn't deleted and the scene name matches.
- Realtime updates are laggy: reload the OBS Browser Source once (Refresh cache).
Latest changes
The manual is updated on every new release.
- 2026-04-25 — New manual section: Scene data vs. layer names — full comparison table + fuzzy match mapping for custom scenes.
- 2026-04-25 — Custom control panel on /program: drag-drop buttons, right-click to edit/remove.
- 2026-04-25 — Realtime broadcast straight from the database to the overlay (lower latency than polling).
- 2026-04-25 — Manual extended with field reference for scene data (scoreboard, lower-third, bug, ticker, lineup).
- 2026-04-20 — User manual released.
- 2026-04-20 — Stream Deck integration via URL buttons (all actions).
- 2026-04-20 — Clock quick-adjust (±1s, ±10s) and presets (45:00, 90:00).
- 2026-04-20 — Edit team names, short names and period directly from the scoreboard block.