BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Shift sheets for LADA's rec hockey teams: shifts, ice time and average shift length for every skater, measured from the wide-cut game video on YouTube.
| Team | Folder | Site |
|---|---|---|
| LADA Turbo Kings (LADA team 24) | teams/tk/ | https://kondrat52.github.io/lada-analytics/tk/ |
| LADA Blue Wings (LADA team 10) | teams/bw/ | https://kondrat52.github.io/lada-analytics/bw/ |
| LADA Beerteam (LADA team 5) | teams/bt/ | https://kondrat52.github.io/lada-analytics/bt/ |
| LADA Doofers (LADA team 17) | teams/df/ | https://kondrat52.github.io/lada-analytics/df/ |
| LADA Y (LADA team 20) | teams/y/ | https://kondrat52.github.io/lada-analytics/y/ |
| LADA R (LADA team 2) | teams/r/ | https://kondrat52.github.io/lada-analytics/r/ |
| Path | What it is |
|---|---|
docs/ | The published sites (GitHub Pages): each team's in docs/<slug>/, with game pages, a trends page (trends.html) and a JSON feed in api/, and a list of the teams at the root. Generated; don't edit by hand. |
API.md | The JSON feed for apps (e.g. the LADA app): URLs, fields, conventions. |
teams/<slug>/games/<date>-vs-<opp>/ | One folder per game: game.json (periods, penalty kills, video link, notes) and shifts.csv (one row per shift). |
teams/<slug>/roster.json | Jersey number → surname, LADA player ids, team name, LADA team id and where its site goes. Add new players here. |
teams/<slug>/opponents.json | Opponent code → full name. |
teams/<slug>/lada_games.json | The team's games as LADA's API has shown them (ids, home/away, rink, lines, scores); the pipeline keeps it current and takes each game's LADA id from it. |
pipeline/ | The scripts that turn a game video into shifts.csv, and build_site.py, which renders docs/. They work on one team at a time, picked by TEAM (tk unless set). regress.py re-solves every archived game and diffs the published sheets, for checking a pipeline change. |
RUNBOOK.md | The manual steps behind the skill, for debugging or running by hand. |
WINDOWS.md, setup_windows.ps1 | Setting up a Windows PC with an NVIDIA GPU to run the pipeline (one command). |
.claude/skills/process-game/ | The Claude Code skill for the weekly run. |
The weekly run is driven by Claude Code. Open this repo and run the project skill:
/process-game https://youtu.be/XXXXXXXXXXX vs RR
for Turbo Kings, or name the team: /process-game https://youtu.be/XXXXXXXXXXX bw vs DB.
The skill (.claude/skills/process-game/SKILL.md, with its references/) reads the SportNinja scoresheet if you
give it one, asks for the opponent and any new players, finds periods, goals, penalties and shots from the arena
scoreboard and the video, then runs pipeline/run_game.py (fetch → absent → prepare → review → solve → publish)
and asks before pushing. Only the score confirmation and the push wait for you.
It takes two to four hours of session time on the Windows PC (fetch 25–45 minutes when YouTube serves the video,
prepare and review 15–25, the by-eye lineup checks 20–70, then goals, clips and publish 10–30), or a few hours more
on an M-series Mac, where detection alone is about two hours. YouTube's bot block adds anything from nothing to
hours: three of the four games fetched on Oct 31 needed the user's browser cookies (run_game.py download --cookies firefox, which the user runs), and one waited nearly three hours for the block to lift. The Nov 2
changes to detection and OCR (TODO 1–3) should take about 10 minutes off a fetch; they are measured on a slice so
far, and the first full fetch will tell.
On a Windows PC with an NVIDIA GPU, detection runs on CUDA and should be much faster. To set one up, run this in
PowerShell; WINDOWS.md has the details and the steps by hand:
irm https://raw.githubusercontent.com/kondrat52/lada-analytics/main/setup_windows.ps1 | iex
To rebuild the sites after editing a game's files or a roster (TEAM=bw for one team only):
python pipeline/build_site.py
teams/<slug>/roster.json: copy another team's, empty its skaters, subs, goalies and lada_player_ids
({}), and change the team name, team_short, lada_team_id (LADA's public https://api.ladaseattle.com/api/v1/Team/<id> gives a team's name)
and site_url (https://kondrat52.github.io/lada-analytics/<slug>/). teams/<slug>/opponents.json: {}.python pipeline/lada_ids.py --write <slug> (several slugs at once is fine). It signs
in to LADA as you (LADA has to show you the team's roster) and fills in skaters, subs (LADA's Sub status),
goalies (LADA's Goalie position) and lada_player_ids; the surname is the last word of LADA's name, so check
them against the jerseys. It never changes what's already there. A spare who isn't on LADA's roster goes under
subs by hand (the team's SportNinja roster has them; screenshots work). A player LADA lists under another number
than his jersey's (Y's #87 Beregovoy is #67 on LADA) goes under his jersey number, with "lada_numbers": {"87": 67}
so lada_ids.py matches him and doesn't add LADA's number. A player who wears two numbers (Beregovoy wears 67
on the white jersey) is under both, with the same LADA id, and "aliases": {"87": 67} lists him once, under 67,
on the season table, trends page and feed. Without --write it only compares.python pipeline/build_site.py: the team gets its site, listed at the root, and its feed (empty until the first
game) right away.--team <slug>. Check the jerseys and benches on a frame first: rink.py knows our two
jerseys (light blue, white with blue trim) and each rink's benches.<site_url>api) is in shiftSheetFeeds in the
app's lib/src/shared/api_constants.dart, keyed by LADA team id, and that app version is released.This is the beginning of the README. Read the rest at the original. Read the full README ↗