Skip to content

About

PlayOverlay

Resources

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Latest commit

 

History

235 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PlayOverlay

CI Support PlayOverlay on Ko-fi

PlayOverlay is a free desktop app for adding live score and match-clock graphics to sports video streams, built for streaming community football (soccer) matches to YouTube, and usable for any stream where you key graphics over a live feed.

It renders a broadcast-style score bug, match clock, penalty shootout tracker, and custom graphics on a solid-colour background (blue by default, and you can pick any colour your mixer keys well). Feed that output into a vision mixer or capture device, for example a Blackmagic ATEM Mini, key out the background, and composite it over your camera feed before streaming.

The score bug rendered on the chroma-key display output

PlayOverlay is free to use and always will be. If it earns a place in your kit bag, you can support its development on Ko-fi.

Spectator scoreboard

Venues can also point a big screen straight at PlayOverlay: the Scoreboard screen fills the display with both teams in their club colours, the score, the time of day, and the match clock, no chroma key, no stream required.

The spectator scoreboard screen

How it works

PlayOverlay runs two windows:

  • Control window: the dashboard where the operator updates scores, runs the match clock, tracks penalties, and switches screens.
  • Display window: a clean, fullscreen output showing the graphics on your chosen key colour. Put this on a second display connected to your mixer (e.g. via HDMI into an ATEM input), then chroma key it over the match feed.

If you're streaming through OBS instead of a hardware mixer, you can skip the second display and chroma key entirely, see OBS browser source below.

The operator dashboard

Features

  • Score bug with team abbreviations, optional team logos, live scores, match clock, and stoppage time
  • Match clock driven by the system clock (no drift over a half), with pause/resume and quick time adjustments
  • Goal log: every goal is logged with its minute (23', or 45+2' in stoppage time) and a goal banner goes on air automatically (team and minute, no typing needed). Scorers can be added later, e.g. at half-time, and the end screen lists each team's scorers
  • Undo and redo: step back through goals, clock and phase changes, screen switches and penalties, without ever rewinding the running clock
  • Crash recovery: the score, clock, and match state are saved continuously; if the app closes mid-match you can restore where you left off, and the outputs stay blank rather than showing a false 0-0 until you do
  • Match phases: first/second half with configurable half lengths, and extra time that can be toggled off per match
  • Generic timer mode: for sports that aren't halves-based, switch the timer to a configurable number of named periods (e.g. 4 × 12-minute quarters)
  • Penalty shootout tracker: alternates teams automatically, records scored/missed, supports undo, and can be toggled off for matches that don't need it
  • Screens: match title, score bug, penalties, end screen, plus your own uploaded full-screen graphics and overlay images linked to specific screens
  • Line-ups: type or paste each team's players to put a line-up screen on air and pick goal scorers from a list, and have the display rotate through your chosen screens on its own before kick-off and at half-time
  • Custom key colour for whatever your mixer keys best
  • OBS browser source output: an optional local server that serves the display graphics with a transparent background, so OBS users don't need a chroma key at all
  • Phone remote (LAN): an optional PIN-gated server that lets a phone on the same wifi control goals, the clock, match phases, and the on-air screen from the touchline
  • Keyboard shortcuts and Elgato Stream Deck support for goals, phase changes, and screen switching
  • Club presets: save each club's name, abbreviation, colours and logo once, then load any club into the home or away slot for the next fixture
  • Saved match settings: store whole fixtures and reload them
  • New match: one button resets the score, clock, penalties, goals and on-air graphics between fixtures, keeping your team settings
  • Multi-monitor aware: move the display window between screens, lock windows always-on-top, keep the machine awake while live

Download

Grab the latest release from the Releases page:

Platform File
Windows playoverlay-…Setup.exe
macOS (Apple Silicon) playoverlay-darwin-arm64-….zip
macOS (Intel) playoverlay-darwin-x64-….zip
Linux (Debian/Ubuntu) playoverlay_….deb
Linux (Fedora/RHEL) playoverlay-….rpm

First launch

The macOS builds are code-signed and notarised by Magic Zebra Limited, so they open like any other app: unzip the download and move PlayOverlay.app to Applications.

The Windows installer is not signed yet, so SmartScreen may show "Windows protected your PC" the first time: click More info, then Run anyway.

If you'd rather not run a binary you didn't build, see Building from source below.

Using it

  1. Open Match Settings and set team names, abbreviations, colours, and logos, plus the venue, kick-off time, and half lengths. Save as club keeps a team's details for next time, and Load a saved club fills a team in one step. This is also where you choose between the football timer and generic periods, and toggle extra time and penalties for the match.
  2. In Window Settings, pick your key colour and the dashboard size (small for a 1024px tablet, large for a 4K touch screen). Whether screens switch automatically when the clock starts and stops lives under Phases & clock on the dashboard.
  3. Move the display window to the output monitor and make it fullscreen. The Go live check tab next to the screen keys runs through the setup and shows a dot while something needs attention.
  4. Kick off: start the first half, add goals as they happen, add stoppage time, advance phases. The preview and the clock stay on screen for the whole match; the clock block shows the score (tap it to correct the score by hand) and the time remaining. Each goal is logged with its minute in the Goals tab and puts a banner on air. For a team with a line-up the goal key asks who scored before the banner goes out (see below). Jumping to a phase, nudging the clock and pausing it are one tap away under Phases & clock.
  5. Between fixtures, New match (next to undo and redo) clears the match and puts the match title on air, ready for the next kick-off.

Line-ups

Each team's panel in Match Settings has a Line-up section. Add player gives you a row for a shirt number and a name. The number can be up to three characters, so 9, 00 and GK all work, and pressing Enter moves straight on to the next player. Paste a list takes a whole team sheet at once, one player per line with the shirt number first if you have it, e.g. 9 Ali Smith. A team can have up to 30 players. Save as club stores the squad with the club, so you only type it once.

Once a team has players:

  • Tapping that team's goal key updates the score bug at once and asks who scored: the players on the pitch as large tiles, the bench beneath, plus No scorer, Own goal and Not a goal for a mis-tap. The goal banner goes out once you choose, with the number and the name, e.g. 9 Smith. Tap a goal in the log to change its scorer later. Goals from a keyboard shortcut, the Stream Deck or the phone never wait for the question. Both the question and the automatic banners can be switched off in Window Settings. A team without a line-up keeps a plain scorer field in the log.
  • Home Line-up and Away Line-up appear among the screen keys and on the Stream Deck. Each shows the team's name, logo and colours over its players, in two columns for more than eleven.

Each player has a Starts box, ticked by default. Untick it for the substitutes and the line-up screen shows the starters on the pitch with a smaller Bench group underneath; any number of starters works, so five-a-side and rugby squads are no different. Substitutions are logged from the Substitutions tab during the match: tap the team, pick who is coming off from the players on the pitch, then who is coming on from the bench, and confirm (or confirm and make another for a double change). The two players swap places on the line-up screen, and a banner like the goal banner announces the change on air with the minute. Remove a substitution from the list to put both players back.

The home line-up screen on the display output

None of this appears until a team has players. If you never enter one, the app works exactly as before.

Rotating screens

The Rotate screens key under the screen keys cycles the display through screens you choose, so you can put the laptop down before kick-off or at half-time. The gear beside it opens the set-up: tick the screens to show (the match title, the line-ups, the score bug, the scoreboard, penalties, the end screen and your full-screen graphics) and set the seconds per screen. Tap the key to start; it stays lit, with the interval, while the screens take turns in the order listed. The rotation stops as soon as you take over, whether you pick a screen on the dashboard, the Stream Deck or the phone, start the clock, press New match or restore a match.

With Start automatically at half-time switched on, the rotation starts by itself whenever the clock stops for a break with more of the match to come. That covers half-time, breaks between periods and the break before extra time, but never full time. It needs at least two screens it can show, and it skips a graphic you've deleted or a line-up you've emptied.

Keyboard shortcuts

While PlayOverlay is focused, by default:

Shortcut Action
Cmd/Ctrl+Shift+Space Next match phase
Cmd/Ctrl+Shift+H Home team scored
Cmd/Ctrl+Shift+A Away team scored

The same actions are also available system-wide (they work while OBS or your mixer software is focused) with Alt added, e.g. Cmd/Ctrl+Alt+Shift+H, unless the shortcut you've bound already includes Alt, in which case there's no separate system-wide variant.

These are rebindable: open System Settings → Keyboard Shortcuts, click Change next to an action, then press the new key combination (a modifier other than Shift is required). Combinations the app already uses, such as Cmd/Ctrl+Z and Cmd/Ctrl+Shift+Z for undo and redo or Cmd/Ctrl+C/V/X/A for editing, are refused. On macOS, Cmd and Ctrl are recorded as the separate keys you pressed; on Windows and Linux, use Ctrl or Alt (the Windows/Super key can't be used). Reset restores that action's default.

Stream Deck

Connect an Elgato Stream Deck from System Settings → Connect to Stream Deck. The deck shows rotating button sets for scoring, match phases, and screen switching; the logo key cycles between sets. (Uses WebHID, close any other software that's holding the deck, including the official Stream Deck app.)

OBS browser source

Off by default. If you'd rather not manage a second display and chroma key, PlayOverlay can serve the display graphics directly as an OBS Browser Source, with a transparent background instead of a key colour:

  1. Open System Settings → OBS Browser Source and switch it on (default port 4750).
  2. In OBS, add a Browser Source pointed at the URL shown there (http://127.0.0.1:<port>/), sized to your canvas resolution.
  3. That's it, no chroma key needed, since the page background is transparent.

The server only listens on 127.0.0.1 (loopback), so it serves OBS running on the same computer as PlayOverlay; other devices on the network can't connect to it, and OBS on a different machine can't use it. It stays off unless you enable it, so nothing changes for anyone who doesn't use it. It updates live over a local WebSocket connection and reconnects automatically if OBS is closed or the app restarts mid-stream.

Pinned views

Add ?screen=<name> to the browser source URL to pin that page to a specific screen, regardless of what the operator currently has selected on the display. This lets you run the normal feed into OBS while a venue TV (or a second OBS scene) shows something else, e.g. the spectator scoreboard, from the same running app, both fed by the same local server. Because the server is loopback-only, a venue TV has to be driven by a browser on the PlayOverlay computer itself (for example a window on a second display).

?screen= value Shows
(none) Follows the operator (default)
matchTitle Match title screen
scoreBug Score bug
penalties Penalties screen
endScreen End screen
scoreboard Spectator scoreboard
homeLineup Home team line-up
awayLineup Away team line-up

System Settings → OBS Browser Source shows a ready-made copyable URL for the scoreboard view. Only the built-in screens above can be pinned; custom (your uploaded full-screen graphics) and any unrecognised or missing value fall back to following the operator.

Phone remote (LAN)

Off by default. When you want to run the match from the touchline instead of the laptop, PlayOverlay can serve a small control page to a phone on the same local network (usually the same wifi):

  1. Open System Settings → Phone Remote and switch it on (default port 3006).
  2. On the phone (connected to the same local network as the laptop, usually the same wifi), either scan the QR code shown there or open the URL (http://<laptop-ip>:<port>/) in a browser.
  3. Enter the 6-digit PIN shown in Settings. Once paired, the phone shows the live score, clock, and on-air screen.

From the phone you can:

  • Add or remove a goal for either team
  • Pause or resume the running clock (Next phase starts each half)
  • Advance to the next match phase
  • Switch which graphic is on air (score bug, match title, scoreboard, penalties, end screen, or blank)

The phone mirrors the live match state, so it stays in sync with the operator and with any other paired phone. If the laptop is offering to restore a match after a crash, the phone's controls pause (and say why) until the offer is answered on the laptop, so a tap can't overwrite the recovered score; the system-wide shortcuts wait too. Everything it does goes through exactly the same controls as the dashboard, so a phone tap and an on-screen click behave identically.

Security: while it's on, the remote server listens on all of the laptop's network interfaces (0.0.0.0), so any device that can reach the laptop on your local network can open the page. It isn't exposed to the internet unless the network forwards that port to the laptop (a router port-forward, a DMZ setting, or a laptop with a public IP address), which venue and home networks don't do by default. Pairing is gated by a 6-digit PIN that is regenerated every time you enable the feature, and repeated wrong guesses are rate-limited per device to defeat brute forcing, so a misbehaving device can only lock itself out, never your phone. The server also refuses connections from other web pages, so a page open in a browser on the network can't drive it. It's intended for a trusted venue network, not a hostile public one; leave it off when you don't need it, and treat the PIN like any other password. A paired phone that drops off the wifi reconnects by itself without the PIN. A new PIN is issued whenever you toggle the remote back on or restart the app, so paired phones will need to re-enter it then.

Languages

The interface and the on-screen graphics are available in English, French, German, Italian, Spanish (Spain and Latin America), and Portuguese (Portugal and Brazil). On first launch PlayOverlay suggests a language based on your system and asks you to confirm it or pick another; if you dismiss the prompt without choosing, it stays unset and asks again next time. You can change the language whenever you like under System Settings → Language, and it applies to both the operator dashboard and the on-air graphics. The phone remote control page is in English only for now. Text you type yourself is never translated: team names, abbreviations, venues, and the titles of saved match settings and custom screens are always shown exactly as you enter them.

The translations are machine-generated and have not been reviewed by native speakers, so some wording, especially the on-air football terms, may read a little off. If you spot a mistake, please open an issue and it'll get fixed.

Updates

On launch the app checks this repository's GitHub Releases for a newer version and shows a notification with a download link. Nothing is downloaded or installed automatically.

Building from source

Prerequisites: Node.js 22.13+ (or 24+) and npm.

git clone https://github.com/MagicZebraLtd/playoverlay.git
cd playoverlay
npm install
npm start          # run in development

Package distributables for your current platform:

npm run make

Cross-build for Intel from an Apple Silicon Mac (or vice versa):

npm run make -- --arch=x64    # or --arch=arm64

The repo is an npm workspace: the Electron app is at the root, and the platform-independent code it shares with PlayOverlay's other apps lives in packages/. packages/core holds the match logic (types, schemas, stores, undo, the match clock and actions, translations) and packages/screens the on-air graphics. Both ship TypeScript source with no build step, so a plain npm install at the root is all the setup they need. See CONTRIBUTING.md for what goes where.

Type-check with npm run ts-check, lint with npm run lint, run the test suite with npm test, and generate coverage with npm run test:coverage. The CI-only package sanity check is npm run build:ci; use npm run make to produce distributables.

Tagged releases (v*) are built automatically for Windows, both macOS architectures, and Linux (.deb and .rpm) by the release workflow and attached to a draft GitHub release.

Privacy and telemetry

PlayOverlay does not include telemetry or crash reporting. The only network request a default build makes is the update check against the public GitHub API.

Settings storage

Settings are stored with electron-store in config.json:

  • Windows: %APPDATA%/playoverlay
  • macOS: ~/Library/Application Support/playoverlay
  • Linux: $XDG_CONFIG_HOME or ~/.config/playoverlay

Uploaded images live in an images folder alongside it.

Contributing

Issues and pull requests are welcome. Before opening a PR, please run npm run lint, npm run ts-check, and npm test, then describe how you tested the change (this app's job is to not fall over mid-match, so reliability fixes are especially appreciated).

Licence

PlayOverlay is open source under the MIT License: free to use, modify, and redistribute, including commercially.

The PlayOverlay name, logo, and branding are owned by Magic Zebra Ltd and are not covered by the MIT licence. A modified or rebranded fork must not present itself as an official PlayOverlay release. See TRADEMARKS.md for details.

About

PlayOverlay

Resources

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages