Background
This one started as a very practical problem in my fantasy WNBA league: who should I actually pick up off waivers this week, and what does my team really need?
Those two questions are easy to ask and annoying to answer well. ESPN gives you raw projections, but it won't tell you that you're stacked at guard and thin in the frontcourt, or which available player best closes that gap. So I built a little GM that does. It frames the answer as opportunity rather than weakness — here's your biggest upgrade, and here are the free agents who fill it — and it does the same read for every other team in the league, so you can see where everyone stands.
How It Works
The whole pipeline runs locally and ships its results as a static site, so there's no server to babysit and no secrets in the repo:
- Data: a Python pipeline talks to ESPN's private fantasy API using your own league cookies (SWID and S2), kept in a local
.envthat never gets committed. It writes plain JSON snapshots that the site reads. - Team needs: for each team it compares guard production against frontcourt production (forwards and centers bucketed together, since WNBA fantasy lineups share those slots) and measures both against the league average. The biggest gap becomes that team's "top need."
- Waiver targets: free agents are ranked by projected weekly points — per-game projection times games actually on the schedule — and then re-weighted toward whatever your team is short on, so the list is tailored, not generic.
- Receipts: every add, drop, trade, and lineup change lands in an append-only transaction log, and team identity is tracked by ESPN team ID so the history holds up even when people rename their squads mid-season. Pydantic models keep the data honest; pytest keeps the math honest.
- Tabs: Waivers (the ranked board), Team Needs (per-team cards with rosters and tailored picks), News (from ESPN's public feed, with your watched and waivered players highlighted), and Transactions.
A Look Inside
Each view shown on mobile and desktop — tap any image to open the live site.



