Weekly Fixes & Polish (Aug 25-Sep 8)
75 bug fixes and style improvements across free agents, schefter report, navigation & routing, rosters, and more.
The Full Story
This week's 75 bug fixes and polish improvements touched the following areas of the site:
Free Agents — Free agent pickups were bouncing during the first-come window. If your roster was full — which is exactly when you are dropping somebody to make room — MFL was counting the add before the drop, deciding you were over the limit, and throwing the whole thing out without a word. Our side saw a shrug where an answer should have been and could only tell you "claim failed," so three straight attempts on the same player disappeared into nothing while another owner made the identical swap on MFL's own site. Pickups now go through the same page every owner uses by hand, which actually accepts a full-roster swap and, when it does refuse, says why — a locked player now reads as a locked player. And if anything still goes wrong, the dialog hands you a direct link to MFL's add/drop page so you are not left hunting for it with the clock running. Your waiver claims now look like the players they are. The claim card used to spell out the player you'd claimed as a line of plain text — name, then “TE · WSH” underneath — sitting directly above a table where every player wears a headshot, a team logo and a position. Same player, two different looks, one inch apart. The claim now uses the exact same player lockup as the rows below it, headshot and helmet included, and the drop line tucks in underneath it — same treatment on the Waiver Claims screen in the notifications hub, which lists those same claims. The priority number, Change Drop and Delete all work exactly as before. On Free Agents the Bid or Claim button and the ⋮ actions menu now sit right beside the player's name instead of at the far right of the table — on a phone that meant a sideways scroll past nine columns of stats to reach the one button that does anything. "Your Waiver Claims" on Free Agents was drawing a bordered, rounded box inside another bordered, rounded box, with the Bid Status strip's divider running between the two. It is its own card and had been dropped inside the table's card. It now sits above the table as its own panel, which is where the AFL has always had it. "Your Waiver Claims" on Free Agents said "Could not read your pending waivers" for anyone who actually had one filed, and filing a claim came back with a shrug — "submitted, but we could not confirm it" — instead of a clean checkmark. The claim was always there; we just could not find it when we looked. MyFantasyLeague labels the record differently depending on how a league runs waivers, and we only knew the label the AFL uses. TheLeague bids, so its claims went by another name and we read straight past them. The panel now finds a filed claim by its shape rather than by what MFL decided to call it that week, so a third name would not break it either. Your claims, your bids and the drop attached to each are all listed again. Filing a waiver claim from Free Agents now actually files it. Every claim TheLeague sent through the site was being thrown away by MyFantasyLeague, because the form we submit on your behalf was missing one box: the bid amount. The feature was built and tested in the AFL, which runs waiver priority and has no bid to send — TheLeague bids, so MFL read an empty amount, decided it was below the $425,000 minimum, and refused. It said so, too, in plain English, and we were not reading the part of the page it said it on: the error you saw was our own vague shrug rather than MFL's actual complaint. Both are fixed — the bid goes with the claim, and when MFL does turn one down you now get its exact words instead of a guess. The Bid button on the Auction and Value views has been pointing at MyFantasyLeague's place-a-bid page all year, including the ten months a year the auction is closed. That button does not join a bidding war — on a player nobody has nominated it starts one, at the league minimum. So during a waiver week, with the free-agent pool locked and everyone else filing blind bids, one click could open an auction on a player instead. Both columns now appear only while the auction window is actually open, from the third Thursday of March to the third Sunday of August. The rest of the year the Auction tab is what it should always have been: a record of what the bidding did, not a way to start more of it. Adding a player outside the auction is the Bid button on the main list, which files a proper waiver claim. Free Agents spent a whole locked week telling you it was first come, first served. It was not — the pool has been shut since Wednesday's waiver run, so every attempt to grab a player went out as an instant pickup, MyFantasyLeague refused it without a word, and you got a bare error for your trouble. The mix-up was one minute on the league calendar: MFL processes the round and re-locks the pool at the exact same time, and when two events share a timestamp we were reading whichever one happened to be listed second. A lock and a run at the same moment now mean what they plainly mean — locked — so the page says "Waivers open", the button files a claim, and the pickup path comes back on its own when the pool actually reopens. The Bid button on Free Agents went dead if you had wandered off and come back. Click through to Rosters, click back to Free Agents, hit Bid — and nothing happened at all, no form, no error, until you reloaded the page. The site swaps in the new page without re-running the little script behind the claim form, so the form it was still trying to open belonged to the page you had already left, and opening something that is no longer on screen looks exactly like a broken button. It now rebuilds itself on every page you land on, so Bid works on the first click whether you arrived by link or by reload — and the form it opens is filled in from the league you are actually looking at, not the last one. The same fix restores the hand-off after signing in: click Bid while signed out, sign in, and the form comes back up on the player you wanted. You can file a waiver claim from the Free Agents page again, and it now tells you the truth about whether it worked. MyFantasyLeague turns out to want two things at once to treat an add as a claim rather than an instant pickup, and we were sending neither — so a locked free-agent pool refused every attempt without ever saying why. Fixed, and the confirmation is no longer taken on faith: the claim is read back out of your pending waivers before you see a checkmark, and the message now links straight to MyFantasyLeague's add/drop page so you can see the claim listed with your own eyes. Free Agents had the waiver window exactly backwards. With the league calendar finally syncing, the page turned around and announced first-come-first-served in the middle of a live waiver period — because the code read MyFantasyLeague's “waivers lock” event as waivers ending, when locking the free agent pool is the very thing that starts them: once nobody can just take a player, a claim is the only way in. The AFL's own 2025 transaction log settles it — the lock event fires Monday at 6, the claims run Wednesday at 8, every week. Both leagues now show the real state, and the claim form routes to the right place instead of filing a first-come pickup into a round nobody runs. The Free Agents page can finally tell you which waiver window is open. It had been saying “waiver window unknown — MFL will decide when you submit” to everybody, all season, because the piece of MyFantasyLeague that knows the answer — the league calendar — had never once synced. It wanted a login and was being handed an API key, and the two are not the same thing. So the header now reads the real state: waivers open and your claim queued until they process, or first come, first served and the pickup happens on the spot. The claim form follows suit, which matters more than the wording — a first-come pickup filed as a queued claim is a claim that sits in a round nobody ever runs. A waiver claim that never reached MyFantasyLeague will no longer tell you it did. The Claim button said “Submitted ✓” and closed the moment MFL answered at all — and MFL answers a refused request with a perfectly cheerful blank page, so a claim could vanish between the click and the wire with nothing to show for it. Now the site insists on a yes from MFL, then goes back and reads your pending waivers to see the claim actually sitting there. If either check comes up short you get told so, in the words of what went wrong, with the claim form still open in front of you.
Schefter Report — Schefter's rumor mill has been dialled way back. It was reporting essentially every trade offer that crossed the desk, often within hours, and on one Monday it filed the same Fire Ready Aim offer twice — once buried in a multi-team story and again seven hours later as its own scoop. Under the hood the dice were being rolled roughly fifty times a day per offer, so a nominal five-percent chance of a leak compounded into a near-certainty. Offers are now rolled once a day, a reported offer goes quiet for a full week before it can resurface, and during the season the mill files at most one rumor a day instead of three — the league does its own talking once games are being played. The volume comes back for the offseason, and for the ten days into each league's trade deadline, which are the two stretches when a rumor is actually news. The whole right rail on the Tip Schefter page was rendering as plain unstyled text the moment it filled in with real data — Your Record, Top Tipsters This Season and Hot Topics This Week alike. Every one of those panels is drawn by the browser after the page loads, and the styling we had written only ever reached the parts of the page the server sends down, so each panel lost its formatting at exactly the moment it had something to show. Your codename is a badge again, your season and lifetime counts line up, the leaderboard gets its rank numbers with your own row highlighted, the hot-topic chips are rounded pills with the week's most-tipped subject picked out in league colors, and Tip of the Week badges are amber pills instead of a run-on line of text. All of it reads correctly in dark mode too, which the badges would not have the first time they appeared. Schefter's trade-offer rumors have not worked since they launched in April, and the failure was invisible from the outside. When a pending trade offer passed the dice roll, the scanner built the rumor, queued it, and logged a success — then re-read its own queue two hundred milliseconds later, decided the item was malformed, and deleted the whole queue as stale. The check it was failing asked every queued item for tip text, and a trade-offer rumor deliberately has none: it is built from positions, picks and player names, and the wording gets written afterwards. Four months of rumors were thrown away by the scanner that had just written them. The queue now asks each source for the fields that source actually carries, and anything it still cannot use gets shouted about in the logs rather than dropped in silence. Tipping Schefter by @-mentioning him in the group chat is finally being read. The scanner has always had the code to pull mentions out of GroupMe and turn them into tips, and it ran on every scan — but it had never been handed the two credentials it needs to actually read the chat, so it logged 'skipping mention ingest' and moved on, every run, for months. Those are in place now, and the ingest is fenced to TheLeague in code rather than by accident: it reads TheLeague's group and writes TheLeague's queue, so the AFL's half of the scan no longer runs it at all. The tip page greeted everyone with a confirmation for a tip they had not sent. The 'Schefter's got it' panel and its dead 'Undo 60s' button are supposed to appear only after you file something; they were marked hidden, but a styling rule overrode the hiding and left them on screen from the moment the page loaded. Fixed — the panel now stays out of sight until you actually send a tip. Every record Schefter quoted was double what it actually was. MyFantasyLeague reports a team's head-to-head wins as one total plus two breakdowns of that same total — division games and everything else — and the article generator was adding all three together, so last season's 15-3 leader was handed to the writer as 30-6. It affected every recap, both previews, team grades and the championship writeup: essentially every article that has ever mentioned a record. The fact sheet now reads the record straight off the league standings and is checked against MyFantasyLeague's own W-L string for all sixteen teams. Schefter is supposed to report it when a team puts players on the MFL trade block. He does — for the five teams that had something listed the day the feature launched. The other eleven haven't visited the block yet, and when they did, their first listing would have been quietly filed as "noted, nothing to see here" with no post to follow. That trapdoor is gone: every franchise's first trip to the trade block gets the write-up it deserves.
Navigation & Routing — The Preferences row in the side menu now glows softly until you have actually picked a clock, so the setting stops being something you only find by accident. It is a slow breathing ring, not a badge or a nag — and it turns itself off the moment you save a preference, on every device that remembers it. Screen readers get the same hint in words rather than a ring they cannot see. The Owners page has moved out of the side navigation. It was sitting in League Reports next to Franchises, doubling up on a link the site footer already carries under Record Book — so the drawer is one line shorter and Owners lives in exactly one place. Nothing about the pages themselves changed: every owner, every tenure, every trophy is still right where it was. The side menu has a new first stop: Notifications now sits at the very top of the drawer, above every section, in both leagues. It is the one page that decides what reaches your phone, and until now the only way to find it was site search or a link buried in a What's New post. It stays first year-round — the sections below it shuffle between the season and the offseason, but this one does not move. The Add/Drop link is gone in the same pass; it kicked you out to MFL's own screen, and adds and drops already live on the site's player pages.
Rosters — Roster/Salary went dark on The League — every visit landed on the 404 page, which made it look like the page had been deleted rather than broken. It hadn't: the season rollover filled the schedule out to Week 17, and MFL hands back the last few weeks in a different shape because it has not paired those teams into matchups yet. The page read every week the same way, hit the unpaired ones, and fell over on the way to the screen. It now steps past a week that has no matchups instead of tripping on it, and the recent-score trend still reads every week that has actually been played. The “Rostered by” strip in a player's profile card had a little black tile sitting behind the team crest. It was there for a reason — the crest was the dark-mode cut of the logo, drawn to sit on ink, so it needed ink to sit on — but it read as a sticker slapped onto the card. The strip now takes each franchise's normal crest and lets it follow your theme like every other logo on the site, so the mark sits straight on the card in both light and dark mode with nothing boxed in behind it. Set Lineup went dead the second time you opened it. Come in from the homepage and everything worked; click away to standings, click back, and the page turned into a photograph — tapping a slot brought up nothing, Set Optimal did nothing, Submit did nothing, and there was no error to tell you why. Reloading fixed it, which is a fine trick if you knew it. The page was still wired to the copy of itself you had already left. It now rebuilds itself every time you arrive, so the tenth visit behaves exactly like the first.
Design System & Theming — Franchise crests are no longer cropped into a circle in six more places: the Throwback Week commissioner grid, mock draft results, the My Team panel on both homepages, the team column on Projected Free Agents and its filter, and the “via” tag on traded picks in the draft room. A round frame is the right treatment for a headshot and the wrong one for a logo — it quietly bit the corners off any crest that was not already a circle. Most crests were round enough that nothing changes; Chatmaster gets its AIM badge back, and Maverick, the Wascawy Wabbits, the Dark Magicians and the Computer Jocks stop losing their edges. Historical throwback marks are deliberately left round: that art is a circle cut out of an era banner, and it carries a coloured rim that only sits right on a round frame. In dark mode the Panthers logo had been doing its best impression of a shadow. Every other NFL mark gets a dark-mode cut with its outline re-inked light, but Carolina's panther is black clear through, so on a dark card it dissolved into a smudge next to the player's name. It now wears a crisp white edge, the same treatment the league crests get in dark mode, so the cat is visible again at every size, in both leagues. The Asset Library's search box only worked the first time you opened the page. Come back to it later in the same visit and typing a team name did nothing at all — every logo stayed on screen — and the little size line under each image sat blank instead of telling you the dimensions. The copy buttons were fine throughout, which is probably why nobody filed it. Search and the size readout now come back to life on every visit, in both leagues. Three era crests on the franchise and owner pages were showing art the era never wore. The Music City Mafia 2019-24 had on the crest the franchise did not put on until 2025 — a neat trick for a run that ended the year before. The Mariachi Ninjas had the sombrero sliced off at the brim, and Midwestside Connection was cropped tight enough to shear the bottom off its own gold ring, on both the 2011-15 and 2019-24 eras. All three wear the original badges now, whole circle intact, on the franchise pages, the owner pages and in the Throwback Week picker. The Gridiron Geeks have a new helmet. The facemask went from white to orange, which is the first time that crest has changed since 2014 — twelve seasons of the same grimace. The old white-facemask look is not gone, it is retired: it is now an era of its own, so every 2014-2025 season still wears the helmet it actually played in, and it turns up in the Throwback Week picker as “The white facemask” alongside the Sabertooths and DangerZone. The orange one takes over from 2026 on, across the badge, the chat crest and the wordmark banner. The Gridiron Geeks helmet has a heavier orange outline in dark mode. The old one was drawn for the big chat crest and all but vanished once it was shrunk to the 40px badge on the rosters page — this one still reads at that size. Maverick's dark-mode logo got a redraw — the red keyline around the M is brighter and the whole crest sits a little larger in the frame, so it holds up better against a dark background. Players without a headshot no longer punch a white hole in the roster. Where MyFantasyLeague has no photo, the site used to load MFL's own placeholder — a white disc with a black silhouette on it — which sat on top of the team-coloured chip and blanked it out entirely. The fallback is now drawn by us in the player's own NFL colours: the same gradient every headshot already sits on, with a soft silhouette over it. It shows up everywhere a player can appear without a photo — rosters, free agents, the lineup pages, the draft room and board, dead money, MVP tracking and the draft broadcast — and because it's drawn rather than downloaded, it appears instantly instead of after a round trip to MFL. Cowboy Up and the Gridiron Geeks have dark-mode logos now, and Cowboy Up's light crest got refreshed at the same time. That is every team in both leagues sorted for dark mode — the only one without a separate dark version is the Dark Magicians, whose logo was already designed to work on either background. Bring The Pain's dark-mode skull got a cleaner cut — the thin outer ring is gone, so the crest sits flush instead of looking like a sticker at small sizes. Team crests on the Set Lineup matchup cards and the Tuesday recap hero now hold up in light mode. Those panels are dark whatever theme you browse in — a near-black gradient with white type — but the logo on them was being chosen as if they followed the theme, so anyone reading the site in light mode got the light artwork sitting on ink, and the near-black crests simply weren't there. Thirteen of TheLeague's sixteen teams now wear their dark-mode crest on those cards. Six more do on the AFL side — Smokane, the Drunk Indians, Jewpacabra, Badd Boys, Chatmaster and No Soup — and the four whose logo still needs help separating from the panel get a fine outline traced around the logo's own shape: Harambe, Suh girls, Swiftie and the Boondock Saints, in their own trim colour where they have one. The two leagues' lineup pages had quietly disagreed about this for months: the AFL had worked it out at launch and TheLeague's copy never did. Ten more logos work in dark mode. Fullybaked, Titsburgh Feelers and A Bruin Pegs Me got new dark chat crests, and seven teams that had a dark crest but no matching dark team icon now have one — Badd Boys, Chatmaster, No Soup For You, Jewpacabra, Smokane, the Drunk Indians and Running down the Dream. Badd Boys is the big one: barely a tenth of that logo was actually visible against a dark card, the worst mark anywhere in either league, and it had been getting by on a thin white outline the site drew around it. Only four logos across both leagues still lean on that outline, down from seven. Nine more team logos now have a dark-mode version, so they stop dissolving into the page when you're browsing at night. Midwestside got the full redraw it badly needed — measured against the dark card, only 24% of that crest was actually visible, the worst mark in either league, which is why it had been propped up by a thin white outline instead. Music City, the Ninjas, Da Dangsters, Running down the Dream, Badd Boys and Smokane all picked up proper dark artwork too, and Smokane's light crest got refreshed while we were in there. That puts thirteen of TheLeague's sixteen teams on purpose-drawn dark artwork, and no team icon in the league is leaning on a generated outline any more — Gridiron Geeks, Cowboy Up and the Dark Magicians are the three still to come. The AFL is the next job. Music City Mafia's dark-mode logo no longer sits on a black box — the skyline backdrop is gone and the detective now floats clean on the page like every other team's icon.
Trade Builder — Two rough edges on the Trade Builder. The Trade Bait Marketplace was drawing its own player rows — a flat gray circle and a bare name — instead of the player lockup the rest of the site uses, so a player on the block looked nothing like the same player in the Available Players list two panels down. Marketplace rows and the trade confirmation screen now use the standard lockup: the team-color chip behind the headshot, the NFL logo beside the position. And franchise crests in the team picker and the confirmation screen were being cropped into a circle, which sliced the corners off logos that were never round to begin with. They now show whole. Clicking the little yellow 🏷️ trade-block tag next to a player on Roster/Salary threw up a full-width red error box. The Trade Builder decided which two teams to open with by reading the web address in the browser, but the server had already picked a different pair when it built the page — the two disagreed, and React complained loudly on the way through. The tag now opens the Trade Builder straight onto the tagged player's team, no red box. The same box had also started appearing on unrelated pages: the roster page's error catcher was staying switched on after you navigated away, so it reported other pages' problems as if they were the roster's. It now switches off when you leave.
Notifications — The “Put us on your Home Screen” banner was showing to everyone — including owners already using the installed app, and on Android, where it gave iPhone instructions for a Share menu Android does not have. The banner was correctly deciding to hide itself; its own styling was overriding the decision, so it rendered anyway. It now appears only where it can actually help: a browser that can install the app, and never inside the app. The Sunday lineup check fired four days before the season started and told half the league their lineups were missing — for a Week 1 nobody could have set a lineup for yet. It was reading the calendar month, so September 1st counted as in-season even though Week 1 does not kick off until the Thursday after Labor Day. It now waits for actual kickoff. AFL push notifications arrived wearing a blank white square where the shield should be. The little icon Android shows next to an alert is not a logo slot — the phone throws away the colors and traces the transparent parts, so the flat, edge-to-edge favicon we were handing it came out as an empty box. The AFL now has a proper stencil of its football, TheLeague has one of its crest, and both leagues get their own mark on every alert instead of sharing one. The AFL's app install file pointed at an address the site does not use — it claimed the app lived at /afl-fantasy/ when afl-fantasy.com serves everything from the front door. Phones read that, decided the file did not apply to the page they were on, and quietly threw it away, which is why the AFL never offered to install to your home screen and why its notifications had no app icon behind them. It now points where the site actually is, and ships an Android-shaped app icon to go with it.
What's New — The Transaction Hub write-up described a bell. There has never been a bell — the button in the corner is, and always was, a handshake, which is the mark this site uses for trades and waivers. The article now says handshake in every place it said bell, and carries the handshake as its own icon, so the story matches the button you actually tap. What's New articles now link to the features they are talking about. The Strength of Division launch named the standings, the franchise pages and the division page itself across six paragraphs and you could not click one of them — the only link on the page was the button at the bottom. Every article since early August has had the links woven back into the prose, and they point at your own league's version of each page.
Sunday Ticket — The network logos on the Sunday Ticket board now hold their edge on a light card. Kayo's light green used to wash out against the white — the same hairline outline that keeps a dark team crest visible in dark mode now runs in the other direction, so a pale broadcaster mark reads as a shape instead of a smudge.
Salary — Every contract write to MFL takes a backup first, so there is something to roll back to when a write goes sideways. Those backups have been empty files. The same went for the commissioner's verify step — the one whose entire job is to confirm a contract change actually landed — which had been reading back an empty salary sheet and calling it a clean bill of health. MFL was answering "you are not logged in" with a cheerful HTTP 200, so nothing ever looked broken. Backups now contain the league's actual salary data, and verification checks against something real. Salary Analytics only worked the first time you opened it. Arrive from anywhere else on the site and the Week dropdown had collapsed to a single "Season Total" — the other thirty weeks were simply gone — while the Season picker and Export to Excel had both stopped answering. Reloading brought them all back, which is a fine trick if you knew it. The page was still wired to the copy of itself you had already left. It rebuilds itself on every arrival now, so the week list, the season switch and the export all work on the tenth visit the same as the first.
Homepage — The homepage hero was introducing you to someone else's player. On kickoff week it casts a likely starter from the week's first game — and if you didn't happen to roster anybody in the Thursday opener, it reached across the league and put a rival's star next to your own team card. It now only ever shows a player you actually own: your guy in the opener if you have one, otherwise a likely starter from whichever of your players kicks off first, captioned honestly ("Your First Starter" rather than pretending he's playing Thursday night). If none of your players are left to play, it falls back to your own headliner rather than borrowing a face from another team. Signed out, or before you've picked a team, the hero still shows the opener's headliner from anywhere in the league.
Admin — The Schefter admin dashboard has been reporting a dead GroupMe login as healthy. Its green "SET" row only ever meant the token existed as a line of text somewhere — not that GroupMe would still answer to it — so when the copy stored on the site's host was revoked, the panel kept saying everything was fine while every read of the group chat came back refused. The row now asks GroupMe directly and reports the answer: valid, revoked, or never configured, with the reason spelled out and a link to go regenerate it. The message sync route stopped taking the same thing on faith too, and fails loudly instead of walking into a refusal. Scheduled Schefter scans were never affected — those run on GitHub, which holds its own copy.
Live Scoring — The new pre-kickoff gameday health check cried wolf on its very first run, telling the commissioner both leagues' live scoring was down a week before Week 1 kicks off. Nothing was down. Two things were wrong with the alarm itself. It was asking for Week 1 live scores in a window where MyFantasyLeague has no games to score, so a perfectly healthy league had no honest answer to give — that probe now waits until the season is actually under way, while the NFL scoreboard and MyFantasyLeague checks keep running year-round. And the way it asked put a server address in the web address, which our own edge security reads as an attack and blocked before the request ever reached us. It now names the league and lets the site look up that league's server, which fixes a real trap underneath: every league sits on a different MyFantasyLeague server, and asking the wrong one for a league it does not host returns that server's league instead of an error. Live scoring now resolves the server from the league every time, so there is no path where one league's board can quietly fill with another league's scores. The NFL games rail on Live Scoring now actually appears. It has been on the page the whole time and has never once rendered outside demo mode — the page only handed it a slate of games when you passed ?demo=1, and with nothing to draw it stayed empty, which in turn meant the browser never woke it up to go fetch the real ones. It waits for the rail to scroll into view, and an empty rail never does. Both leagues and Best Ball now load the day's games on the server, so the row of matchups is there the moment the page is, with the carrying network's logo on each card. While fixing it: the network logos were loading lazily, which meant each one took up no space at all until it arrived and then shoved the row sideways — they load with the card now. Leave Live Scoring open on your phone and it kept asking ESPN for the scoreboard every sixty seconds all evening, long after the last game had gone final. It was going by the page's "it's game day" flag, which stays switched on until midnight, rather than by whether football was actually being played. It now watches the clock: it eases off once the day's games are done — even with Monday night still sitting on the schedule — and wakes back up a quarter of an hour before the next kickoff. Nothing looks any different. Your battery just stops paying for scores that finished hours ago.
Other — Schefter's trade-offer radar has been blind and nobody knew. Its reads of MyFantasyLeague's pending-trade list were losing their login on the way through — MFL forwards you from one server to another, and Node quietly drops the credential when it does — so every check came back as an anonymous visitor and the scan shrugged and logged a warning instead of an error. A dead feature that looked like a config nag. Fixed, along with the calendar-writing script that was one environment variable away from the same fate. The commissioner accounting console stopped refusing writes it had no reason to refuse. It had been demanding a second MyFantasyLeague credential before it would touch the books — and it turns out MFL never asks for that credential at all, so the console was locking the commissioner out of his own ledger while every other admin tool in the app worked normally. The extra demand is gone and the parts that actually keep a write honest are unchanged, so the console now works from an ordinary signed-in session and the scheduled year-end carry-over no longer skips every league in silence.
Rankings — Import Rankings no longer shows weights that refuse to add up to 100. If a ranking source in your composite had gone away — deleted on another device, or dropped from a daily refresh — its slice stayed on the books invisibly, so the header counted a source it never showed you and the weights you could see summed to 75. Your actual My Rank order was always computed correctly; it was the panel that was lying. Stale sources are now cleared out and the remaining weights rebalanced, so what you type is the share that source really gets.
Draft — AFL franchise logos on the draft broadcast now hold their own against the board. That board is dark whatever theme you browse the site in, but the artwork was picked as if it weren't, so a crest drawn in near-black — Boondock Saints, Harambe, The Show — sank into the card behind it with nothing to separate the two. Twelve of the twenty-four AFL crests now get a fine outline traced around the logo's own shape, in white or in the franchise's own trim colour where one is set: Suh girls keep their pink, Jewpacabra their green, No Soup theirs. Five of those teams also have a small dark-mode crest drawn already, and the panel headers and pick rails now use it, since nothing at that size is big enough to show that the file is a smaller one. The reveal card and the on-the-clock logo stay on the larger artwork instead — they render past 700 pixels on a television and the small cut would visibly soften — which is what the outline is there to cover. TheLeague looks the same as it did yesterday, because every crest that needed one already got full-size dark artwork this week; the difference is that the board now works this out per franchise instead of assuming it. Traded draft picks now say who they came from — once, with the right team, and on every pick that was actually traded. The draft broadcast had been announcing "Pick 1.11 · via from Bring the Pain" on the TV, and the same doubled-up wording turned up wherever a traded pick appeared: the draft room's board, the draft predictor, your team's pick list. MyFantasyLeague writes these as "[Pick traded from Bring the Pain.]" and we were keeping the word "from" as part of the team's name, then putting our own "via" or "from" in front of it. Because "from Bring the Pain" matches no team in the league, every place that tries to show the original owner's crest beside a traded pick looked for that team, found nothing, and showed nothing — so those logos had never once appeared. Reading the comment properly turned up a second, quieter problem: MFL often files several notes about one pick together ("[Pick traded from Drunk Indians. / Pick made by Commissioner.]"), sometimes files them with no brackets at all, and sometimes lists a pick that changed hands twice. We only recognised the simplest of those, so 130 traded picks across both leagues' draft history were being shown as though they had never moved. All 287 are now read correctly, a pick traded twice is credited to the owner it started with, and a note about a pick traded away to someone else is no longer mistaken for one coming in. The draft broadcast's rehearsal mode shows the big reveal again. Rehearsal replays a season that has already finished so the board can be driven end-to-end before draft night, and last week's fix for autopick bursts — which stops the screen narrating picks the room watched happen minutes ago — judged a pick's newsworthiness by how recently it was made. Every pick in a finished season is months old, so the dry run quietly absorbed all of them: the board advanced pick by pick exactly as it should, and the card that is the whole point of the night never once appeared. A pick the rehearsal rolls forward is now treated as happening at that moment, which is what it is, so the dry run goes through the same check draft night does instead of around it. Live drafts were never affected. The draft broadcast board now keeps up with the room, and its images are ready before the first pick. Two separate problems, both outside our code and both worked around. ESPN expires player headshots after under four minutes, so every reveal was re-downloading a quarter-megabyte photo — which is why a card sometimes sat there with a name and no player; the board now pre-caches every headshot, crest and logo it could need before the draft starts, keeps them for a week, and shows a count in the corner so you can watch it finish. And MyFantasyLeague's draft feed turned out to serve whichever of several out-of-date copies it felt like — measured live, the correct board came back 8% of the time and one seven picks behind came back 70% — which had the board stuck rounds behind the room. It now reads the same file MFL's own draft room reads, so it tracks pick for pick. Hold your phone upright on the draft broadcast and the pick now reads top to bottom the way you'd expect: the pick, the name and the numbers first, the player underneath them. It used to lead with the player and bury the name below him, so the thing you actually wanted — who just went — was the last thing on screen. The copy and the cutout now sit together at the bottom of the card with the headroom above them, instead of a strip of empty gradient in between. When a team defense goes on the draft broadcast, the two defenders standing in for it now get their names side by side on one line, each one sitting in front of the man it belongs to. The names used to stack in a single plate in the bottom corner, which told the room the order they were listed in and nothing about which face was which — so the guy on the left and the guy on the right were a coin flip. Each name now rides its own chip under its own head, at every screen size, and if one headshot fails to load the survivor and his name slide to the middle together. Both rails at the bottom of the draft broadcast board got reordered, and one of them got faces. Up next now leads each row with the franchise logo instead of trailing it, so the three teams warming up stack into one column you can read straight down rather than logos hanging off the end of names of different lengths. Just off the board picks up the player headshot the rest of the site uses — same circle, same team-colour backdrop behind the head — sitting between the pick number and the name. Once a reveal is over, that rail is the only place the room sees the guy who just went, and four rows of nothing but type read like a receipt instead of a draft board. Team defenses get their NFL logo there, in the dark cut, since a defense has no headshot to show. The Draft Broadcast reveal now shows you where a player comes from before you finish reading it. The line under his name has always said the school or the pro team — "Notre Dame", "JAX" — and now the logo sits right there in front of the words. TheLeague's rookie draft gets college marks, the AFL's board gets NFL helmets, and either way a room ten feet from the TV recognises the shield before it reads the three letters. The marks are the dark-background versions, so the ones that normally disappear on a dark card — Raiders, Steelers, Jets — still show up, and a logo we don't have simply doesn't appear rather than leaving a hole in the line.
Standings — Strength of Division was handing out participation trophies. The "Titles" number on every division panel — 15 for the Northwest, 19 for the Central — was just the number of seasons that division has existed, because a division crowns a winner every single year. It's gone, along with the sortable Titles column that ordered the table exactly like the Seasons column beside it. Divisions now report what their teams actually earned against the rest of the league: playoff berths, the share of franchise-seasons that reached the postseason, and championships with the runner-up finishes beside them. Division titles still show where they mean something — per owner, inside the division, where four owners split them unevenly. The "Together" column on Strength of Division was counting seasons with the same four franchises, which isn't the same as the same four owners — the Southwest was credited with nine shared years for a group that's only been together since 2020. Together now means exactly what it says: seasons this group of owners has played together, restarting when a team changes hands. A new Founded column carries the division's own age, so a young lineup in an old division reads right. The Division Strength rankings read straight down on a phone now. Team logos always drop to their own line under the division name instead of tucking in beside the short names, so every row is the same shape and the records line up in one column. The rows also lead with the division name again — the phone layout had been putting the year range first. The lineup board on Strength of Division now admits any group of owners that stayed together three seasons instead of four, which takes it from 6 rows to 10 in TheLeague and 4 to 10 in the AFL — the Atlantic of 2007-2009 turns out to be the toughest room TheLeague has ever put together, and the AFL North of 2019-2022 went .643 against the rest of the league. The two ranked boards on Strength of Division — Strongest to Weakest and Every Lineup, Ranked — had their headings sitting flush against the paragraph above them instead of clear of it like every other section on the page. They now use the same spacing as the rest.
Owner Pages — Owner cards on the Owners page were wearing decade-old logos. Eight owners — Dangsters, Ninjas, Midwestside, Pigskins, Wabbits, Bring The Pain, Dark Magicians, Fire Ready Aim — now show the logo they actually run today instead of the one they retired years ago. The Owners page now leads with current owners — the "Champions you've never seen" callout moved below the card grid instead of sitting above it. Eighteen owners get a real name instead of a first name, an initial, or nothing at all — and two of them get their history straightened out. Maverick is Mick Travers, the LBer Decleaters’ “BSB” turns out to have been his initials all along — Brian Stanford-Brandt — the Gridiron Geeks are Bob Szelagowski, the Dark Magicians are Dan Le Cam, and Jomar Marinio finally gets a surname on the Computer Jocks in both leagues. On the AFL side: Nigel Dunnington (Titsburgh Feelers), Chuck Carper (M.L. Maniacs), Marnel Mangrubang, Boun Lovan, Jeffrey Tefertiller (ISIS), Justin “Pec” Collier (Cougs), Rafael Araiza — the Badd Boys’ “Ralfie” — plus originals who had no name at all — Andrew Wagner (2004 C.P. Bruisers), Pete Sisich (2003 Lucky Buck$), and, exactly as their team names always suggested, Trevor of Trevors Team and Joey of Joey’s Team. Bryan Sandes had been filed as two different strangers: Taco Hell 2004-06 and the Fly Fishermen in 2007 were the same man and the same franchise, so his four seasons now sit on one page. The Carolina Blues went the other way — they are Chris Broskey, not Coinflip, so the Angry Irish’s 2012 season moves back to a page of its own.
Message