How It Works

Methodology, factor definitions, scoring math, and live draft connections

1. Big picture

This is a full fantasy decision system: multi-factor rankings, an on-the-clock AI (value vs ADP + roster need + strategy), live draft sync, and Season Mode for weekly lineups and waivers. Factors use natural units and a transparent 0–100 model you can re-weight.

On the clock: Top picks blend model score, ADP value (model rank − market), position need, scarcity, and your strategy (Balanced / Zero RB / Hero RB / Robust RB / Best Ball). One click drafts them.
HTML dashboard is the right tool here. Rankings + draft companion UIs are mostly static data + browser API calls. Hosting as a static site (Vercel / GitHub Pages) means no laptop server: open the URL on phone or PC, connect Sleeper/ESPN, draft. Updates = push code/data → redeploy.

What you get on the board

  • Summary tab — full ranked list by model total, with every factor column visible.
  • Factor tabs — rank by one input only (e.g. Playcaller leaderboard of all 32 OCs).
  • Live draft — mark players taken from Sleeper, ESPN, or manual entry; boost thin roster spots.
  • Weights — decide how much Last Year vs Opportunity vs ADP matters for your process.

2. 0.5 PPR vs 1 PPR

Toggle at the top of the draft board switches two scoring contexts at once:

What changes0.5 PPR1 PPR
Last-year fantasy points column Half-PPR 2025 totals Full-PPR 2025 totals
ADP column / ADP factor Half-PPR market ADP PPR market ADP
Model total Recomputed with half metrics Recomputed with PPR metrics

Team factors (playcaller, Vegas wins, SOS, team QB quality) do not change with the toggle— only production and market columns that depend on reception scoring do.

3. Every factor explained

Early versions wrongly scored everything out of 32. That only makes sense when there are exactly 32 things to rank (NFL teams / playcallers). Each factor now uses an applicable unit.

Last Year Stats unit: fantasy points

What you see: Actual 2025 fantasy points in the selected format (e.g. 366.9).

What it measures: Proven production last season. High last-year points raise floor confidence.

How it ranks on its tab: Higher FPts first.

In the model total: Converted to a within-position percentile (so a WR’s points compete with other WRs, not with QBs who score more raw points).

Limits: Rookies and players who missed most of 2025 show ~0 and rely on other factors (ADP, opportunity, age).

Age unit: years

What you see: Chronological age (e.g. 24). DST has no age.

What it measures: Where the player sits on a position-specific aging curve.

Peak windows used in the model (not shown as a second number on the board):

  • RB ≈ 23–26
  • WR ≈ 24–28
  • TE ≈ 25–29
  • QB ≈ 26–32
  • K ≈ mid/late career stable longer

In the model total: Age is turned into an internal fitness 0–100 (peak ages score highest; old RBs fall fastest). You still only see years on the board so the number stays interpretable.

Quarterback unit: 1–32 · WR & TE only

What you see: Team QB quality N/32 (32 = best), or if N/A.

Applies to: WR and TE only. Does not score QB, RB, K, or DST.

In the model: When N/A, this factor is dropped and other weights are renormalized for that player.

Offensive Line unit: 1–32 · RB & QB only

What you see: Team OL quality N/32 (32 = best run/pass blocking).

Applies to: RB and QB only. Does not score WR, TE, K, or DST.

What it measures: Pocket protection and run-blocking environment for fantasy production.

Playcaller unit: 1–32 · offense only

What you see: N/32 plus playcaller name / scheme, or if N/A.

Applies to: QB, RB, WR, TE only. Never K or DST.

What it measures: Fantasy-friendliness of the OC/scheme (pace, pass rate, usage philosophy).

ADP unit: average draft position (pick #)

What you see: Market ADP such as 1.5 or 48.0.

What it measures: Where the public/industry is spending draft capital. Early ADP = consensus elite; late ADP = cheaper / ignored.

How the tab sorts: Lower pick number first (ADP 1 before ADP 100).

In the model total: Lower ADP ranks as a stronger signal (earlier picks get higher percentiles). You can down-weight ADP if you want a more “anti-market” board.

Vegas Lines unit: per-player props

What you see: Season player prop O/Us — not team wins:

  • QB: Pass yards + pass TDs (e.g. 4250 Pass Yds · 28.5 Pass TDs)
  • RB: Rush+rec yards + total TDs
  • WR / TE: Receiving yards + rec TDs
  • K: Kicking points / FG made
  • DST: Sacks / takeaways

What it measures: Market-implied individual production. Higher primary yard (or sack/point) lines mean the books expect more from that player.

How it ranks: Higher primary prop first. Team win totals are ignored for this factor.

Source note: Props are modeled from ADP/opportunity/prior production until live sportsbook season props are wired in.

Opportunity unit: rank within position

What you see: #3 / 40 meaning 3rd-best projected role among 40 RBs in the database.

What it measures: Expected volume and role security (carries, targets, routes, red-zone work, clear bellcow vs committee).

How it ranks: 1 = best opportunity at that position. Lower rank number is better.

In the model total: Better (lower) ranks map to higher percentiles.

Efficiency unit: 0–100 rating

What you see: A 0–100 composite (e.g. 100, 72).

What it measures: How well the player turns touches into production— yards per touch, TD rate, explosive-play profile—not pure volume.

Why not /32: Efficiency is continuous quality, not a 32-team roster slot.

Health unit: games played (0–17)

What you see: Estimated durability as games played, e.g. 15 GP.

What it measures: Availability risk. Higher GP profile = more trustworthy for season-long leagues.

Limits: This is a modeled durability profile from public injury history / patterns, not a medical report. Always check current injury news the week you draft.

Strength of Schedule unit: 1–32 teams

What you see: N/32 where 32 = easiest fantasy schedule, 1 = hardest.

What it measures: Relative difficulty of the team’s 2026 slate for fantasy production contexts.

Why /32: 32 team schedules. Same structural reason as playcaller ranks.

4. How the model total (0–100) is built

You cannot add “366 FPts + 24 years + ADP 1.5 + 10.5 wins” into one meaningful sum. So the Summary total works like this:

  1. Read natural metrics for the active scoring format (0.5 or 1 PPR).
  2. Percentile-rank each factor across the player pool (0 = worst in pool, 100 = best). Last Year / Opportunity / Efficiency are percentile-ranked within position so positions stay fair.
  3. Flip direction when needed (e.g. lower ADP and better opportunity rank = higher percentile).
  4. Weighted average of those percentiles using your left-panel weights (default sum 100).
  5. Optional team-need multiplier if “Boost by team need” is on and your roster is thin at a position.
model_total = Σ ( weight_i × percentile_i ) / Σ weight_i
→ result is 0–100

Changing weights does not change the raw FPts/ADP/Vegas numbers—only how much each percentile contributes to the Summary ranking.

5. Summary tab vs factor tabs

ViewSorted byBest for
Summary Model total (0–100), all columns Your overall draft board / pick recommendations
Last Year / Age / ADP / … That metric alone in natural units Auditing one signal (“who did the model love for playcaller?”)
Playcaller / QB / Vegas / SOS Also shows a 32-team leaderboard above the players Understanding team environment before taking a player

The right-rail “Top picks for you” always uses the Summary model + team need, even while you’re browsing a factor tab.

6. Weights & team need

Default weights (sum 100)

FactorDefault weightWhy
Last Year18Historical production
Opportunity14Volume / role
ADP12Market draft capital
QB8WR/TE only — team passer quality
O-Line8RB/QB only — blocking environment
Playcaller8QB/RB/WR/TE only — not K/DST
Vegas8Player prop lines
Efficiency8How well touches convert
Age7Peak / decline curve
Health6Games played profile
SOS3Schedule ease

Team need boost (12-team 1QB defaults)

Starter targets: 1 QB, 2 RB, 2 WR, 1 TE, 1 FLEX, 1 K, 1 DST, plus depth.

  • Position at 0 players → up to ~1.25× model total
  • Partially filled → mild boost
  • Fully stocked → slight de-prioritize (~0.85×)

That reorders “Top picks for you” toward holes without deleting high-total players from the main board.

7. Sleeper & ESPN live draft

Sleeper (recommended)

  1. Enter your Sleeper username and/or league ID / draft ID.
  2. The site calls Sleeper’s public read-only API (no password stored).
  3. It matches picks to board players and greys out drafted names.
  4. Your picks fill the need meter; polling continues every few seconds while connected.

Works from a hosted URL the same as localhost—no extra backend required.

ESPN

  1. Paste league ID from the ESPN fantasy URL.
  2. Optionally set your team ID so “your” picks are detected.
  3. Public leagues usually work via the unofficial ESPN API + browser CORS proxy.
  4. Private leagues often need cookies (espn_s2, SWID) through a future small proxy— until then, use Manual entry or make the league viewable.

Manual

Type a name + Enter during a party draft. Toggle “my pick” to update roster need.

8. Limits & honesty

  • This is a decision framework, not guaranteed projections or gambling advice.
  • Player pool is a curated top board (~180), not every NFL player.
  • Playcaller / opportunity / efficiency / SOS are model composites from public context—challenge them.
  • ADP and Vegas lines move; regenerate data or ask for an update push when camp news hits.
  • Always cross-check injuries and depth charts the day you draft.

9. How this stays online & how updates work

The app is static files: HTML, CSS, JS, JSON. Hosted on a CDN (Vercel), it needs no always-on laptop process.

  1. You (or Grok) edit rankings data / UI in the project folder.
  2. Optional: python scripts/generate_data.py to rebuild JSON.
  3. Deploy / push → production URL updates in under a minute.
  4. Open the same URL anytime; connect Sleeper/ESPN for that night’s draft.

When you want changes, tell Grok what to tweak (weights, players, copy, new factors). Deploy again. No local server required for day-to-day use.