All notable changes to Streamn Scoreboard will be documented in this file.
- Strength display — writes current players-per-side to
strength.txt(e.g.5-4) based on active penalties or red cards, updated on every penalty lifecycle event (#11) - Configurable "Players per side" in Game Settings — supports different game formats (5v5, 4v4, 3v3 hockey; 11v11, 7v7 soccer; etc.)
- Sport-aware strength calculation — hockey/lacrosse/rugby use running penalties, soccer uses red cards (
fouls2) - Strength label format template with
{{ home }},{{ away }}, and{{ if_pp }}...{{ end_if }}conditional, with live preview in Game Settings - Sport preset defaults for base strength: Hockey 5, Soccer 11, Lacrosse 5, Rugby 15
- Game Settings dialog is now scrollable and resizable
- Cumulative game clock no longer drifts 1 second from the period clock — elapsed time is now derived from the displayed period clock, guaranteeing they always sum to the period length (#16)
- Cumulative game clock now persists across OBS restarts — previously reset to 0:00 every time OBS reopened
- Cumulative game clock — opt-in feature (Game Settings toggle) that counts up from 0:00 across the entire game, displayed under the period clock, written to
cumulative_clock.txt, and used for event log timestamps when enabled (#12) - Cumulative clock format setting — choose between
MM:SS(e.g. 75:30) andH:MM:SS(e.g. 1:15:30) in Game Settings - Combined penalty label files (
home_penalty_labels.txt,away_penalty_labels.txt) with configurable format template including compound penalty support via{{ if_phase2 }}conditional; live preview in Game Settings (#14) period_length.txtfile written and read by the scoreboard core — enables external tools (reeln-cli) to set a custom period length that persists across "New Game" and period advanceperiod_length.txtadded to the file watcher for automatic pickup of external changes
- "Game Finished" checkbox now resets when starting a new game — previously carried over from the prior game, causing the highlights button to show "Generate Game Highlights" instead of "Generate Period Highlights"
- Penalty chapter markers now correctly name the penalized team instead of the opposing team, and use the label "Penalty:" instead of "Power Play:" (#13)
- Clock adjustment on compound penalties now carries leftover time into phase 2 — previously a 60s subtraction on a 2+5 with 30s remaining would start phase 2 at 5:00 instead of the correct 4:30
- Game Settings dialog no longer resets the clock when saving non-clock settings (e.g. penalty format, CLI path)
- Compound penalty support (2+2, 2+5, 2+10) — two-phase penalties where phase 2 auto-starts when phase 1 expires, matching hockey rules for double-minor and major infractions
- Phase 2 toggle buttons (+2, +5, +10) in the add-penalty dialog — select one for compound, deselect all for regular; only shown for sports with major penalties (hockey, lacrosse, rugby)
- Compound indicator
(+M:SS)shown in the dock UI for penalties still in phase 1 - Edit button (✏) on each active penalty row — click to change remaining time
- 4 new OBS hotkeys: Home/Away Penalty Edit 1/2 — opens edit dialog for the first or second running penalty
- 4 new OBS hotkeys: Home/Away 2+2 Penalty Add, Home/Away 2+5 Penalty Add — open add-penalty dialog with compound phase pre-selected
scoreboard_penalty_compact()API — consolidates penalties to lowest slots after any clear or expiryscoreboard_home_penalty_set_time()/scoreboard_away_penalty_set_time()API for programmatic time edits- JSON state persistence for
phase2_tenthsfield (backwards compatible — old state files load with phase2 defaulting to 0)
- Clock adjust at 0:00 no longer reduces penalty time — pressing -1 min or -1 sec when the period clock is already at 0:00 was incorrectly subtracting time from active penalties
- File watcher re-read no longer wipes compound penalty phase 2 data —
parse_penalty_filesnow preservesphase2_tenthsacross text file round-trips
- Penalty hotkeys now open a dialog for player number entry instead of silently adding penalties with no player number — ensures every penalty is tracked to a player
- Clearing a compound penalty in phase 1 (via X button or Clear hotkey) transitions to phase 2 instead of removing the penalty entirely; clearing in phase 2 removes it as normal
- Editing a compound penalty's time to 0 transitions to phase 2 instead of clearing
- After clearing or expiring a penalty, remaining penalties consolidate to the lowest slots — "Clear 1" always targets the first remaining penalty regardless of which slot originally held it
- Hotkey penalty-add callbacks now dispatch to the Qt main thread via
QMetaObject::invokeMethodfor thread-safe dialog display - Total OBS hotkeys increased from 37 to 45
- Game clock now keeps accurate time — previously drifted fast due to assuming exactly 100ms between Qt timer fires instead of measuring actual elapsed wall-clock time
- "Generate Period Highlights" button now correctly runs
reeln game segment <N>instead ofreeln game highlights— the game highlights command requires individual segment files to exist first - Highlights hotkey now also dispatches based on "Game Finished" checkbox state
- Highlights button label now includes the period number (e.g. "Generate Period 1 Highlights") for clarity
- Configurable period labels — period display names are now customizable per-game via
period_labels.txt, with sport-specific defaults (e.g. hockey: 1, 2, 3, OT, OT2, OT3, OT4) - "Edit..." button in Game Settings to open
period_labels.txtin default text editor for quick customization - File watcher on
period_labels.txt— edits in external editors apply immediately without restarting OBS - Faceoff wins counter for hockey and lacrosse — tracks home/away faceoff wins with +/- buttons, displayed below shots on goal
home_faceoffs.txtandaway_faceoffs.txtoutput files for OBS Text sources- 4 new OBS hotkeys: Home/Away Faceoff Win +/-
- Tooltips on all stat row buttons and labels (SOG, FO) for discoverability
- Penalty queue system — only 2 penalties per team run simultaneously (matching hockey rules), additional penalties queue and auto-start when earlier ones expire
SCOREBOARD_MAX_RUNNING_PENALTIESconstant for configurable penalty concurrency
- Start/Stop button now resets to green "Start" when clock auto-stops at 0:00 — previously stayed red "Stop" until manually clicked
- Penalty timers now freeze when period clock reaches 0:00 — previously kept ticking after clock auto-stop
- Period max is now derived from period label count instead of hardcoded segment_count + ot_max
- Toggling overtime on/off regenerates period labels and clamps current period accordingly
- Penalty text file output (
home_penalty_numbers.txt, etc.) now shows only the 2 running penalties, not queued ones - Dock UI shows all active penalties but marks queued penalties with "(queued)" suffix
- "Copy Timestamps to Clipboard" button now remains visible after OBS restarts or stream stops, as long as
timestamps.txtexists on disk - reeln-cli commands (segment highlights, game highlights) now fire regardless of streaming state — previously the button did nothing when not actively streaming
- New Game clears
timestamps.txtand hides the copy button - Stream start warns if previous game timestamps exist, with option to keep or start fresh
- Game event timestamps for YouTube chapter markers — automatically logs goals, penalties, period changes, and game end events with stream-relative timestamps
- "Copy Timestamps to Clipboard" button for pasting chapter markers into YouTube descriptions
timestamps.txtoutput file written incrementally after every event- Event removal support: decrementing a score or clearing a penalty removes the corresponding timestamp entry
- Goal timestamps subtract a 10-second delay offset to better align with the actual moment
- Power Play labels on penalty events showing which team has the advantage
- Recording chapter markers — embeds chapters into Hybrid MP4/MOV recordings via OBS 32+ API when enabled (requires Hybrid MP4 output format, not Standard/FFmpeg)
- Companion
.chapters.txtfile written next to any recording (MP4 or MKV) for reeln-cli integration or manual ffmpeg chapter injection - "Record chapters in game file" checkbox in Game Settings with tooltip showing API availability
- Sport-aware score labels in timestamps: "Goal" for hockey/soccer/lacrosse, "Try" for rugby; score logging disabled by default for basketball and football (too frequent)
- Clock auto-stop when it reaches 0:00 (count-down) or period length (count-up)
- Scrollable dock layout — process queue no longer pushes scoreboard controls out of view
- Segment CLI command (
reeln game segment) only runs when OBS is actively streaming — no more spurious failures during offline testing - Process queue section now uses remaining dock space and scrolls internally instead of growing unbounded
- Renamed "Streamn CLI" to "reeln-cli" in Game Settings dialog with clickable link to repository
- Simplified CLI integration: period advance fires
reeln game segment {period}automatically - Removed main config and override config fields (replaced by hardcoded reeln-cli commands)
- Removed auto-highlights checkbox (segment command fires automatically on period advance)
- Goal scoring and new game no longer fire CLI commands
- Highlights button and period advance are disabled while clock is running
- Highlights button text is now sport-aware (e.g. "Generate Quarter Highlights" for basketball)
- "CLI arguments" text field in Game Settings for extra args (e.g.
--profile my-profile) - Mid-period confirmation dialog when generating highlights or advancing period with clock stopped mid-segment
- "Game Finished" checkbox next to highlights button — switches to
reeln game highlightscommand
- Multi-sport support: hockey, basketball, soccer, football, lacrosse, rugby, and generic sport presets
- Sport selector dropdown in Game Settings dialog
- Sport-specific segment naming in dock UI (Period, Quarter, Half, Segment)
sport.txtoutput file for CLI integration- Sport field in JSON state persistence
- File watcher monitors
sport.txtfor external sport changes - Foul/card/flag counter for basketball ("Fouls"), soccer ("YC"/"RC"), and football ("Flags") with +/- buttons in dock UI
- Soccer split yellow card (YC) and red card (RC) into separate counter rows
home_fouls.txt,away_fouls.txt,home_fouls2.txt,away_fouls2.txtoutput files for foul counters- Fouls and fouls2 persisted in JSON state and text file round-trips
- 8 new OBS hotkeys for foul counters: Home/Away Foul +/-, Home/Away Foul2 +/-
- Rugby preset: 2 halves, 40-minute periods, count-up clock, sin-bin penalties
- 31 new sport preset and foul tests (
test-scoreboard-core-sport.c)
- Soccer: "Cards" counter split into "YC" (yellow cards) and "RC" (red cards).
home_fouls.txt/away_fouls.txtnow represent yellow cards only. Add OBS Text sources for the newhome_fouls2.txt/away_fouls2.txtfiles to display red cards. - Period/overtime logic now driven by sport preset (segment count + OT max) instead of hardcoded hockey values
- Shots row automatically hides for sports without shots (basketball, soccer, football, generic)
- Penalty section automatically hides for sports without penalties (basketball, soccer, football, generic)
- Game Settings dialog label changed from "Period length" to "Segment length" to align with reeln-cli vernacular
- Sport dropdown in Game Settings live-previews default duration, direction, and penalty visibility
- Lacrosse preset includes penalty support (same timed model as hockey)
- Fouls row automatically shows for sports with fouls (basketball, soccer, football) with sport-specific label
- Second foul row (fouls2) automatically shows for soccer (red cards)
- Fixed Windows plugin failing to load — release was built against Qt 5 but OBS Studio 30 ships Qt 6
- Fixed Windows and Linux release packages using incorrect directory structure for OBS plugin loading
- Fixed CLI events firing when no CLI executable is configured (no longer spawns empty processes)
- OBS 32+ Plugin Manager metadata (
manifest.json) now included in all platform packages images/text_files.pngscreenshot for documentation
- Updated Windows and Linux installation instructions in README to match corrected package structure
- Fixed macOS
.pkginstaller not being found by OBS — now installs as a proper.pluginbundle to the user-level plugins directory (~/Library/Application Support/obs-studio/plugins/) - Updated README macOS install instructions with Gatekeeper workaround (right-click > Open)
- Fixed OBS hotkey bindings not persisting across restarts (added explicit save/load via
obs_frontend_add_save_callback)
- Improved README installation instructions with step-by-step guides, post-install dock setup, and link to OBS Plugins Guide
- Added dock UI and scorebug screenshots to README
- Main config, override config, and environment file fields in Game Settings dialog with Browse buttons
- Visible process queue in dock (auto-hidden when no jobs, appears on CLI events)
- Right-click context menu on process queue to clear completed jobs
clear_completed_jobs()function for queue management- Cross-platform build support (macOS, Windows, Linux)
- GitHub Actions CI: build and test on all 3 platforms with coverage enforcement
- GitHub Actions release workflow: platform packaging with optional code signing
- About dialog accessible from dock menu (shows version, license, repo link)
- Windows and Linux CMake presets (
windows,linux) - Qt6 build support with
USE_OBS_QT_FRAMEWORKSCMake option for macOS local development
- CMakeLists.txt refactored for cross-platform Qt5/Qt6/OBS/SIMDE discovery
- macOS build now links against OBS.app's bundled Qt6 frameworks when OBS.app is present, avoiding dual-Qt-runtime crash
configure.shauto-detects OBS.app and skips Homebrew Qt prefix when present (CI still uses qt@5)QActioninclude is now version-conditional (QtGuifor Qt6,QtWidgetsfor Qt5)merge_path_value()now uses platform-correct PATH separator (;on Windows,:elsewhere)- Compiler flags platform-gated: MSVC uses
/W4, GCC/Clang uses-Wall -Wextra -Wpedantic - Game Settings save now reloads CLI config (
load_cli_config()) after updating paths
- Fixed shutdown double-free of
g_queue_container(now owned by QScrollArea widget tree)
- Initial release of Streamn Scoreboard OBS plugin
- Game clock with configurable period length (count up / count down)
- Period tracking: 3 standard periods + OT through OT4
- Home/away score and shots on goal with +/- buttons
- Editable team names directly in the dock UI
- Penalty tracking: up to 8 penalties per team with player number and countdown timer
- Clock quick-adjust buttons: minutes (left carets) and seconds (right carets, hold-to-repeat)
- Clock adjustments sync penalty timers symmetrically
- Dynamic Start/Stop button with red highlight when running
- 22 OBS hotkeys for hands-free operation
- Text file output: 12 files (clock, period, names, scores, shots, penalties) for OBS Text sources
- Refresh State: reload all values from text files (menu action)
- State persistence: reads text files on startup to restore game state across OBS restarts
- Save/Load State to JSON files
- New Game reset (preserves team names and configuration)
- Configure Paths dialog for output directory, CLI executable, and config files
- Game Settings dialog for period length, clock direction, and default penalty duration
- CLI process queue with event-driven actions and token expansion
- Theme-compliant UI using QPalette (adapts to OBS light/dark themes)
- Requires OBS Studio 30.0 or later
- macOS (Apple Silicon and Intel)