"Build Lineups" calls your deployed dfs-optimizer-nhl-api
Cloudflare Worker, which dispatches to GitHub Actions and runs the real
optimizer.py. Also used for cloud-synced slates and presets. Stored only
in this browser's localStorage.
Slates
▸
Upload Slate CSV
No slate loaded
Date:
Accepts either final_projections_{site}_{date}.csv (to build lineups) or an already-built lineup_*.csv (to view) or a pivot_suggestions_{site}_{date}.csv (paired to a matching date already saved -- type that same date above). The date field is pre-filled from the filename -- leave it as-is unless you have a reason to change it, since this exact value is what "Build Lineups" sends to the real solver as --date. Must be a real YYYY-MM-DD date (NHL's data pipeline is date-keyed, not free-labeled). Persists across reloads and syncs to cloud.
Build a Lineup
▸
# Lineups
Max Exposure %
Min Swaps (Uniqueness)
Stack Mode
Randomization %
Minimum Salary
Lineups must spend at least this much (cap is $50,000 on DK, $55,000 on FD -- the slider adjusts automatically when you switch sites).
Max Players Per Team (optional -- applies to every team, every lineup)
Max Players Per Game (optional -- both teams combined, every lineup)
A single number applied uniformly to every team/game (matches optimizer.py's current --max-players-per-team/--max-players-per-game). Per-team-specific caps (e.g. cap COL at 2 but TOR at 3 in the same build) aren't supported yet -- flagged as a follow-up backend session.
Settings Presets
Each lineup in the batch draws its own randomized projection around the real value -- adds variety across a multi-lineup build.
Stack Size
Line #
Stack Team(s) (optional -- pick 1 or more, or leave blank to auto-select)
Stack Game(s) (optional -- pick 1 or more, or leave blank to auto-select)
Player Pool
Using estimated_ownership_pct from chalk_scores, if loaded
Salary
–
Projection
–
Value
–
Own %
–
Runs the actual optimizer.py via GitHub Actions (typically 20-90s) and supports every control above.