Add Player
One roster for the whole league. You'll split players into two teams per game, since teams change each time.
Roster
Video Setup
Session video
If one recording covers several games back-to-back, upload it once here and reuse it across all of them. Each game just remembers its own start time in the shared video, instead of you splitting the file into separate clips.
Or a video just for this game
A chosen file is stored in this browser (via IndexedDB) so it stays loaded next time you open this game on this computer, but it never leaves the browser, so it isn't included in exports.
Mark a Clip
While the video is playing, mark the moment. It grabs a ~10 second clip centered on the current playback time. Needs a local video file or direct video link loaded above (YouTube embeds can't be read for their playback time). See the full list in Highlight / Lowlight Reel below.
Suggested Plays
Candidate clips pulled straight from what's already logged for this game (dunks, blocks, contested makes, deep 3s, steals, the game-winning shot) instead of scrubbing the whole video by eye looking for moments worth clipping. Adding one grabs the same ~10 second window Mark a Clip does, centered on that event's own timestamp — nothing gets added until you click. Click ▶ Jump to watch a suggestion before adding it. Only shows events with a real video timestamp, and never re-suggests something already added.
Team Rosters for This Game
Add players to Team A or Team B for this game. Click the × on a chip to remove them.
Game Stats
Everyone in this game at a glance, including shooting splits and defensive/advanced numbers derived from the Shot Log below: FG/3PT/FT (made/attempted, %), eFG% (FG% weighted for 3s counting extra), TS% (true shooting: scoring efficiency across FGs and FTs combined), A/TO (assist-to-turnover ratio), Pts Allowed and Beaten (points scored, and times scored on, while they were the tagged defender on a make), Opp FG% (shooting % of everyone they were tagged defending, make or miss), Stops (times they were the tagged defender on a miss), Off Rating (offense-only Game Score: PTS, shooting efficiency, rebounds, assists, TOV, and fouls), and Two-Way (Off Rating plus Def Rating: STL, plus BLK when it isn't already one of this player's own Stops, plus Stops minus Beaten minus 0.4×Pts Allowed, so it's 0 for anyone never tagged as a defender with no steals or blocks, not a penalty for conservative tagging). STL/BLK are shown as recorded. They also feed Def Rating, and their sum (Stocks) is in the CSV export if you want it, but isn't repeated here since it's just those two columns added together.
Shot Log
Every shot attempt, make or miss, with who (if anyone) was contesting it and, for makes, who assisted it. Click +1/+2/+3 (make) or the MISS buttons on a player above to log one. Each entry auto-captures the video's playback position when you logged it, so Jump takes you right back to it (needs a local video file or direct link loaded, not a YouTube embed). Click any column header to sort by it; puts it back the way it opened.
Other Events
Every turnover, steal, and foul, tagged with the one opponent involved where noted. Click the TOV/STL/PF +1 buttons on a player above to log one. Click any column header to sort by it; puts it back the way it opened.
Defensive Matchups
Track who was guarding who while you review the video. Add as many entries as the matchup changes. Click any column header to sort by it; puts it back the way it opened.
Highlight / Lowlight Reel
Every clip you've marked for this game (use the Mark Highlight / Mark Lowlight buttons above to add one). Click any column header to sort by it; puts it back the way it opened.
Plays every clip above in video-time order and records it live. This takes real time (roughly the reel's own total length), and the tab needs to stay open and in the foreground while it runs. Downloads as a .webm file when done.
Personalized Tips
This player's own numbers next to the league average for that same stat, only shown when something actually stands out, not a fixed checklist. Doubles as a real scouting note on whoever you're looking at: their preferred shot zone and a real strength/weakness zone (checked against the league's own FG% from that same distance), plus real matchup-specific splits (a defender who's genuinely held them below their own usual shooting, or a scorer who's shot well above what they normally allow), each needing 5+ real attempts before it counts as a pattern rather than one bad or good night. Several tips carry their own "Watch film" links, straight to the actual games behind that number.
Notable Matchups
Every real, exploitable shooting swing involving this player, either as scorer or defender, ranked biggest first, each with its own "Watch film" link to the actual games it came from. Needs 5+ attempts against that one specific opponent and at least a 15-point swing from the scorer's own overall FG% before it counts as a pattern rather than one lucky or unlucky night.
Past Seasons
This player's final numbers from every season closed out via Export → Data Management → Start New Season, one row per season, computed live off the actual archived games, not a frozen snapshot, so these stay correct even if a stat's formula changes later. The current season's own numbers are everywhere else on this page; toggle Include Past Seasons to blend these into the live totals instead of viewing them separately (same toggle as the Leaderboard's; flipping it here updates both).
Flake %
Of the dates this player RSVP'd yes for on the Games tab's Who's Coming? panel and that have since had at least one game logged, how many they never actually showed up for. A date they RSVP'd for with no game logged yet isn't counted either way: it's not resolved, not a no-show.
Two-Way Trend
Two-Way/20 for every reviewed game this player's played, in order: the line-graph version of the "Last 5" number and arrow already shown elsewhere (feeding the Most Improved comparison on the Leaderboard), since a real trend line makes "up or down lately, and by how much" legible at a glance instead of two numbers to compare in your head. The dashed line is the season average; where the recent points sit relative to it is the whole read.
Game Log
Every game this player was in, most recent first.
Shot Chart
Every marked field goal this player has taken, plotted at its actual spot on the court: green for a make, red for a miss. The individual-shot pattern the zone-bucketed heatmap below necessarily smooths over: a cluster, a gap, a lean to one side, is visible here in a way no table of percentages shows directly. Only shots with a marked location are included (see Export → Backfill Shot Locations to fill in the rest).
Shot Heatmap
Every marked field goal this player has taken, bucketed by court zone. Color is FG% in that zone (red low, green high), the number is attempts. Only shots with a marked location are included.
Head-to-Head: As Scorer
Shooting against each defender who has been tagged guarding this player's shots, across the season.
Defensive Heatmap
Every shot this player was tagged defending, bucketed by court zone. Color is opponent FG% allowed there (red high, green low; inverted from the offensive heatmap above, since a low percentage is good defense). This is what actually answers whether this player's overall Opp FG% holds up at every distance or collapses somewhere specific: a single season number can't say that on its own. A double-teamed shot counts toward every tagged defender, same rule the Head-to-Head: As Defender table below uses.
Head-to-Head: As Defender
Shooting allowed to each scorer this player has been tagged defending, across the season.
Teammate Synergy (With/Without)
For each teammate this player has shared a team with, this player's own per-20 numbers in games with that teammate on their side vs. games without them (opposing team or not playing). Only games with real shots logged count either way. "—" means there's no game in that bucket yet to compare against. A small GP on either side makes the comparison noisy, not a verdict.
Teammate Quality
Average season Off Rating/20 of this player's own teammates (not this player), game by game, with a dashed season-average line. Off Rating specifically, not Two-Way: what this measures is a teammate's offensive gravity, how much they draw defensive attention, create mismatches, or set up easy looks, not their own defense. Doesn't correct for this player also counting toward each teammate's own Off Rating/20 (no leave-one-out adjustment), a simplification, same tradeoff every other season-long number on this page already makes.
Assisted By
What share of this player's own made field goals were set up by someone else, and how good (season Off Rating/20) those passers have been: the direct test of "getting fed easy looks by good players" vs. creating shots alone. Field goals only; free throws don't carry an assist by rule.
Offensive Matchup Difficulty
Average season Def Rating/20 of whoever was tagged defending this player's own shot attempts, game by game, with a dashed season-average line. The mirror of Defensive Matchup Difficulty below, from the scorer's side: how tough have the defenders this player shoots over actually been? A double-teamed shot counts toward every tagged defender, not split, same rule Stops/Beaten/Pts Allowed already use. A wide-open (untagged) shot contributes nothing, since there's no defender to rate.
Defensive Matchup Difficulty
Average season Off Rating/20 of whoever this player was tagged defending, game by game, with a dashed season-average line. The defensive-side counterpart to Teammate Quality above: does this player draw the tough offensive assignments, or get sheltered on weaker ones? Weighted per shot, not per opponent: facing the same tough scorer five times in one game counts five times, the same way Stops/Beaten/Pts Allowed already weight every tagged shot equally.
Defensive Load
A companion to Def Rating, not a replacement: how much of the team's tagged defensive workload this player is actually carrying, not just how well they handle what they get. Every opponent field goal attempt with at least one tagged defender is divided evenly across the team's own roster that game for an "expected fair share"; this is how many of those this player actually got tagged on, divided by that share. Above 1.0 is more than an even share, below 1.0 is less. A low number here is genuinely ambiguous on its own (avoided as a tough matchup, genuinely uninvolved for other reasons, or just too small a sample) and can't fully separate those, so it's always shown paired with this same player's Def Rating/20 and a plain-language read of what the two together suggest, never as a standalone verdict.
Shooting by Direction
FG%/TS% split by which hoop this player's team was shooting at that game (set per game in Stat Entry: "Where is Team A shooting?"). Real question worth asking with an outdoor pool court: does the sun in one direction actually cost shooting, or is it just a feeling? Only counts games where the game's own direction has been set, and needs at least 5 attempts on a side before showing a number.
Highlights & Lowlights
Every clip tagged to this player, across all games. Tag a clip to a player from the Highlight / Lowlight Reel table in Stat Entry.
| Date | Type | Time | Note |
|---|
Areas to Work On
This player's own rate in each category next to the league median for that same stat, not the average and not the league's best: a real "behind (or ahead of) where a typical player in this league is" bar, one specific thing at a time. Every category needs its own minimum real sample before it can be flagged at all (shot zones: 5+ attempts in that zone; turnover rate: 10+ FGA+FTA+TOV; assist-to-turnover: 5+ assists or turnovers combined; wide-open shooting: 5+ open attempts; defense: 10+ shots defended; out-of-bounds rate: 10+ misses; second-chance conversion: 5+ offensive rebounds) — below that gate, nothing gets said rather than a confident callout off a handful of shots. Both directions show up, not just weaknesses. This tool only ever names the area; deciding how to work on it is yours.
Export All Data
Full dump of players, games, box scores, and matchups. Give this to your friend to integrate into the website.
Export a Single Game
Backfill Shot Locations
Every field goal (2 or 3, not free throws) that's missing a shot chart location, across every game. Click a spot on the mini chart to set it, no need to reopen the game or its video. Each click saves immediately and the shot drops off this list.
Review Possible Dunks
Close/midrange 2PT field goals logged before the Dunk field existed, so Shot Arc's ball-flight fitting can exclude real dunks (a dunk is carried by hand through a close-range slam, not a free-flying arc: see shot-arc/FINDINGS.md). Click Watch film to check, then Dunk or Not a dunk; either answer removes it from this list.
Review Stopped-Early Games
A game stopped before completion breaks every stat that treats a game as a standardized, comparable unit (Best/Worst Games, Power Ranking vs. Performance, Shot Attempt Differential, Pace/PPP, Win Shares). This can't be detected from the box score alone, the same way dunk needed a human to watch the clip instead of being inferred: if you remember a game being cut short, flag it here. Season-total rate stats are unaffected either way.
Flagged Shot Locations
Every marked field goal where the spot disagrees with the point value picked at logging time: the same mismatch the Shot Log flags one row at a time with a "📍 2PT range"/"📍 3PT range" badge, collected here so a whole season's worth can be reviewed at once. Click a spot on the mini chart to re-mark it. If the new spot agrees with the point value, the shot drops off this list; if the point value itself was wrong (not the spot), remove and re-log the shot from the Shot Log instead, since this tool only ever moves the marked location.
Session Videos
Recordings uploaded once and shared across multiple games (see the Video panel in Stat Entry). Removing one here clears it from every game using it.
| Name | Used by |
|---|
Broken Session Video Links
A game can end up pointing at a session video id that no longer exists here. The video panel silently falls back to showing nothing useful, so this can go unnoticed for a while (an id can go stale if a browser profile changes, data gets imported from elsewhere, or a recording is removed some other way than the button above). A single-game export from a game listed here will carry a null masterVideo, even though masterVideoId is set.
Shot Arc Hand-Labeling
For fine-tuning ball detection on real footage (see shot-arc/FINDINGS.md: stock detection doesn't find the ball on real in-flight shots). Pick a shot below (whatever's currently in shot-arc/frames/, from extract_frames.py), then click the ball's center to mark a frame and jump ahead by the step size below (skipped frames get filled in by straight-line interpolation between your clicks on download, so you don't have to click every single frame), or "No ball visible" if it's occluded/off-screen. Space bar repeats "No ball visible". If the clip contains more than the shot itself (a pass or dribble before release, a bounce after), step to the real release frame and click "Mark Shot Start", then the frame it lands/settles and click "Mark Shot End" -- only that range gets used downstream, and interpolation never crosses outside it. If the whole clip isn't a clean single-flight shot at all (a dunk, multiple separate plays), skip labeling it and click "Not a valid shot" instead. A small dot shows where you last clicked once you've labeled a frame. When you're done with a shot (or want to stop partway), download the labels JSON and hand the whole batch back for fine-tuning.
Data Management
Start New Season clears every game, stat, matchup, and locally-stored video file, but keeps the player roster, since that's the one thing that's supposed to carry over. Download JSON above first if you want a backup of the season you're closing out. Reset All Data is the nuclear option underneath it: clears the roster too, back to a completely empty tracker.