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.
1985‑86년부터 NBA 경기와 비교해 휴식·여행·일정 밀도를 분석하고, 슈팅·플레이오프·선수 출전·심판 등을 탐색
NBA analytics for rest, travel, and schedule density, checked against games since 1985-86. Explore shooting, playoff series, availability, and officiating with methods and limitations.
스포츠·피트니스TypeScript · PythonGitHub @mhju0온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
NBA rest and schedule analysis with matchup comparisons, historical venue baselines, player shooting splits, shot-location models and source-linked officiating reports.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗NBA rest and schedule findings, player shooting splits, and source-linked officiating reports.
v1.3.2 · October 26, 2026 · Release history
Open FullCourt · Read the methods
FullCourt scores each team's schedule load, compares the two teams in a matchup, and measures how often the more-rested side won. It also examines playoff series, player shooting, shot locations, missing rotation players, and officiating patterns.
Home court matters much more than rest. The regular-season model makes a call when the more-rested team is at home; rested visitors are reported separately, and a neutral-site game has no home team to call. Both win rates are compared with their venue baselines. These are historical associations, not estimates of what rest alone caused or a complete forecast of who will win.
The Model Results page carries the current rates and sample sizes, split by gap size (small 0.5–3, medium 3–5, large 5+) and by five-season era. Behind the Data explains the calculations and publishes results that did not support a measurable effect.
The engineering walkthrough source explains the problem, data flow, implementation tradeoffs and verification. About identifies the author and links to that walkthrough in the application.
Data status separates coverage and available refresh dates from database connectivity. Result studies publish current-season observations as soon as validated data exists and mark them as season-to-date. Selected views remain shareable through URLs and browser history.
| Page | What it shows |
|---|---|
| Games | Browse matchups by season and date, and expand a game to inspect its schedule load. A rested team at home 3 to 5 points fresher is marked as a medium rest edge, 5 or more as a large one. Edges Ahead jumps to the upcoming games where the rested team is at home with the widest gaps. |
| Season Report | Published-season results against their home baseline, team rest records, and the completed games with the largest rest gaps the model called. Small samples are labeled. |
| Schedule Edge | Within-season rest-edge ranking, schedule worth, travel and workload, and the completed-game fatigue calendar. Details expand on demand. |
| Explore | Seven basketball studies and their research sources, with compact cards and concise descriptions on phones. |
| Home-Court Advantage | Each season's home win rate beside the record of teams that were also more rested at home. |
| Model Results | Win rates for the rested team at home by gap size and by era, each compared with its venue baseline, the rested-visitor games reported separately, and a searchable game record filtered by gap size and rested side. |
| Playoff Rest | Previous-round workload and a separate series probability model. Its probabilities improve on the historical base rate, while its overall accuracy is close to always choosing the home-court team. |
| Player Shooting by Rest | Effective field goal percentage on no rest versus 2–29 days off. Rest comes from each player's appearances. Single-season splits are noisy; career estimates use shrinkage toward the league mean. |
Captured from fullcourt.fyi on 2026-10-27 at v1.3.2 (8419bb8f);
capture details and reproduction. Desktop images show historical
Games, the completed 2025-26 Shooting season and current Officiating. Phone images use 375px and 402px Chromium viewports.
Physical iPhone, Safari and VoiceOver behavior remains unverified; live data can change.
On phones, Games puts matchups earlier, Schedule Edge leads with rankings, and Shooting puts the rest difference beside each player, with eFG% and shots under each rest group and player names pinned while the table scrolls. Home Court links graph selection to the season readout, chart selections offer an explicit game-browsing action, and Expected Shot Value compares models on one court while keeping the selected location.
The score combines recent workload, travel distance, time between games, schedule density, altitude, extended road trips, and time away from the team's home time zone. Prior-game overtime and margin affect workload; longer breaks reduce it. Travel is estimated from game locations, not flight records.
Regular-season fatigue scores exclude playoff games and the 2019-20 Orlando bubble. Ordinary games played before that season's suspension remain included. Schedule Edge excludes the whole interrupted season from its team ranking because teams played unequal numbers of games. Some inputs, including overtime and tip-off times, are unavailable in earlier seasons.
The rest-advantage method documents the terms, coefficients, and tests. A weight-fitting study did not establish enough improvement to replace the ratified model; its protocol and amendments are preserved in ADR 0006.
flowchart TD
feeds["ESPN · hoopR · NBA feeds"] --> ingest["Ingest scripts"]
ingest --> db[("PostgreSQL")]
db --> fatigue["TypeScript fatigue engine"]
fatigue -->|"stored scores"| db
db --> api["Next.js route handlers"]
api --> ui["React · SWR"]
db -.->|"Realtime scores"| ui
offline["Python analyses"] --> artifacts["Generated data artifacts"]
artifacts --> ui
The fatigue engine in src/lib/fatigue.ts computes scores on the write path. Pages read the
stored results. Other analyses use dedicated queries or generated artifacts; player shooting,
availability, and Officiating use published artifacts. Officiating loads report details on demand.
| Layer | Implementation |
|---|---|
| Interface | Next.js, React, TypeScript, Tailwind CSS, Base UI, Recharts, SWR; CSS motion |
| Data access | Next.js route handlers, Zod, Drizzle ORM, node-postgres, Supabase PostgreSQL |
| Ingest and analysis | Python and TypeScript scripts; scikit-learn models run offline |
| Checks | Vitest, Playwright, Python contracts |
| Hosting and scheduled jobs | Vercel and GitHub Actions |
Start at the documentation index for architecture, operations, reproducibility, and release verification. No accounts or login are needed; selected views can be shared by URL.
Use the pnpm version pinned in package.json. CI uses Node 22 and Python 3.11.
pnpm install --frozen-lockfile
cp .env.example .env.local
# Set DATABASE_URL for a populated database.
pnpm dev
Open localhost:3000. Database-backed pages need populated data; optional public Supabase settings enable live score updates.
The repository has no automatic database bootstrap. src/lib/db/schema.ts is deliberately
incomplete, and drizzle/ contains manual SQL records. Do not run drizzle-kit push or
generate. Follow Database and apply SQL manually in a dedicated database.
pnpm lint
pnpm typecheck
pnpm test:run
pnpm build
pnpm audit --prod
pnpm test:e2e starts its own server and needs a populated database. To test an existing
server, set PLAYWRIGHT_BASE_URL. Python requirements and contract-test commands are in
Testing and CI/CD.
| Directory | Contents |
|---|---|
src/app/ | Pages, metadata, and API routes |
src/components/ | Tables, charts, navigation, and shared controls |
src/lib/ | Fatigue model, database access, formatting, and analysis helpers |
src/hooks/ | Data loading, live scores, and browsing state |
scripts/ | Ingest, backfills, data generation, and maintenance |
ml/ | Offline analyses, reports, and pre-registrations |
src/data/, public/data/ | Generated analytics artifacts |
drizzle/ | SQL for manual application |
docs/ | Current documentation index, decisions, and clearly labeled research history |
anti-slop/ | Project-local review guidance; completed intermediate audits are retained in Git |
Built by Michael Ju.
The interface bundles Geist and Geist Mono locally under the SIL Open Font License 1.1; font provenance records official sources and hashes. The separate static Geist fonts used for social images retain their original license.
Copyright (c) 2026 Michael Ju. All rights reserved. No license is granted for use, copying, modification, or distribution of this code. The repository is public for portfolio review.
| Expected shooting value by court location. The model does not observe defender distance, shot-clock pressure, or shot difficulty beyond location. |
| Availability Cost | The estimated margin associated with a missing rotation player, controlling for team strength and schedule factors, with selectable annual readouts. Absences are identified after games, so this is not a lineup forecast. |
| Officiating | NBA Last Two Minute findings across 12 completed regular seasons (2014–15 through 2025–26) and the current season to date, by team and call type, with the NBA’s verdicts inside each game. Covers selected close-game endings; earlier referee studies remain in the research archive. |