Weekly Fixes & Polish (Aug 18-24)
27 bug fixes and style improvements across navigation & routing, calendar, franchise pages, live scoring, and more.
The Full Story
This week's 27 bug fixes and polish improvements touched the following areas of the site:
Navigation & Routing — An owner spotted the AFL sneaking onto The League's Stats & Reports page. The League History shelf was carrying two cards that belong to the other league — Record Book and AFL Owners — and clicking either one went nowhere, because the link was built by gluing The League's address onto an AFL one. The shelf now lists only The League's own history pages: Franchises, Rivalries and Owners.
Calendar — Doubleheaders were being pushed too early in the season. The maths that splits them between the start and the end subtracted the fixed Week 1 game before halving, which quietly shrank the late half — four past seasons ended up with doubleheaders stacked in Weeks 1 to 3 while bye-free weeks at the end of the season went unused. The schedule builder could not cope with a season of a different length or a different division structure — it assumed 14 weeks and today’s divisions and gave up outright on anything else. Replaying the last fifteen years of NFL bye calendars found ten seasons it could not schedule at all. It now works the shape out from the format instead of assuming it. Schedule Release Day can no longer publish a schedule that missed a goal it could have hit. The lock previously checked only for structural breakage, so a season could leave a bye-free finale unused or decide a division race in September and still go live. Goals that were genuinely unachievable that year are still reported and still publish. The Schedule Builder now says plainly that it is a preview. It runs a shortened search so the page loads in time, while the release job runs a far longer one and produces a different schedule — and the page had been offering a copy-to-clipboard button as though the two were the same. The league calendar had the 2027 NFL Draft on April 22 — a Thursday, the fourth Thursday in April, very nearly the right answer and not the right answer. It's April 29. That matters more than a stray date on a calendar usually would, because our Rookie Draft isn't stored anywhere: it's computed off the NFL's opening night, nine days later, every year. So a draft that was a week early quietly made our draft a week early too — May 1 where it should read May 8 — in What's Next, on the calendar, and in anything Roger would have gotten around to reminding you about. The tell is that April was never the anchor. The NFL Draft tracks the Super Bowl, landing exactly 74 days after it every year since 2022, and the Super Bowl is the second Sunday in February. February 2027 opens on a Monday, which shoves that Sunday out to the 14th — the latest it can ever fall — and drags the draft to the fifth Thursday of April instead of the fourth. Run that against every year from 2022 to 2035 and the shortcut is wrong exactly once, in 2027, which is precisely why it sat there. Both years are now taken from ESPN instead of guessed, the Rookie Draft moves back to Saturday, May 8, and the nightly job that was supposed to catch this sort of thing has been fixed too: it had been failing every night for unrelated reasons, which is a fine way to make sure nobody looks at it the night it's finally right.
Franchise Pages — Midwestside's franchise history had been handing Nate a season he never played. His page opened on 2010 — a 2-16 Witch City Warlocks year that belonged to the owner before him — because the record of when he took over franchise 0010 started a year early. He arrived in 2011, the year the Warlocks became the Midwestside Connection, and 2011 is where his history starts now. The 2-16 goes back to the former owner where it belongs, and his career record loses it too: 95-117 instead of 97-133, with the 2010 Jerry Jones Award off his shelf. The other thing he noticed while he was down there: his first five seasons were wearing the Warlocks' pentagram. The art for that era was a copy of the logo it replaced, so 2011 through 2015 sat under an occult crest that was never his. Those years now wear the gold-ringed Midwestside photo — the same one the team wore right through 2024, because the banner Nate hung in 2011 is the banner still hanging today.
Live Scoring — Live Scoring stopped sliding sideways in a week with no games. Open it before kickoff and the empty "Scores will appear here when games begin" card ran wider than the phone, so the page scrolled horizontally with nothing to scroll to — the card's right edge parked just off screen, and a stray gray-and-blue bar sat along its top looking for all the world like a scrollbar. That bar is the win-probability split every real matchup card wears; with no matchup behind it there was nothing for it to show, so it's gone from the empty state, and the card now measures itself the same way the scoring cards do and fits the screen. The board behind it also stopped overflowing by a hair on the narrowest phones. Open a matchup on your phone and the little "Tracking · updated 37s ago" line — the one that proves the scores are still coming in — sat a full step to the left of the "All matchups" link right above it, hanging off the edge of the card like it had fallen out of the header. The header is one row that wraps on a narrow screen, and the indent had been attached to the back button instead of the row, so the moment the status dropped to its own line it lost the indent with it. The row carries it now, so both lines start at the same place — and on a wide screen the back link finally lines up with the team names below it too. A couple dozen players — D'Andre Swift, Tony Pollard, Cameron Dicker and three other kickers among them — were missing the id that links them to ESPN, so they quietly showed no box-score line on Live Scoring and went uncredited on their own touchdowns. All of them resolve now, and a test keeps it that way. On a phone, the two sides of a Live Scoring matchup never quite agreed on where a player's points sat — a name that wrapped onto a second line pushed its score down a hair, a name that didn't left it where it was, and the two columns read as slightly out of step all the way down. Worse on a narrow phone, where a name like Mike Washington Jr. needs three lines and drops that score a full line below his opponent's. Both sides of a matchup now share their rows outright, so a longer name, a wrapping box-score line, or a red-zone flag grows the row for both players at once and the numbers stay level. The box-score detail also moved below the score line rather than above it, which is where you'd look for it. Open the Bench on a Live Scoring matchup and the only thing telling you whose bench you were reading — the team name over each column — was the smallest text on the screen, a muted little label losing a shouting match with sixteen player names set larger than it was. The crest beside it was 16 pixels, roughly the size of the helmet logos tucked next to each player's game time. Both now read as a header: the team name in the display face at the same size as the players underneath it, over a 32-pixel crest you can identify at arm's length. Same two columns, same order, but you can tell at a glance which one is yours.
Import Rankings — The My Rank panel — the one where you set how much each ranking source counts — was taller than a phone screen, and it was anchored to the bottom, so everything it couldn't fit got pushed off the TOP. The title went first, then the X. An owner with nine sources loaded opened it, found the rows running past the edge with no way to scroll them back, and couldn't close the thing either. It now measures itself against the part of the screen you can actually see rather than the taller one your browser reports when its address bar is hidden, so the header and the Done button stay put and the list of sources scrolls between them. The Actions column on Import Rankings had drifted out of line with its own header, and the Average Rank row trailed a stray horizontal rule off to one side. Both are back in the grid where they belong.
Rosters — Player news in the player pop-up had no expiration date. Open a quiet backup and ESPN would happily hand back three stories from a season and a half ago — a training-camp battle he lost in 2024, presented with the same confidence as this morning's injury report. News now ages out: one month during the season, when a three-week-old note is already two depth charts behind, and three months in the offseason, when a June signing really is the freshest true thing about a player. And when there's genuinely nothing to show, the section stops holding open a tall empty box under the heading — it collapses to a single line telling you nothing turned up in the last 30 (or 90) days, so you know the search happened and came back empty instead of wondering whether it ran at all. Washington players had been quietly missing from their own games on Set Lineup. Every other roster spot told you who its player was up against that week; a Commanders player told you nothing — no opponent, no defensive matchup ranking — as if the week had forgotten him. Two halves of the app had been spelling the team differently, WAS on one side and WSH on the other, and a lookup that has to match exactly never did. They speak the same way now, and Washington's players get their week back like everybody else. Every row on Set Lineup tells you the game that player is walking into, and every one of them had the opponent's helmet parked out front with the words trailing behind it in a gray faint enough to read like a disclaimer — you had to lean in to tell a home game from a road game. The crest now sits inside the phrase, right after the vs or the @ where the team's name belongs, and the whole thing is in full-strength text like the rest of the row. Your starters and your bench also spell the opponent out now instead of leaving you to identify a 16-pixel logo on your phone: "vs LAC" beats a squint. Starters, bench, and the list of eligible replacements all read the same way, which they did not before. Throwback Week wasn't throwing all the way back on the Set Lineup screen. Week 4 correctly gave both teams their old names and their old colors, then painted the modern logo behind the players anyway — so the Pigskins, whose throwback name is just 'Pacific Pigskins' again, showed no sign of throwing back at all. The crest was the one piece of the old identity nobody had wired up: the overlay swapped the team's icon, but that banner reads a different field, and that field kept pointing at today's mark. It now wears the era's own logo, and each team's 2013-or-whenever crest sits behind its player like it was supposed to. The matchup banner on Set Lineup was showing you the same two faces every week, and both of them were quarterbacks. It picked whoever projected highest, and since a starting QB projects ten points clear of anyone else on a roster, the tight end who is the best tight end in football never once got the panel. It now casts by rank within position, weighed against how many the league actually has to start — we start one quarterback and four backs and receivers, so QB12 is a guy you'd bench where WR12 is a stud, and the panel finally knows the difference. The line under the name says which — WR1 · CIN · 18.0 PROJ — so you can see why that face is up there. Thirteen of sixteen teams get a new headliner out of it, and a genuinely elite quarterback still gets his panel. The two headshots also moved out to the far edges of the banner instead of standing in the middle of it, which finally lets your franchise crest read behind them instead of being a rumor. Set Lineup had two ways of losing your lineup on a future week, and an owner caught both in the same sitting: week 12 came up with nine empty slots and week 14 came up with nine players named 'Player 13592'. The names were the easy half — every page view re-asked MFL for the whole player file, and when that call got throttled the page had nothing left to print but the ID, even though the same names are sitting in a feed on our own disk. The empty week was the same throttling hitting the roster call instead. But the real find was underneath: the page asked MFL for your saved lineup with a request MFL has never accepted — myStarters is an import, not an export — and the error was swallowed, so it silently fell back to filling the slots with whoever projects best. That means it has never once shown you a lineup you submitted. It does now, for any week, and when there's genuinely nothing on file for that week it says so instead of dressing up a projection as your lineup. At one specific browser width — right at the tablet breakpoint — the GM/Coach switch on the roster page was sliced in half by the top edge of the card it sits in. It stays inside the card at every width now. The franchise crest on a player modal's header was sitting directly behind the headshot, which left you looking at its edges. It is now about twice the size and offset to the left, so it tucks behind the player with most of the logo showing. Every team's player-modal header now takes its colour from the team's actual brand rather than from the colour used on charts, which is picked to stand out on a graph and isn't always a colour the team wears — Vitside were opening in a pink that appears nowhere in their kit. Most bands shift, and three lead with a deliberate choice: Midwestside black with gold trim, Vitside black with red, the Gridiron Geeks blue with orange. The crest sits a little smaller too.
Rankings — Projected Free Agents was ignoring your rankings board. The report had its own private idea of which ranking columns to draw — the first eight it could find — so it showed an Average column nobody asked for and every source you had deliberately unticked in the My Rank editor, eight columns of it running off the right edge of the screen. Free Agents has honored your board for months; this page never got the message. It now uses the same rule: My Rank plus the sources actually feeding it, nothing you turned off, and the table fits on the screen again. On a phone the ranking headers hide along with their numbers instead of hanging around over the wrong columns. The ranking columns on Free Agents finally look like they belong to the same table as everything else. Their headers are built on the fly once your board loads, and they had been missing the styling every other header gets — so "My Rank" and "FBG ®" came in oversized, mixed-case, and folded onto two lines on a phone while AGE, EXP and DRAFT sat neatly on one. They now read small, uppercase and gray like their neighbors, right-aligned over their numbers, and each title stays on a single line no matter how narrow the screen gets. Same fix in TheLeague and the AFL.
Other — The Computer Jocks finally have a real night look. Their crest was surviving dark mode on a generated green outline — a ring the site draws around any logo too dark to read on a dark card, which keeps a logo findable but is a floor, not a design. Somebody sat down and drew the thing properly instead: the lifter and the CPU wordmark redrawn to glow on black, ring baked into the artwork. It's the same file in both leagues, so the defending champs look identical whether you're reading TheLeague or the AFL, and the borrowed outline is gone from both. The GroupMe avatar got the matching cut while we were in there.
Design System & Theming — Hover a day on the Owner Activity chart in dark mode and the readout came up white text on a near-white box — legible only if you already knew what it said. The chart's tooltip was pinned to the darkest gray in the palette, and that palette flips in dark mode, so the "almost black" it asked for resolved to almost white while the text stayed white. It's now the same raised card surface the rest of the site uses, which fixes a quieter problem in light mode at the same time: the team dots in that readout are tuned to stand out against a card, so on the old dark chip the darker-jerseyed teams were dots you couldn't see.
Message