DraftBoard is a configurable 2026 cheat sheet, snake/mock/live-draft assistant, and auction planner. It combines Sleeper projections and format-specific ADP with optional ESPN PPR ADP, then computes league-scored projections, first-undrafted replacement value, tiers, and explainable recommendations.
npm install
npm run dev
npm test
npm run lint
npm run build
npm run release:checkrelease:check runs lint, offline unit tests, a production build, starts the production server on a temporary port, validates /api/players, and stops the server. Deployment is intentionally separate.
- Custom PPR/Half/Standard/TE-premium scoring and configurable FLEX/SUPERFLEX rosters.
- VOLS/VORP rankings with one consistent definition: replacement is the first undrafted player.
- Format-safe market values: Sleeper's selected format is authoritative; ESPN supplements PPR only.
- Snake/mock drafts with true snake keepers, traded-pick ownership, roster-valid seeded CPU teams, pick-cost grades, persistent targets/avoids/notes, tier cliffs, runs, and next-pick survival context.
- A full draft board grid view and a positional scarcity chart, plus a side-by-side player comparison modal.
- Read-only Sleeper live sync through documented REST polling. There is no unofficial streaming protocol.
- Auction planning with $1-per-open-slot reserves, hard maximum bids, roster capacity checks, team-specific inflation, and dollars-per-slot guidance.
- Raw 2025 historical stats scored with the active league settings.
- Versioned browser-storage envelopes and shared server/CDN caching for normalized player responses.
| Area | Files |
|---|---|
| Ranking/scoring | lib/scoring.ts, lib/vbd.ts, lib/market.ts, lib/risk.ts |
| Draft domain | lib/draft.ts, components/MockDraft.tsx, components/DraftBoardGrid.tsx, components/ScarcityChart.tsx |
| Auction domain | lib/auction.ts, components/AuctionDraft.tsx |
| Persistence/input | lib/persistence.ts, lib/validation.ts, lib/annotations.ts, components/useLocalStorage.ts |
| Player data | lib/sleeper.ts, lib/espn.ts, app/api/players/route.ts |
| Shared UI | lib/ui.ts, components/PlayerCompare.tsx |
| Regression suite | tests/domain.test.ts |
The raw Sleeper responses exceed Next's fetch-cache item limit, so they are normalized first. The API payload is cached in the Next Data Cache and returned with explicit shared CDN freshness/staleness headers. Optional ESPN/history failures degrade independently.
See METHODOLOGY.md for formulas, examples, and limitations, and ROADMAP.md for the implementation history and acceptance gates.
Current ffdp.* values are stored in a versioned { version, data } envelope. Legacy unversioned values migrate on read. Player annotations are keyed by season and player ID so they do not leak into a later player pool.
CPU behavior, survival probability, auction inflation, tiers, recommendations, and risk are decision aids—not forecasts. Each uses deterministic inputs and exposes the factors available in the UI. Bye weeks remain a season-maintained static data source.
Features land on dev via PR (advisory fresh-context review). dev is
promoted to test, then test to main, each via a blocking
fresh-context review (.github/workflows/promotion-review.yml) plus a build/
typecheck check — both required by branch protection.