Documentation

Everything you need to put SpreeSports on the air.

Architecture overview, operator quick-start, vMix/OBS integration, data feed setup, troubleshooting. Written for the producer who's setting up their first broadcast.

1. Architecture overview

SpreeSports is a cloud-hosted multi-tenant SaaS. Every game runs on its own isolated StateManager instance in memory. Operators control their game from a browser-based controller; the same game state renders to a browser-source URL that vMix or OBS picks up as an overlay.

End-to-end data flow:

Stadium scoreboard
  └─ serial cable → USB-to-serial adapter
  └─ ScoreBox device (Tailscale VPN)
       └─ wss:// to spreesports.clickingspree.com
            └─ tenant-isolated StateManager (your game instance)
                 ├─ /api/game/state  → controller (browser)
                 ├─ /ws              → controller, output(s)
                 └─ /output          → vMix/OBS browser source

Tenant isolation is enforced at three layers: (1) per-instance StateManager objects in memory; (2) AsyncLocalStorage + Proxy in the request middleware so legacy route handlers always touch the right tenant; (3) account-bound JWT checks reject any cross-account access at HTTP 403.

2. Getting started — your first game

Steps for your first broadcast:

  1. Create your account at /admin/ — or follow the email invitation an admin sent you.
  2. Buy a license — Per Game ($1,000) or Weekly ($3,000). Stripe checkout. License is active immediately.
  3. Set up your teams — go to the Game tab in the controller. Either type the team identities by hand or use the Importer to pull them from ScoreStream + MaxPreps.
  4. Start the instance — from the dashboard, click Start New Game and pick the saved game setup. The controller URL and the vMix browser-source URL are both displayed.
  5. Wire up vMix / OBS — see section 3 below.
  6. Optional: bind a ScoreBox — if you want live scoreboard data, see section 4.

3. Connecting vMix / OBS to the output

The output renderer is a regular web page. Whatever switcher you use, drop in the URL as a browser source.

vMix

  1. Add Input → Web Browser
  2. URL: https://spreesports.clickingspree.com/output/?token=<your-output-token>
  3. Resolution: 1920×1080
  4. Tick Transparent background
  5. Add the input as an overlay channel above your game feed

OBS Studio

  1. Add Source → Browser
  2. URL: same as above
  3. Width 1920, Height 1080, FPS 30 (or 60)
  4. Add custom CSS: body { background: transparent !important; }
  5. Drag above your camera scene
Output token: When you start a game, the platform generates a short-lived viewer token tied to that one instance. The token is read-only — vMix or OBS can render the graphics but can't mutate state. You can copy the token from the dashboard's instance card or from the Open Output button in the controller.

4. ScoreBox setup

ScoreBox is the optional plug-and-play hardware that reads the stadium scoreboard's serial output and pushes the data to your game instance live. Setup is covered fully on /hardware — TL;DR:

  1. Register the unit in the admin panel under Devices with its serial number
  2. Pick the scoreboard type (Daktronics Football, Electro-Mech LX, etc.)
  3. Plug it into the scoreboard controller's console port + the network + power
  4. Bind it to a game instance when you start the game

5. Scoreboard data — how it reaches the cloud

SpreeSports is cloud-hosted. There's nothing for you to install locally, which also means there's no local process listening for ScoreBridge OSC/TCP packets from your press-box PC. Direct ScoreBridge-over-LAN is only possible in self-hosted deployments of earlier builds.

For cloud-hosted broadcasts, the live-scoreboard path is one of these three:

a) ScoreBox device (recommended)

Our $299 plug-and-play box reads the scoreboard controller's serial output directly, normalizes the protocol (Daktronics, Electro-Mech, Fair-Play, etc.), and pushes it to your game instance over a pre-authenticated Tailscale VPN — outbound only, no firewall changes required. See /hardware for the full walkthrough. This is the only solution that works with zero IT involvement on the school network.

b) Manual operator entry

If you don't have a ScoreBox, the controller has full manual controls for clock, score, period, down & distance, possession, timeouts, and penalty flags. Your producer drives the graphics directly from the controller — same as they'd drive any other CG. Obviously more work than a live feed, but free and works for any board.

c) ScoreBridge forwarder (on the roadmap)

For crews who already run ScoreBridge on a press-box PC, we're adding a small helper utility that runs alongside ScoreBridge, joins our Tailscale tailnet, and forwards its OSC / TCP / HTTP output to your cloud instance. Outbound VPN only, same pattern as ScoreBox. If you need this sooner, email web@clickingspree.com and we'll prioritize.

The cloud deployment intentionally does not expose public UDP/TCP endpoints for scoreboard data. Every live feed goes through an authenticated Tailscale tunnel so the press-box network and the scoreboard traffic are never exposed to the open internet.

6. Importing teams, rosters & stats

The Game Import panel pulls team and game data from ScoreStream, then optionally pulls rosters and per-player stats from MaxPreps:

  1. Search ScoreStream by team name (e.g., "Palmetto")
  2. Pick the team from the results
  3. Choose a season and pick the game from the schedule
  4. Click Import — team identities (logo, colors), score, and starting state populate
  5. For rosters/stats, click the MaxPreps button on the imported team to pull the latest roster and per-game stats
Your ScoreStream API key lives on your account's settings — paste it once under Settings → ScoreStream API Key. The key is persisted on the server and survives restarts.

7. Ticker & sponsor management

The bottom-line ticker is its own panel in the controller. It tracks the teams you've enabled across NFL, NCAA football, NBA, NCAA basketball, NHL, MLB, MLS, and NWSL. Game schedules and team metadata come from ScoreStream; live game state (clock, score, baserunners, etc.) is enriched from ESPN's public sports APIs.

8. Running multiple games at once

Each active license allows one concurrent game instance. Per Game and Weekly licenses both work the same way here — the difference is just the license window (24 hours vs 7 days), not how many games you can run in parallel.

To broadcast multiple games at the same time, buy multiple licenses. Examples:

Each concurrent instance runs on its own StateManager, with completely isolated state — different teams, different scores, different rosters, different operators. Each gets its own controller URL, its own browser-source URL, and binds to its own ScoreBox device (if you have multiple units).

Cross-tenant access is hard-rejected at the API layer — operator A cannot read or write operator B's instance, even if they have the URL.

The license check on POST /api/platform/instances/start rejects with HTTP 403 ("All licenses in use") if you already have as many active instances as you have active subscriptions. End an existing game from the dashboard or buy another license to start the next one.

9. Saving & loading game setups

From the controller, Save Setup stores the current state — teams, rosters, lineups, sponsor configurations, graphics presets — under a name. Setups are scoped to your account; only you (and admins) see yours.

To reuse, click Load Setup and pick the name. Auto-save runs every 30 seconds against the current instance, so a browser crash mid-game doesn't lose your place.

10. Admin panel — accounts & licenses

The admin panel at /admin/ is for platform admins (accounts with is_admin=true). It can:

11. Troubleshooting

Output is blank in vMix/OBS

ScoreBox shows offline

Ticker shows mock games / no real scores

Score from the scoreboard isn't updating the scorebar

Lost my admin password

Stuck? We answer fast.

Email web@clickingspree.com — typical response within an hour during US business days.

Or just try the demo