Get the code on GitHub

What it does

ESPN’s draft room ranks every player under ESPN’s default scoring. If your league scores differently, and most do, that list is quietly wrong for you all night. This board pulls the same projections, re-prices them with your league’s point values, works out who is worth more than the next player you could take at your next pick, and tells you the one name to click. Python, SQLite, a terminal, and one browser snippet. No account, no server, nothing sent anywhere.

How it works

StepWhat happens
PullESPN projections, ADP, ownership and injury status for every player, plus your league’s scoring, roster slots and rosters through the same API (your own login cookies for a private league). Everything lands in a local SQLite file.
RescoreESPN ranks players on its default scoring, which pays hits, blocks and shots. Most leagues do not. The board re-prices every projection with your league’s point values, so a player ESPN ranks 13th can be your 4th.
RankValue over replacement per position, from your league size and roster slots, plus value over the next available player at your next pick. That second number is what says “take the goalie now” or “wait”.
SyncESPN’s read API does not show picks while a draft is live. A ten-line browser snippet reads the draft room’s own Picks panel instead and writes one name per line to a text file. The board re-reads it every 5 seconds and drops those players. It clicks nothing.
PickOne line: the pick and a backup. You click Draft. The tool never drafts, queues or writes anything to ESPN.

It prints the rules it is running on

Every run starts with the league the board thinks it is drafting for. A wrong league id or a stale cookie shows up here, before the draft, not at pick 22. Bench seats deepen the replacement level, C, LW, RW and UTIL slots all count as forwards, and per-game rates like GAA are skipped and named rather than summed as if they were goals.

League: 13 teams | starters F12 D6 G2 | bench 3 | IR 0
Scoring: W 2, SO 3, OTL 1, G 1, A 1, PPG 1, SHG 2, SHA 1, GWG 1, HAT 3
Ignored (rate stats cannot be summed): GAA
Replacement level (teams x depth F14 D7 G2): F 45, D 25, G 56

What nobody else does: it models the other owners

Every ESPN tool I found ranks players. None of them read the league. This one pulls your league’s past drafts and builds a model of each owner: how often they let ESPN autopick, when they take their first goalie and first defenceman, and which players they re-draft every year. Between your picks it walks every intervening pick with that owner’s habits instead of assuming ADP, prints what it expects to vanish, and raises a run alarm.

Layer 2: 4 past drafts, 1040 picks, 18% autopick. Owners modelled: 17.
!!! G run: 3 G likely gone before pick 48, best G VOR drops 7
>>> PICK: Jake Oettinger (G, DAL) | backup: Jake Guentzel (F, TB)
    Expected before your next pick: Tkachuk (adp), Hughes (favorite), Oettinger (first G) ...

That is a replay of pick 31 from the draft below. On the night, the board still assumed ADP and said Guentzel; the plan I had written from the history report said goalie. Five goalies went in the next twelve picks. The owner models landed the next morning, and now the board says it on its own.

The draft it ran

13 teams, snake, 20 rounds, no bench, slot 5. Goals and assists scoring, no peripherals. The picks below are the ones where the board and ESPN’s list disagreed, with the board’s projection under our scoring.

PickPlayerProj.Why
5Leon Draisaitl128ESPN rank 13, ours 4. The rescoring paid for the whole project here.
22Mark Scheifele107Plan wanted a goalie or an elite D. All four went between 14 and 18.
31Jake Oettinger89G1. The board preferred a forward; the plan said goalie by 31 in this league.
48Sam Reinhart100
57Sergei Murashov76G2. Five goalies went between picks 33 and 43.
100Lucas Raymond86ADP 121. The steal the rescoring predicted.
135Gavin McKenna49Rookie, taken 10 picks before ADP because this league drafts rookies early.

Projected total for the 18 players ESPN projects: 1,262. Last season’s winner scored 1,446. Three rookies with no projection decide whether that gap closes. I will post the final standings here in April, whichever way it lands.

What it missed

  • No rookie data. ESPN projects zero for most first-year players, so they never appear on the board. I kept a hand list; it was late by 40 to 60 picks on where this league actually takes rookies.
  • No skip list. Injured players kept topping the board for 80 picks and I had to remember the rule each time. Fixed in the published version (--skip-file).
  • It never said which rules it was using. Bench slots were ignored and a rate stat like GAA would have been summed as points. Fixed: the rules print at startup and the board refuses to run on a half-loaded league.
  • Name collision. Alex Laferriere (LA) went to my roster at pick 213 instead of Alexis Lafreniere (NYR). The board showed the right name; the room search matched the wrong one first.
  • The room’s Picks panel reset twice and dropped six picks from the taken list. Nothing changed as a result, but it could have. Next version keys picks by number, not by line count.

Run it on your league

Clone the repo, install, copy the env file, run the refresh. The README has the five commands. A private league needs your two ESPN cookies, which stay in a git-ignored file on your machine; there is a small script that reads them from a hidden prompt so they never land in a terminal history.

espn-fantasy-hockey-draft-assistant on GitHub

Unofficial API. ESPN publishes no terms for automated reads of its fantasy endpoints. The tool makes a handful of read requests per refresh and never writes. Use your own judgement.

Get the next result.

I email when the standings post, and when the rookie feed lands in the board.

Have your own site checked this way

The same habit, pointed at one site: what is actually wrong, what the evidence says, and what I would do about it in what order.

Get the Foundation Audit

Or skip ahead and talk

If you already know what you need built, a call is faster than a report. Thirty minutes, no pitch deck.

Book a call

Want the Lab's results in your own searches? Add Wired Builder as a preferred source and Google shows it to you more often.

Add as a preferred source on Google (opens in a new tab) Add as a preferred source on Google (opens in a new tab)