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.
Data pipeline and scouting dashboard for the Turkish Basketball League: TBF + FIBA LiveStats, possessions, lineups, xPTS, matchup model, Tableau workbook generated in code
翻訳待ち
Loading the full README.
Read the full README ↗A data pipeline and scouting dashboard for the Turkish Basketball League (TBL). It joins two public sources: TBF (the federation's API) and FIBA LiveStats (Genius Sports). It rebuilds every game possession by possession and turns the season into a Tableau dashboard a coach can read before a game.
TBF API ──────────┐ ┌─> analysis tables (Parquet, DuckDB)
(fixtures, ids, │ raw store staged enriched │
officials) ├─> (never ─> (parsed, ─> (order, ├─> metrics.json
FIBA LiveStats ───┘ overwritten) validated) lineups, │
(play-by-play, possessions,└─> Tableau CSV + Hyper + .twb
shots x/y, box) shot zones)
tbl sync fetches only what is due: new or unsettled games and
expired lists. Every response is stored as a compressed file and never
overwritten.tbl build parses both sources and maps Genius players to TBF's
persistent ids. It validates the two sources against each other, then
enriches the play-by-play: canonical event order, five-man lineups on every
event, possessions, free-throw trips and shot zones in metres.tbl analyze fits an expected-points (xPTS) shot model and
builds team and player profiles. It also measures how many games each stat
needs before it can be trusted, projects matchups, and writes a complete
Tableau workbook in code.Some of the checks the pipeline passes, measured on its own data:
Nine pages built around one team: Home, Opponent, Teams, Shots, Players, Pairs, Games, Reliability and Method. You choose the main team once on the home page. The opponent page finds the next opponent from the fixture list and reads top to bottom: a game card with an 80% range, the matchups that stand out, the opponent's style, their key players, the full four-factor matchup, rotation and form.
Every number carries a data-strength mark (● settled, ◐ partly, ○ mostly luck after N games). The wording describes and never prescribes: the page shows tendencies and leaves the decision to the coach.
Requires Python 3.12 and uv. Syncing TBF also needs Google Chrome.
uv sync
uv run pytest # 33 tests run offline; 20 more need tests/fixtures (not in git)
uv run tbl sync --season 2025-26 # fetch a season (opens Chrome for TBF)
uv run tbl build --season 2025-26
uv run tbl analyze --season 2025-26 # analyse seasons in order: the next one uses this one
uv run tbl sync && uv run tbl build && uv run tbl analyze # 2026-27 (default)
Data lives outside the repo, in $TBL_DATA_DIR (default ~/data/tbl). The
workbook is written to ~/data/tbl/tableau/tbl-2026-27/tbl-2026-27.twb; open
it in Tableau Public. See running the pipeline.
The docs come in two versions written for different readers:
| For humans | For AI agents | |
|---|---|---|
| Start here | docs/for-humans | docs/for-ai |
| Style | explanations, reasons, numbers, reading order | dense rules: repo map, invariants, commands, traps |
Coding agents also find AGENTS.md at the root.
tests/fixtures/ is absent.The code is under the MIT License. The license does not cover any data, logos or trademarks the code may download.