Documentation – SportEventTV

About SportEvent TV

SportEvent TV is a self-hosted app that drives TV signage screens at sports arenas.

Getting Started

Install SportEventTV on your server, point your screens to their URLs and you are live. Each screen gets its own URL — one per display. You can use any computer to run the server. In some cases you use a mini PC/Mac already as a display unit. You may use the same as a server. Or install it somewhere else and use the TVs built in browser app to display content.

Installing SportEventTV

SportEventTV runs in Docker — available for Windows, Mac and Linux. Install Docker Desktop, create a folder with a docker-compose.yml and .env file, then run docker compose up -d. The app starts at http://localhost:5020.

Detailed instructions

Requirements

  • A computer or server running Windows, Mac or Linux
  • Docker Desktop installed

Step 1 — Install Docker

Download and install Docker Desktop from docker.com. Once installed, make sure it is running (you should see the Docker icon in your taskbar/menu bar).

Step 2 — Create a folder

Create a folder on your computer called sporteventtv. Inside it, create two files:

Step 3 — Create docker-compose.yml

Create a file called docker-compose.yml with this content:

name: sporteventtv

services:
  sporteventtv:
    image: ghcr.io/planet4/sporteventtv:latest
    ports:
      - "5020:5020"
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      - sporteventtv_data:/data
      - ./data/backgrounds:/data/backgrounds

volumes:
  sporteventtv_data:

Step 4 — Create .env

Create a file called .env with this content:

BASIC_AUTH_USER=admin
BASIC_AUTH_PASS=yourpassword
SECRET_KEY=change-this-to-a-random-string

Change yourpassword to a password of your choice.

Step 5 — Start the app

Open a terminal in your sporteventtv folder and run:

docker compose pull
docker compose up -d

The app will start and be available at: http://localhost:5020

Step 6 — First time setup

  1. Open http://localhost:5020 in your browser
  2. Log in with the username and password from your .env file
  3. Go to Settings → Club Identity and enter your club name, sport and home arenas
  4. Go to Settings → License and enter your license key

Updating

When a new version is available, open a terminal in your sporteventtv folder and run:

docker compose pull
docker compose up -d

Your data is kept — schedules, rosters, settings and media are never affected by updates.

Accessing from other devices

To access the app from same network, use your computer's local IP address instead of localhost:

http://192.168.x.x:5020

Find your local IP in your network settings. All URL:s will also be shown in the GUI.

Login

Access the URL of the server and enter your username and password. The credentials are the ones you set in the .env file.

Login screen

Feeds

The three feed types in the Feeds tab are:

Schedule feeds

Added per team via the scheduler. Each team gets a schedule_<id>.json file. Powers all the match display pages and RSS feeds.

Roster feeds

Also per team. Each team gets a roster_<id>.json with player numbers and names. Powers /tv-roster and /led-roster.

Player feeds

Individual player profiles — name, club, age, photo, and custom fields (number, position, occupation, fun fact, etc.). Added manually or via player ID lookup. Stored in player_feeds.json + individual player_<id>.json files. Powers /tv-players.

Schedule and roster feeds are team-based and may be pulled automatically. Player feeds are per-person and managed manually in the Feeds tab.

New season: At the start of each season, teams are assigned new IDs. The old feed will stop returning matches. Use Refresh team list in the Feeds tab to pull the updated team list, then remove the old feed and add the new one. Do this with caution — it will take some time.

Presets

A preset is a saved snapshot of all settings for a display type — colors, fonts, transitions, feeds filter, venues, time filter, duration and so on. Both LED and TV have their own independent preset lists.

TV Presets screenshot
  • Saving: Type a name in the preset field and click Save. To overwrite an existing preset, select it from the dropdown first, adjust settings, then click Save.
  • Loading: Select a preset from the dropdown. Settings update immediately in the preview. Nothing is written to the server until you click Save.
  • Using on a display page: Append ?preset=name to the page URL, e.g. /tv-matches?preset=MyPreset. The Copy URL button builds this URL for you.
  • In the Client tab: Each game and idle slot has a preset dropdown that automatically builds the correct URL — no manual URL editing needed.

All TV pages (Matches, Matches List, Countdown, Roster, Stats) share the same preset list. Fields a page doesn't use are silently ignored.

LED

The led page is similar to TV. But made for long displays. It generates a simple html page that could be used in another player like Sedna. Use Feeds to pick which teams appear. Save named presets and load them with ?preset=name in the URL. The LED page is not used in the client. This is more static content that should be triggered manually.

LED Presets screenshot

Below is an example of Led output.

LED Countdown screenshot

TV Pages

Each TV page is configured in the TV tab. Save a preset per use case and assign it to a slot in the Client tab.

Matches — /tv-matches

Full-screen rotating cards, one match at a time. Cycles through upcoming matches at the configured duration interval. Good for a lobby screen showing what's on today.

TV Matches screenshot

Matches List — /tv-matches-list

Shows multiple upcoming matches at once in a table — team logos, series, date/time and venue. If there are more matches than fit, the page flips automatically at the duration interval.

TV Matches List screenshot

Countdown — /tv-countdown

Counts down to the next match kickoff, then switches to a GAME ON screen. Smart Mode keeps the screen blank outside match windows, wakes up before kickoff, shows countdown, switches to GAME ON, then sleeps again after the match ends.

TV Countdown screenshot

Roster — /tv-roster

Full-screen player list with numbers and names. Without a ?team= parameter it automatically picks the team whose next scheduled game is soonest.

TV Roster screenshot

Stats — /tv-stats

Pre-match stats for both teams in the next upcoming game — wins, draws, losses, goals for/against and last-5 form. Requires History enabled on the relevant feeds.

TV Stats screenshot

Players — /tv-players

Promote some players. Full-screen player profile cards using data from Player feeds. Cycles through players at the configured duration interval. Requires player feeds to be added in the Feeds tab.

Content

The Content tab manages images and videos shown in the /tv-commercial and /tv-photos slideshows. Supported formats: jpg, png, gif, webp, mp4, webm. In most cases this is what you want to show during idle mode. When no matches are coming up. This is similar to a normal digital signage or a powerpoint presentation. Media is general photos. Commercial is what it sounds like.

Filenames must not contain spaces. Rename files before uploading — use underscores or hyphens instead (e.g. Intro_2024.mp4). Uploads with spaces in the filename will be rejected.

Each file has an On/Off toggle. Inactive files are kept on disk but excluded from the slideshow. Videos play through to completion before advancing; the ?duration= parameter only applies to images.

Media / Content tab screenshot

Client

The client is what creates the screens you will use to display your content on a TV. It connects to the server via WebSocket and switches content automatically based on the configured slot schedule. No software to install — just a browser URL. The content is managed by using slots. So first create your TV presets, save them and assign them to slots. You can include the teams you want. Let´s say you want some image 1 hour before a game starts, set it to -60 minutes. The client reads the start of next game from the feeds. Next you might want the countdown, use a countdownpreset and and set it to -10 minutes. It will always use the next upcoming game. Add upcoming games to 15 min. This will display this preset 15 minutes after game has started. After this the client will go to idle mode. So the lenght of the game mode depends how youconfigure the slots.

Client slots screenshot

The player is always in one of two modes:

  • Idle mode — no match is active. The player cycles through idle pages on a loop: typically a commercial slideshow, then a photo slideshow.
  • Game mode — a match is approaching or in progress. The player switches to a sequence of match-related pages timed relative to kickoff: countdown, roster, matches, stats. When game mode ends the player returns to idle.
Client game mode screenshot

Client tab overview

  • Playlists — a named configuration set (game slots, idle slots, game mode, night mode). Use + New to create a playlist. The Default playlist always exists and cannot be deleted.
  • Game slots — pages shown in sequence around each match, sorted by offset relative to kickoff (KO). E.g. −30 = countdown starts 30 min before KO, +45 = stats page 45 min after.
  • Idle slots — pages shown when no match is active, cycling in order. Each has a duration in minutes. Drag to reorder.
  • Game mode — when disabled the player stays in idle at all times. Useful for screens that should never show match content.
  • Night mode — during a configured quiet-hours window, idle cycling stops and a single standby page is shown instead. Enable it, set the From/To times and the page URL.
  • Displays — the list of registered browser players. Each display has a stable ID and is assigned to a playlist. Use Copy URL to get the URL to load on that screen.

Settings

Club Identity

Your club's name, sport (Floorball / Ice Hockey), data source, display language (English / Svenska), logo, team name overrides, public URL, and home arenas. Home arenas map to venue filter slots A/B/C and are used for home/away detection on display pages.

Endpoints

Collapsible reference table of all display page URLs and data API endpoints. Useful for building kiosk URLs or integrating with external tools.

Scrape

  • Teams feed list — refresh the full team list from the source (run once per season when new teams appear)
  • Manual scrape — one-off pull of a specific team URL for roster or schedule
  • Scheduled scraping — enable/disable automatic nightly scraping; set frequency to daily or monthly

Dev Tools

  • Time offset — shift the app's internal clock forward/back by days/hours/minutes for testing
  • Randomize KO — set the offset to 30 min before a random upcoming match, for quick countdown testing
  • Fake match — inject a test match into a schedule file a few minutes from now
  • Sample feed — load a built-in test feed with fake players and matches (team ID 99999)
  • Group feeds by sport — toggle sport headers in the Feeds tab scheduled list

Custom Fonts

Upload .ttf, .otf, .woff, .woff2 font files. After uploading, reload the page for them to appear in the TV/LED font dropdowns.

Logos

  • Fetch logos — auto-download NHL team logos from the internet; floorball logos must be uploaded manually
  • Team logos — upload individual logo files or a ZIP; use Missing logos to find teams without a matching file

License

Shows trial/license status and days remaining. Enter and activate a license key from sporteventtv.com.

Backup & Restore

Download a full ZIP backup of all data and media. Restore by uploading a backup ZIP.

Danger Zone

Reset all data — deletes all schedules, rosters, player feeds and settings. Media files are kept.

FAQ

Why SportEventTV?

Most digital signage tools are general-purpose and require a lot of setup to show sports content. SportEventTV is built specifically for sports venues — schedules, rosters and countdowns work out of the box.

Pricing and license?

SportEventTV requires a license key after the trial period. Contact us at info@sporteventtv.com for pricing. Licenses are per installation and cover all screens on that server. You can download and use it for free full functions for 3 months. Swedish Floorball is free to use. You will still need a key though.

What sports are supported?

To be honest not many. We just lauched this. Currently swedish Floorball and NHL Ice Hockey. More data sources are planned. Custom feeds can be added manually regardless of sport.

Development

SportEventTV is actively developed. Feature requests and feedback are welcome — reach out at info@sporteventtv.com.

I have found a bug?

Please report it to info@sporteventtv.com with a short description of what happened and what you expected. Screenshots or screen recordings are very helpful.

Support

info@sporteventtv.com