A professional real-time scoreboard application for live streaming and sports broadcasting, built with Electron, React, and TypeScript.
- Features
- Screenshots
- Installation
- Usage
- Overlay Mode
- Match Recording
- Video Generator
- Hotkey Configuration
- OBS Studio Integration
- Development
- Building
- Tech Stack
- License
- Real-time Score Management - Control home and away team scores with instant updates
- Game Timer - Countdown timer with play, pause, and stop controls
- Half/Period Tracking - Track game periods or halves with customizable labels
- Customizable Teams - Configure team names and brand colors
- Timer Loadouts - Quick-access presets for common timer durations (e.g., 15:00, 45:00, 20:00)
- Overlay Mode - Separate windows for controls and preview, perfect for multi-monitor setups
- Global Hotkeys - Control everything without focusing the app window
- Browser Source Support - Seamless integration with OBS Studio and streaming software
- WebSocket Server - Real-time updates to all connected clients
- Match Recording - Record every second of your match for later review or video generation
- Video Generator - Create highlight videos from your recorded match data
- Team Colors - Visual color picker for team branding
- Custom Labels - Rename teams and period/half prefixes
- Flexible Hotkeys - Fully customizable keyboard shortcuts with duplicate detection
- Responsive Design - Clean, modern UI that scales beautifully
Disclaimer about OBS Studio in screenshots
The OBS Studio interface shown in the screenshot is for demonstration purposes only. Scoreboard Server does not include, modify, or distribute any OBS Studio code or assets. The OBS Studio view is used solely to illustrate how Scoreboard Server can be integrated as a browser source in streaming setups. All rights to OBS Studio belong to their respective owners.
Scoreboard Server supports zooming the interface for better visibility or to fit your screen:
- Press the Alt key to reveal the application menu at the top of the window.
- Click on the View menu.
- Select Zoom In or Zoom Out to adjust the interface size.
This feature is available on all platforms and works in both the main window and overlay windows. Use it to make the scoreboard easier to read or to fit your workflow.
- Node.js 18+ and pnpm package manager
- Windows, macOS, or Linux
-
Clone the repository
git clone https://github.com/d-luca/scoreboard_server.git cd scoreboard_server -
Install dependencies
pnpm install
-
Run the application
pnpm dev
When you launch Scoreboard Server, you'll see the main control interface with two sections:
- Team Scores: Use +/- buttons to adjust home and away scores
- Timer: Start, pause, stop, and manually adjust the game timer
- Half/Period: Track game periods with increment/decrement controls
- Timer Loadouts: Quickly set common timer values (configurable in settings)
- Reset: Clear all scores and timer data
- Overlay Mode: Enable separate preview and control windows
- Team Names: Customize home and away team names
- Team Colors: Select brand colors for visual representation
- Half Prefix: Change the period label (e.g., "PERIOD", "HALF", "QUARTER")
- Timer Loadouts: Configure three preset timer durations for play/pause time or whatever you need
View your scoreboard design in real-time with the integrated preview. The scoreboard displays:
- Team names with colored indicators
- Current scores
- Game timer (countdown format)
- Current half/period
Overlay Mode is designed for streamers and broadcasters who need dedicated control and preview windows:
- Navigate to Scoreboard Settings
- Toggle Overlay Mode to ON
- Two new windows will appear:
- Overlay Preview: Shows the scoreboard display (for reference)
- Overlay Controls: Compact control panel with all functions
The compact control panel features:
- 5-Column Layout: Home, Away, Half, Timer Actions, Timer Values
- Visual Hotkey Indicators: Each button shows its assigned hotkey
- Quick Access: All controls accessible without switching windows
- Always on Top: Stays visible while working in other applications
- Control scoreboard from any window with global hotkeys
- Keep preview visible while streaming
- Compact interface perfect for small screens
- Independent window positioning
When in overlay mode, if the hotkeys are enabled, they will be globally registered, this mean that they will work even when you are not focusing the main app or the overlay
Scoreboard Server can record all scoreboard data during a match, capturing a snapshot every second. This data can be used to generate later a video with the scoreboard, useful for embedding the scoreboard on videos using other video editing programs.
- Navigate to the Recording Controls section in the main window or overlay controls
- (Optional) Click Change Directory to select where recordings are saved
- Click the Record button (π΄) to start recording
- The recording indicator will show the elapsed time and snapshot count
- Click Stop (β¬) to end the recording
- Recordings are saved as JSON files with the naming format:
{HomeTeam}-{AwayTeam}-{Timestamp}.json - Each recording contains:
- Metadata: Team names, recording ID, start/end times
- Snapshots: One per second, containing scores, timer, half, team colors, and timestamps
- Background Recording: Snapshots are captured in the main process, ensuring reliable 1-second intervals even when the app window is minimized
- Multi-Window Support: Recording status is synced across all windows (main app and overlay)
- Compact Controls: Recording controls are available in both the main window and the compact overlay control panel
The Video Generator allows you to create video files from your recorded match data. This is useful for embedding the scoreboard on videos using other video editing programs.
- From the main application, click Open Video Generator in the toolbar or settings
- A new window will open with the video generation interface
- Select Recording File: Click Browse to select a previously saved
.jsonrecording file - Review Recording Info: The generator displays metadata about the recording (teams, duration, snapshots)
- Select Output File: Click Browse next to Output File to choose where to save the video
- Configure Settings:
- Frame Rate: Choose from 1 to 60 FPS (default 30FPS)
- Generate: Click Generate Video to start the rendering process
- Monitor Progress: A progress bar shows the current rendering status
- Cancel: You can cancel generation at any time if needed
- Longer recordings will take more time to render
- Higher frame rates increase rendering time and file size
Scoreboard Server includes fully customizable global hotkeys that work even when the app is in the background.
- Increase Home Score:
W - Decrease Home Score:
Q - Increase Away Score:
E - Decrease Away Score:
D
- Start Timer:
Space - Pause Timer:
P - Stop Timer:
S - +1 Second:
β(Up Arrow) - -1 Second:
β(Down Arrow) - +1 Minute:
Shift + β - -1 Minute:
Shift + β
- Loadout 1:
Ctrl + 1 - Loadout 2:
Ctrl + 2 - Loadout 3:
Ctrl + 3
- Increase Half:
] - Decrease Half:
[
- Reset Scoreboard:
Ctrl + Shift + R
- Click the Hotkey Settings button in the main window
- Browse hotkeys organized by category (Score, Timer, Half, Loadouts, Other)
- Click Change next to any hotkey
- Press your desired key combination
- The app will warn you if the key is already assigned
- Click Reset to Defaults to restore original hotkeys
- Toggle Enable Hotkeys to temporarily disable all shortcuts
- Modifier Support: Combine with Ctrl, Alt, and Shift
- Conflict Detection: Automatic duplicate detection
- Visual Feedback: Hotkey badges on all buttons
-
Start Scoreboard Server
-
In OBS Studio, add a new Browser Source
-
Configure the source:
- URL:
http://localhost:3001/scoreboard - Width and Height: The scoreboard is define to fill the entire space available, therefore you can adjust its dimension directly from the OBS Scene component
- β Check Shutdown source when not visible
- β Check Refresh browser when scene becomes active
- URL:
-
Position and resize the source in your scene
-
Control the scoreboard from the app while streaming
- The scoreboard updates in real-time via WebSocket
- Use Overlay Mode for better workflow during streams
- Use hotkeys to control the scoreboard without switching windows
- The scoreboard has a transparent background for easy integration
# Start development mode
pnpm dev
# Start with scoreboard build watching
pnpm dev:with-scoreboard
# Run type checking
pnpm typecheck
# Lint code
pnpm lint
# Format code
pnpm format
# Build scoreboard only
pnpm build:scoreboard
# Start preview mode (after building)
pnpm startsrc/
βββ main/ # Electron main process
β βββ index.ts # Main entry, window management, IPC
β βββ server.ts # Express + WebSocket server
β βββ ssr.ts # Server-side rendering for scoreboard
βββ preload/ # Preload scripts for IPC
βββ renderer/ # React frontend
β βββ src/
β βββ components/ # React components
β βββ stores/ # Zustand state management
β βββ hooks/ # Custom React hooks
β βββ pages/ # Page components
βββ types/ # Shared TypeScript types
Build executables for distribution:
# Windows
pnpm build:win
# macOS
pnpm build:mac
# Linux
pnpm build:linuxThe built applications will be in the dist/ directory.
The build process uses electron-builder. Configuration is in electron-builder.yml:
- Product Name: Scoreboard Server
- App ID:
com.github.d-luca.scoreboard-server - Includes SSR scoreboard files
- Creates installers for each platform
- React 19 - UI framework
- TypeScript - Type-safe development
- Tailwind CSS 4 - Utility-first styling
- Zustand - State management
- Radix UI - Accessible component primitives
- Electron 38 - Desktop application framework
- Express 5 - HTTP server
- WebSocket (ws) - Real-time communication
- Node.js - Runtime environment
- Vite 7 - Fast bundler and dev server
- electron-vite - Electron integration
- electron-builder - Application packaging
- ESLint + Prettier - Code quality and formatting
This project is licensed under the MIT License - see the LICENSE file for details.
Luca Davi
- GitHub: @d-luca
- Project Link: https://github.com/d-luca/scoreboard_server
- Built with Electron
- UI components from Radix UI
- Styled with Tailwind CSS
Made with β€οΈ for the emerging sports community
If this project helps you, please consider giving it a βοΈ!

