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.
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 changes | 0.5 PPR | 1 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:
- Read natural metrics for the active scoring format (0.5 or 1 PPR).
- 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.
- Flip direction when needed (e.g. lower ADP and better opportunity rank = higher percentile).
- Weighted average of those percentiles using your left-panel weights (default sum 100).
- 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
| View | Sorted by | Best 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)
| Factor | Default weight | Why |
|---|---|---|
| Last Year | 18 | Historical production |
| Opportunity | 14 | Volume / role |
| ADP | 12 | Market draft capital |
| QB | 8 | WR/TE only — team passer quality |
| O-Line | 8 | RB/QB only — blocking environment |
| Playcaller | 8 | QB/RB/WR/TE only — not K/DST |
| Vegas | 8 | Player prop lines |
| Efficiency | 8 | How well touches convert |
| Age | 7 | Peak / decline curve |
| Health | 6 | Games played profile |
| SOS | 3 | Schedule 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)
- Enter your Sleeper username and/or league ID / draft ID.
- The site calls Sleeper’s public read-only API (no password stored).
- It matches picks to board players and greys out drafted names.
- 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
- Paste league ID from the ESPN fantasy URL.
- Optionally set your team ID so “your” picks are detected.
- Public leagues usually work via the unofficial ESPN API + browser CORS proxy.
- 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.
- You (or Grok) edit rankings data / UI in the project folder.
- Optional:
python scripts/generate_data.pyto rebuild JSON. - Deploy / push → production URL updates in under a minute.
- 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.