There is no panel of experts behind this app. Every rating, grade and suggestion is computed from public data by rules that fit on this page. This is all of them.
01What this is
A mock draft simulator. You take one seat, seven to thirteen computer opponents take the rest, and everyone drafts until the rounds run out. Nothing is saved to a server and nobody else is in the room.
It was built for one ten-team league and still opens on those settings, but the league shape is now yours to set: 8 to 14 teams, 8 to 20 rounds, any starting lineup, and standard, half or full PPR scoring.
02Where the numbers come from
Two free public feeds, no keys and no accounts:
- Sleeper — the player list, injury designations, depth charts, season statistics back to 2018, week-by-week game logs and next-season projections.
- Fantasy Football Calculator — average draft position, taken from real drafts, as one set per scoring format.
Fantasy points are recomputed, not copied
Sleeper publishes its own points total, and it is thrown away. It assumes four-point passing touchdowns and flat kicker scoring, and bakes in choices you may not share. Every point you see is recalculated from raw components — attempts, yards, touchdowns, field goals by distance — under the rules below, which are the defaults and can all be changed:
| Passing | 0.04 per yard, 6 per touchdown, −2 per interception |
| Rushing | 0.1 per yard, 6 per touchdown |
| Receiving | 0.1 per yard, 6 per touchdown, and 0, 0.5 or 1 per reception depending on the format you pick |
| Kicking | 3 inside 40, 4 from 40–49, 5 from 50–59, 6 from 60+, 1 per extra point, −1 per miss |
| Fumbles | −2 per fumble lost |
0 from the feed means Sleeper has no forecast
for that player, not that he will score nothing. Those are treated as
missing. Counting them as real zeroes dragged replacement level toward
zero and made everybody else look elite.
Scoring format changes the board
Full PPR moves receivers up and running backs down, so each format has its own ADP list. When a draft starts, the board is built from the list matching your scoring, and every positional rank, tier and value figure is computed from that list rather than from a fixed order.
Scoring happens in the browser
There is no points total in the data file. stats.js holds
raw components — yards, touchdowns, receptions, field goals by
distance, points allowed — and every scoring rule is applied here,
as the page runs. All thirty-eight of them are editable on the setup
screen.
Change one and everything rescores at once: projections, every historical season, the week-by-week logs, replacement level, the Overall signal and the draft grade. Nothing is rebuilt and nothing is refetched, because the numbers were never baked in to begin with.
This is why the pipeline records facts rather than opinions about how to value them. A stat that was never stored could never be rescored, so everything scoreable is kept even when the default rules value it at zero.
03The league, and everything derived from it
One object in app.js describes the league. Nothing else in
the app writes a league number down. Team count, round count, the
starting lineup, the FLEX and the bench all live here, and the setup
screen edits them:
teams: 10,
rounds: 14,
starters: { QB: 1, RB: 2, WR: 2, TE: 1, K: 1, DST: 1 },
flex: 1,
bench: 5,
scoring: "half"
};
That matters more than it looks. An earlier version had "ten teams" typed into a dozen different places and a replacement level worked out by hand for one particular league. Both were correct exactly once, and quietly wrong the moment anything changed.
The setup screen refuses impossible leagues
Two combinations are rejected before a draft can start:
- The roster does not fill the rounds. Starters plus FLEX plus bench has to equal the number of rounds, or teams would finish the draft with seats unfilled or players with nowhere to sit.
- The draft is bigger than the board. Teams times rounds cannot exceed the number of players in the ADP list. Fourteen teams over sixteen rounds wants 224 players, and the half PPR list carries about 205, so that one is blocked rather than allowed to run out mid-draft.
Replacement level
This is the most important derived number in the app. It is the last player at a position who would realistically start somewhere in the league, and it feeds the draft grade, the Overall signal and every value-over-replacement figure.
It is the number of starting slots the league creates at that position, plus that position's share of the FLEX slots, plus one:
flex = teams × flex × flexShare[pos]
rank = round(base + flex) + 1
flexShare = { RB: 0.40, WR: 0.55, TE: 0.05 }
The FLEX shares are how often each position actually wins that slot, which is why running backs and receivers run so much deeper than quarterbacks.
Worked through, at the default settings
Ten teams, one FLEX. Receivers: 10 × 2 = 20 starting slots, plus 10 × 1 × 0.55 = 5.5 from the FLEX, giving 25.5, rounded to 26, plus one → WR27. Across the board that is QB11, RB25, WR27, TE12, K11 and D/ST11.
Move to twelve teams and the same formula gives QB13, RB30, WR32, TE14, K13 and D/ST13. Nothing was retyped.
Roster limits
How many of a position a computer team will ever hold: its starters, its share of the FLEX, and a fixed depth allowance of 3 for quarterbacks, 5 for backs and receivers, and 2 for tight ends, kickers and defences. At the default settings that works out to 4 quarterbacks, 8 backs, 8 receivers, 3 tight ends, 3 kickers and 3 defences.
04How the CPU teams draft
Each computer team scores every available player and takes the lowest. The score starts at average draft position and is multiplied by how badly that team needs the position:
| need | 0.80 | still filling a starting slot |
| 1.00 | sensible depth, up to two past the starters | |
| 1.45 | hoarding | |
| 999 | refuses to take the player at all | |
| risk | 1.35 | doubtful, or physically unable to perform |
A team refuses a player outright when:
- it has hit the roster limit for that position;
- the player is ruled out — out, on injured reserve, suspended, non-football injury or did not report. These are never drafted by anyone and never suggested to you;
- it already has as many quarterbacks, kickers or defences as the league starts. A superflex league that starts two quarterbacks gets two;
- it is too early for a kicker or a defence.
Kickers and defences go last
Measured back from the final round rather than pinned to a fixed number, so it holds at any league length: kickers become available for the last two rounds, defences for the last three.
Worked through, at the default settings
Fourteen rounds, so defences come off the board from round 12 and kickers from round 13. Run a fifteen-round draft and both shift a round later on their own.
The wobble
A draft where every computer team took the best available player would be identical every time. Each player gets a fixed offset of roughly ±3 draft places, generated from a seed chosen when the draft starts. It is deterministic, not random: it stays put for the whole draft, so undoing a pick does not reshuffle how the room thinks, and a resumed draft behaves exactly like the one you left.
Picks are made one at a time on a three-quarter-second timer so you can watch the board fill in. Skip jumps straight to your turn.
05Tiers
A tier is a run of players at one position with no meaningful gap between them. The point is the sentence it lets the app say: not "take the best player available" but "take him now or lose the whole tier".
A new tier starts when the gap to the previous player is large relative to where you are on the board:
Proportional, because two picks apart means something at pick 5 and nothing at pick 120. A tier also breaks after six players regardless: gaps stop growing as fast as ADP does, so deep in the board nothing ever clears the threshold and a single tier would otherwise swallow half the position.
06The draft grade
Four components. Each is computed the same way for every team in the room, then scaled from 0 to 100 against the other teams, then weighted. Your grade is a ranking against the people you actually drafted with, not against the league at large — which is why somebody always gets the top grade and somebody always gets the bottom one.
| Starter strength | 50% | Every player in your best legal starting lineup, scored by how many places above replacement level they rank at their position. Uses the replacement ranks derived in section 03. |
| Draft value | 25% | How far each player fell past the board's own order when you took them. Taking a player later than his rank says is a bargain; taking him earlier is a reach. |
| Roster construction | 15% | Starts at 100. Minus 14 for each unfilled starting slot, minus 9 for every quarterback, kicker or defence beyond what the league starts, minus 6 for being thin at running back or receiver. |
| Bye week safety | 10% | Minus 20 for every starter beyond the second sharing the same bye week. Judged on the starting lineup only, because bench byes cost nothing. |
The weighted total is ranked, and the ranks are handed letters from a fourteen-step scale running A+ down to F, long enough to give every seat in a fourteen-team room its own letter.
07The three signals on a player
Open any player and there are three meters. They are model output, not a consensus of analysts, and they disagree with the market on purpose — that disagreement is most of what they measure.
Overall
Projected points above a replacement starter at that position, expressed against the best such figure on the board. A player projected for exactly replacement production scores zero regardless of name.
Upside
Starts at 20 and rises with: projecting at least four positional ranks better than his draft position (up to +35), three years or less in the league (+18), first on his depth chart (+14), age 24 or under (+10), and points per game up more than 20% across his last two full seasons (+15).
Bust risk
Starts at 12 and rises with: being drafted at least four ranks ahead of where he projects (up to +35), being ruled out (+40) or carrying a lesser injury designation (+22 or +12), age (+20 for a back at 28 or older, +15 for a receiver or tight end at 31, +12 for a quarterback at 36), sitting second or lower on the depth chart (+15), playing 12 games or fewer in his last active season (+14), and having missed real time in at least half of his seasons (+12).
08Saving and resuming
A draft in progress is stored in your own browser and nowhere else: your seat, the clock length, the seed, the league settings and an ordered list of player names. Refreshing the page no longer destroys a draft.
It refuses to restore rather than restore something broken, in two cases:
- The settings no longer match. Resuming a twelve-team draft into a ten-team league would corrupt the board — the snake turns in different places and the rounds run out at a different pick. The saved draft is kept and the app tells you which settings it needs, because setting the dropdowns back is all it takes.
- A player no longer exists. The player list is rebuilt every morning. If a saved pick cannot be resolved the board would be corrupt, so the draft is discarded rather than half-restored.
09What it deliberately does not do
- No live multi-user drafting. It roughly triples the project, and even the large sites mostly do not do it.
- No expert rankings, news or analyst commentary. That content belongs to the sites that produce it. Everything here is computed from public statistics.
- No trade or keeper handling. This simulates one snake draft.
- No build step. Plain HTML, CSS and JavaScript. Open
index.htmland it runs.
ADP from Fantasy Football Calculator. Player, injury, statistical, projection and depth chart data from Sleeper. Fantasy points recomputed under the scoring rules in section 02. The data files are regenerated daily; the app shows you when, under the Start button.
← Back to the Draft Room