Changelog
[0.18.14] — 2026-11-08
Changed
-
Workbench: switching between lineups loads only what changes; the Rules panel and player details stay in place.
-
Workbench: pages load a little faster; defensive ranks are reused while their inputs are unchanged.
[0.18.13] — 2026-11-06
Changed
- Workbench: switching between lineups is faster again.
Fixed
-
Workbench: a notice is no longer lost if you type while a lineup is loading.
-
Workbench: the Back button no longer leaves the address on a different lineup than the one shown.
[0.18.12] — 2026-11-05
Changed
- Workbench: switching between lineups is faster.
[0.18.11] — 2026-11-04
Changed
- The optimizer now follows the playoffs: the week, the pool, the saved lineups, the exports and the weekly reset move with the loaded playoff schedule; the schedule fetch keeps playoff games and refuses a refresh that would drop any, saying why.
[0.18.10] — 2026-11-04
Added
- Redeemable cards show a badge: a chrome R beside the player's name, where the other collection badges sit; the Collections admin page offers the Redeemable badge to any family but Core.
[0.18.9] — 2026-11-04
Fixed
- The lock rule's numbers now count the saved lineups that already carry the player, shown apart from the cards available for new lineups, so a lock a locked lineup already satisfies no longer shows zero copies available.
[0.18.8] — 2026-11-03
Fixed
- A lineup whose started players put it outside the contest's collection mix no longer blocks Reoptimize, late swap or Build for the whole week: it is left as saved with a note, and the other lineups are optimized.
[0.18.7] — 2026-11-02
Changed
- Pages load lighter: smaller font and banner image files, and browser caching of scripts, styles and images.
[0.18.6] — 2026-11-02
Fixed
- Entered lineups: in every contest, the lineup chooser lists your latest week's lineups first.
[0.18.5] — 2026-11-01
Fixed
- Entered lineups: the page opens on your latest week, and weeks are listed newest week first.
[0.18.4] — 2026-11-01
Added
- Entered lineups: Return all to workbench sends every saved lineup for a week back to the workbench in one step, from the week's page or the Entered lineups list, after a confirmation that names each lineup. A lineup that cannot return (a card no longer on your roster, or a contest entry cap) stays saved and is named.
[0.18.2] — 2026-10-31
Fixed
-
Variance: you can change several contests' Variance settings in one visit; each change saves without reloading the page, and Reoptimize or Build uses them.
-
Advanced tools stays open after you change a Variance setting.
[0.18.1] — 2026-10-31
Added
- How to Use: a new Variance step, with screenshots, shows where to find Variance, what the allowances and the spend choices do, and how to change one lineup with its Variance bar.
[0.18.0] — 2026-10-30
Added
-
Variance: in Advanced tools on the Setup page and the workbench, Variance lets the optimizer give up a set share of a lineup's top projection so that lineups in the same contest share fewer players. It is off until you turn it on, and Off keeps the normal optimizer. Each contest gets an allowance (Off, Light 2%, Medium 5%, Heavy 10% or a custom percent up to 25%; at 5% a lineup keeps at least 95% of its best projection) and a spend choice: Different lineups looks for players not in that contest's earlier lineups, and Higher multipliers prefers cards with higher multipliers within the allowance, a candidate heuristic for upside, not a guarantee. The first lineup in each contest keeps top projection unless individually overridden.
-
Workbench: a selected lineup's Variance bar sets that lineup alone to Use contest setting, Keep top projection or Custom; the change applies the next time you build or reoptimize. The FAQ answers What does Variance do? and Why did a lineup keep top projection?
[0.16.2] — 2026-10-28
Fixed
- Workbench: refreshing projections works again on a saved run whose stored lineup notice has no lineup id.
[0.16.1] — 2026-10-23
Changed
-
Workbench: the GameBlazers download note is one bold line, Download GameBlazers CSVs here.
-
Workbench: switching between lineups is faster.
-
Workbench: the Edit button on a lineup row is smaller.
Fixed
- A player whose only stat in a week was a two-point conversion now has those points counted once the admin backfills the missing row.
[0.16.0] — 2026-10-22
Added
-
Every collection family wears its own card tag.
-
Week in review for guests: upload a roster, pick a finished week, see the best lineups it could have built.
-
Download a signed card of any week-review comparison.
Changed
- Week in review counts a contest that ran that week even if it has been archived since.
[0.15.0] — 2026-10-21
Added
- Week in review: pick any finished week from a drop-down.
Changed
-
GameBlazers bulk entry: the note under the download now says lineups with locked players are included, each locked card kept in its exact card and column.
-
The Primetime family is now spelled Primetime everywhere (it read Prime Time on some pages).
[0.14.6] — 2026-10-21
Changed
-
GameBlazers bulk entry: the download now includes lineups with started or played players. Each such card keeps its exact Item Id in its exact column, so the file can update an entry GameBlazers has already locked. The page that listed left-out lineups is gone.
-
Updating the roster after kickoff keeps a locked player's exact card.
[0.14.5] — 2026-10-18
Changed
-
Excluding a player on the Roster page and under Advanced tools is now one list: an exclusion made in either place shows in both, and a player can be un-excluded from either place.
-
When a run's projections come from the database, Reoptimize refreshes them first, if the database has this week's numbers, before it fills open slots.
-
The Unmatched cards message on the draft page is now a yellow notice in plain words, not a red error.
[0.14.4] — 2026-10-15
Changed
- GameBlazers CSV download: pick the contest from a drop-down, then download; the row of per-contest buttons is gone.
[0.14.3] — 2026-10-15
Added
-
Download GameBlazers CSV. "What you need to worry about is generating a CSV that matches the lineups. That's all. That's all we need: the names, the template name, and then the positions." Each contest on the workbench and on an entered week has a Download GameBlazers CSV button: one row per lineup, the preset name (
WK6-Flamethrower-1: the week, the contest, the lineup's number among that contest's lineups for the week at download, with saved lineups first and working lineups continuing after them) and the GameBlazers item id of the card in each slot column, in the contest's slot order. The download refuses, and says why, when a card has no item id or one item would be in two lineups this week. A lineup with a started or played player is refused by name, because GameBlazers' upload takes only fresh lineups. -
The roster export's Item Id is kept. "The item ID is going to be located in every roster we upload every week." Each card's Item Id is read from the roster export and saved with every lineup you enter. A roster uploaded without the column still works; its lineups cannot be downloaded this way, and the page says so. Lineups entered before this release have no item ids; returning one to working and entering it again uses the cards you hold now.
[0.14.2] — 2026-10-14
Added
- Update roster keeps your lineups. "the ability to update your roster of players without wiping out all the generated lineups" An Update roster button now sits beside Reoptimize in the workbench. Upload a new roster export there: lineups whose cards are still on the roster are kept, players who have already played stay in their slots, and a lineup that lost a card is released with a notice naming the cause. Replacing the roster from the draft page still clears working lineups, and its caption now says so.
Fixed
- Roster page counts and links. "The roster tab is not showing the lineups correctly." The Roster page counts each card's lineups and links to them from your current lineups, also while a draft is open.
[0.14.1] — 2026-10-08
Fixed
- Fury cards show a badge. "We forgot to put a fury icon, like the Prime Time cards have the PT icon, next to the fury cards in the optimizer, so now I can't tell which cards are fury or not." A Fury card in a lineup now shows the flaming F badge beside the player's name, in the same place a Prime Time card shows PT.
[0.14.0] — 2026-10-07
Added
-
Week in Review. "I should be able to compare: the best lineup I submitted with the best lineup that was available to me". Signed-in accounts have a Week in review navigation link. For each contest that ran, three lineups sit side by side, aligned by slot: your best submitted lineup, the best you could have built from your roster, and the best anyone could have built. Three comparisons show your submitted best against each possible best, and your roster's best against anyone's best. A bold Total row shows each lineup's points. The page is read-only.
-
Finished weeks only. "It will not show, for instance, week 5 as available to select until week 5 is complete." The page opens your newest finished week with stored results. Back and forward links move between finished weeks; an in-progress week is neither listed nor opened by direct link.
-
Earlier weeks. "if possible, it'd be great to have the previous weeks. That is preferable." The deploy imports the saved data for weeks 2–4. The imported roster and lineup history determines which personal columns are available; week 3 has no saved submitted lineup. Week 1 is not reviewed.
Changed
-
Fury joins the collection families. "a third collection family, FURY." Cards whose collection name contains the word Fury belong to that family alongside Core and Prime Time. Contest family rules accept Fury, its labels read Fury, and Week in Review uses the same family rules.
-
Contest edits can proceed. "I must be able to edit a contest even when other accounts have private working lineups on it." The admin can save the edit. Other affected workspaces are marked to re-validate their working lineups on their next Home, Setup or workbench visit and show a notice to review them. The admin sees only a count of affected workspaces.
Fixed
- Lock after Return to Workbench. "When I return an entered lineup to the workbench and click "Lock the lineup" to enter it again, the server answers Error 500". Returning a saved lineup and then locking it now works without reoptimizing first.
[0.13.2] — 2026-10-04
Fixed
-
Interceptions cost one point. "the interception weight to -1". GameBlazers takes one point for an interception, not two, so a quarterback's actual points and every newly fetched projection match GameBlazers' own scoring.
-
Two-point conversions count. "two-point conversions stored for ESPN-sourced actuals". A successful two-point pass, run or catch adds two points to each player credited, read from the game's scoring plays.
[0.13.1] — 2026-10-03
Changed
-
Bench groups on separate lines. "the Bench line in an expanded Roster row reads one group per line under "Bench:", the count in bold, a dash, then the collection and multiplier, and multipliers always show one decimal, 1.0 never 1". An expanded Roster row shows its lineup card lines and a "Bench:" line with one group per line beneath it: the count in bold, a dash, the collection and the multiplier.
-
One decimal, no multiplier sign. "Okay, get rid of the X. I don't want the X there". Every multiplier in the expanded Roster row shows one decimal with no "×", for example "Prime Time 1.0", on both lineup card lines and Bench groups.
-
Keep the Bench together. "Keep the bench together: lineup cards on the left, bench on the right. If there are no lineup cards, then it doesn't matter." A player with both lineup and bench cards opens with lineup cards on the left and the whole Bench on the right on a computer, stacked on a phone.
-
The defense rank header. "the Roster "Rk" header becomes "Def Rank" so it reads as the defense's rank, not the player's". The Roster rank header reads "Def / Rank", with Def above Rank.
[0.13.0] — 2026-10-02
Added
-
The full roster. "instead of just an injury report, a roster report. It'll be the full roster". The Roster tab replaces Injury report after you upload a roster; the old address forwards to Roster. Each player has an injury letter when designated, logo, name, position, team code, Def, Rk, kickoff date and time, an
n / totallineups count, Base, Adj %, Adj and an Exclude X: "I definitely want the X for the exclude for everybody". Kickoff is date and time only: "The kickoff column should just be date and time." -
Expand a player. "You can expand a player, and it'll drop down and show their lineups where they're at, or if they're on the bench." There is one line per card in a lineup, with its collection, multiplier and lineup link, and one Bench line grouping the remaining cards by collection and multiplier: "for every card that's in the lineup, it gets its own row, but for everything that's on the bench, it's just listed under 'bench'." "only one player can be expanded at a time".
-
Roster filters. Game, Team, Position, Designation (All, Injured only, Healthy only), Status (All, In lineups, On bench), Sort by and Apply. Sort by offers Name, Position, Kickoff, Rank and Lineups; the default is Lineups, most used first, then name. "Maybe just a checkbox that says 'Show free agents'" — it is off by default.
-
A weekly percent for each player. "each player would have a base projection" and "give the user the option to increase or decrease it by a percentage". Adj % starts at zero, accepts −50% to +50% in 1% steps through arrows or a typed value, and has a reset at nonzero values. "Instant save it is": a saved tick confirms the save. The percent belongs to the player in your workspace for that week and clears when the week ends; the provider's 1.0 base projection stays untouched. "green when it's a positive percentage and red when it's a negative percentage" applies to the percent and adjusted player number.
Changed
-
Adjusted projections everywhere. "Option one, everywhere. But it definitely has to be color-coded so you can tell that it was manually adjusted". The adjusted number feeds workbench rows and totals, Find Player, working exports (the CSV gains an
adj_pctcolumn, and PDFs color adjusted player numbers green or red) and the optimizer. Player numbers are green for a positive adjustment and red for a negative one; totals stay plain. Roster updates on save; other pages show the number on their next load. Saved entered exports retain their as-entered values; entered-lineup PDFs saved after 0.13.0 also color their as-entered adjusted player numbers green or red. Changing the percent changes existing lineups only when you Reoptimize. Player Exposure and Highest Exposure are unchanged: they show lineup counts, no projection. -
A smaller percent control. "The box with the percentage is too big. There's no reason for that box to be that tall and that wide." The box is smaller, the arrows and reset are bare glyphs ("I don't want boxes around the arrows."), and the sign sits inside the box: "put it inside the box. That makes the most sense."
-
Multiplier before position on the workbench. Every lineup reads Slot, Name, Multi, Pos, Team, Def, Salary, PTS, then Lock and Edit: "the multiplier first, then the position". "This makes entering lineups easier."
[0.12.2] — 2026-10-01
Changed
-
No more matchup word. Great, Fair and Poor, and their colors, are gone from every page: "I dislike the word. Get rid of it." Each player shows the opponent and the defense rank only, such as "@CAR 32".
-
Highest Exposure is back on one line. "I hate that it's on two lines." Each player reads name and position, opponent, rank, then the lineup count, all on one line.
-
The defense and its rank are in their own columns. "Columns should be the defense column and then the rank column." On lineup cards the header reads Def and Rk, and on Player Exposure and Highest Exposure the opponent and the rank line up in two columns on every row.
[0.12.1] — 2026-10-01
Changed
-
The injury tag is a bigger, plain letter. "It's got to look like a Q. It's got to be bigger, and it's got to be an obvious cue." The tag is now a bold Arial letter at the size of the player's name, on every page that shows it: Q in yellow; D, O, IR, PUP, SUS and NA in red. It is never a box or something to click: "I asked for a letter, a color-coded letter."
-
Matchup shows Great, Fair or Poor with no number, colored like the defense ranks: "I don't want the numbers. ... We can leave the great, fair, or poor, but it also needs to be the same color scheme that we're using for the defensive ranks."
-
Injury report is a tab at the top. "It should be a tab up at the top ... and the tab should appear after you upload the roster." The tab appears once you have uploaded a roster, and the small Injury report link beside the lineups is gone.
-
Player rows read like the lineup Def cell. On Player Exposure, Highest Exposure, Find Player, the Entered lineups table and the expiration review, the opponent and rank read "@HOU 9" or "NE 23", plain text with only the number colored, and the matchup word has no box: "keep the number but show the opponent and rank exactly as the lineup row's Def cell does ... no "of 32", no box". The tag, name, opponent and rank, and matchup word each sit in their own column "with the same left edge on every row." Highest Exposure keeps each name and position on one line with the opponent and matchup beneath, and no longer lists matchup reasons.
-
The injury page is simpler. One line at the top says when injuries were updated: "All it should be is 'Injuries updated as of this time, this date.'" The Defense rank, Matchup and Designation columns are gone ("This is an injury report."), the Vs column is plain text with no box, and free agents are not listed.
Added
-
Lineup links on the injury page. In Roster status, each lineup name links to that lineup: "The contest name should be a clickable link that would take you to that workbench contest."
-
Exclude on the injury page. A last column, Exclude, has an X for each player. Clicking it asks "Do you want to exclude Breece Hall from all lineups?" with Yes and No; Yes shows "Breece Hall is now excluded from all lineups." The player's cards are left out the next time you Generate or Reoptimize; your own Add, Replace and other hand edits are not affected.
[0.12.0] — 2026-09-30
Added
-
Injury tags on every player row. A player with an injury designation shows a small tag before the team logo and name: Q in yellow; D, O (out), IR, PUP, SUS and NA in red. A healthy player shows nothing. Each page says once when injuries were last refreshed, and notes when the last refresh failed.
-
A Def column in every lineup. The lineup table now reads Slot, Name, Pos, Team, Def, Multi, Salary, PTS. Def shows the opposing defense (@ for an away game) and its rank against the player's position as plain text in the row's own type, with only the number colored: green for a soft matchup, yellow for a middle one and red for a tough one. The circled ? beside the heading reads "1-Strongest Def vs Position/32- Weakest Def vs Position". A bye shows BYE, a free agent FA.
-
Defense rank against position, computed from this season's completed games in earlier weeks under GameBlazers scoring; this week's games join the ranks after the Tuesday rollover. Week 1 has no ranks yet.
-
A 1-to-5 matchup score (Great, Fair, Poor) on Find Player, the exposure pages, Highest Exposure and the new injury page.
-
Injury report page. Lists every injured player on your current roster (the draft you uploaded, or your active run), including excluded, expired and duplicate cards, with each card's status. You can filter by game, team, position and designation, and sort by player, team, game, designation, defense rank or matchup. Reach it from the Injury report link on the workbench or the draft page.
-
More frequent injury refreshes on game days (once the new schedule is installed on the server at deploy): every two hours from Wednesday to Sunday, once a day on Monday and Tuesday. If Sleeper rate-limits us, refreshes pause until the next day, and the page shows how old the injuries are.
Changed
-
Player names no longer cut off in lineup rows.
-
The Primetime badge on player rows now reads PT, so rows are less crowded.
-
Highest Exposure shows each player's matchup reasons without expanding the row.
-
Game state beside a lineup row's points is shown only when there is one: F when the game is final (or final and awaiting its score), IP while it is in progress, and nothing before kickoff. The Entered lineups page keeps its spelled-out words.
-
The Projected total on a lineup swaps in each player's final actual points once that game is final; an in-progress game keeps its projection until final.
-
An expired card's EXPIRED stamp sits beneath the name on its own line, so every name stays on one line.
-
The lineup overview is narrower: the note about ESPN and two-point conversions, the "scored and projected subtotals are separate" note and the "Locked, protected until saved" sentence are gone, and the lineup-table columns keep their gutters at every width.
[0.10.15] — 2026-09-26
Fixed
-
Save Played Players lists only cards that have played. The played-player picker used to list every card of the player, including cards whose game had not started, and marking then clearing such a card could leave it stuck on the unavailable hold. It now lists only cards whose game has started or finished (including a team you marked as started in late swap), and saving a card that has not played is refused with a message naming the player. Cards already recorded as played stay recorded.
-
Core is Core in the played-player picker. In a Core-only contest such as Volcano, the picker could show "No matching cards" for a free Core card of the player, for example a 2024 Core card, because it counted your pick as an extra card instead of a replacement for the one in that slot. It now offers every free card the contest and slot accept, whatever the year, and no longer offers a Primetime card in a Core-only contest.
Changed
-
Hand edits in a contest that mixes Core and Primetime cards. In a contest such as Prime Time Pyro, Replace, Add on an open slot, Move, a position swap and Save Played Players are no longer blocked by the contest's Core and Primetime counts. The lineup then shows that it is outside its collection mix, for example "Prime Time Pyro needs 4 Primetime cards; this lineup has 3.", and Lock Lineup, Lock Selected and Save lineups as entered stay unavailable until your edits or Reoptimize this week bring it back, just like the salary cap. Lock this card in this lineup still works. When the app fills a slot for you (Exclude here, or the refill after a Move), it keeps the mix when it can. A contest that allows only one collection is unchanged.
-
The How to Use guide, the FAQ and the downloadable PDF describe these changes.
[0.10.14] — 2026-09-26
Fixed
- Players whose games have started now stay in their lineups when you add entries and build again. After Add more lineups and Build lineups, every player whose game had already started (for example, Thursday night players) was swapped out of his working lineup for someone else, even though the help promises that started players are protected. Build now keeps each of them in the same lineup and position, and fills the rest around them; Reoptimize this week keeps them there too. Locked lineups and card locks still hold. If your new plan would remove a lineup holding a started player, or move it to another contest, Build stops and says so, and nothing changes — keep that lineup, or remove it on the workbench with Delete selected lineups first.
[0.10.13] — 2026-09-25
Changed
- A card you place by hand shows one rule in the rules panel. After you place a card with Edit or Add, the panel used to show both a "Player placement" row and a "Card lock" row for the same card. It now shows only the card lock, for example "Card lock: Mark Andrews (1.5×)". Nothing else changes: the card still stays in that lineup at that position when you reoptimize.
[0.10.12] — 2026-09-25
Added
- Delete selected lineups. The workbench sidebar has a Delete selected lineups button beside Lock Selected and Unlock Selected. Check the lineups you no longer want, select it and confirm "Are you sure you want to delete N contest entries?". Each deleted contest entry leaves the workbench completely and is available again through Add more lineups; the other lineups keep their cards, though their numbers may shift down. Played cards in a deleted lineup go back to your bench. A locked lineup is never deleted: it is kept and named in the result, so unlock it first if you want it gone. Saved lineups stay on the Entered lineups page, where they have their own Delete.
Changed
-
The rules panel tells a placement rule from a card lock. After you replace a player with Edit, the panel used to show two identical rows for him. It now labels each kind, for example "Player placement: Pat Holt at TE" and "Card lock: Pat Holt (1.1×)".
-
The Move form's "player to move" list leaves out players Move would refuse. A player held by a card lock (or by a lock on that player in this lineup) is no longer offered only to be refused.
-
A clearer message when a lock names an expired card. When a card lock for a contest, the whole run or another lineup names a card that has since expired, Reoptimize this week, Add more lineups and Build lineups still refuse, but the message now names the lock and the card, says the card has expired, and tells you to remove the lock (or, for a lock covering more than one lineup, narrow it) — instead of blaming the roster upload.
-
The How to Use guide, the FAQ and the downloadable PDF describe Delete selected lineups and the new lock message.
[0.10.11] — 2026-09-25
Added
- Put back an expired card you set on GameBlazers before it expired. GameBlazers keeps a card valid for the week when you set it in a lineup before it expired, but Reoptimize here may take it out. Add (on an "Open, filled on Reoptimize" slot) and Edit's Replacement player box now also offer your expired cards that pass every other check, listed after the unexpired cards with EXPIRED in the option text. Choosing one and selecting Swap asks you to confirm: "This card is expired. Use it only if it was set in a GameBlazers lineup before it expired." The card goes into that slot only and is locked there, Reoptimize this week keeps it and fills the rest, and Build lineups keeps it through Add more lineups with the same roster. The optimizer still never chooses an expired card on its own.
[0.10.10] — 2026-09-24
Added
-
Add a player straight into an open lineup slot. A slot that reads "Open, filled on Reoptimize" now shows an Add button where filled slots show Edit. Add opens the same panel as Edit — Replacement player box, Clear choice, Collection filter and Swap — with Exclude here and Lock this card grayed out because the slot is empty. The card you choose goes into that slot only: every other card stays where it is, other open slots stay open until you reoptimize, and the card is locked in that lineup.
-
Exclude expiring cards in one step. The dialog that lists cards expiring in the next three days now has a checkbox beside each card and an Exclude checked cards button. Checked cards are left out of your next Build lineups or Reoptimize; nothing in your current lineups changes until then, and unchecking restores them. Cards recorded as played, and cards held by Lock this card in this lineup, are always kept, and you can still pick an excluded card yourself. View cards reopens the list on the Setup screen and on This week's lineups for as long as that roster is uploaded; a new upload starts with nothing excluded.
-
See the cards that had already expired when you uploaded. The same dialog now has an Already expired section listing every card on the upload whose expiration date had already passed. Those cards stay out of new lineups unless you mark them played.
-
Expired cards carry a red EXPIRED stamp. Wherever an expired card is shown — lineup rows, the Save Played Players picker, Find a player on your roster and the expiring-cards dialog — a small red EXPIRED stamp sits beside it (plain drop-down menus show the word in the option text). It is a label only; downloads do not carry it.
Changed
- Edits in a lineup's Edit panel change only that slot. Replace, Exclude here and Lock this card no longer re-solve the rest of the lineup. Exclude here fills its slot with the best eligible bench card that keeps the lineup at or under the salary cap (or the best one over it), and leaves the slot open, "Open, filled on Reoptimize", only when no bench card is eligible. The per-team limit and the one-tight-end preference apply when the optimizer builds or reoptimizes, not to the cards you pick yourself.
Fixed
- Cards you set in a lineup before they expired can be recorded as played. Save Played Players now accepts a card from your current upload after its expiration date, as GameBlazers allows for a card entered before it expired; an expired card can also stay in a locked or saved lineup, or in its slot under Lock this card in this lineup. The optimizer still never places an expired card into a new or reoptimized slot.
[0.10.9] — 2026-09-23
Added
- Replace a lineup player with any card you own that isn't locked elsewhere. In a lineup's Edit panel, type a name in the Replacement player box: it lists every card of that player you own that is not locked in another lineup, each showing the lineup it is in now or "bench". Cards in saved or locked lineups, cards locked in another lineup, and players already played or started are hidden and refused. The card you pick goes in regardless of salary — if the lineup ends up over the cap it shows Over salary cap and can't be locked until Reoptimize or your edits bring it back under. The placed card is locked in this lineup automatically, the replaced player is freed, and if the card came from another unlocked lineup, the slot it left shows as "Open, filled on Reoptimize" until you reoptimize.
Fixed
-
The Find Player box shows each card's own projection. Every copy of a player used to show the same base projection; each card now shows its projection with its multiplier applied, the same figure the lineup rows show. The Unused premium panel had the same problem and is fixed too.
-
Workbench edits no longer fail after saving played players leaves an open slot. Once a lineup held an open slot from Save Played Players, every other workbench edit returned an error until you reoptimized; edits now work normally, and open slots show as "Open, filled on Reoptimize".
-
Refreshing the page after an upload no longer reopens the expiring-cards dialog. It opens once after the upload, as intended.
[0.10.8] — 2026-09-22
Changed
-
The per-player projection-change notices no longer appear on the workbench. The small badges that flagged a card whose projection dropped, went to zero, went missing, or whose availability worsened after a projection refresh are removed entirely. Your projections and lineup totals still update exactly as before, and the actual-score-completeness and lineup-legality notices are unchanged.
-
Near-expiring cards are kept for you automatically, with an informational heads-up. When you upload a roster containing cards that expire within the next three days, those cards are now available to the optimizer with no include step. Right after the upload a dialog lists exactly which cards are expiring and on what dates and reminds you to lock them into your GameBlazers lineups before they expire — you just acknowledge it. Already-expired cards remain unavailable.
Fixed
-
The "players already played" picker no longer offers cards it cannot use. A card already locked into another lineup, saved as entered, or protected as a started or played card elsewhere is hidden from the suggestions and rejected on save; when you own several identical copies, only the protected ones are held back and the rest stay selectable.
-
That same picker now respects each contest's collection rules. A Core-only contest no longer shows or accepts Primetime cards — the suggestions and the save both apply the destination lineup's contest collection and slot eligibility.
[0.10.7] — 2026-09-22
Changed
- The How to Use guide, the FAQ, and the downloadable How to Use PDF now cover the newest features. They describe the Actual points column and the "Points scored so far" and "Remaining projected points" totals on the Entered lineups page, the "How your rules were applied" and "Unused premium" panels counting your saved lineups together with the working run, the per-lineup "Return to Workbench" button, the workbench player search with its one-click return of every saved lineup a player is in (for a late scratch), and points shown to two decimal places.
[0.10.6] — 2026-09-22
Added
-
Pull a saved lineup back to the workbench to edit it. On the Entered lineups page, each saved lineup now has a Return to Workbench button beside Delete. It moves that lineup back into your working run with every card intact so you can edit it and save it again as a new version; the original entry is removed as it moves, so nothing is lost. A lineup holding a card that is no longer on your roster is left in place and tells you which card blocked it.
-
Find a player and act on every lineup he's in. A search box on the workbench (beneath Reoptimize) autocompletes player names; picking one opens a sortable list of every card of that player you own — with its multiplier, salary, projection, and the lineup it sits in ("bench" if none) — where each lineup is a link straight to it. One button returns every saved lineup with that player to the workbench at once (handy for a late scratch), leaving the lineups you are already working on alone and naming any it could not return.
Changed
- Points now read to two decimal places everywhere — the workbench, the Entered lineups page, and the CSV and PDF downloads — so actual and projected points show the hundredth.
Fixed
- "How your rules were applied" and "Unused premium" now count your saved lineups too. When a week's lineups were all saved as entered, these panels read the working run only and could wrongly report a required stack as unmet or premium cards as unused. They now cover the working run and the week's saved lineups together as one population.
[0.10.5] — 2026-09-21
Added
- See real points beside your saved projections on the Entered lineups page. Each player now shows an Actual column next to the projection (now labeled "at save"), carrying his live or final points with the same mark the workbench uses. Under the saved total there are two live lines: Points scored so far (the real points of every player whose game has started or finished) and Remaining projected points (the at-save projection of every player whose game has not kicked off). The saved Projected lineup total (at save) never changes. There is no blended or best-case number anywhere — a player whose game is in progress counts only in points scored so far, at his real points. The Actual column and both live lines also appear in the CSV and PDF downloads.
[0.10.4] — 2026-09-21
Fixed
- Generating lineups after kickoff no longer fails to save. A saved lineup's projected total is now always the sum of its players' projections, frozen at the moment the lineup is saved. Building lineups once games have started — including players who have already played — now saves and reloads correctly, where before the save could be rejected. Live and actual points are tracked separately and never change this saved projected total.
[0.10.3] — 2026-09-21
Security
-
Guest workspace creation is rate-limited. Repeated anonymous "Continue as guest" requests from one client are throttled, so the sign-in page can no longer be used to mint unlimited throwaway workspaces.
-
A failed sign-in can no longer lock another person out. The login and account-recovery rate limits are counted per client as well as per username, so someone repeatedly guessing your username cannot exhaust your own sign-in attempts and lock you out.
-
A malformed upload fails cleanly. A roster or projection CSV with an oversized field now returns a clear upload error instead of an unexpected server error.
[0.10.2] — 2026-09-20
Fixed
-
Reordering weekly lineup priority now confirms reliably. Changing priority by typed number or with the arrows no longer ends in "Priority was not confirmed" when your entered lineups are unchanged; a saved change is confirmed.
-
A rejected priority change now explains itself. When a priority change cannot be saved, the workbench shows the specific reason and confirms nothing was saved, instead of the ambiguous "the save may have completed."
-
Protects a working run from an out-of-sync saved state. The app now refuses to store a run whose lineup projection totals no longer match its player pool — a condition that could otherwise disable Reoptimize and every priority change for that run.
[0.10.1] — 2026-09-17
Lineup improvements — September 18, 2026
-
Set priority from the lineup number. Click a lineup's priority number to open Move to, then enter a whole number from 1 through the current lineup count. Invalid entries leave the order unchanged.
-
Move lineups faster with the arrows. Repeated clicks move a lineup several places without waiting for the whole workbench to refresh. Your selected lineup and sidebar scroll position stay in place.
-
Keep flexible positions open for later games. When optimizing, Wednesday–Saturday players are preferred in their regular position slots instead of FLEX or SFLEX when that can be done without lowering projected points or breaking your rules.
-
One tight end per lineup by default. Advanced tools includes a setting to limit optimization to one tight end per lineup. You can turn it off, and manually required tight ends are still honored, including a tight end locked into FLEX.
-
Swap positions within a lineup. Use Move to exchange two players in the same lineup when each can legally occupy the other's position. Locked and already-started players remain protected.
-
Make an edit even when it puts a working lineup over budget. A deliberate player swap can exceed the salary cap so you can keep the card you want and finish adjusting the lineup. The lineup shows Over salary cap and explains what needs attention. It cannot be locked, saved as entered, or downloaded until it is back within the cap.
-
Keep your chosen card when rebuilding the week. The card added by an over-budget swap remains required when you explicitly click Reoptimize this week. If the optimizer cannot bring the lineup within the cap, your edit stays in place with an explanation. You can also lower the salary yourself or release the requirement by unlocking or replacing that player. Editing does not automatically reoptimize the week.
-
Removed the outdated note about unknown salary caps beneath the contest slate.
Added
-
Public How to Use and FAQ pages, linked from the main navigation and sign-in page. No account or guest session is required.
-
A downloadable illustrated guide with an original football cover, generated from the same content as the website.
Fixed
-
Save-lineup confirmation text remains readable in the light theme.
-
Desktop working-lineup salary figures fit together without an unnecessary extra row.
Earlier rollout — accounts and projections
-
Private accounts across devices. Invitation-based registration, password sign-in and one-time recovery codes open the same private roster, rules and lineups on each device. Recovery replaces the code and signs out all devices.
-
Reuse an uploaded collection during the week. Successful uploads save the complete collection with its original source date. Reuse it to start another draft, then choose projections before building. Tuesday's weekly reset clears the working run, draft and saved collection, so upload a fresh roster for the new week. Your account, saved entered lineups and their history remain.
-
Bring an earlier workspace into an account. An eligible earlier browser workspace can be attached to an empty account without merging or deleting its private data.
-
Account passwords accept 8–128 characters, including spaces. The Owner has unlimited invitations; other accounts retain their existing allowance.
-
Fantasy Guru weekly offense CSV imports calculate GameBlazers points from predicted statistics. Existing DFS exports keep their supplied DraftKings projections.
-
Workbench export buttons explicitly say Download Selected Lineups(csv) and Download Selected Lineups(pdf).
-
Sign in or try temporary guest access. Registered users can create invitations; guests can try the optimizer for 24 hours. Only the Owner can administer shared contests and projection imports. The old shared administration password no longer grants access.
-
Account privacy remains protected during administration. Contest changes that would disrupt another account's lineups are refused without exposing or clearing that account's data.
[0.10.0] — 2026-09-12
Added
-
Entered lineups are individual records. Each lineup you enter is its own record with its own card snapshot, and you can delete exactly one without touching the rest. The week view lists them per lineup with each one's entered time and projected points.
-
Cumulative Enter. Entering a week adds your newly built lineups to that week's record and updates the ones you changed, in one reviewed batch, without disturbing the lineups already entered.
-
Lock started players and re-optimize. Once a game kicks off, one control locks every player whose game has started at his actual scored points and re-solves every still-open slot across your entered and working lineups, shown as a preview you confirm before anything is written.
-
A live actual-points feed. Player actual scores are fetched from a source chosen by a measured latency test, on an Owner-set cadence, and scored to GameBlazers rules (including the INT = −2 and the fumble-recovery-TD bonus); unsupported stat components are disclosed rather than silently zeroed.
-
A per-player points column in every lineup table: a started player's cell shows his actual points with a small "live"/"final" mark; every other cell shows the projection. One table-level note names any partial actuals.
-
Exposure caps as a rule type — a maximum number of lineups a single player, or a single team, may appear in across the run.
-
A stack builder that lists every stack your roster can actually make (a quarterback with same-team receivers and tight ends), with the members you pick becoming the stack rule the optimizer already honors.
-
Lineup-scoped locks and excludes directly on the lineup box, with a per-lineup tally you can remove from, kept separate from the run- and contest-wide rules.
Changed
-
Collection rules explain a refusal. An add or move that an active rule forbids is blocked with a one-line reason naming the rule, rather than failing silently or with pool arithmetic.
-
A broad display and layout pass across the draft page, workbench, and lineup tables: the muted text token is readable on every background, badge and control shapes were regularized, the rule and report copy was cleaned, and the player-format label is one consistent macro everywhere it appears.
-
The late-swap include/skip CSV forms were retired in favor of the one-pool re-optimize control above; the Entry Checklist and pull-list pages were retired, with entered records read from the new tables.
[0.9.0] — 2026-09-09
Added
-
Discard the working run or the draft. Each has its own discard action that removes only that in-progress work; your entered lineups are never touched. A stale form left open from an earlier generation can only ever discard the exact run it named, never a replacement built since.
-
A weekly reset. When a new week opens (Tuesday), every workspace's working run and draft are cleared automatically — the only thing that survives week to week is lineups you have actually entered. The first visit after a reset explains what happened and when the week opened. Enter your lineup before the week turns over; after that an un-entered run is gone.
-
A game slate per contest. Every contest declares which games it can draw from — all games, the Sunday slate, the primetime slate, or a hand-built one-week special — and the optimizer enforces it on every path that builds or edits a lineup. A special contest is unavailable outside its week. Lineups already built are never retroactively invalidated by a later schedule change.
-
Entered lineups download as CSV. Each entered record has a CSV download from its row and its read-only view, alongside the existing week-by-week list, with the retention rule stated on the page.
Changed
-
The working run is named by its week and generation time on the workspace card, the workbench, and the checklist — "Week 1 run · generated Sep 10, 6:14 pm ET" — with an honest label for runs started before this update.
-
The admin sees exactly what blocks a contest edit. When working runs would be invalidated by a cap, roster, or rule change, the form lists them and offers to clear them and save in one step; a cleared workspace is told once, on its next visit, why its run went away.
-
The draft page was rebuilt again to open on the three things you need — roster, projection source, and Generate — with each source's last-updated time shown in the dropdown (in Eastern time) and its diagnostics beneath it, the chosen file's name echoed back, this week's contests shown with their games and kickoff times, and every advanced control (rules, locks, excludes, stacks) tucked behind one "Advanced tools" disclosure. Contest verification left the draft page. The projection dropdown now lists only sources that actually supply projection points.
-
The site frame pins the header on desktop with larger navigation links, and moves the Admin link to the footer.
-
"Level" is gone from every page and the admin form. It is no longer read or displayed anywhere; the stored column is left untouched.
[0.8.0] — 2026-09-05
Changed
-
Database projections are usable before the week's boundary. The draft page targets the pending week and offers every projection source that has an import or fetch for it, instead of hiding all database sources and offering only "My CSV" until the boundary passes. Applying, refreshing, and averaging those sources all work pre-boundary exactly as they do in-season.
-
The draft page's pre-boundary wording. The projections panel now names the week it targets and when that week opens, and says database projections for that week are usable now — replacing the note that said they would only become fetchable once the boundary opened.
[0.7.0] — 2026-09-04
Added
-
Entered lineups are a lasting record. When you enter this week's lineup into a contest it is saved to a dedicated Entered lineups page, reachable from the nav, with a link back to its week, whether it was imported, and a no-JavaScript delete. Entering this week replaces the prior week's active lineup rather than piling up, and an entered record can be viewed read-only, deleted, and re-entered.
-
One shared navigation frame across every page — Home · Draft · Lineups · Entered lineups · Admin, plus a Changelog link on the version stamp — with the login and error pages deliberately left frameless.
-
Server-side plan validation. A plan that asks for fewer lineups than you have already accepted is refused at configure time and re-checked at generate time, so it cannot be bypassed.
Changed
-
The draft page was rebuilt around two clear Generate paths, redesigned chrome, and owner-facing slot labels that read the way the contest names them.
-
The lineup workbench was rebuilt into two sections — the lineups you have accepted and the ones still being worked — with a bulk action bar.
-
The player pool controls were rebuilt. The duplicate pool tree is gone, replaced by a single searchable, position-filtered lock/exclude editor over the real pool; on a phone every control now meets the full touch-target size.
-
The landing page and copy throughout — footer, onboarding, checklist, history, and the draft page — were rewritten for plainer language, and the workspace retention picker was removed.
[0.6.0] — 2026-09-03
Added
-
Projections from multiple sources, not just your CSV. A provider registry with four built-ins — FantasyPros (keyed API), Pro Football Focus and Fantasy Guru (weekly CSV imports), and Sleeper as the keyless backbone for player team and availability. Each is scored into GameBlazers points (FantasyPros and PFF from stat lines; Fantasy Guru as its DraftKings-format points).
-
Projection modes on the draft page — a single source, an Average across the sources that have a usable fetch for the week, or Hybrid (a database view with your uploaded CSV overriding points per player) — alongside the unchanged CSV-only path.
-
A data-health strip on the draft page — per source: whether it is configured and eligible, how long ago it last succeeded, its last attempt and message, and any scoring notes — plus a count of players excluded as unavailable.
-
Freshness and flex banners — a game-day banner when the availability feed is stale on a game day, a banner listing schedule flex-time changes, and a per-source staleness badge for an import that has fallen behind the live feeds.
-
Player availability handling. Players marked IR / PUP / NA / OUT / suspended are auto-excluded; doubtful and questionable are badged, not dropped.
Changed
- The workbench refresh can rebuild from the database sources, re-resolving each player's team and availability and badging any lineup whose players got worse or lost points.
[0.5.2] — 2026-08-29
Fixed
- The workbench's per-player action buttons are lighter on wide screens. Each lineup slot's Exclude, Exclude and re-optimize all unlocked, and Swap buttons were rendering as heavy, solid-filled primary buttons — three saturated blocks per player row that overpowered the player's name. They now use the light, outlined style they were always meant to have: transparent fill, a thin border, and a smaller label. This is a desktop refinement only; phone-width layout is unchanged, and every button keeps its full touch target.
[0.5.1] — 2026-08-28
Fixed
- The workbench's per-player action buttons no longer waste the row on wide screens. Each lineup slot's Exclude, Exclude and re-optimize all unlocked, and Swap buttons were stacking one per line at desktop widths, spreading a single row of controls down the page. They now sit together on one horizontal row across the player's row, wrapping to a second line only when the row is genuinely too narrow. Phone-width layout is unchanged, and every button keeps its full touch target.
[0.5.0] — 2026-08-28
Added
-
Contest verification, per season (P5.5). Mark a contest verified for the current NFL season; a per-contest badge on the entry-plan builder reads "Verified {year}" and reverts to "Verify {year}?" on its own when the league year rolls over in March — the year is always derived, never a stored literal. Changing any of a contest's legality fields clears its verification (a reconciled contest that changed is no longer reconciled); renaming or reordering it does not. A preseason verification checklist lists every active contest for the annual walk-through, and both the builder and the checklist show a "season complete" state once the schedule has passed week 18.
-
Past runs (P5.6). A read-only history of your archived runs, reachable from the site navigation: newest first, with the week each run was for (derived from when it was uploaded, never today's clock), its lineup count, total projected points and salary, and roster hash. Opening one renders the full lineups and reports through the same presenter the live workbench uses — with every editing control removed, because a past run's pool and salaries are stale by definition. It is private to your workspace: any other run, any other workspace, any id that does not exist all return the identical "not found," and no editing action can reach an archived run. A run stored in an older or unreadable format shows a plain notice instead of an error, on both the list and the view.
Changed
- The site navigation now carries Admin and Past runs links beside Changelog, so both surfaces are reached by navigating rather than by typing a URL.
[0.4.0] — 2026-08-23
Added
-
Choose how long your saved runs are kept (P3.5 Phase B Slice 7, play S7.2). A setting on the landing page, beside the privacy note, lets you keep archived runs for four weeks, eight weeks, or a full season. Eight weeks stays the default if you never touch it. The control is honest about its own limits: it says plainly that losing this browser's cookie, or leaving the workspace idle for ninety days, still makes an anonymous workspace unrecoverable — a retention setting cannot rescue a workspace nobody can find. Choosing a shorter window affects the next cleanup rather than deleting anything on the spot, and the choice never touches the run you are working on.
-
You are now told when a carry quietly resets your settings (P3.5 Phase B Slice 7, play S7.3). Carrying your setup into a new week has always reset two engine settings to their defaults — the minimum-uniques number and the optional max-per-team cap — and until now it did so in silence, while a dropped lineup rule got a precise notice. That asymmetry is closed. If either setting was not at its default, the new draft says so, names the value you had been using, and tells you where to put it back. If both were already at their defaults you get nothing, because there is nothing to report.
-
Your week-to-week setup now carries forward (P3.5 Phase B Slice 6, plays S6.1–S6.9). Uploading a new roster no longer starts you from a blank page: the draft it creates arrives carrying the plan you built, your stack requests, your athlete-level locks and excludes, and the stack counter from the run you are currently working. Rules that cannot survive the new week are dropped loudly rather than quietly rebound — a lineup-scoped rule whose slot now belongs to a different contest is removed with a notice naming it, and rules tied to a specific card leave with a notice of their own, because a card's identity does not survive a new export. Editing the plan afterwards reconciles the same way in the same save, so a rule you drop cannot reappear on the next autosave.
-
Generating against a changed roster now re-freezes the lineups you locked (P3.5 Phase B Slice 6, play S6.6). Lock the lineups you have already entered, upload next week's roster, and generate: each locked lineup is rebuilt from the new roster's equivalent cards when every one of them is still available, and honestly released with a "cards changed" notice when it is not — the rest of the run generating around it either way. Lineups that survive keep their stack assignment only while it still means what it meant; a stack whose team, count, or coverage no longer holds is cleared with a notice rather than carried as a claim that is no longer true. Frozen lineups also now count toward the supply checks that run before solving, so a locked lineup can no longer be reported as impossible by the very validation it already satisfies. A run's minimum-uniques request is never overwritten by the tighter value generation needs; the tighter value is used for the solve and the number you asked for is what stays saved.
-
"Start new run" — one click, same roster (P3.5 Phase B Slice 6, play S6.7). A button on the workbench creates a fresh draft from the run you are already working, without a new upload and without touching the active run, so last week's lineups stay exactly as they are while you set the next ones up. If a draft already exists you are taken to it rather than losing it. Results, entered marks and differences reset for the new draft; the projections you already loaded stay, because the roster did not change.
-
Promotion now archives exactly the run it solved against (P3.5 Phase B Slice 6, play S6.6). Previously generating archived whichever run happened to be active at that moment. It now archives the specific generation the solve was based on, and if that run changed underneath — another tab, another window — the generation is rejected rather than silently archiving someone else's work. Where no active run exists, its absence is proven in the same transaction rather than assumed.
-
A shared necessary-capacity gate for generation (P3.5 Phase B Slice 4, play S4.3b). Validation now matches remaining card Items to every realized roster seat, including scoped excludes and frozen-lineup consumption, and reports one deterministic Hall witness when the plan cannot be filled. Initial generation stops at validation while whole-run re-optimization keeps its diagnose-and-continue behavior. (Written before the diagnosis below existed, when "diagnose-and-continue" meant only that re-optimize would not refuse. The mechanism that does the explaining is the next entry.)
-
Two ruled refinements to what a saved run records about its own rules (amendments A10, A11, A15). A stack rule's row in the satisfaction report now carries a plain verdict — satisfied, partial or failed — instead of leaving a reader to work it out from two counts, and every writer of that report produces it the same way, from one place. Notices that report a rule falling short now carry the rule they are about and the two numbers behind the sentence as real fields, rather than only as prose a reader has to parse; the shortfall is deliberately not stored, because a third number can disagree with the two it comes from. Two consequences worth naming: a rule asking for zero lineups could previously be created in the engine and then graded as satisfied — the form refused it, the engine did not, and now both do; and the check that stops the app writing a document it could not read back was silently repairing the very field it was meant to check, so it is now performed against the document as written.
-
The workbench can re-solve a lineup (P3.5 Phase B Slice 3). The four remaining edit actions are live: exclude a player from a lineup, add one, swap one out for the best available replacement, and move a player from one lineup to another. Each re-solves only the lineup you touched, against the rules the run was built under. Two behaviours are worth knowing. When an edit has no legal answer, the run keeps what it had and shows the lineup as conflicted with the rule that caused it, rather than silently discarding your change or refusing it — except when moving a player out of a slot that has no replacement, where the source lineup is cleared and says why, because refusing would make that player permanently stuck. And a move is all-or-nothing: both lineups are solved and verified before either is saved, so a half-completed move cannot exist.
-
The workbench can change a saved run (P3.5 Phase B Slice 3). Three edit actions are live, the three that need no re-solve: remove a rule you no longer want, release a stack requirement from one lineup, and freeze or unfreeze lineups — one at a time, a selected set, or all of them — so a result you are happy with cannot be disturbed by later edits. Freezing is all-or-nothing by construction: if any lineup in the request cannot be frozen, none of them are, so you never see half an action applied. Each edit is one checked write against the run you were actually looking at; if the run moved under you — another tab, a stale page, the back button — the edit is refused with a clear conflict rather than silently applied to something else. The buttons themselves arrive here too, each carrying the revision it was rendered against and an acknowledgement of any lineup already entered on the platform that the edit could disturb.
-
Download your lineups as a CSV (P3.5 Phase B Slice 3). The result page now has a download button that hands you every filled lineup as a spreadsheet-ready file — one row per player, with the contest, entry, slot, team, salary, projected points and effective value alongside each lineup's totals and whether it is locked or already entered. The file is named for the week, run and moment it was produced, opens cleanly in Excel and Google Sheets, and is guarded so a player name that looks like a spreadsheet formula cannot run when the file is opened. It only reads your active run; downloading never changes it.
-
The game-week workbench's machinery, built and proven before any of it is reachable (P3.5 Phase B Slice 5, plays S5.0–S5.4). Everything the entry checklist, the entered/diff tracking, the projection refresh and the late swap will need now exists and is tested, with no route wired to any of it yet — the pages and buttons arrive with the next play, nothing you can click behaves differently because of this work, and the version does not change. (Corrected 2026-08-19, while writing S5.5: that sentence was true when written and is not true now. S5.5 wired the routes and built the pages; what you can click is described in the S5.5 entry below. Corrected rather than quietly left standing, because a changelog that under-claims what is reachable is the same defect as one that over-claims it.) What is now in place: a saved run can be handed a fresh projection file and rebuilt on a copy without a single lineup changing hands, so a refresh moves projected points and nothing else; a lineup can be marked as entered on the platform, or un-marked, with the record of what changed since you entered it cleared at the same moment; one accumulated change can be dismissed from that record by address, with a stale page refused rather than silently applied to the wrong one; a printable entry checklist can be assembled in plan order, grouped by contest, with a per-contest pull list and warnings for anything unfilled or in conflict; and the late swap itself — one atomic operation that takes a fresh reading of which games have started, applies your review of that set, optionally refreshes projections first, pins the players already playing, bars the rest, re-solves everything else, and either saves the whole thing or changes nothing at all. Two safeguards inside it are worth naming because they are the reason it is one operation rather than three: every failure path — a bad file, a clock that moved while you were reviewing, an invalid override, an impossible solve, a database error, or another tab saving first — leaves your projections, overrides, lineups and notices exactly as they were; and lineups you ask it to skip are held still for that one operation without being locked, so they are not left frozen afterwards.
-
The game-week workbench, now reachable (P3.5 Phase B Slice 5, plays S5.5 stage one through 2c). The machinery described above is wired and on the page. This was the drive's single entry and each stage appended to it; the version held at
0.3.0through that drive, and the phase closes here at0.4.0. -
Stage one — the routes went live. Four operations became reachable: mark a lineup entered, dismiss one accumulated change, refresh projections from a CSV, and run a late swap. Nothing pointed at them yet.
- Stage 2a — the entry checklist. A printable page listing every lineup you can enter, grouped by contest in plan order, with a per-contest pull list, warnings for anything unfilled or in conflict, a per-lineup control to mark it entered, and a CSV download. It prints in landscape without the site chrome, and your browser is told never to store it.
- Stage 2b — the late swap. A confirmation panel on the workbench showing every team it can pin, checked for the ones already playing, running the whole operation as one step. Unchecking every team unpins all of them, and the panel says so rather than letting an all-unchecked confirm read as "do nothing". It works without JavaScript. If a run's stored state cannot be read, the panel is withheld behind a notice saying why, instead of looking like a run with nothing to swap.
- Stage 2c — the remaining controls, and a warning that now follows you. You can dismiss a single accumulated change from a lineup, and upload fresh projections without running a late swap; that upload names its own failure now — a missing file says a file was not attached, rather than borrowing the parser's "empty or has no header row". And the started-players warning — "N teams have started. Their current Items have been pinned automatically…" — now appears on every action that re-solves anything, instead of only the two whole-run ones. Excluding, adding, swapping or moving a single player already re-solved under those pins and told you nothing; now it says so every time, so what the app did to your lineup is never silent.
Fixed
-
Moving a player can no longer knock a player whose game has started out of your lineup (P3.5 Phase B Slice 5, play S5.4b). Moving a player between lineups sometimes leaves the lineup they came from with no legal replacement; when that happened the app emptied that lineup rather than refusing, so you were never left with a player stuck somewhere you could not move them. But if the emptied lineup also held someone whose game had already kicked off, that player was dropped too — silently, as a side effect, even though the app otherwise refuses every attempt to remove a started player, because the check only ever looked at the player you actually clicked. That move is now refused, and the message names every started player the emptied lineup would have cost you, so you can remove the started-team override for a postponed game and try again. The original behaviour is unchanged in every other case: a lineup with no legal replacement and nobody already playing in it still empties rather than refusing, so an immovable player is still never stuck.
-
Replacing your roster no longer leaves stale projection warnings behind (P3.5 Phase B Slice 5, play S5.2c). When you uploaded a new roster over an existing draft, the notes explaining the previous roster's projection problems — rows that could not be matched, players whose team could not be resolved, sources that disagreed — were kept and the new roster's notes were added beside them, so the page accumulated warnings about players you no longer had. Those stale notes are now removed from both places they are kept, the run's own list and each lineup's, and only the new roster's are shown. Warnings unrelated to projections are untouched, and the new roster's own projection warnings are still generated normally.
-
Generation no longer accepts a run that the single-lineup re-solve then rejects (docket 4, fix F1). When a contest-scoped lock reserved cards, generation worked out which cards from one pool and then checked whether they could actually fit a legal lineup against a wider one — so a run could be generated, saved and displayed, and then fail the moment anyone tried to edit a single lineup of it. Both sides now check the same set. This mattered now rather than later because the workbench edit routes are what would first have hit it, and they are the next thing being built. The parameter that had supplied the wider pool is gone, and the two comments elsewhere in the engine that described the old mismatch as intended behaviour are corrected — a third that looked similar was checked and left alone, because it describes something this fix does not change.
-
A contest-scoped lock's reserved cards can no longer be seated outside that contest (amendment A9). Such a reservation is now a run-long containment boundary: releasing its claim downgrades it to a hold instead of lifting it, so the engine now matches the lifetime the invariant checker always assumed — it re-derives the reservation statically from the rule and so treats it as permanent. (The two still derive their sets from different pools, which is docketed separately and untouched by this fix.) This closes the pre-existing P2 defect that had blocked P3.5 Phase B Slice 1 since 2026-07-18, in all four of its known triggers — the demand abandoning, natural satisfaction by a card other than the reserved one, frozen-lineup satisfaction, and overlapping-rule satisfaction (the set is not proven closed; all four route through the same released claim). Lineups inside the scope still use the reservation freely.
-
Generate is reachable on a phone without scrolling the whole page (P3.5 Phase B Slice 4, play S4.6; Docket C). On a 375 px screen the draft page ran to roughly 34,800 px and the Generate button sat at the very bottom of it — about forty full screens of scrolling to reach the one control the page exists for. The cause was the unmatched-cards table, which rendered every unmatched card as its own row with no height limit: on a fresh roster with no projections yet, that is 912 rows and around 31,300 px, or ninety percent of the page. That table now has a fixed height and scrolls inside itself — every row is still there, none are hidden or dropped — and the Generate panel now sits directly under the page heading instead of below the diagnostics. The page is about 4,200 px, and Generate is visible the moment the page loads without scrolling at all. The pool rule tree, long assumed to be the culprit, was measured at 512 px and is deliberately unchanged. Its accompanying sentence no longer says the plan and cards are "above" it, which stopped being true when the panel moved.
-
File uploads work on iPhone and iPad. Tapping the roster or projections upload box on an iOS browser did nothing at all — no file picker, no error, no way to tell anything had been missed — which left the entire flow unreachable from a phone, since a roster upload is the first thing the app asks for. The upload boxes hide the real file control behind their own styling, and that styling also declared the control untouchable; desktop browsers hand the tap through anyway, but iOS refuses to open a picker for a control it considers unreachable and drops the tap in silence. The control is now reachable, so tapping the box opens the file picker exactly as it always has on desktop. Nothing about the appearance or the desktop behaviour changes.
[0.3.0] — 2026-07-17
Added
-
Anonymous workspaces and draft runs (
0002) with 90-day sliding sessions, token-only isolation, revision compare-and-swap, owner-aware retention cleanup, and PostgreSQL/SQLite parity. -
Roster and projections flow with parse-before-mint first upload, revision-safe replacement, wholesale projection refresh, unmatched-card reporting, roster-freshness warnings, and asynchronous GameBlazers export onboarding.
-
Live draft configuration for entry plans, locks, excludes, directed stacks, and run settings. A dependency-free client saves one wholesale document with a 400 ms debounce, one request in flight, trailing dirty-save handling, stable stack ids, persistent failure states, and shared server-side validation/supply calculations.
-
Atomic generation that revalidates, runs the real optimizer before writing, then archives the prior active run and promotes the draft in one transaction. Lost revisions roll back completely; generate-only rule errors render without a 500.
-
Read-only workbench showing every plan slot in order, filled and unfilled results, card/salary/EV totals, notices, lock/stack satisfaction, athlete/team exposure, and unused premium cards. P3.5 mutation controls remain deliberately absent.
Fixed
-
Strictly reject negative minimum-uniques and non-positive stack counts instead of persisting silently ignored rules.
-
Treat non-ASCII CSRF input as a normal 400 mismatch instead of raising
TypeError, and contain the mobile exposure table inside its horizontal-scroll wrapper.
[0.1.0] — 2026-07-16
Added
- Flask application skeleton (app factory, single blueprint, GameBlazers theme, changelog page) ported from the golf optimizer.