{"id":45756592,"url":"https://github.com/streamndad/streamn-scoreboard","last_synced_at":"2026-04-16T22:02:18.280Z","repository":{"id":340587521,"uuid":"1165361787","full_name":"StreamnDad/streamn-scoreboard","owner":"StreamnDad","description":"Third-party OBS Studio plugin for tracking youth hockey scoreboard state. Writes game data to text files for use with OBS Text sources.","archived":false,"fork":false,"pushed_at":"2026-04-16T15:24:42.000Z","size":469,"stargazers_count":4,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-16T15:30:43.600Z","etag":null,"topics":["c","clock","hockey","livestreaming","obs-plugin","obs-studio","obs-studio-plugin","scoreboard","scorebug","scorekeeper","sports","streamn-dad","youth-sports"],"latest_commit_sha":null,"homepage":"https://streamn.dad","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StreamnDad.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-24T04:51:06.000Z","updated_at":"2026-04-10T14:30:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/StreamnDad/streamn-scoreboard","commit_stats":null,"previous_names":["streamndad/streamn-scoreboard"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/StreamnDad/streamn-scoreboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreamnDad%2Fstreamn-scoreboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreamnDad%2Fstreamn-scoreboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreamnDad%2Fstreamn-scoreboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreamnDad%2Fstreamn-scoreboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StreamnDad","download_url":"https://codeload.github.com/StreamnDad/streamn-scoreboard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreamnDad%2Fstreamn-scoreboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31905895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"ssl_error","status_checked_at":"2026-04-16T18:21:47.142Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","clock","hockey","livestreaming","obs-plugin","obs-studio","obs-studio-plugin","scoreboard","scorebug","scorekeeper","sports","streamn-dad","youth-sports"],"created_at":"2026-02-25T21:00:57.369Z","updated_at":"2026-04-16T22:02:18.273Z","avatar_url":"https://github.com/StreamnDad.png","language":"C","readme":"# Streamn Scoreboard for OBS Studio\n\n[![Build](https://github.com/StreamnDad/streamn-scoreboard/actions/workflows/build.yml/badge.svg)](https://github.com/StreamnDad/streamn-scoreboard/actions/workflows/build.yml)\n[![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/StreamnDad/streamn-scoreboard/actions/workflows/build.yml)\n[![License: GPL v2](https://img.shields.io/badge/License-GPL_v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)\n\nOBS Studio plugin that tracks live game scoreboard state and writes it to individual text files. Supports hockey, basketball, soccer, football, lacrosse, rugby, and a generic preset. Users compose their scoreboard overlay in OBS using standard Text (GDI+/FreeType) sources pointed at these files.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/streamn-scoreboard.png\" alt=\"Streamn Scoreboard dock UI\" width=\"360\"\u003e\n\u003c/p\u003e\n\n## Features\n\n- **7 sport presets** — hockey, basketball, soccer, football, lacrosse, rugby, and generic\n- **27 text files** updated in real-time: clock, period, scores, shots, team names, penalties, penalty labels, fouls, sport, and more\n- **Dock UI** with full scoreboard controls in an OBS dock panel\n- **45 OBS hotkeys** for hands-free operation during broadcasts\n- **Penalty tracking** with automatic countdown timers, compound penalties (2+2, 2+5, 2+10), edit/clear per slot (hockey, lacrosse, rugby)\n- **Foul/card counters** for basketball, soccer, and football\n- **reeln-cli integration** for automated highlight generation\n- **Game event timestamps** — YouTube chapter markers copied to clipboard for livestream descriptions\n- **Recording chapter markers** — game events written to a `.chapters.txt` companion file next to each recording; also embedded directly into Hybrid MP4/MOV recordings on OBS 32+\n- **Cumulative game clock** — opt-in clock counting up from 0:00 across all periods, written to `cumulative_clock.txt`, with configurable display format (MM:SS or H:MM:SS)\n- **Custom penalty labels** — combined penalty number + time in a single file per team (`home_penalty_labels.txt`, `away_penalty_labels.txt`) with configurable format template and compound penalty support\n\nBuild your own scorebug overlay using OBS Text sources pointed at the output files:\n\n![Example scorebug overlay](images/scorebug.png)\n\n## Compatibility\n\n- **OBS Studio** 30.0+ (Qt5/Qt6); embedded recording chapters require OBS 32+ with Hybrid MP4 output\n- **macOS** (Apple Silicon and Intel)\n- **Windows** (x64)\n- **Linux** (x86_64)\n- C11 / C++17\n\n## Installation\n\nDownload the latest release for your platform from the [Releases](https://github.com/StreamnDad/streamn-scoreboard/releases) page. Each download contains a single plugin file (`.so`, `.dll`, or `.pkg`) that you copy into your OBS plugins folder.\n\nFor general information about installing OBS plugins, see the [OBS Plugins Guide](https://obsproject.com/kb/plugins-guide).\n\n### macOS\n\n1. Download `streamn-obs-scoreboard-x.y.z-macos.pkg`\n2. **Right-click** (or Control-click) the `.pkg` file and choose **Open** — this is required because the package is not yet notarized with Apple. If you double-click instead, macOS will block it. You can also go to **System Settings \u003e Privacy \u0026 Security** and click **Open Anyway** after a blocked attempt.\n3. Follow the installer prompts\n4. Restart OBS Studio\n\nThe installer places the plugin in `~/Library/Application Support/obs-studio/plugins/streamn-obs-scoreboard.plugin/`.\n\n### Windows\n\n1. Download `streamn-obs-scoreboard-x.y.z-windows-x64.zip`\n2. Extract the `streamn-obs-scoreboard` folder to your OBS plugins directory:\n   - **Recommended:** `C:\\ProgramData\\obs-studio\\plugins\\`\n   - **Alternative:** Copy just the `.dll` from `bin\\64bit\\` to `C:\\Program Files\\obs-studio\\obs-plugins\\64bit\\`\n3. Restart OBS Studio\n\n### Linux\n\n1. Download `streamn-obs-scoreboard-x.y.z-linux-x86_64.tar.gz`\n2. Extract the `streamn-obs-scoreboard` folder to your OBS plugins directory:\n   - **Per-user:** `~/.config/obs-studio/plugins/`\n   - **Alternative:** Copy just the `.so` from `bin/64bit/` to `/usr/lib/obs-plugins/`\n3. Restart OBS Studio\n\n### After installation\n\n1. Open OBS Studio — the plugin loads automatically on startup\n2. Go to **View \u003e Docks \u003e Streamn Scoreboard** to enable the dock panel\n3. Dock it wherever you like in the OBS interface (drag the title bar to snap it into place)\n\n### Uninstalling\n\n**macOS:**\n```bash\nrm -rf ~/Library/Application\\ Support/obs-studio/plugins/streamn-obs-scoreboard.plugin\n```\n\n**Windows:** Delete `streamn-obs-scoreboard.dll` from your OBS plugins folder.\n\n**Linux:**\n```bash\nrm -rf ~/.config/obs-studio/plugins/streamn-obs-scoreboard\n# or, if installed system-wide:\nsudo rm /usr/lib/obs-plugins/streamn-obs-scoreboard.so\n```\n\nRestart OBS after uninstalling.\n\n### Building from source\n\n```bash\n# macOS\nmake setup                    # Install prerequisites (requires Homebrew)\nmake find-obs-dev-paths       # Discover local OBS header/lib paths\nmake dev OBS_INCLUDE_DIR=/path/to/obs/include OBS_LIBRARY=/path/to/libobs\nmake install\n\n# Linux\nsudo apt install libobs-dev qtbase5-dev libsimde-dev ninja-build\ncmake --preset linux\ncmake --build build\nctest --test-dir build\n\n# Windows (requires Visual Studio 2022, Qt5, OBS SDK)\ncmake --preset windows -DOBS_INCLUDE_DIR=... -DOBS_LIBRARY=... -DCMAKE_PREFIX_PATH=...\ncmake --build build --config RelWithDebInfo\nctest --test-dir build -C RelWithDebInfo\n```\n\n## Text Files\n\nSet an output directory in the dock settings. The plugin writes these files on every tick (~100ms):\n\n| File | Content | Example |\n|------|---------|---------|\n| `clock.txt` | Game clock | `12:45` |\n| `period.txt` | Current period | `2` / `OT` |\n| `home_name.txt` | Home team name | `Eagles` |\n| `away_name.txt` | Away team name | `Hawks` |\n| `home_score.txt` | Home score | `3` |\n| `away_score.txt` | Away score | `1` |\n| `home_shots.txt` | Home shots on goal | `18` |\n| `away_shots.txt` | Away shots on goal | `12` |\n| `home_penalty_numbers.txt` | Home penalty player numbers | `#12 #7` |\n| `home_penalty_times.txt` | Home penalty times remaining | `1:32 0:45` |\n| `away_penalty_numbers.txt` | Away penalty player numbers | `#19` |\n| `away_penalty_times.txt` | Away penalty times remaining | `0:22` |\n| `home_fouls.txt` | Home fouls/yellow cards/flags | `3` |\n| `away_fouls.txt` | Away fouls/yellow cards/flags | `2` |\n| `home_fouls2.txt` | Home second counter (e.g. red cards) | `0` |\n| `away_fouls2.txt` | Away second counter (e.g. red cards) | `1` |\n| `sport.txt` | Active sport preset | `hockey` |\n| `home_penalty_labels.txt` | Combined penalty number + time (one per line) | `#12  1:32` |\n| `away_penalty_labels.txt` | Combined penalty number + time (one per line) | `#19  0:22` |\n| `home_faceoffs.txt` | Home faceoff wins | `8` |\n| `away_faceoffs.txt` | Away faceoff wins | `6` |\n| `cumulative_clock.txt` | Cumulative game clock (when enabled) | `32:15` |\n| `period_length.txt` | Period length in seconds | `900` |\n| `period_labels.txt` | Period display names | `1,2,3,OT` |\n| `default_penalty_duration.txt` | Minor penalty duration (seconds) | `120` |\n| `default_major_penalty_duration.txt` | Major penalty duration (seconds) | `300` |\n\nNot all files are relevant for every sport — shots are only tracked for hockey and lacrosse, penalties for hockey/lacrosse/rugby, and fouls for basketball/soccer/football. Files for inactive features still exist but won't change.\n\n## Hotkeys\n\nAll 45 hotkeys are prefixed with \"Streamn:\" in OBS Settings \u003e Hotkeys:\n\n| Hotkey | Action |\n|--------|--------|\n| Clock Start/Stop | Toggle game clock |\n| Clock Reset | Reset clock to period length |\n| Clock +1 Min / -1 Min | Adjust clock by 1 minute |\n| Clock +1 Sec / -1 Sec | Adjust clock by 1 second |\n| Home/Away Goal +/- | Adjust score (4 hotkeys) |\n| Home/Away Shot +/- | Adjust shots (4 hotkeys) |\n| Period Advance / Rewind | Change period |\n| Home/Away Penalty Add | Open add-penalty dialog (minor) |\n| Home/Away Major Penalty Add | Open add-penalty dialog (major) |\n| Home/Away 2+2 Penalty Add | Open add-penalty dialog (compound 2+2) |\n| Home/Away 2+5 Penalty Add | Open add-penalty dialog (compound 2+5) |\n| Home/Away Penalty Clear 1/2 | Clear or transition penalty slot (4 hotkeys) |\n| Home/Away Penalty Edit 1/2 | Open edit dialog for penalty slot (4 hotkeys) |\n| Home/Away Faceoff +/- | Adjust faceoff counter (4 hotkeys) |\n| Generate Highlights | Trigger reeln-cli highlight generation |\n| Home/Away Foul +/- | Adjust foul counter (4 hotkeys) |\n| Home/Away Foul2 +/- | Adjust second foul counter (4 hotkeys) |\n\n## Game Event Timestamps \u0026 Recording Chapters\n\nThe plugin automatically tracks game events (goals, penalties, period changes) with timestamps relative to your stream or recording start time.\n\n### Livestream Timestamps (YouTube Chapters)\n\nWhen OBS is streaming, events are logged with stream-relative timestamps. Click **Copy Timestamps to Clipboard** in the dock to paste them into your YouTube video description as chapter markers:\n\n```\n0:00:00 Stream Start\n0:12:34 Period 1 Start\n0:15:22 Goal: Eagles (1-0)\n0:23:45 Penalty: Hawks #12\n0:35:10 Period 1 End\n```\n\nA `timestamps.txt` file is also written to your output directory after every event.\n\n### Recording Chapters\n\nEnable **\"Record chapters in game file\"** in Game Settings to track events in your local recordings:\n\n- **Companion file**: A `.chapters.txt` file is written next to every recording (e.g., `2026-03-12_15-30-00.mp4.chapters.txt`). This works with any recording format (MKV, MP4, MOV) and can be used by reeln-cli or with ffmpeg to inject chapters.\n- **Embedded MP4 chapters**: On OBS 32+, chapters are also embedded directly into the recording file — but **only** when using the **Hybrid MP4** recording format. Standard (FFmpeg) output and MKV do not support embedded chapters. To enable: OBS Settings \u003e Output \u003e Recording \u003e Recording Format \u003e **Hybrid MP4**.\n\nRecording chapters are tracked independently of streaming, so they work when you're only recording locally without a livestream.\n\n### Sport-Aware Score Events\n\nScore events use sport-specific labels:\n\n| Sport | Label | Logged by default |\n|-------|-------|-------------------|\n| Hockey | Goal | Yes |\n| Soccer | Goal | Yes |\n| Lacrosse | Goal | Yes |\n| Rugby | Try | Yes |\n| Basketball | Score | No (too frequent) |\n| Football | Score | No (too frequent) |\n\nPeriod, penalty, and game-end events are always logged regardless of sport.\n\n## Development\n\n```bash\nmake dev          # configure + build + test (full cycle)\nmake coverage     # enforce 100% line coverage on scoreboard-core\nmake release      # build macOS .pkg installer\nmake clean        # remove build artifacts\n```\n\n### Architecture\n\nTwo-layer design separating testable core logic from OBS-dependent code:\n\n- **scoreboard-core** (C static library) — pure game state management, file output, no OBS dependencies\n- **OBS module** (C/C++ shared library) — dock UI, hotkeys, OBS integration\n\nTests are plain C using `assert()` with 100% line coverage on the core library.\n\n## License\n\nThis project is licensed under the GNU General Public License v2.0 — see [LICENSE](LICENSE) for details. GPLv2 is required because the plugin links against libobs (GPLv2).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreamndad%2Fstreamn-scoreboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstreamndad%2Fstreamn-scoreboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreamndad%2Fstreamn-scoreboard/lists"}