"Build Lineups" calls your deployed dfs-optimizer-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
Name:
Accepts either final_projections_{site}_{slate_id}.csv (to build lineups) or an already-built lineup_*.csv (to view). The name field is pre-filled with the real --slate-id 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. Persists across reloads and syncs to cloud.
Build a Lineup
▸
# Lineups
Max Exposure %
Uniqueness
Stack Mode
Randomization %
Minimum Salary
Lineups must spend at least this much (cap is $50,000 on DK, $60,000 on FD -- the slider adjusts automatically when you switch sites).
Minimum Projection
Excludes any player projected below this many points from the pool entirely, before the solver runs (0 = no floor). Locked players are always exempt.
Minimum Total Ownership
Requires the lineup's summed ownership to be at least this much (0 = no floor; same units as "Total Own" on a built lineup, e.g. 130). Set very high to see a "super chalk" build for comparison against the true optimal.
Participation Floors
Excludes a player from the pool if his participation (share of his team's last 5 played games he actually appeared in) falls below his position's floor here -- catches a backup or a still-injured player a point projection alone can miss. ON by default. Locked players are always exempt -- lock in a player you know is a real exception (e.g. a starter confirmed back from injury). Format: POSITION:FLOOR comma-separated, 0.0-1.0. Clear the field to disable entirely.
Lambda (variance penalty)
Session 10.5's mean-variance objective: sum(mean) - lambda*sum(sigma²). 0 (default) maximizes projected points only. Positive = floor-seeking (cash); negative = upside-seeking (GPP). Requires a projection build with --sigma-recalibration -- the solve fails loudly if the pool has no per-player sigma. Built-in presets' lambda values are Session 10.5b's swept defaults (DK, 2018-2021, 65 weeks, holdout; see ROADMAP.md Ad Hoc Session A5) -- cash/SE-3Max at 0.063 (best on their own metric, though the 3-Max case was not a clear winner over 0.0), MME at -0.005 (positive lambda measurably hurts large-field GPP).
Dart Exposure Cap
Cap %
Floor Threshold
Ad Hoc Session A6: any non-DST player whose simulated 10th-percentile outcome (statline_p10) falls below the Floor Threshold is a "dart" -- capped at Cap % of this batch's lineups, unless he's on this batch's own stack team (that correlation is the trade you're paying for, not accidental dead-money risk). DST is always exempt -- every DST's floor simulates as a flat 0 regardless of matchup, so this filter can't tell a good matchup from a bad one there; use the DST's own opponent implied total for that instead. Real example that motivated this: a $3,000 min-salary WR with statline_p10 = 0.07 (basically a coin flip on scoring anything) was showing up in 20% of a real 20-lineup MME batch purely for being the cheapest legal filler. Not a backtested/swept value like Lambda above -- a heuristic guard against that specific failure mode (see ROADMAP.md Ad Hoc Session A6). Classic slates only; needs the same --sigma-recalibration build as Lambda.
Skill Player vs. Opposing DST
By default the optimizer refuses to roster a skill player (QB/RB/WR/TE) from the same team your own DST/DEF is facing this week — the two are negatively correlated (your DST scores better when that offense struggles). Check this box to lift that restriction. Recommended for small slates or Showdowns, where the player pool is thin and avoiding the pairing may cost more than it saves.
Team Exposure Caps (optional -- max players from a specific team, applies to every generated lineup)
E.g. cap KC at 2 players. Click an added cap to remove it. If a locked player already exceeds a cap, the build will fail with a clear reason.
Game Exposure Caps (optional -- max combined players from both teams in a game)
E.g. cap KC vs DEN at 4 combined players. Independent from (and additive with) a Game Stack's minimum -- a contradictory combination will fail to build.
Min Team Players (Showdown only -- force a one-sided lineup)
E.g. floor KC at 4 to force at least 4 of the roster's players from KC. The other team must still have at least 1 player -- an impossible floor fails loudly before the solver runs, not as a silent no-op.
FLEX Eligible Positions
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
Partner Positions
WR/TE correlate with their own QB's passing stats -- RB production is mostly independent (rushing, not passing), so it's left out of the default. Add RB here if you specifically want it as an option.
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)
Min Players From Game
Mini Stack Type
Player Pool
Using estimated_ownership_pct from the slate, if present
Salary
–
Projection
–
Value
–
Own %
–
Runs the actual optimizer.py via GitHub Actions (typically 20-90s) and supports every control above.
Exposure Summary
▸
Player/DST exposure across every lineup in your last build. Confirm your chalk lands near Max Exposure %, your dart-tier plays land near Dart Exposure Cap % (if set), and nothing is over- or under-exposed relative to what you intended. Updates automatically after each "Build Lineups" run.