Kind-of-Lost Kind-of-Lost · OR Tools · NHL Lineup Optimizer · Support

NHL Lineup Optimizer

Upload the player pool straight from DraftKings — nothing else. The tool pulls tonight's forward lines, power-play units and confirmed starting goalies from Daily Faceoff for the teams on your slate, then builds a diverse set of lineups ready to upload back. Free tool by kindoflost.

1 · Site & player pool

FanDuel is coming once their NHL export format is confirmed against a real file — the numbers I have are several seasons old and I'd rather ship nothing than ship a guess.
📥 Drop the player pool CSV here, or browse
This reads the DraftKings NHL player-pool export (Position, Name + ID, Salary, Game Info, TeamAbbrev…), not a spreadsheet of your own.
📈 Drop projections here, or browse
Columns: an id or name column + a projection column.
Already have your own line chart? (optional)
🏒 Drop a line-combinations CSV here, or browse
Columns: Team, Unit, Player1…Player5. Unit is L1L4 (forward lines), D1D3 (pairings), PP1/PP2 (power-play units), or G (starter). For anyone who pays for a line-chart service and would rather use theirs.

What is this NHL DFS lineup optimizer?

A free NHL DFS optimizer for DraftKings — no signup, no paywall, no “3 free lineups” teaser. It solves a real mixed-integer program (the same math the paid tools use) to build a set of lineups that are individually strong and collectively different, because in large tournaments one good lineup is easy — twenty is the hard part.

How it works

  1. Export the player pool from DraftKings and upload it. That is the only file you need.
  2. The tool pulls the forward lines, power-play units and confirmed starting goalies for the teams on your slate from Daily Faceoff and fills the Line and PP columns. Hit refresh any time — lines move at the morning skate and goalies get confirmed close to puck drop. Every value stays editable.
  3. Trim the pool: lock, exclude, or cap exposure on any player, and overwrite projections.
  4. Set the rules — how many units to stack and how deep, what your goalie is allowed to correlate with, and how different each lineup must be from the rest.
  5. Generate. You get salary-cap-legal lineups in a CSV formatted for direct re-upload.

Why hockey stacks are different

DraftKings NHL Classic is nine slots — two centers, three wingers, two defencemen, a goalie and a utility — under a $50,000 cap, with skaters from at least three teams. Under the hood that is a knapsack problem: maximize projected points subject to the cap and the position rules.

What makes hockey its own thing is the unit. A forward line is three players who change together, share ice time, and share goals — one goal pays the scorer and both assisters. A power-play unit is five players doing the same thing with a man advantage, and it is not a line: it is assembled from the best players across several lines, which is why it needs its own column. Meanwhile your goalie is negatively correlated with the skaters he faces, so rostering both is a bet against yourself. The optimizer treats all of that as hard constraints.

Common questions

Is it really free? Yes — it is a working demo of optimization models I have built for 20+ years. No account, no lineup limit tricks.

Where do the line combinations come from? Daily Faceoff, which publishes them free. The tool pulls only the teams on your slate, when you load the pool and again whenever you hit refresh. If that lookup ever fails — the source is down, or goes premium, as line-chart sites have a habit of doing — nothing breaks: the pool still loads, the solver still runs, and you can type the Line and PP columns in yourself or upload your own chart.

How current is it? As current as the source. Lines are cached for about ten minutes and starting goalies for about four, and the refresh button goes past the cache. A goalie only counts as starting when he is reported confirmed or likely — an unconfirmed goalie is the source guessing from the schedule, and the tool will not pass a guess off as a confirmation.

Does it support FanDuel? Not yet. I have old FanDuel NHL numbers but no current export to check them against, and shipping a guess about roster shape would quietly produce invalid lineups.

What about Showdown / single-game contests? Not yet — classic full-slate only.

Are the projections any good? The optimizer uses the projections in your file — and you can overwrite any of them. Its job is squeezing the most out of whatever projections you trust.

Do you have one for other sports? Yes — MLB and NFL, same engine with batting-order and quarterback stacking instead.

Get an email when we ship updates to the NHL optimizer. Low volume, unsubscribe anytime.

Questions people actually ask

The hockey vocabulary is the hard part, not the optimizer. Click any question.

What is the difference between a line, a power-play unit and a “unit”?
A line is a forward trio — left wing, centre, right wing — who skate a shift together. Four per team. A power-play unit is the five skaters a coach sends out on the man advantage, usually four forwards and a defenceman, picked across lines rather than being one line. Two per team. A defence pair is the two defencemen who skate together, three per team. Unit is this tool’s umbrella word for any group whose players score together, because the stacking rules treat them the same way. Only lines and power-play units can be stacked; defence pairs are read and numbered but never stacked.
Do I have to supply the line combinations myself?
No. Upload the DraftKings player-pool CSV exactly as it downloads — that is the only file you need. DraftKings does not ship line combinations, so the tool looks them up from Daily Faceoff for just the teams on your slate, along with power-play units and confirmed starting goalies. Refresh it any time — lines move at the morning skate and goalies get confirmed an hour before puck drop. If the lookup fails, the tool still works: you can type the Line and PP columns in yourself, or turn stacking off.
What does “2 units × 3 players” actually mean?
Three players from each of two different lines or power-play units — the classic double stack, six skaters in two correlated blocks. Each stack row reads n units × k players, and the rows add together rather than overlapping, because one unit can only satisfy one row. So adding row B at 1 × 2 gives you one more unit contributing two players: 3-3-2.
Do the two stacks have to be from different teams?
Yes, with Each stack from a different team on, which is the default. It matters more than it sounds: a team’s second line and its second power-play unit share players, so without that rule the solver can satisfy “two units” with about five skaters from one team and call it a double stack. Switch it off if you actually want a heavy single-team stack — it is a legitimate play, just a different one.
Can a stack be two defencemen?
No. Only lines and power-play units are stackable, and neither is a pair of defencemen. But a stack is not purely forwards either: every power-play unit includes a defenceman, so a 2-player power-play stack can legitimately be that defenceman plus a forward.
Is the stack salary window measured across all stacked players?
Yes — it sums the full salary of every selected unit, and it counts the whole unit, not just the members that ended up in your lineup. So the window has to move with the shape you asked for. Two lines is six salaries; add a power-play unit and it is eight. The 57–70% default is tuned for the 2 × 3 GPP shape. For a single 1 × 3 stack the Cash preset correctly turns the window off, because 57% of the cap on three players is unreachable.
“Max shared lines / PP units vs any prior lineup” — if I use a line once, can I use it again?
Yes, as often as you like. The check runs separately against each earlier lineup: against any single one of them, at most this many units in common. At 1, if lineup 1 was Colorado’s line 2 plus Pittsburgh’s line 2, a later lineup may reuse either one — it just cannot reuse both. In plain terms: no two lineups may carry the same pair of stacks. That is the rule that stops twenty lineups being twenty shades of the same two stacks, which a player-overlap cap cannot do — swap one winger and the stack is identical.
Why did I ask for 150 lineups and get 54?
Almost certainly the clock, not the rules. Each new lineup has to differ from every lineup before it, so the work grows as the set grows: measured on a twelve-game slate, about 2.2 seconds a lineup over the first 25 and about 4.3 by the fiftieth. The message under the button now tells you which of the two ran out. If it was time, use Keep going to N — it keeps what you have and constrains the new lineups to differ from them, which a fresh run cannot do because it has never seen them. Loosening the Tier 3 caps is not the fix: measured one at a time, every one of them moved the count by under 8%, and half made it worse.
Do the lineup patterns override the settings above them?
Only two of them. A pattern replaces your stack shapes (the A/B/C rows) and which kinds of unit may be stacked, for the lineups it governs. It then adds rules that have no control of their own — whether a stacked team must also give you a defenceman, whether your two defencemen come from the same game or different ones, and whether every stack must come from one game. Everything else still applies exactly as you set it: the salary window, exposure caps, cooldowns, minimum skater teams, max players per team, confirmed goalies and declared skaters. One asymmetry worth knowing — a pattern can turn on “goalie from a stacked team”, but it cannot turn it off if you switched it on yourself.
Where do the projections come from, and can I use my own?
By default the tool uses the AvgPointsPerGame column in the DraftKings file, which is a season average of actual DraftKings points — a fallback, not a forecast. There is no projection model here and the tool does not pretend otherwise. Upload your own projections and they replace it, which is the recommended way to use this: the optimizer is only ever as good as the numbers you feed it.
What actually changes between Cash and GPP?
Cash wants one best lineup and is happy to repeat it: a single 3-man stack, 95% of the cap spent, four skater teams, the goalie tied to a stacked team, and almost no diversity between lineups — which is correct, because in a cash game twenty near-copies of your best lineup is the right answer. GPP wants many different shots: two stacks, the salary window on, 40% player exposure, cooldowns, and unit-level diversity. The diversity is exactly what makes a GPP batch slow.
Is a unit cooldown of 9 too high?
It depends entirely on slate size, and the number is not arbitrary — it is ported from the Excel model this tool replaces. On a twelve-game slate there are around 72 stackable units, so freezing recent ones barely bites. On a three-game slate there are about 18, and a cooldown of 9 puts half the pool on ice at once. Lower it to 3 or 4 on small slates. The companion setting caps how many recently-used units may return: at 1 a lineup reusing a recent line must find its other stack among rested units; at 0 it is a literal ban, which on a twelve-game slate runs dry after about sixteen lineups.

Who built this

I'm Mario — an operations research analyst with 20+ years in optimization and supply chain (Cargill, Cessna Aircraft, Textron Aviation). Daily fantasy lineup building is a knapsack problem in a costume: the same constrained-optimization math I used for scheduling and routing, just with a salary cap instead of a truck. This NHL DFS tool runs a real MILP solver (PuLP/CBC) end to end, not a heuristic or a spreadsheet formula. More about me and the other free tools →

Also free: MLB lineup optimizer · NFL lineup optimizer.