- Commissioners can set minimums for Wager Wars, and can make every Game of the Week, every playoff game and the Super Bowl a Wager War automatically.
- GIFs are back for real: tap GIF in any chat to search and send. Photos and videos now go straight into chat — how long your videos can be depends on your league's plan.
- Chat is now a full command center: every game gets its own channel to set the time, Trade Talk has the trade block built in, and you can rob, hustle, bet, poll, check stats and more right from the chat box — with replies, reactions, photos and live game cards.
- Rob is on the website and the app, playing by your league's own rules. Discord and the app now share one set of hustle cooldowns, so every run counts the same wherever you make it.
- Commissioners can give each store item its own limits — which ratings it can raise, how many points, and how high — and the site holds every request to them. The item's card says what it allows.
- Live betting only switches on for a stream that's really this league's game: if your league has an acronym, the stream title has to carry it. A commissioner taking a game off live now stays off.
- Commissioners can choose which bot sections show up in their Discord, and each server now only sees the commands for its own game.
- The Discord bot can now look up stats and MLB The Show / UFC 6 ratings.
- Every Madden league's store now sells team crests — any team's, so you can wear your favourite even if it isn't in your league. The tier you can buy follows your prestige. Crests you earn are still yours as before.
- Reports, votes and the Arcade are harder to game.
- Every commissioner action is now on a staff log your whole staff can see. Commissioners can change the export link, and you can sign out of every device at once.
- Commissioners and co-commissioners can no longer approve their own trades, upgrades, loans or bet voids. The lead commissioner can, and it's recorded.
- Tighter rules on bets, box scores, upgrades and trades — bets close when a final is in, upgrade points and items can't be spent twice, and results can't be changed without the commissioner.
- UFC 6 ratings load again after EA moved its ratings pages.
- Chat is now one tab. It opens right into your league's channels — tap a channel along the top to switch, or open the full list for every league, your DMs and the Network.
- On 2K progression, your league's upgrade rules now sit right above Send to the desk, so you know the limits before you ask.
- In 2K leagues, the upgrade desk now shows each rating's real current number and the number to set in the 2K menu. It used to show 0.
- The desk speaks 2K in 2K leagues: "✓ Done in 2K", with no mention of Madden or exports.
- Height now counts in player value — taller corners are worth more in Madden leagues, and every 2K player is valued against his position's height. Commissioners can tune both.
- Bets on simmed and forfeited games now push: you get your stake back. That covers the Book, the 2K book, Wager Wars and the Exchange's game markets.
- A parlay with a leg on a simmed game pays on the rest of its legs, the same as any other push.
- Book results wait for the commish to confirm each game before paying out. Until then your ticket says "Waiting for the result to be confirmed" and the latest time it will settle.
- A game settles once the commish rules it, or once the league advances. Otherwise it settles 7 days after the final (24 hours in 2K). The commish can also hit "Settle now" or "Clear bets".
- Once a game's bets have paid out, a later ruling doesn't change them.
- Share player cards in league chat: type # and a couple of letters, or hit Discuss on any player.
- A card always shows the player's ratings as they are right now. Tap it to open his page.
- You can send cards in direct messages too, when you're both in that player's league.
- The room tabs in the chat window no longer get covered when a room is busy.
- Messages from your commissioner, or from someone who has left, show their name instead of "someone".
- Buttons and controls now wear your league's colours: buttons, the chat bubble, progress bars, the tour's buttons and, in the app, the slide-to-confirm knob and your team's markers.
- On a light league colour like gold, button text turns dark so it stays easy to read.
- Leagues that never changed their colours look exactly the same as before.
- MLB The Show 26 and UFC 6 ratings are on the site, updated automatically.
- Browse every MLB team's roster by OVR or position, with each player's full ratings, or UFC 6 fighters by weight class with their attributes and perks.
- Search both games from one box. Find it next to People, on the site and in the app.
- Players and fighters show their faces where the publisher has one. EA has photos for some UFC 6 fighters only; the rest show initials until EA adds theirs.
- The Network now has chat rooms everyone can talk in: General, Madden, NBA 2K, MLB The Show, UFC, GTA and Looking for a League. In the app they're at the top of the Chats tab.
- @ someone in a room and they get a notification. Long-press (or tap Report) to report a message or block someone.
- Find is a new place to look for a league or for players. Commissioners can list their league with a short pitch. Players can post a card with their game, console, time zone and the nights they can play.
- Request to join from a league's card, or get a message from a commissioner about yours.
- All of this shows once the Network is launched.
- In the app, the bottom bar now has a Chats tab where the Wire used to be. Every league you're in is there with its rooms, and your direct messages are under them.
- Each room and conversation shows how many messages you haven't read, plus the latest message and when it was sent. The tab itself shows your total.
- If someone @'d you, that room moves to the top of its league with an @ beside it.
- The Wire is still one tap away: open it from the wire tile on Home.
- On the website, the same list is at Chats in the menu.
- The game mark beside your league's name is now that game's own ring, so you can tell a Madden league from a 2K league at a glance, whatever colours the league uses.
- Put a nameplate behind your name, up to three emblems beside it and a ring around your picture. They show on your profile, in Find people and on the Ladder, on the site and in the app.
- Each game's flair unlocks when you play in a league of that game, and some flair is open to everyone. Relics come with a title. Anything you haven't unlocked yet still shows, with what unlocks it.
- Pick yours under Collectibles → Flair.
- Your league's banner and its wallpaper are now two separate pictures. The banner sits at the top of your league's home; the wallpaper sits faintly behind every page. Set each one in Admin → Your league's look, where each has its own preview of how it will really look.
- The banner now shows whole on your league's home, every edge of it, with your crest, name and motto in a row underneath instead of on top of it. Every other page keeps the slim strip.
- In the app, the banner shows whole at the top of your league's home, and you can upload a banner from your phone. The app keeps its screens clear of the wallpaper on purpose.
- If your banner was already showing your wallpaper, that picture carries over as your banner, so nothing disappears.
- Banners are 1600 by 600. Wallpapers are best at 1920 by 1080.
- The league name in the top bar now carries its sport: 🏈 Madden or 🏀 2K, in the sport's own colour, whatever colours the league has chosen. The switch list marks every league the same way, so you can't wander into the wrong one without noticing.
- A 2K league's menu leads with The Court; a Madden league's with My HQ. The 2K bar wears a thin hardwood line along the top.
- In the app, the sport mark sits beside the league's name on every tab, and a 2K league's quick-access buttons are its own: the court, the badge book and progression, instead of a fantasy draft room it never had.
- Open a league in the app and the app recolours to it: the tabs, the buttons, the cards, the header, the lens on the tab bar, every tint and hairline. A forest league is green on your phone, a crimson league is red, and the sapphire comes back the moment you're out of a league. No more clicking around the wrong league without noticing.
- The league's crest sits in the bar on every tab, with its motto under the name.
- The background tone and the corner shape the commissioner chose follow too. Typefaces stay the app's own for now.
- When a commissioner changes the look from the app, their phone wears it at once; everyone else's does on their next open.
- Your league's look now goes much further than two colours. Under Admin → Your league's look you can set the background tone (navy, black, charcoal, a dark cast of your own primary, or any dark colour you pick), the glow in the corner, whether surfaces are glass, flat or outlined, one of eight type sets for headings and body, sharp, rounded or soft corners, and a motto.
- Every colour on the site follows your primary now — the hairlines, the tints, the glow, the plates, the selection highlight — not just the buttons. A crimson league is crimson all the way down.
- Upload a wallpaper: a wide picture that is cropped to 1600 by 600, checked the same way a crest is, and shown in a banner under the bar, faintly behind every page, or both.
- Two ways for the league to introduce itself on every page: an identity strip under the bar with your crest, name, motto and sport, or a full banner over your wallpaper. Either one makes it obvious which league you are in.
- Nothing you type ever becomes a stylesheet. Every layer is a choice from a list, a validated colour, or plain text, and the site works the rest out, so no league can break a page for anyone.
- The site owner's crest desk now reviews wallpapers too, and says which is which.
- The app's "Your league's look" room has every layer, the wallpaper upload and the motto. The app wearing the look itself is the next build.
- A 2K league can switch on a progression system where upgrades are earned by games played. Every 6 games a team earns 5 attribute points and 5 badge points; every 10 games it earns a roll of two 20-sided dice on a twenty-package table (a Speed pack, a Slasher pack, a Hall of Fame badge, an extra roll, and so on). Simmed and forfeited games do not count.
- The site rolls the dice. The result is written before anyone sees it, so there is nothing to argue about. Each die's package goes on a player of your choice, split between at most two players, and lands on the commissioner's upgrade desk like any other request. Points you spend are held until the desk decides, and come back if a request is declined or cancelled.
- The rules are a preset, not a law: the commissioner can change every number — how often points and rolls come, which players are eligible (90 overall and under by default, the champion's team excepted), the +5 step, three upgrades a player a season, the three-point caps by position, the speed/speed-with-ball/agility caps by position and height, what each badge tier costs, the gold and Hall of Fame budget per season, the age-reset tiers, and all twenty packages. One button goes back to the preset.
- Badge requests are checked against the 2K27 badge book: a tier his ratings do not unlock is refused and told exactly which rating is short, so nobody spends points on a badge the game will not honour.
- Age resets open by games played: at 25 games a team can reset players up to 85 overall, at 50 any player, once per player. The commissioner sets the tiers.
- Both pages are native rooms in the app: 2K progression under My franchise, and 2K progression rules under Running it. The rules page is also on the 2K set-up checklist and the home court has a Progression chip once it is on.
- Players who have left the league file (retired, deleted, or dropped by a bad export) kept their stats but lost their names, so leaderboards, the MVP race, the record book, awards and the weekly show printed "Unknown" or "?" over real performances. The league now remembers every player it has ever seen leave, and names him everywhere his numbers appear. Leagues already running get their lost names back from the export archive within a few minutes of this update.
- The Record Watch tiles read names off the stat rows, which Madden only sometimes fills in. They read the roster now.
- The transactions page showed "sends ?" on older approved trades. It rebuilds the two sides from the offer on file, and says "not recorded" when there is nothing to rebuild from.
- A team that has lost every game no longer reads "the last win was Week 0".
- The team ratings page no longer prints "None%" when a figure is missing.
- In the app, the stats room marks ranks with # so they are not mistaken for scores, shows points for and against as numbers, and colours the top and bottom quarter of your league rather than assuming 32 teams.
- The app's Find a league screen has a Directory tab with every league on the site, searchable by platform. It had no way in before. Me tab has a row for it too.
- A pick you were given in an approved trade no longer vanishes from the trade block the moment you list it.
- The app's crew hosting card, the bot-setup note and the fantasy home header were reading fields the app never received. They work now.
- Stability: the visit bookkeeping on every page view now runs behind the response with a one-second wait instead of up to fifteen seconds on the request path, so a slow disk makes the site sluggish instead of freezing every page at once. The app's crash reporter is app-only and rate-limited. The backup restore script closes its handles before replacing the live file.
- Housekeeping from the last few builds: Conduct and Fantasy trades have homes in the menus and their own walkthroughs, as do Set your availability and the Hit List; five pages that still used the browser's own confirm box use the site's; a dormant book table is included in a league reset.
- In the app, tap your picture on the Me tab (it has a pencil now), or "Change crest & frame" under your stats. It opens straight to your crests and frames, where you can pick any one you've earned.
- If a slot is empty, it now says how to earn it: the crest comes with your Madden franchise, and the frame unlocks at Prestige 1.
- New game: Battleship, played live. Both of you play at the same time on an 8x8 board with four ships. A hit shoots again, and each shot has a 20-second clock, so a game takes a few minutes.
- Coordinator Clash is live by default now, with 30 seconds per call. You can still pick "at your pace" for the old one-call-a-day game.
- In both games, if your clock runs out a move is made for you. Run it out three times in a row and you forfeit.
- Live challenges stay open for 15 minutes and show as LIVE NOW in the Arcade. The game starts the moment your opponent accepts.
- Managers can trade players for players, the same number each way. Once the other manager accepts, the league has 24 hours to review it.
- Any manager not in the deal can vote to veto. If half of them do, the trade is off. Otherwise it goes through when the review ends.
- A player who has already played this week can't change teams until the week is final. That trade waits, then goes through.
- Waivers can now run on FAAB, set from the fantasy admin page. Every manager gets a budget for the season (100 by default, its own money, not your cash), every claim carries a blind bid, and the highest bid wins. A tie goes to the waiver order.
- Waivers now run by themselves when a fantasy week goes final.
- Any member can back either side of this week's fantasy matchups in play money. The odds come from each side's live chance to win and are locked when you bet.
- Betting on a matchup closes once a starter in it has played.
- Managers can't bet on their own matchup. Instead, a manager can challenge his opponent for a stake. If the opponent matches it, the winner takes both. A tie hands both stakes back, and a challenge nobody matches is refunded.
- Everything pays when the week is final.
- When every matchup in a fantasy week is final, the league gets that week's awards in Discord and on the fantasy page.
- The awards are top scorer, biggest blowout, closest call, best bench (the most points left sitting), should've started (a benched player who outscored the starter in his spot) and the basement (the week's lowest score).
- The top scorer is paid $250,000 in play money. The commissioner can change that on the fantasy admin page, or set it to 0 to turn the prize off.
- Each matchup this week shows each side's chance to win. It counts the points already scored, plus what each starter who hasn't played yet usually scores.
- A feed under each matchup lists every starter's points as exports land, with what he did, for example "Jonathan Taylor · 112 rush yds, 2 TD +24.2".
- When the lead changes hands, both managers get a push. Turn it off under Settings → notifications.
- A fantasy season set up on the site now works even if your league never ran fantasy in Discord.
- While a season is signing up or drafting, the fantasy page counts the managers signed up for it, and the matchups page explains that fixtures come after the draft.
- If a planned season starts in a week that's already been played, the fantasy admin page says so and offers the weeks that still fit. One tap saves them.
- The draft room's position count now includes team defenses.
- Any ticket with 3 to 6 legs can be played as Flex, on the site, in the app and in Discord.
- Flex still pays if you miss one leg, or up to two on a 5- or 6-leg ticket. The top prize is smaller than the same legs as a parlay.
- Flex is priced from each leg's own odds, and over time it pays the same as the parlay would. You trade some of the top payout for getting paid with a miss.
- The slip shows what each result pays before you lock it, for example "3/3 $27,690 · 2/3 $15,380". Your ticket shows it too.
- A push or DNP that leaves a Flex ticket with fewer than 3 legs pays it as a parlay of what's left.
- A player only drops off the injury report when Madden shows his injury not counting down at all for two or more weeks. If the weeks-out number drops even once, he stays listed as injured.
- Every league's injury history was re-read again with this rule.
- League staff can give a strike with a reason, or suspend an owner for a set number of weeks. Both are posted to the league's Discord with the member tagged.
- A suspension ends by itself once the league has advanced that many weeks. Staff can lift one early or remove a strike.
- Every league has a Conduct page: who's suspended and for how long, strikes this season, and the league's rules. A suspended owner's team page says so too.
- Grief rules: the commissioner sets the numbers, such as winning a head-to-head game by 35+, scoring 56+, or one player passing for 500+ or rushing for 300+ yards. Each played game is checked. The first crossing in a season is a warning, the next ones are strikes, and every 3 strikes is a 1-week suspension. All of these numbers can be changed or switched off.
- Rules start from the week they're switched on, so nobody gets a strike for a game played before the rule existed. Simmed and forfeited games never count.
- When someone takes a team while suspended in another league on SapphireSportz, or with strikes there, the league's staff get a private heads-up.
- The check that clears players who aren't really hurt now counts the weeks the league has actually played, including across the move into a new season. Before, a new season could put some of those players back on the injury report for two weeks.
- Every league's injury history was re-read with the new count, so the report is right today.
- Madden sometimes keeps a player listed as injured long after he's back on the field. The report shows the same "out 1 week" week after week, even while he plays every game.
- A real injury counts down every week the league advances. The site now spots injuries that stop counting down and shows those players as healthy on every page: the injury report, player pages, the trade block, trade values and lineups.
- A new or longer injury always shows up right away.
- Players corrected this way are listed under Corrected on the injury report. Staff can press Put back if one really is hurt, and the site won't clear that injury again.
- Sapphire Sportez and Rubin Stone still host every episode. Their lines now play as captions along the bottom of each card instead of as spoken voices.
- The Voice it button and the "staff may voice" setting are gone from the show desk on the site and in the app.
- The background jobs that run every 15 minutes now save as they go, one step at a time. Earlier today the site went down because one of these jobs held up everyone else's saves; this change stops that from happening again.
- If anything ever holds up the database again, the site logs exactly which part did it, so it gets fixed the same day.
- A new update only goes live once it has started up properly. If one fails to start, the version you were already using keeps running.
- The availability grid now has one tile per hour, noon to 1 AM Central, instead of Afternoon, Evening and Late. Tap every hour you could start a game; 12 AM and 1 AM count as late that night. Your opponent sees exactly which hours you both have.
- Times you saved under the old Afternoon, Evening and Late tiles no longer count, so set this week's times again.
- Kickoff examples now read Central time.
- The commissioner's prop builder lists every rostered player. Before, it only listed the top players by overall, so rookies and depth players never showed up when you typed their names. The app part needs the latest app update.
- Fixed a slowdown that stopped the site and the app from opening. The weekly show was doing too much work in the background each time the bot checked in, and that tied up the database.
- A league name like "pfl2k27" is now read out as "PFL 2K27" instead of letter by letter. Names with spaces are read exactly as written.
- The Week in Review now has a card for every game of the week, not just games with clips. It is the recap of every game, so there are no separate recap videos for single games any more. A game's page now has a button that opens its week's show.
- Playoff weeks are part of the same show. After the season, the off-season, free agency and the draft are episodes of the same show too. Pick any episode from the list at the top of the show.
- Sapphire Sportez and Rubin Stone are now voice only: you hear them and read their lines along the bottom of each card. Rubin has a new, deeper voice.
- The video file of the week's show now includes the hosts' voices and their captions. Once the league advances, the site makes the week's video on its own and posts it to Discord. If voices are on for the league, they're added before the video is made.
- The Week in Review has two hosts. Sapphire runs the show and Rubin breaks it down. The show opens with their intro and theme, they talk over every card (the scoreboard, the storylines, the games, players of the week, the playoff picture), and they sign off at the end.
- A week with no clips is still a full episode. The hosts cover the week from the results.
- Commissioners can paste a Twitch clip link straight onto the week's show and write what happens in it. The hosts talk it up before it rolls, using your words. That's the only thing they know about the clip. File it to a game and it plays in that game's card; leave it on its own and it gets a card called The Tape.
- Everything the hosts say comes from the week's results or from what staff wrote. Staff can rewrite any line on Edit the show.
- Their lines show as captions under the card. Once voices are switched on for a league, the hosts read them out loud.
- In the app, the show room has a Watch the show button that plays the whole episode, hosts and clips included, without leaving the app. The app part needs the latest app update.
- Help now has 50 short video lessons, 10 to 30 seconds each: finding your league, signing in, claiming your team, setting when you can play, upgrades and mentorship, the store, the Book, futures, Discord commands and more.
- Tap a lesson and it plays right there, with the steps written out underneath. The Help search finds videos as well as written answers.
- In the app, the videos are at the top of Help and play inside the app. The app part needs the latest app update.
- The Exchange, My Team, the league home and the Book load noticeably faster. The work behind them is no longer redone on every visit, and game recaps for Discord are no longer rebuilt every two minutes.
- My Team sends about 400 KB less to your phone.
- The site no longer slows down for a few minutes after every update.
- On the Book, staff messages for Who bet it, Edit and Void now show right under the line instead of in a pop-up.
- The Super Bowl market now lists every team in the league, not just the top 20 or so. You can back any team to win it, whatever the odds. The cheapest a share can be is now half a cent, so the longest shots pay up to 200 times.
- Futures prices follow the stats every week, even once people have bet. When a new week is played, each team's price moves with how it actually played. Your position is never touched: the shares you hold stay yours, and only the price moves.
- New markets: who wins each division, and who wins each conference. Division markets settle off the final standings when the regular season ends, and conference markets settle off the conference championship games. They are all on the Exchange under Futures.
- Coach of the Year lists every team too.
- The Book page no longer puts your tickets above the lines. There's one "My tickets" link at the top, and the tickets are on their own page.
- League staff can now pull a line that shouldn't have been posted. Voiding a line closes it for everyone: straight bets on it get the stake back, and parlays pay on their other legs. Members see it marked as pulled by league staff.
- Staff can change the number on a line while nobody has bet it. Once someone has, the line is locked, so void it and post a new one.
- Staff can see who has bet any single line and which side they took.
- Games with a CPU team in them are off the book by default, so nobody bets a sure thing. Commissioners can turn this off with the switch in the book's tools.
- The app's home screen now has Teams, Players, Upgrades and Props in one row, then Fantasy, League TV, The Network, Futures and the Arcade as live cards. "All of SapphireSportz" opens one searchable list of every page. The app side of this needs the app update.
- League staff can see every ticket this season with whose it is: open ones first, filterable by week and by member, with what's down and what it would win. It's under the Book's commish tools in the app and on the website.
- Staff can void any single bet. The member gets the whole stake back with no cancel fee, and if the bet already paid out, the payout comes back. The member sees "Voided by league staff" and the reason on the ticket. A voided bet drops out of the betting split.
- The app's money leaderboard can be sorted by cash on hand or by bank as well as net worth, so you can see who actually has cash.
- Build 549 made dragging the bet slip close the keyboard, and the way that was wired in crashed the Book on open. It's fixed, and dragging the slip still closes the keyboard.
- The app's sync screen shows the site's two logs. "What actually arrived" lists every export the site received and whether anything landed from it. "What EA said" lists every EA Direct Connect step. When EA Direct Connect isn't switched on, the screen names the server settings that are missing.
- Member tags show how many days each has left and the note behind it.
- Owner tools: Referrals is in the owner menu, and leagues can be attached to a referral by hand. The bot feed explains how to tell when a looping bot is fixed. Money shows the legacy one-year price.
- **2K calendar.** A league with a fixture list shows its progress bar, and today's games appear at the top.
- **2K league home.** Standings and The Rec now have buttons on the home screen.
- **2K book.** If you're signed out, the empty ticket list says how much you get to play with once you sign in.
- **Rec.** The solo membership and crew hosting panels turn amber in the grace period, and the solo panel says what the membership covers. Rec ratings are numbered.
- **Hall of Fame.** Open ballots show each nominee's position, team and stat line, plus the ballot's season. When no vote is open, the app lists the honours your league runs.
- **Past seasons.** Standings show the division, Power shows wins, Advanced shows times sacked and Coaches shows point differential, with the site's explanations. A game or player with nothing filed now says so instead of showing a blank page.
- **Compare.** Each player card shows his team and how many contract years he has left.
- **My tickets.** The heading shows how many tickets are open, what's down and what they win. Graded lines include the site's read on that line.
- **Collectibles.** "Automatic" now says which tier it's using.
- **Offseason.** A 2K league no longer sees free-agency buttons it has no use for.
- **Gameplan.** The app shows "Built for vs actually does": what the opponent's defense is built to stop, what it has actually stopped, and a warning when the two don't match. It also shows who they feed, meaning each player's share of the team's carries, catches and receiving yards.
- **People.** Commissioners can offer a team to anyone open to offers, choosing which of their leagues it's for. You can also filter by game.
- **Card trades.** You can send a gift (give cards, ask for nothing) or a request (ask, give nothing), and notes can run to 300 characters like on the site.
- **Roll call.** Marking yourself away takes a reason, private unless you choose to share it, and a return date. While you're away, the app shows exactly what the league sees. Staff can post the advance board to Discord from the app.
- **Fantasy draft.** Commissioners can set the draft order by hand and set any player's tier. Re-ranking every player from last season now asks first, because it overwrites tiers set by hand.
- **GOAT League.** A commissioner override now includes the "Why him?" line the whole platform reads.
- **League TV.** You can type any Twitch channel name and watch it in the app.
- **Ratings.** Offense, Defense, pass and rush yards always showed "—" in the app; they now show. Line play (sacks allowed and earned per dropback) appears for the first time. The app also has the site's other views: adjusted yards, finishing, luck, turnover differential and schedule strength, each with the site's explanation.
- **The daily wheel.** Your spins and the league's recent spins were blank; they now list who won what. The wheel says that nothing is staked and that the odds shown are the real ones.
- **The draft class.** Scouting notes no longer read "undefined", and the combine shows a score and its label instead of garbled text. Notes the commissioner hasn't released show as 🔒 Classified.
- **Records.** Season labels were one off (the second season showed as S1); they now match the site. Season marks show how many games they took.
- **The record book.** Record holders show by name instead of "?", and each record has a readable title. The fantasy bracket shows the field, the round, the seeds still alive and the champion. Keepers are listed by manager, with ones already applied marked "locked in".
- **The Arcade.**
- QB career leaderboards show XP and level instead of "—", and Most Wins shows what was won.
- Non-members see "Members only" instead of a challenge form that fails when sent.
- Results show the score, empty sections say so, and opponents show with their team.
- The Watch screen has a playback log (the list button, top right). It records every address the player tries to open, whether the app allowed it, and which app build and update the phone is running. It stays on the phone until you tap Share. Addresses are kept without their query strings.
- The player is held to tighter rules. It may load Twitch's player and chat, YouTube's player and chat, and the other supported video players. Anything else a tap tries to open inside it is refused, and refusing never opens another app.
- Live Twitch streams now play through Twitch's own player controls. Under each player you can see whether it is loading, live, paused, offline or waiting for a tap to start, with Retry when one doesn't start.
- Watching several games: every stream starts muted, and 🔊 gives one game the sound and mutes the rest without reloading anything. The screen shows as many players as fit at a size Twitch will play (usually two on a phone held upright). The other games you picked wait as buttons, and tapping one swaps it into the player that has the sound.
- The player page is no longer cached for an hour, so a fix to it reaches phones straight away. Clips, replays, YouTube and the website's nine-stream wall work as before.
- A mistake in build 541 stopped the server part behind the app's ladder, polls and pick'em from loading, so those screens came up empty. It's fixed, and every server file is now checked so a mistake like that can't ship quietly again.
- Scrolling any page in the app now puts the keyboard away, including the trade sheets on the Exchange, so a number pad can never sit on top of the button you need. The 2K book's stake box closes its keyboard when you lock a bet too.
- Typing a stake in the app no longer traps the keyboard over Lock it in. A Done button shows while you type, and tapping a quick stake, Lock it in, or dragging the slip closes the keyboard.
- Your tickets no longer sit above the board on the app's Book. One line shows how many are open, what's down and what they win, and tapping it opens My tickets, where the live ticket and every locked ticket now live.
- Items in your inventory on the app's fantasy squad page show their card art, like the site. Items without art keep their emoji.
- In a league with one ticket per week, locking a new ticket in the app now asks first, the way the site does: it shows the change fee and lets you keep your ticket instead.
- The app's live ticket shows a LIVE tag, how many graded legs have hit, the multiplier under the payout, HIT ✓ and MISS ✗ on each leg with pending legs in amber, and the note about what changing or cancelling it costs.
- Type any stake, or tap 10K, 50K, 250K, 1M or All in.
- Roulette in the app takes every bet the site does: red, black, odd, even, 1–18, 19–36, the three dozens and a straight-up number. Put up to six bets on one spin, each with its own amount, and tap one to take it off.
- Every game shows what it pays. Blackjack shows the dealer's total and leaves a finished hand on screen with the result.
- The hustles count down live with a bar, show NO RISK, RISKY or WILD and the biggest fine, and keep the last result on the card.
- A push shows in grey instead of "−$0". The house rules and the note about Discord settling every play are in the app.
- Prices in the app's Exchange can be read three ways, like the site: Exchange (34¢), Sportsbook (+195) or Decimal (2.94×). The one you pick is shown big with another under it, and the app remembers it.
- Each outcome has its rank, a bar behind it showing its price (gold for the favourite), its subtitle, and an arrow for how far the money has moved it since it opened.
- What you're holding shows the price now, what it would sell for, profit or loss, and what it pays if it hits.
- Award markets explain how they pay. Money lines and props carry the site's notes, and the full rules are at the bottom.
- One market's page has the status, "the line moves on every bet", what your shares pay, and the tape with coins and where each trade left the price. Commissioners see the house's exposure, and Re-price only shows up before anyone has bet.
- The app's player table has the site's presets as one-tap chips (Free agents, Fast LBs hitting free agency, 300lb DTs by block shed, Coverage bust risk, Cap casualties and the rest), each with its one-line reason.
- Saved views work in the app: save the columns, filters and sort you have set under a name, open it again as a ★ chip, or remove it. Views saved on the site show up in the app and the other way round.
- Every row shows the player's face.
- The app's contract board can be filtered to one team and sorted by cap hit, years left or age, like the site. Your own players are marked.
- Draft capital shows each club's chart value (the price the Trade Center puts on its picks), where any extra picks came from, and every club's chest in one ranked list with yours marked.
- Both pages carry the site's notes: contracts live in Madden, and picks traded inside the game don't show here until a commissioner records the deal.
- Fantasy matchups in the app show a bar for how close each game is, a pulsing IN PROGRESS for live games, and how many starters each lineup has. Leagues that schedule on the site are marked "Site schedule".
- Every squad on the Rosters tab now starts open, shows each player's overall, and dims the bench.
- Your squad shows each player's overall and season points.
- Your queued actions use plain words, and a failed one tells you why, the same as on the site.
- Waivers show the priority order with who has the first claim, and say so when no order is set. When you claim someone, your bench is listed first, and starters are labelled with their slot.
- Everyone on the app's Ladder now shows their Discord picture, their franchise crest, their prestige stars and their level, with their total XP on the right. Names of Prestige 2 and up are in gold.
- Under each name: what the XP is made of (real wins, fantasy wins, pick accuracy, posts) and any challenge XP awarded.
- Your own card shows your betting accuracy.
- "How XP works" from the site is now in the app, and the perks list explains that prestiging resets your level.
- The app's economy leaderboard now shows exact dollar amounts instead of rounded ones, so close balances no longer look the same.
- Each member shows their cash and bank, how much they've gained or lost this week, and a bar showing how close they are to the leader.
- Your wallet card shows your rank, your items, and how long ago a bot-kept balance was last synced.
- Market movers have the site's up and down arrows, and the "How to earn" note is at the bottom.
- In your wallet, each money source now shows money in and money out next to the total, and the closing note from the site is at the bottom.
- The app's Most Active Leagues board now ranks by League Pulse or by games played, like the site, and the main number is games played in the last 30 days, with the all-time count beside it.
- The total at the top is now the number of verified games across the board. It was mislabeled as a count of leagues.
- Each league shows whether it's active, how many days it's been quiet, how many weeks it has played and how many members it has. Leagues that sim a lot show the share of games played between members.
- The top three are coloured gold, silver and bronze, and tapping a league opens it.
- The "What counts, and why" explainer from the site is at the bottom.
- In leagues that run attribute points, you can now file a spend request from the app: pick the pool, the number of points, the player and the attribute. It goes to your commissioner, the same as on the site, and the points are held until he rules.
- Each pool shows how many points are held on a pending request.
- Your requests are coloured by where they stand: applied in green, denied in red, pending in gold.
- The points history says which pool each change came from, and the league list shows each member's physical and non-physical points separately.
- A sold-out item in the app's store now says "Sold out" and can't be bought.
- Each item shows how many are left, or "∞ stock" when there's no limit, and how many members own one.
- When an item can't be bought yet, the app gives the real reason: it unlocks after the bot's next update.
- You can move money between cash and the bank right from the store, the same way you can on the site.
- The Live Marketplace from the site shows in the app's store when there are listings.
- In the app, an approved loan that's waiting to be paid out now shows as open instead of under Closed.
- While you have a loan request waiting, the app says so instead of showing the borrow form again, so you can't ask twice by accident. At your limit, it tells you what opens it back up.
- You can borrow on a weekly payment plan, add what the loan is for, and see what it will cost before you ask, worked out the same way as on the site.
- Each loan shows the interest so far, its payment schedule with the next payment due, and every movement on it. You can pay part of a loan or pay it all off.
- Your credit score shows what moved it: repaid loans, early payoffs, bounced payments, overdue and defaulted loans.
- Commissioners can give a reason when they decline a loan, and can write off a loan from the app.
- The app's Franchise HQ now shows what's on your desk and everything that happened since you last checked, ending with "You're caught up."
- This week's gameplan: your opponent's record and SRS, the ratings line, the two strongest reads on them, and a link to the full scouting report.
- Your whole season, with the result of every game played and a scout button on every game still to play.
- The contract ticker: everyone with two years or less, with their cap hit and what cutting them would save. Expiring players are in gold.
- The trade block players that fit your needs, with an Offer button, plus who you have on the block.
- The dev board: your squad on your league's own dev ladder.
- If you don't have a team yet, you can claim an open one right from the app.
- A player's Ratings tab in the app now has the site's OVR progression line across every export, with the key weeks marked.
- The story of why he moved: each change with its cause (XP, an upgrade, the off-season, age, an injury), how much his overall moved, and which attributes went up or down.
- The attribute history grid: every week down, every attribute across, with the cells that went up in green and down in red. It starts on just the attributes that moved; tap to see them all.
- Personality goals, how many upgrades are left on him (or why he can't take one), and the old and new dev trait or rating on each move now show in the app.
- "Discuss" on a player opens Trade Talk with his name already typed. Nothing is sent until you send it.
- On a team's schedule in the app, games that haven't been played open their preview, the same as on the site.
- Kickoff times on a team's schedule show green once they're locked in and amber while they're only proposed.
- Contracts with one year or less left show in amber on the roster.
- Team needs show a bar for how far below league average each position is.
- The teams list shows each franchise's colours along the top of its row, and open teams are marked in orange.
- Every deal in the app now shows what each piece is worth and each side's total, like the site.
- Under each deal: how far apart the two sides are, how much this league allows, and which team it favours.
- The Waiting tab explains how your league decides a deal: by commissioner or by league vote, and how many votes it takes. If your league approves fair deals automatically, it says that too.
- The app has the site's Picks on the move board: who holds whose draft picks.
- Closed deals are coloured by how they ended: declined in red, countered in amber.
- In Madden, trading a player puts the part of his signing bonus that hasn't hit the cap yet on the cap of the team that sends him. The team that gets him takes on his salary, not the bonus. The site now shows that dead cap everywhere a trade is made or talked about.
- When it counts: a trade during the season puts one season's share of the bonus on this season's cap and the rest on next season's. A trade in the off-season puts all of it on the cap at once. Every figure says which.
- The trade center warns you before you send an offer: how much dead cap you'd take on, how much lands this season and how much next season, and what the other team would take. Your cap-space check now counts it too. Same in the app.
- Every offer, agreed deal and approved trade on the Trade Hub shows the dead cap for both teams, on the site and in the app. Discord trade posts show it as well.
- Your team page has a Dead cap from trades panel: what's counting against your cap this season, what starts next season, and the trade each piece came from.
- The figures are Madden's own penalty for each contract. Trades made in the game without going through the site aren't included.
- Approved trades used to show up in Recent moves and Transactions as a blank "? ()" line. They now show as one line for the whole deal, with what each team sent, draft picks included. Tap one in Transactions to see both sides.
- A commissioner's progression now shows the player's name and his rating change instead of a blank line.
- The app's trade block now does everything the site's does. List anyone on your roster with an asking price and a status (Listening, Actively shopping or Must move), list your draft picks, and take either down.
- Your shelf shows each listing's asking price, status and how long it's been up. Draft picks on the block show what they're worth and what the owner wants.
- Tap a player on the block to open his contract, his season stats and the owner's note right there. Build an offer from that card or from Fits your needs.
- An offer on your desk in the app now has a Counter button, like on the site. It opens the trade center with their offer turned around and ready to change, and what you send goes back to them as a counter.
- If something from their offer has been traded or released since, the app says so and leaves it out of the counter.
- "Make an offer" on a player's page, and on the trade block, now opens the trade center with that player already in the deal.
- The app's playoff room has the Playoff Machine from the site. Type a score for any game still to be played and the seeds rearrange to match, with arrows showing who moved in, out, up or down. "Fill in the favourites" plays out the rest of the season the way the odds lean, and Reset clears it.
- The odds in the app now show the whole rooting guide, how much each result is worth to you, and a second guide for the 1 seed. Each guide folds open like on the site.
- The app's odds use the site's colours, and they warn you when some future weeks haven't been exported yet.
- A game's kickoff in the app shows green and "Locked in" once both sides agree, or amber and "Proposed" while it's still waiting.
- The preview shows each team's recent form as green W and red L tiles, like the site.
- The room changes colour the way the site's does: green when someone's on, amber when it's gone quiet. When the other owner puts up a time or answers yours, the app picks it up within 20 seconds without a refresh.
- The recap video box now says when the site is making the video, and the Watch button plays the video itself.
- The matchup on the app's home has a link straight into your gameplan.
- When a league import is running, the app's home shows the same progress bar as the site, then refreshes itself when it finishes.
- The app's injury report uses the site's words: Long-term, Multi-week and Week to week. Weeks out are coloured by how bad it is, and each player shows his face.
- Tap a move in the app's transactions to open it, like on the site. A trade shows what each team received, a signing shows salary, term, bonus and when, and a dev change shows the old and new trait.
- Trades, signings, releases and dev changes each have their own colour again, and you can filter the moves by team.
- The app's power rankings now show the three tiers from the site (Contenders, In the Mix, Rebuilding), each team's full rank grid in green and red, and what SRS means.
- The week chips in the app's Scores tab now use the same names as the site, including the playoff rounds, and the current week is marked in gold.
- Pick a team in Scores to see its whole season week by week, bye weeks included, the same way the site's schedule filter works.
- Kickoff times on the Scores tab show green when they're confirmed and amber when they're only proposed.
- If only a few weeks are on file, the app says so and explains how the commissioner can load the whole season.
- Standings in the app now show point differential, conference record, points for and against, and a ties column when there are ties. Division leaders stand out, and the legend from the site is at the bottom.
- A streak that isn't a win or loss streak shows grey instead of red.
- The app's league home now shows what the site's front page does: the season and week, how many of this week's games are played, and when the next advance is due (or that it's overdue).
- It also shows what's on your desk, this week's show, the game of the week, your last money movements, the stat leaders, the league's About card, and where the GOAT League vote stands.
- New members see the same Start here card as on the site, and hiding it in one place hides it in both.
- This week's games show whether each kickoff is confirmed, proposed or not set yet, plus the same badges the site shows. Last week's finals carry their highlight clips.
- Posts on the home show the same labels the site uses (clip, recap, the wire, booth), with the poster's picture.
- After a game, the "what stood out" tags in the app start from what you already picked, so saving no longer wipes your earlier picks.
- A game spread's line now moves when people bet it. When the money piles onto one side, the line shifts toward that side. Heavy enough money can carry it through zero, so a team that opened +6.5 can end up favored at -3. Bets placed during a live game move it three times as hard, so a team that's winning on stream moves fastest.
- The odds on each side stay fair at whatever the current line is.
- Every ticket keeps the line it took. If you bet a team at +6.5 and the line later moves to -3, your ticket is still graded at +6.5.
- When a spread has moved, the Book shows where it opened, on the site and in the app.
- In Discord, a spread that has moved past zero shows its real sign (no more "--3").
- Trades show when each offer was sent and when it was accepted, declined or approved, on the site and in the app. The trade history shows the day and time each deal went through.
- Transactions show the week and the time the move showed up.
- Loans show when they were asked for, approved or denied, and paid off. The commissioner's desk shows when each request came in.
- Tickets show when they were placed and settled, and every Wager War entry shows when it was made.
- Every time is in your own time zone: "Today 7:42 PM", "Yesterday", the weekday, or the date.
- Your bet slip in the app lists every leg you picked, with its odds, a LIVE tag if its game is being played, and an ✕ to take it off.
- Quick stakes in the app are 10%, 25%, 50% and All of what you can reach (cash plus the bank behind it), like the site, instead of fixed amounts. The slip also shows your cash and bank.
- A week that's still open from earlier has its own chip and takes bets. The app used to wrongly say those lines were closed.
- Player props read MORE and LESS with the line, and show the player's team. The side you picked gets a check and the other side dims; after grading, the losing side fades.
- Money lines read away team first, like the game header. Every game card shows points per game and links to the Exchange money line.
- Your tickets show the total you have down and what they pay, plus when each was placed and settled.
- Wager Wars in the app lists every entry: who, which side, how much, and when.
- My tickets in the app shows how each line finished, in words and color (a push says PUSH), with player photos and how the league bet it.
- Time stamps on the site now show in your own time zone ("Today 7:42 PM", "Yesterday", or the date).
- Fixed: pressing Approve on a loan request in the app declined it instead. Approve and Decline in the app now do what they say. If a loan you approved from the app shows as declined, that's why — the member can ask again.
- In the app, prestiging on the Ladder now asks you first, like the site does, instead of resetting your level on one tap.
- The Book only analyzes the lines that are still on the board. It used to work through every prop of the season, including weeks long since graded, so it got slower every week.
- Your tickets and the league's ticket list now load in one pass, so a busy betting week doesn't slow the Book down.
- In the app, a slow page now waits longer and tries once more before giving up. If it still can't load, it tells you to pull down and try again instead of showing a technical error.
- Fixed: opening the Book in the app could close the app when player props were on the board. The last-five bars for player props weren't reaching the app, and the app crashed trying to draw them. They come through now.
- If one card on the Book ever fails to draw again, it shows "This part couldn't load" and the rest of the page keeps working, instead of the app closing.
- Player props in the app now show the last five games against the line right on the card, the same bar chart the site has, along with how many of the five cleared it.
- Every line in the app shows how the league is betting it: a split bar with the count on each side.
- Tap **The read** on any line to open the full breakdown the site shows. For a player prop that's his season average, last three, over rate, season high, an eight-game chart and the matchup. For a game line it's both teams and what the model projects.
- When a Wager War ends, the result post now lists everyone on the losing side and how much each put in, right under the winners and what they won.
- Fixed: a Wager War only paid out when someone opened the Wager Wars page. It now pays the moment the final comes in, whether from the Companion App export or EA Connect, and it also checks every couple of minutes in case one slips through.
- Fixed: a winner who was in debt could be refused his winnings, which also held up any war settling after his. Winnings are always paid now, and one war that can't settle no longer holds up the rest.
- Fixed: balances on the site didn't show Wager War money until something else changed them. They update as soon as a war takes a stake or pays out.
- Every Wager War update now reaches the whole league: when a challenge is made, when the war goes live and when it ends.
- In Discord, those posts ping the @Member role, so people who have @everyone muted still get it. A server without a Member role gets @everyone, as before.
- In the app, every member gets a notification for each update.
- You're no longer limited to one slip a week. Every time you lock in, you get a new ticket, so you can have a spread ticket, a player prop ticket, a mixed parlay and a handful of straight bets going at once.
- One leg is a straight bet at that line's own odds. Two to six legs make a parlay. The same line can be on more than one ticket.
- Adding a ticket never costs a fee. Each ticket settles on its own when its games are graded.
- Every open ticket shows on the Book and in My tickets, on the site and in the app, with its own **Cancel** button. Cancelling costs the usual fee and leaves your other tickets alone.
- In Discord, **My picks** lists your open tickets with a cancel button for each, and **Clear** only empties picks you haven't locked yet.
- Tickets you locked before this update carry over at the odds you locked them at.
- Every game on the Book now has a money line you can add to a slip, next to its spread and total, on the site and in the app. Tap a team to win and it goes on your slip like any other leg, straight or in a parlay.
- Money line odds come from the same game model as the spread, so the favorite pays less. Each side shows its own price.
- It's graded on who wins. A tie is a push, and that leg drops off the slip.
- The Exchange's money line market is still there, one tap away on each game card.
- New `/wager` command: put money on your game against your opponent this week. Enter an amount, or "all" for the most you can both cover.
- The challenge posts in your game channel and tags your opponent, with **Accept**, **Pass** and **Call it off** buttons. A challenge made on the site or in the app posts there the same way.
- Once it's accepted, the card switches to **Back** buttons for each team, so anyone else can pick a side and put in an amount without leaving Discord. The card updates the pot and the number of backers as people join.
- Either player, or a commissioner, can hit **We're kicking off** to close backing.
- When the final comes in, the result posts in the game channel, tagging everyone who got paid. A tie or a void says everyone was refunded.
- Everything runs through the site, so a war shows the same on the site, in the app and in Discord.
- Fixed: `/loan request` in Discord saved the request inside the bot, where the site and app never saw it, so the commissioner couldn't approve it. Requests now go straight to the league's bank on the site, where they show on the bank page and in the app.
- `/loan request` now lets you pick how you'll pay it back: one payment in 2 weeks, 30 days or 60 days, or 4 or 8 weekly payments. It uses the same credit limits as the site.
- The commissioner's phone gets a notification when a loan request comes in from Discord.
- `/loan approve` and `/loan list` work from the site's bank, so a loan can be approved in Discord, on the site or in the app.
- Any request still stuck in the bot moves to the site automatically.
- The moment a Wager War is accepted, it posts in Discord with an @everyone, in the same channel as the book's posts. The post names both teams and the pot, tags the two owners, and links to Wager Wars so anyone can back a side before kickoff.
- Everyone else in the league also gets a phone notification that the war is live.
- If a league hasn't set a channel for the book, the post still goes out, to the server's main channel.
- After you lock in a slip, the Book clears your picks and stake and reloads onto your locked ticket, on the site and in the app. There's nothing left on screen to tap twice.
- A locked ticket's legs no longer load back into the slip builder, so you can't re-lock the same ticket by accident. Building a new slip on top of a locked one still works, and still asks before charging the change fee.
- In the app, a second tap on Lock while the first is still going does nothing.
- Fixed: a glitch that let a slip be locked twice in a row charged a change fee for the second lock. The member it hit on Sept 29 has been refunded, and the refund shows on their wallet as a glitch refund.
- You can no longer bet on a game your team plays in. That covers the spread, the total, the money line, and player props for anyone in the game, including your opponent's players. It applies on the site, in the app, in Discord and in the 2K book.
- On the Book, your own game's card says YOUR GAME, its buttons are switched off, and it has a button to Wager Wars.
- If you try anyway, you get a message that sends you to Wager Wars, the one place you can put money on yourself. In the app it offers to open Wager Wars; in Discord it comes with a Wager Wars button.
- A parlay with a leg on your own game drops that leg and keeps the rest, as long as enough legs are left. Spreads and totals on your game now count too; before, only player props did.
- Futures like the title and MVP aren't affected, and you can always sell out of a position you already hold.
- The Most Active Leagues board now lists leagues from the highest League Pulse to the lowest. Leagues without a reading yet go at the bottom. Ranking by games played is one tap away.
- The Leagues directory is ordered the same way, highest pulse first.
- The app's league leaderboard follows the same order and numbers leagues by where they sit.
- Every league on the Most Active Leagues board now shows its League Pulse: a score out of 100 built from exports, games played, owners showing up, filled seats and league talk. Each row also shows its band (strong, steady, fading or flatlining) and how much it moved this week.
- The board can now be ranked by pulse as well as by games played.
- Every league card on the Leagues directory shows its pulse too.
- In the app, the league leaderboard shows each league's pulse and can sort and filter by it, and the league browser shows it on every card.
- Fixed: the app's Set your availability screen could show "Sign in first" above the grid even when you were signed in.
- The ratings, injury report, transactions, your wallet and the league leaderboard now have the same sort and filter controls as the rest of the app. Tap a column to sort by it, or open Filter to narrow the list.
- On ratings, every metric is a column. Metrics where lower is better, like pass and run yards allowed, put the best team first on the first tap. Each row shows the number you're sorted by.
- On the injury report, sorting or filtering merges the teams into one league-wide list until you clear it.
- For league staff, the money log, inventories and member list have them too.
- The draft class's sort and filters now cover the whole class, not just the first 150 prospects on screen.
- The green bar across the top of the site had been stuck on update 470. It now shows the newest update and changes each time a new one ships. Dismiss it and it stays gone until the next one.
- The changelog page and the update post in each league's Discord had the same problem and are fixed too. Updates 471 through 502 are all on the changelog now.
- On the website, every table can now be sorted by any column: tap a column's header for highest first, tap again for lowest first, and a third time to go back to the table's own order. Records like 12-5, money like $1.2M and streaks like W3 sort the way you'd expect, and blanks always go last.
- Every table also has a Filter button. Pick a column: number columns take a low and a high (OVR 85 and up, say), and text columns take a word to match. Filters stack as chips; tap one to remove it, and the bar shows how many rows are left.
- Tables that repeat the same headers, like standings by division, share one filter bar. While a sort or filter is on, the division headers step aside and the league reads as one table, then they come back when you clear it.
- Tables that already had their own sorting, like the stat leaders and the contract board, keep it and gain the Filter button.
- In the app, the stat leaders, power rankings, standings, team rosters, trade block, draft class and player list all have the same controls: a row of column chips to sort by, and a Filter panel. Sorting the leaders by a different column shows that column's number on each row.
- The app's player list sorts and filters across the whole league, not just the page on screen.
- On the website, "Set your availability" now leads your league's home page, above the upgrades. Until you've set your times for the week it's open, outlined in orange and marked NOT SET; once you save, it flips to SET and folds to one line with your kickoff or the times you can both play.
- It also has its own page, one tap from the MATCHUP and MY HQ menus.
- In the app, Home's first key is now "My availability" (orange until you've set your times), the card under your next game is called "Set your availability", and it has its own screen in the app's map under This week.
- The site and the app save to the same place, so times set on one show on the other.
- The app's Home now has "When can you play?" right under your next game, at the top of the screen. Tap the days and times you're free, see your opponent's, and set the kickoff without leaving Home.
- It stays open until you've set your times, then folds to one line showing your kickoff or the times you can both play.
- Creating a week's game channels now also makes a bye channel for that week and tags every owner on bye, so nobody wonders why they have no game channel. It sits with the week's game channels and goes away with them: deleting the week's channels removes it, and so does the update that clears finished games once every game that week is final.
- A player in an approved trade is taken off the block the moment the trade is approved, without waiting for the next export to move him. Every trade already on file was applied, so anyone who had already been traded is gone from the block now.
- A player his new team puts on the block after the trade stays listed, and so does one who was traded away and back and then listed again.
- Draft picks on the block come down the same way once they've been traded.
- `/tb` now shows every player on the block, ten at a time, with Back and Next buttons. Two dropdowns filter it by position or team, built from who is actually listed. The person who ran it is the one who can flip it.
- `/ps` opens with the search box ready to type in. Type `fa` for free agents.
- The payout for playing a game, and any Hit List bounty won in it, now post in that game's Discord channel with both owners tagged. They only go to another channel if the game channel was deleted before the stats came in.
- Franchise HQ in the app now has the same "when can you play" grid as the website. Tap the days and times you're free this week and your opponent's show beside them, with the times you can both play in gold.
- Set the kickoff from the same card: propose a time, or tap one of the times you both marked. Your opponent confirms it, and either of you can clear it.
- Last season's weeks 5 through 18 were still sitting beside this season's first four weeks, so every leader board, player line and "on pace" note added two seasons together and the weekly show and player of the week were stuck on week 18. Last season's rows are now moved out as soon as a new season has played a game. Nothing is lost: last season keeps every week on its own Past Seasons page.
- The Hit List is the league's top five owners, rated on this season first with last season as the starting point. Only the games an owner actually coached count, and playoff wins and titles add on top. It updates by itself every three weeks.
- The five carry a Discord role called The Hit List. Beat one of them and you collect a bounty: $1,000,000 for #1 down to $500,000 for #5.
- Every game you play now pays $250,000, plus $250,000 more for a win. Simmed games and forced wins pay nothing.
- Every payout tags you in Discord and lands on your phone: game pay, Hit List bounties, and winning tickets or money lines at the book.
- Commissioners set the amounts, publish the first list and mark owners who took over partway through a season, all from the Hit List page on the site or in the app.
- Staff can force approve or force deny any open trade, on the site and in the app, without waiting for the other owner to answer.
- A trade done in Madden before it was accepted on the site no longer expires because the export already moved the player to the other team in that deal. If a player went to a third team instead, the message now names him and says where he is.
- Leagues on EA Direct Connect never moved their season forward, so the site kept acting like it was still last season. Item limits on upgrades counted last season's uses, including requests from last season that were never decided. The season now comes from the export itself, whichever way it arrives.
- Every spread, total and player prop is priced by simulating the game thousands of times from this season's results, so each side of each leg shows its own odds. The likelier side pays less.
- Odds move with the money. Every ticket moves the line on the sides it takes, and cancelling doesn't move it back. Two tickets on the same legs a minute apart can pay different amounts.
- A slip is a parlay that pays the product of its legs' odds at the moment you locked it. Flex is retired for new tickets; tickets already locked settle the way they were placed.
- When an owner whose game is on the board goes live on Twitch or YouTube, that game is treated as being played: a third of the usual profit on its lines, a $250,000 limit per ticket, and live money moves the line three times as hard. It stays that way until the game is graded, even if the stream ends. Staff can also mark a game live by hand.
- Changing or cancelling a locked ticket now costs 25% of its stake, or 50% once a game on it is live. Cancelling used to be free. Commissioners can set all of these from the book page.
- A Wager War closes to backers the moment either player goes live, and the Exchange caps buys on a live game and charges them a 30% fee.
- The league gets an app notification when a game on the board goes live, when a week's lines go up, and when a game has sat on the board for hours with nobody on it. Each can go to Discord too. App notifications no longer depend on the website's notification keys being set.
- Changing a locked ticket costs a tenth of the old stake, but that fee wasn't counted when checking whether you could afford the new ticket. Raising a ticket to everything you had left you owing the fee, and the next bet was refused with "you're in debt". The fee is now part of the check, and the bank covers it the same way it covers the stake.
- Pressing Lock it in on the same ticket twice charged the change fee a second time. An identical ticket now goes through free, and the button waits for the first lock to finish.
- ALL on the bet slip now fills in the most you can actually lock, counting the ticket you already have minus its change fee.
- Tapping a name on the app's Every player list did nothing. It now opens that player's card.
- The first wild-card game exported on its own was being read as the Super Bowl, so the champions channel crowned a wild-card winner. A champion is now only named once the conference championships are played and the Super Bowl itself is final.
- A title handed out that way comes off the champions list, and the real Super Bowl winner still gets their post and their ring when it's played.
- Link a YouTube channel on Settings, beside Twitch, on the site or in the app. Commissioners can fill it in for members from the streaming admin page.
- When you go live on YouTube, your league gets the same notification and Discord post a Twitch stream gets, and the stream shows on League TV.
- YouTube streams play inside the app and on League TV with their live chat, and mix with Twitch streams on the watch-together wall.
- Streaming pay covers YouTube too. On a Madden-only league the stream title has to say Madden, since YouTube doesn't report the game.
- Streaming to Twitch and YouTube at the same time counts as one stream, announced and paid once.
- Tapping a Twitch player could still throw you into the Twitch app. The player's links to the Twitch and YouTube apps are now refused, so the stream stays on the Watch screen.
- Madden gives out the same game numbers every season, so a game this season could pick up the write-up from a different game last season — The Read on one matchup describing two other teams. Recaps and the booth's takes are now tied to the season as well as the game.
- Games that were stuck showing an old recap now get their own, written on the next pass. Last season's games keep theirs.
- The game's Discord card reads the same, corrected recap.
- **Every season counts:** the league records (single game, single season, and team records such as the longest win streak) are now worked out from every season on file. Before, they came from the current season only, so the book started over each year.
- **Win streaks:** the longest win streak counts consecutive regular-season wins in order, carrying from one season into the next, and shows which seasons it spanned.
- **Record announcements:** a record is only announced when it's beaten (not tied) by something that happened this season. Short streaks early in a new season no longer post as "records". The bot follows the same rule (bot build 168).
- **No flood on the switch:** switching to the all-time book doesn't announce anything.
- **The button:** the iPhone sign-in screen shows a Sign in with Apple button on app builds that include it. It won't appear in current TestFlight builds until the next build.
- **Checking the sign-in:** the site verifies Apple's sign-in against Apple's published keys, and checks it's for this app and hasn't expired, before signing anyone in.
- **Accounts:** an Apple sign-in works like an email sign-in. If the address matches a Discord account, it signs into that Discord account. Later Apple sign-ins find the same account even though Apple only sends the email the first time.
- **Deleting:** an account made this way can be deleted like any other. Signing in with Apple again afterwards starts a new account.
- **League chat:** long-press someone else's message to report it or block them.
- **The Network:** tap the ••• on someone else's post to report it or block them. Long-press a comment to do the same.
- **Reporting:** a report saves a copy of what was said to the owner's report desk (the same place reported DMs go), notifies the owner, and blocks the author for the person who reported.
- **Blocking:** it hides everything the blocked person writes in league chat, on the Network, in comments and in DMs. Blocks made anywhere hold everywhere, and the blocked person isn't told.
- **Unblocking:** Settings lists the people you've blocked, each with an Unblock button.
- **Privacy:** Network posts no longer need to carry anyone's id for any of this. The site works out who wrote the post.
- Settings has a Delete my account option. You type DELETE to confirm.
- **What's deleted:**
- Your profile, league memberships and teams (the teams open up and the wire says so).
- Your money and items, settings, notifications, handles and streaming links.
- What you wrote in league chat, on the Network and in DMs.
- Every email sign-in linked to you.
- Commissioner roles.
- **What stays:** league records other people's seasons rely on (trades between clubs, settled bets, awards, fantasy results) stay, with your name removed. Billing records stay as required.
- **Signing out everywhere:** every session that was signed in stops working right away. Signing in again later starts a brand-new account.
- **The switch:** commissioners can set a league to Members only, from a new "Who can see this league" panel on the admin page, on the site and in the app.
- **What outsiders get:** anyone who isn't a member, staff or the platform owner is sent to the league's join page, which explains that the league is private and shows the way in. In the app, the league's screens and player search tell them the pages are for members.
- **What stays open:** the join and welcome pages, the list of open teams for recruiting, the league crest, shared images, show videos, and the bot (with a real key; a made-up key gets nothing).
- **Posting and sending** already required membership, so they're unchanged.
- The Me tab has a Bring a league option that opens your referral link, with a Send it button that uses the phone's share sheet.
- The app's referral screen no longer mentions prizes. Referrals are still counted the same way.
- **Links to other sites:** these open in a browser sheet over the app and close back into it, instead of a blank screen with Safari behind it.
- **Videos:** Twitch, YouTube and other video links play on the Watch screen.
- **Discord invites and email:** these still open Discord or Mail, because that's what they're for.
- **Players inside site pages:** in the app's web view, a player embedded in a page can play, but it can no longer load a twitch.tv or youtube.com page, which iOS would hand to that app.
- **Owner backups:** these download in a browser sheet. Before, iOS bounced the link straight back into the app.
- Every payment an Arcade match owes (pot, win bonus, first-play bonus, refunds) is saved with the match. Each payment can only land once.
- If any part fails to pay, the match is marked. The players are told the money is delayed, and the league's commissioners are told what failed.
- Payments that failed are retried automatically whenever anyone opens the Arcade or the match, until they land.
- The match page (site and app) says when a payout hasn't landed yet.
- The privacy test now covers the Hall of Fame and past-season pages.
- The app's trade desk has a History tab listing every trade that went through, newest first, 20 at a time with a button to show older ones.
- Each trade shows both clubs and what each one got. Trades made in the game and recorded here are labelled as such.
- Commissioners have a Void button on every approved trade, however old. It asks first.
- Voided trades stay in the history, marked as voided.
- The Recent deals list links straight to the full history.
- **Discord sign-in.** When the Discord app was installed, Discord could finish the sign-in outside the app's sign-in window and send the callback link to the app. The app had no screen for that link, so the window spun forever. The app now finishes that sign-in itself. A sign-in that returns through `sapphiresportz://auth` also lands correctly.
- **Waiting on Discord.** After 20 seconds, the sign-in screen offers a way to start over and explains what to do if the Discord app opened.
- **Links into the app.** Links to sapphiresportz.gg (from Discord, email or texts) open the matching screen in the app. They used to land on a blank "unmatched" screen.
- **Links that stay on the web.** The sign-in, the Watch player, the bot's API and video files are no longer claimed by the app.
- **Sign out.** The Me tab has a sign-out button near the top, showing whether you're signed in with Discord or email. Signing out also stops that phone getting the account's notifications.
- **Sync page.** EA Direct Connect is now the first thing on the sync page, on the site and in the app, above the export URL and the export log.
- When someone leaves a league's Discord server, their team opens up automatically and the wire posts it as open, the same as `/unassign`.
- Their cash and bank go to zero, written as one ledger line marked "left the server". This works whether the money lives on the site or still in the bot.
- League membership and history stay, as they do with `/unassign`. Needs bot build 167.
- The Watch screen no longer lets a Twitch or YouTube page load inside the player. iOS was handing those pages to the Twitch app, which pulled people out of SapphireSportz when they pressed play.
- Newsroom clips, game-tape VODs (including marked moments, which keep their timestamp), clips without an ID on League TV, and any video link opened in the app now play on the Watch screen. Twitch, YouTube, Streamable, Medal, TikTok and direct video files are all supported. Anything that can't play still opens as before.
- The Media Center's Play the show button now appears when a recording of that episode has been made, and plays it in the app.
- Home has a Watch section near the top with two tiles: League TV (with a live count when someone is streaming) and Media Center.
- Searching for watch, video, clips, news or media finds both.
- LEDG and REDG (LE and RE in older Madden) now count as one EDGE group. Typing any of them in a player search finds both sides.
- The Players table's position filter lists EDGE in place of the two separate edge codes.
- The app's Trade Center splits the old DL chip into EDGE and DT. Sorting by position keeps both edges together.
- The website's Trade Center position list now comes from the positions the league's rosters actually use, with both edges as EDGE. Madden 27 codes like LEDG, MIKE and WILL used to match nothing there, and they sorted to the top of the position sort.
- The app's Trade Center has position chips (QB, RB, WR, TE, OL, DL, LB, DB, K/P, Picks) that narrow both rosters at once, plus a sort by value, overall or position. Only positions either side actually has get a chip, and anything already in the deal stays on screen whatever the filter.
- League admins see a Void button on each approved deal under Trades → Waiting → Recent deals. It asks first, then voids through the same route the website uses.
- A team's pick next year is now always worth less than the same pick this year. Before, a good team's first-round pick this year was priced as a late pick, while its first next year was priced as a mid-round pick. That made the later pick worth more.
- Before any games are played, every pick is priced as mid-round. Nobody can be early or late on a 0-0 record.
- When a game goes final, its recap video is now made and posted into the game's channel on its own. Nobody opens the show, nobody presses Make the video, nobody waits with the page in front of them.
- The game page says which of the three things is true: the site is making it, it's made and already in your Discord, or nobody is making it. It no longer tells you nothing happens until you press it when something already is.
- Make the video is still there and still works, on your phone or your computer, whenever you want to make one yourself — a game the site couldn't manage is still a game you can.
- It's the same show, drawn the same way, with the same music and effects. Nothing about the video changed; only who presses the button.
- Play your game and export as usual.
- Open the game on the site — the recap video panel says the site is making it.
- A few minutes later it's in your game channel.
- The top of the app's home screen is now one search bar. Type a player's name to jump to him, or type what you want to do ("store", "bank", "draft", "trade", "upgrade", "tv") and the right page comes up even when it's called something else.
- Item store and Fantasy draft are now one tap from home.
- Items that come in levels now sit together and in order, e.g. Mentorship One through Five in a row. This works whether the levels are numbers, words (One, Two), Roman numerals or "Lvl 3".
- Everything else is sorted cheapest to most expensive, on the site and in the app. A store with no levelled items goes straight cheapest to most expensive.
- The fantasy draft room now opens on Advisor order, on the site and in the app. Every player has a projected points-per-game and a one-line reason: his spot on his team's depth chart, what he scored per game last season, and for rookies, where he was drafted.
- Rookies are ranked on where they were drafted and how likely they are to start.
- Receivers are sorted onto the depth chart by size and speed as well as overall. A tall, fast WR is expected to start over a shorter, slower one with a higher overall, and the reason line says so.
- The ranking is value over replacement, so it won't tell you to take a second kicker in round three.
- "Last season pts" now reads last season's archive, so it still works after the new season's first export.
- When a team makes several moves in one export, Discord now gets one card for that team listing every signing, release and trade, instead of a message per player. Dev changes are grouped the same way. A team with a single move still gets its own full card.
- Everyone signed in now has their own link on the website: open the account menu and choose Bring a league. Send it to a commissioner running a league somewhere else.
- When their league starts on SapphireSportz, it's counted to you. It counts once their first EA export is in and at least 8 people hold a team.
- Your page shows every league you brought and where each one stands, plus a board of who's brought the most. Prizes are announced later; every league is counted from today.
- When two or more people in your league are live, League TV in the app has a Watch together card. Pick up to four channels and watch them all at once.
- On a phone held upright they stack one under the other, each full width. Turn the phone sideways for a 2 x 2 wall. The first stream has the sound; tap the speaker on any other to hear it.
- New to the app? The first screen now lays out every way in: link your Discord if you're already in a league, type an invite code, find a league with open teams, or start your own. You don't need the website for any of it.
- An invite code on its own is enough. You don't need to know the league's name first.
- The email sign-in screen now says to use the email on your Discord account, so your league and team come with you.
- If you signed in with an email that isn't linked to your Discord, the site and the app now say so at the top of the page, and explain that's why your team doesn't show. One tap on Link my Discord fixes it. If you don't use Discord, tap "I don't use Discord" and it stops asking.
- The EA export notice is down. That problem is fixed.
- Email sign-ins that already existed on the same address as your Discord have been joined to your Discord account. Your email sign-in now opens your Discord account, with your leagues and your team.
- If yours didn't match, use Link my Discord in Settings, or ask the site owner to merge them.
- When somebody asks to join your league, the commissioner and staff get a notification. Approve or decline from the recruiting desk on the site or in the app, and the applicant gets a notification with the answer.
- If you signed in with your email first and with Discord later, using the same address, the two are now one account automatically. Your email sign-in opens your Discord account and its leagues.
- Commissioners can now make the fairness buffer exact: in League Admin → Trade settings, set "How the buffer is measured" to "Exactly the buffer". A 300 buffer then allows 300 points and no more. The old rule added 10% of the bigger side on top, so bigger deals got more room.
- With "Only deals inside the buffer" on, a deal past the limit can't be sent, and it can't be accepted later either if player values move outside the limit before the other owner answers. The commissioner can still approve it himself.
- The trade center meter on the site and in the app now uses your league's exact rule, so what it calls fair is what the league accepts.
- Staff can set how often empty ability slots get filled from the app's desk.
- If you sign in with an email that isn't the one on your Discord account, you can now link the two. After that your email sign-in opens your Discord account, with your leagues and your team, so you never join a league twice.
- The site and the app offer it right after an email sign-in that isn't in a league yet, and in Settings. Discord confirms it's you, and you see both accounts before anything is linked.
- Anything you already did under the email account moves over to your Discord account.
- The app has its own Settings screen: open it from the Me tab. Everything you can set on the site's settings page is there.
- Link your Twitch channel and connect the auto-clipper from your phone. Twitch asks for its one permission and sends you straight back to the app.
- Also there: which notifications reach you, the Network on/off switch, your email and updates, your preferences, your leagues, and leaving a league. Staff can set the notifications nobody can turn off.
- `/channels create-games` now covers the preseason. In the week option, type "pre" and pick Preseason week 1 to 4. The site also pulls preseason schedules from EA.
- If your roster is over 53, My team shows who to cut to get down to 53, in the site and the app. Your best players in each position group are kept so you can still field a team; the rest are ordered by trade value, least first. Young players are marked as practice squad options. Your home desk also tells you how many cuts are left.
- The Apply an upgrade panel now suggests where an upgrade would help most: for a Mentorship card you hold, the best mentor and player to copy onto, and for your thinnest positions, the starter's weakest key ratings.
- Every season is now kept and filed under its in-game year, starting with the 2026 season. Find it under League → Past seasons, on the site and in the app.
- Each season has results by week or by team with full box scores, final standings, power ratings (SRS, offence, defence, strength of schedule, Pythagorean wins), advanced team stats, stat leaders, coaches (each member's record, points, record against other members and playoff results) and every trade made that season.
- Every player has a game log for each season, plus his ratings as that season ended, linked from the Career tab on his page.
- Last season is recovered from the exports the site already had on file.
- The draft recap now shows each player's overall on draft day and where he is now: his current overall, how much he has gained or lost, his dev trait, and his team if he has moved. It updates with every export.
- Every class is kept, so you can follow it into later seasons after the players are no longer rookies. Older classes are one tap away at the top of the page.
- `/schedule` shows any team's season game by game, with every win, loss and score, playoffs included. Leave the team blank and it shows yours.
- `/game` looks up any final by team and week and posts the full recap card: the score, the box score and the players of the game. Leave the week blank for that team's most recent game.
- Madden 27 exports every draft slot one round and one pick too high. The site now corrects it everywhere, so the first overall pick reads Round 1, Pick 1 on the draft recap, player pages and the show, and undrafted players read as undrafted.
- A player's own face now follows him to every page, card and the bot, and stays through every export.
- Created players, like a custom draft class, often share one stock face in Madden. Adding a photo for one of them used to put it on every player with that face. Now each one gets his own, and it shows everywhere he appears.
- League staff now have The Desk at the top of their league home, on the site and in the app. It shows how much is waiting, including upgrades and ability slots, and opens the desk in one tap.
- The draft recap now opens pick by pick: every selection in order, round by round, with the team, the player, and his grade against the slot. Undrafted signings come after the last round. The by-team view is one tap away. Same in the app.
- Free agency grades are now about position groups. Each group (QB, RB, WR, TE, OL, DL, LB, DB, ST) is compared with where it stood before the off-season, and teams are graded on how much they raised them. The recap also lists the biggest position-group jumps and who was added there.
- Upgrades and mentorships now offer every rating, with the player's own position's ratings listed first. Any limits are the ones the league sets on the upgrade rules page.
- Players at Madden 27's newer position codes (edge rushers and the renamed linebacker spots) now get the right ratings on the upgrade form and on their player page.
- Mentorships only list ratings the mentor is higher in.
- Physical ratings are now exactly speed, strength, agility, throw power, change of direction, acceleration and jumping. Everything else is non-physical, including stamina, toughness and injury.
- This applies everywhere the site splits the two: attribute limits on upgrades, mentorships, and physical or non-physical attribute points.
- When a player gets a new ability slot, his owner can report it under My team (Empty ability slot) or in the app on the Upgrades screen. Pick the player, how many slots, and the ability you want if you have one in mind. Beside each player it shows how many empty slots the export sees.
- Staff see the list on the desk, on the site and in the app. They can mark each one filled or dismissed, or mark the whole list filled after a fill session.
- The league sets how often slots get filled (every 3 league weeks unless staff change it). Members see when the last fill happened and roughly when the next one is due.
- Mentorship is now an upgrade type. Pick the level, who to copy from and who to copy onto, and both players' ratings show side by side. Tick the ratings to copy and it shows what each one becomes.
- The levels are built in: Lvl 1–3 copy 1, 2 or 3 non-physical ratings; Lvl 4 adds 1 physical; Lvl 5 adds 2 physical. The player copied onto has to be younger than 30. Picking a Mentorship card sets the level for you.
- The desk shows every mentorship as Copy from → Copy onto, with the number to type in for each rating.
- In the app you can now put several ratings in one upgrade, each with its own bump, the same as on the site.
- Every handled upgrade shows which staff member handled it and when, opens to the full request, and can be filtered by staff member.
- An upgrade approved too early can be removed. The record stays, it stops counting toward the league's limits, and staff choose whether the item goes back.
- Through the off-season and the preseason, Free agency recap and Free agents are the first two tiles on the League page, on the site and in the app. Once the regular season starts they go back under Also here.
- Every page that opens from the app now has to have its own screen in the app before it can ship.
- A new Free agency recap page shows every signing since the Super Bowl: the biggest signings, the best bargains for the money, who each team lost and where they went, and who is still on the market.
- Every team that made a move gets a grade. It is talent signed minus talent lost, using the league's own trade values, graded against the rest of the league. A player let go and brought back counts as a re-sign, not a gain or a loss.
- The Free Agency episode of the league show now carries The Big Signings and Free Agency Grades.
- Find it under League, on the Off-season page, and in the app.
- A Free agents view on the players page: everybody without a team, best first, with what each one is asking and for how long. It's under League and My team, and on the Offseason page.
- In the app, the players screen has a Free agents button.
- Set or raise an honour's purse after the plaque is up, then press Pay the rest. Only the difference is paid, never the whole purse twice.
- The site now reads where the league is straight from Madden's export: the week, the playoffs, or the off-season step (re-sign, free agency and on). It shows on the league home and the Offseason page, on the site and in the app.
- Every time the league moves on, every member gets a notification on their phone. No Discord needed.
- The first time Madden reports an off-season step the site hasn't seen, staff pick its name once from a list (and can name the next step ahead of time), so the notification says the right thing.
- The off-season shows (Off-season preview, Free agency, Draft recap) now include the Hall of Fame's newest class.
- The Hall opens on the newest inductee as a framed plaque: his portrait (or the award itself), his name, the honour and his season numbers, with every other plaque below it grouped by class. The 3D gallery walk is still there, one tap away.
- Every inductee has his own page: the whole season he had, game by game, the citation and his team's record. It all stays on the plaque through every reset.
- Induction night: a commissioner can seal a winner until a set time. The Hall shows the countdown, then the plaque goes to your Discord as a picture and the page plays the reveal once.
- The member a plaque honours (or who ran that player's team) can write a speech that sits under it for good.
- A Hall of Fame ribbon now shows on the player's page, his team's page and the member's network profile.
- Commissioners can pick a player or member from a list and his face, club and numbers fill in on their own, and can read Madden's season awards screen from a screenshot: crop it to the award winners, check the list, put them up.
- Honours can pay out. Set a purse on each honour (league cash, plus physical and non-physical attribute points if your league runs the attribute purse) and it goes to whoever ran that player's team, once, the moment the plaque is revealed. Plaques already on the wall can be paid with one tap.
- In the app: swipe through the plaques, open any one, and every admin tool above is there too.
- A player page used to show only one kind of stat. A running back's catches, a quarterback's scrambles and a receiver's carries counted toward his fantasy points but never appeared. Now his main numbers lead and every other kind he actually put up follows: season totals, the game log and his career line. Same in the app.
- His position decides which numbers lead, so a back is always a runner first.
- Hall of Fame plaques now show faces: the player's portrait, and the member's Discord picture on a front-office plaque. Plaques already on the wall pick theirs up too. A name that matches more than one player keeps its letter rather than risk the wrong face.
- Madden's export doesn't say who owns a draft pick, so a pick traded inside the game stayed with its old club here. Commissioners can now fix who holds a pick in one step: whose pick it is, and who has it now. Deals written down afterwards carry on from there. It's on Admin, under Trades done in the game, on the site and in the app.
- A fixed pick shows on the trade hub's pick list as set by the commissioner.
- Picks now roll over with the season. A pick traded as next year's becomes this year's once the new season starts, and a pick already used in a draft drops off.
- GOAT TV now shows every nominee even when nobody is live: his name, the team he runs and its record, why his league put him up, and his next game (or "Time not announced" until the time is set).
- Watch opens that nominee's own channel, not just his league's TV. Same in the app.
- When a race ends, the champion and the field stay up until the next race opens.
- The Network opens with four things to do: Watch GOAT TV, Share a moment, Discover leagues and The GOAT race, with the champion or a nominee featured underneath.
- Commissioners can now do from the app everything the site's admin pages have a control for. The last few pieces are in:
- Roll call: excuse a member (3 days, a week, two weeks) or mark them back with one tap. Members can mark themselves away too.
- Injury report: staff can clear a man Madden still lists by mistake, and put him back.
- The Door: tap Got in ✓ for anyone waiting on an invite.
- Settings: staff choose which notifications nobody can turn off.
- New members can claim an open team straight from the app's home screen.
- A 2K league's home, on the site and in the app, now opens with the same tiles as a Madden league: Upgrades, Props, Futures and Players & compare, then the Arcade and the Rec, then your numbers.
- The app's home screen has the tiles too, for both sports, with the four sections (League, My team, Analytics & tools, Explore) right under them.
- Fixed: the final score on a 2K box score in the app was clipped at the top. Big numbers across the app now get the room they need.
- The bar across the top is now five tabs: Home, League, My team, Analytics & tools and Explore. None of them opens a list of pages. Each one opens a page with a few choices, and each choice says what it does.
- League: games & scores, the race, league life and the record book. My team: your roster, upgrade a player, make a trade and the draft room. Analytics & tools: a player, your team, your opponent, or the people in your league. Explore: your picks, your money, the arcade and the network.
- Upgrade a player keeps your items, the store and your requests in one place. Buying an item now offers Use this item straight away, and the purchase review shows what you will have left.
- The league home opens on the four things people come to do (Upgrades, Props, Futures, and Players & compare) with the Arcade and the Draft right under them, then your numbers, this week's matchup and your latest money movements.
- New: Money history. Every dollar in and out of your account and why, with filters for the window and for money in or out. On the site and in the app.
- The progression chart on player pages fits the screen at every size, and every value is there as a list too.
- Help, the manual and the page tour live in your profile menu. Find (press /) still goes straight to any page.
- Nothing was removed. Every page is still reachable from its section.
- The app's Explore tab opens the same four sections.
- The league's crest at the top of the league home is now a machined plate: the crest laid into a bevelled navy slab with a sapphire rim, lit from one side, with a slow light sweeping across its face. It leans a few degrees toward your pointer.
- It loads after the page, and only where it can be held. On a phone, under reduced motion, or without WebGL, the crest is the picture it was yesterday; nothing else waits on it.
- The picture and the object are the same file, so they can never disagree.
- The bar across the top of every league page went from twelve tabs to four: PLAY, SCOUT, MY STUFF and LEAGUE, the same doors the league home opens on. Staff keep ADMIN beside them.
- Every page is still one hover away. PLAY carries the Book, the money, the games, fantasy and the ladder; SCOUT carries your matchup, the numbers, the talent, the leaders and the history; MY STUFF is your HQ and your team; LEAGUE is the league, the show and the Network.
- A menu that used to run off the side of a laptop screen now wraps instead. The full bar fits on any desk, and a laptop keeps the Find and Players buttons it used to lose.
- The phone bar and MENU list the same four doors. Nothing moved and nothing was removed.
- Every panel, tile, button, chip, input and table head on the site is now cut from the same material as the app: a molded navy plate lit along its top edge inside a fine rim, keys that press in, inputs that sit in a recess. Text is brighter, floors are darker, nothing glows.
- Every page inherits it. Nothing moved and no feature changed.
- The league home now opens on the doors people use, as cut tiles in the same material as the app. PLAY, biggest and first: Upgrades, Props, Futures, the Arcade and the Draft. Then SCOUT: player search, compare, the gameplan on your next opponent, and the Lab. Then MY STUFF: your team, your tickets, your money. Everything else is one tap away under Everything else.
- Nothing moved and nothing was removed. Every page is where it was; this is a shorter way in.
- The tiles lean toward the pointer a few degrees on a desktop. Nothing moves on a phone or when your system asks for reduced motion.
- The Upgrades tile lands on the upgrade desk on your team page, opened.
- Wager Wars, the offseason, the Lab and the money log each have a walkthrough now.
- The app's Explore tab opens on the same three groups: Play, Scout, My stuff, with everything else below.
- New page: The Lab, under The Numbers on the site and in the app. Four groups, one line each: Players (search, compare, ratings, advanced analytics, progression, contracts, draft capital), Teams and matchups (gameplan, head-to-head, power rankings, standings, records), Owners (Pulse, the Ladder, roll call, achievements, the Hall), and Money. Nothing moved; every page is now also one door away from here.
- Fixed: the OVR progression chart on a player's page was cutting off the top rating and the first and last week labels, and a long season printed labels on top of each other. It has room for all of them now and thins the labels when there are many.
- Commissioners have a new page under Admin, The money log, on the site and in the app. Pick any member and see exactly where their money came from: work, prop payouts, the exchange, the arcade, transfers, loans, and anything an admin gave or took by hand.
- A table at the top shows who has been handing money out by hand, how much, and to whom.
- Every movement an admin makes by hand now records which admin made it: pay or fine from the admin page, a balance set outright, and /eco add and /eco set in Discord. Older movements made from the website are attributed from the record already on file. Older Discord commands didn't record who ran them, and the page says so instead of guessing.
- Every cash movement the bot makes now names its reason on the ledger (work, crime, a loan, a casino win) instead of all reading "adjust".
- The Book: a leg that lands exactly on the number (Patriots -8 winning by 8, 3.0 passing TDs landing on 3) used to count as a miss, so the whole slip lost. It now comes off the slip the way every real book does. A three-leg slip with a push pays as a two-leg, and a slip left with fewer than two legs gets its stake back. A player who didn't play is handled the same way.
- Every slip already settled the old way has been paid what the new rule owes. Nothing was taken back.
- The exchange: selling a money-line position by the rounded number on screen left a fraction of a share behind, which kept showing as a live position with your round-trip loss beside it, on a game that had already been played. Selling now takes the whole position, and a decided market no longer appears under What you're holding.
- Commissioners now have a Season Awards panel at the top of the MVP page on the site, and on the MVP tab in the app. It covers MVP, Offensive and Defensive Player of the Year, Offensive and Defensive Rookie of the Year, and Coach of the Year.
- Pick each winner and tap Award it. Everyone who backed the winner on the exchange is paid right away, and the winner shows next to the award.
- New page: The offseason (Matchup menu on the site, and in the app). It shows every offseason stage, which one is open, and how long it has left, in your own time zone.
- Commissioners set the stages. Load the Madden 27 stages (re-sign, Free Agent Frenzy, the draft, undrafted free agents, camp) or add your own, then give each one a deadline. Free Agent Frenzy can be split into rounds.
- When a stage opens, Discord hears about it and members get a notification. An hour before it closes, Discord hears again.
- Upload next season's schedule before Madden exports it. Paste it or pick a .csv or .txt file: "Week 1" and then "Bears @ Packers" lines, or "week, away, home" rows. Check it first and any mistakes are named by line.
- Once every game this season is final, game channels are made from the uploaded schedule. Records start at 0-0. When the real export for the new season lands, it takes over.
- Open The offseason.
- Load the Madden 27 stages and set each deadline.
- Paste next season's schedule and save it.
- Roll call shows when the league advances next, in your own time zone. Commissioners can set the deadline there: pick the day and time, how often it repeats, and a note. You can also choose how hard the bot reminds you, and post the advance call to Discord.
- Fixed: a deadline set on the website was read in server time, so 9pm Central was saved as 4pm. It now uses your own clock, and times on the site show in your time zone.
- Fixed: on the website, saving the reminder setting could switch the advance timer off.
- Members (Admin → Members): tap someone to pay or fine them, or to give or take XP.
- Commissioners can close a poll from the app, and the result posts to Discord.
- The Arcade's win bonus can be set from the Arcade screen.
- The MVP ballot is in the app. Members vote on the MVP tab, and commissioners can close or cancel the vote.
- The Sync screen now shows your Companion App export URL any time, with a Copy button. It used to appear once, when the league was founded.
- EA Direct Connect works in the app. Tick the box, tap Sign in to EA, and sign in. The app picks up the rest itself, so there's no address to copy and paste. Then pick your Madden account and your franchise.
- Nightly sync can be switched on, timed and set to digest, live or silent from the same screen.
- A league nobody runs yet can be claimed in the app with its export key.
- Recruiting: make a join link (pick how long it lasts and how many people can use it, and give it a label), turn a link off, or add somebody by Discord ID.
- Copying a join link from the app now copies a link that works.
- Tapping a live channel on League TV now plays the stream right in the app, with the channel's chat under it. You're no longer sent out to the Twitch app.
- Clips on League TV and the Watch buttons on the courts play in the app too.
- Close the player with the arrow at the top to go back where you were.
- Challenge the owner you play this week. You both put in the same amount, up to all in, which is the most the poorer of you two can cover. Your stake is held the moment you send it and comes back if they don't match.
- Once it's matched, anyone else in the league can back a side, and their money goes into the same pot.
- When the final lands, the winning player first takes a bonus from what the losing side's backers put in (20% unless your commissioner changes it, 50% at most). Then everyone on the winning side splits the rest by what they put in. The pot pays out exactly what went in. Nobody can win more than that, and nobody on the winning side gets back less than they put in.
- A tie, a game that never gets played, or a war the commissioner voids refunds everyone in full.
- Backing closes when either player taps We're kicking off.
- It's in the app's Book tab and on the site under The Book. It needs the league's economy to be running on the site.
- Open Wager Wars.
- Set your stake or go all in.
- Your opponent matches it and the league picks a side.
- On iPhone, the app was showing the phone's default font instead of the site's Barlow and Archivo. That's why it didn't feel like the same product, and why some condensed labels got cut off. The app now loads the site's fonts itself.
- The Team store now shows everything you can spend: your cash plus your bank, because a purchase uses cash first and then the bank. Items you can cover with the two together can be bought.
- A button on the store page could stretch into an empty box on iPhone. Fixed.
Try it: open the Book tab in the app.
- The Book tab now has Commish tools for league admins. Tap Build the board to write a player prop, a spread or a total on this round's games, with or without your own line, and post the board to Discord if you want.
- Open the Book tab.
- Tap Build the board.
- Pick a player and a stat, or a game, and queue it.
Try it: /channels create-games in Discord.
- /channels create-games, update-games and delete-games now give you one list of weeks. Weeks 1–18 are the regular season, and the playoff rounds sit at the bottom: Wild Card (19), Divisional (20), Conference Championship (21) and Super Bowl (23).
- The separate "part of the season" option is gone. Pick Wild Card and the bot knows it's the playoffs.
- Type /channels create-games.
- Pick Wild Card (week
- from the week list.
- Send.
- The 13 upgrades have new artwork: an original picture for each item, with no real players and no team logos. The item's name and what it does are printed next to the picture.
- The artwork now shows in the app as well as on the website: the Team store shelf, My items, and the commissioner's upgrade catalogue.
- The World Bank, Deposit and Withdraw pictures have new artwork too.
- The upgrade cards now also show on your team's upgrade desk, in the upgrade history, on the fantasy squad page and in the admin's inventories list.
- The cards are a website feature. The app keeps each item's emoji.
- The item store now has card art. Mentorship Lvl 1–5, Leadership Camp, Boot Camp, O.G., Ability Switch, Regression Protection, Finance School, Tampering and Commissioner Eyes each have their own card, on the website and in the app.
- Commissioners: the admin item page has a new Upgrade Catalogue. Pick a card, set the price your economy wants, add a stock limit or a per-person cap if you like, and it's on your shelf. The wording is yours to change to match your league's rules.
- Items that already carry one of these names pick up their card automatically. Any other item can be given a card, or kept on its emoji, from Edit.
- In the app you can now deposit and withdraw from the Economy screen: pick Deposit or Withdraw, type an amount (500k, 2m, half, all) and slide.
- The Bank now shows the World Bank card.
- Fixed: editing an item on the website no longer resets its price to $0 if you leave the price box alone.
- Open Admin → Items.
- Scroll to the Upgrade Catalogue.
- Set a price on a card and press Add to store.
Try it: open Home and give your crest a spin, then tap the grid at the top.
- Your team's crest on Home is now a medallion you can hold: tilt your phone and the light moves across it, drag it to turn it, flick it to spin it. Tap it to open your team.
- The tab bar floats over the screen, and the highlight slides between tabs. You can drag along the bar to switch tabs.
- Explore (the grid button at the top) groups every room behind a few doors. Open a door to see what's inside, or search all of them at once.
- The Team store puts items on a shelf you swipe through. Slide to buy, and watch your balance count down. A short guide under it shows what to do with an item next.
- "It worked" and "that didn't go through" now pop up as small notes at the top of the screen instead of a box you have to close. Flick one up to clear it.
- Buttons and cards got a new finish, and every button responds the moment you touch it.
- The Terms and Privacy pages now name the company that runs SapphireSportz.
- Drag or flick the crest on Home.
- Tap the grid button for Explore.
- Open the Store from Explore and slide to buy.
Try it: open any team or game, or Me → More → League chat.
- A team's page now has everything the website's does: Overview (top performers, the team build tracker, the locker room, recent moves, injuries, head-to-head), Roster (the cap room, what's eating it, IR and the practice squad), Depth, Needs (the trade block, the deep read, front office calls, upcoming free agents) and Schedule. The "full franchise page" button is gone because there's nothing left behind it.
- A game's page now has the read, the wider picture, the stars and the storylines, the preview, the room where the two owners book the game, what stood out, your private five-second review, the matchup scout with your notebook, how each man plays, the series between them, matchup advantages, the sheet, recent form and the board.
- League chat is in the app: the Locker Room, Announcements, Trade Talk, Matchup and Support, from Me → More, or "Talk about this game" on any game.
- The privacy link on the sign-in screen opens the app's own page.
- Tap a team or a game anywhere in the app.
- Use the tabs at the top of a team.
- Scroll a game for the room and the scout.
Try it: Me → More → Owner console (site owner only).
- The last owner rooms are native: the 2K player pool (mint a collector token, roster coverage, the top of the pool), Network handles, the Network and GOAT League events, and founding slots (grant, waitlist or decline requests, then tap any tile on the board to follow up, resend the claim link, DM it from the bot, or take the slot back).
- With these, no page the site serves opens as a web page inside the app any more. Everything has its own room.
- Open the Me tab.
- Tap Owner console.
- Pick the room.
Try it: Me → More → Owner console (site owner only).
- Backups are native: see the newest good copy and whether anything is off the box, back up now, re-check a copy, and download one. Download opens a link good for five minutes in your phone's browser, since the app can't save files itself.
- Money is native: who is here, whether payments are wired (never showing a secret, only its shape), the lifetime book, and every league's standing, with "free for life" per league.
- EA health is native: every league's connection state worst first, the platform wiring, the keep-alive, and the three levers (kick the line, retry every league, the EA notice).
- Open the Me tab.
- Tap Owner console.
- Pick the room.
Try it: Me → More → Owner console (site owner only).
- Tell the owners is native: write an email update, pick who gets it, send yourself a preview, then send it, with the history and the mail log underneath.
- The bot feed is native: close or open any league's feed, the panic switch for every feed, each league's watermark, rewind, and a platform notice to every league.
- Export coverage is native: which fields in a league's exports nothing on the site reads yet.
- Open the Me tab.
- Tap Owner console.
- Pick the room.
Try it: Me → More → Owner console (site owner only).
- Every league is native for the site owner: pin which league a stranger sees first, see who runs each one, hand a league to somebody, or delete one after typing its name.
- Methods, the show music shelf (add a track with its source and licence straight from the phone) and the network-wide broadcast are native too.
- A shelf track added without a title takes the file's name.
- Open the Me tab.
- Tap Owner console.
- Pick the room.
Try it: Me → More → Owner console (site owner only).
- The site owner now has an Owner console under Me → More, with every room that runs the service in one list.
- Native already: support requests (with what the site knows about each league and a reply box), the review desk (notes, clear, ban, lift a ban, mark a tag disputed), reported messages, player photos, crest review, and who's using the site.
- "1 days seen" and similar now read correctly on the usage page.
- Open the Me tab.
- Scroll to More.
- Tap Owner console.
Try it: Admin → Fantasy season, or Edit the show.
- The fantasy season desk is native: plan a season and watch the weeks work themselves out as you type, build or rebuild the schedule, change the shape before anything's played, end a season into the record book, or reset the draft.
- Edit the show is native: pick the episode, reorder segments, hide cards, rewrite what the host says, set the music, volume, effects and video size, and add a song of your own from your phone.
- Fixed: saving the show a second time used to throw away words you'd rewritten earlier. They now stay until you clear the box.
- A song added without a name now takes the file's name instead of "Untitled".
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → Draft board.
- The draft board editor is native: search the class, add or edit a prospect (including combine numbers and which fields members can see), remove one, and rename the board.
- Reveal a field across the whole class, a position group or a range of ranks, or hide it again, in one go.
- Fill the board from a file on your phone (the board's HTML page, a CSV or JSON), paste JSON, or copy the AI prompt that builds one.
- Open your league in the app.
- Go to Admin.
- Open the draft board editor.
Try it: Admin → Hall of Fame, or Weekly awards.
- The Hall of Fame desk is native: close a vote to induct, put an honour to the league with a suggested shortlist you can trim or add to, enshrine a legend directly, run your list of honours, and take a plaque down.
- Weekly awards are native: step through the weeks, take the site's picks or choose your own with a line about why, set what each pays, choose the ping, set the MVP race's floor, and announce.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → The booth, or The Bot.
- The booth is native for staff: hear any broadcaster call your latest game without publishing a word, add or edit one, give one a new face, or retire one and keep their old recaps.
- The Bot is native: see whether your Discord server is linked, get a fresh /connect code and copy it, add the bot, or disconnect a server.
- Broadcasters made in your league now show their drawn faces in the app's booth instead of a blank circle.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → Dev tiers, Attribute points, or The Wire.
- Dev tiers are native: name and colour your ladder, reorder it, and move any player onto a rung with a tap.
- Attribute points are native: approve or deny what's waiting, switch the purse on or off, set what each award pays, and hand points out with a reason.
- The Wire is native: route every kind of league event to a channel, switch it on, set its minimums, and send a test post.
- The attribute points page now lists your league's members to hand points to, not only people who already have a purse, and it no longer carries names from outside your league.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → Upgrade rules, or Spotlight.
- Upgrade rules are native: require an item, cap how many upgrades one player can ever have, set a cooldown in your league's own weeks or seasons, limit each item per person, and set the physical and non-physical attribute caps, all with one save.
- Spotlight is native: open the Game of the Week vote with a prize, close it and pin the winner, pin or unpin featured games, pay prizes, add rivalries, and set team tiers with a tap per team.
- Fixed: saving team tiers used to mark every team as placed by hand, so none of them were re-sorted by the next roster upload. Now only the teams you actually moved are marked.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → Start a new season, or Twitch.
- Starting a new season (or a new Madden franchise file) is native: choose what survives, see exactly what will be deleted as you choose, then type the league's name to confirm.
- The Twitch room is native: what streaming pays, the rules that stop it being farmed, the league acronym, and linking a channel for a member who hasn't done it themselves.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → Rule the games, The hot seat, Trade log, or Values.
- Rule the games is native: flip through the weeks and mark each game played, fair sim or a forfeit win with one tap.
- The hot seat is native: who's on a run of sims or force losses, who's one game away, the season's record, and where the bar sits.
- Trades done in the game are native: pick the two teams, tap the picks and players that moved, and record it. Undo a recorded deal from the list.
- Player & pick values are native, with real sliders and the live preview priced by the site as you move them.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → Clips, Items, or Inventories.
- The clip desk is native: see every clip, pin one to the right game from a list of the season's games, mark it not ours, or put it back to automatic.
- The item store is native: create, edit, give and remove items, with the bot's queue showing what has actually been done.
- Everyone's pockets is native: every account's cash, bank and items at a glance.
- The item store now shows each item's description on the site too.
- Open your league in the app.
- Go to Admin.
- Pick the room.
Try it: Admin → 2K set-up, Season honours, or Off-season progression in a 2K league.
- The 2K set-up page is a native room now: rosters, the player pool, assigning players, the season and calendar, drafted players with their face photo, the score log, simmed games, pick ownership, and the pay for filing screenshots.
- Simmed games can be read straight off a screenshot of the schedule in the app, same as on the site.
- Season honours are native: take the site's picks, fill any seat yourself (including a CPU club's player), set what each one pays, and announce.
- Off-season progression is native: photograph up to twelve progression screens, check every match, change any player the reader got wrong, and apply. Nothing is written until you press Apply.
- Open your 2K league in the app.
- Go to Admin.
- Pick the room; photos come from your phone's own picker.
**The admin home** shows the set-up checklist and the "make it yours" list, with every other admin room one tap away. From there you can: **Members:** everyone's standing across the site, how the ones who left went out, tags, removing a member with a reason on the record, and the recruiting listing. **Who's using it:** members, sign-ins, and days used in the app and on the web. **The Network:** join or leave, and every team's handle (set, rename, release, or hand the keys to a new owner). **Your league's look:** a colour preset or your own two colours, and your crest, picked straight from your photos. Every room in the app's room list now opens as a screen. Arrives on your phone with the next app update.
- hand each team to an owner (tap the team, pick the person)
- set the trade rules: fairness buffer, how trades get approved, what members may send, what approves itself, and who can post clips
- send a league poll
- add a co-admin, or hand the league to a new commissioner (it asks you to confirm first)
- test the beat writer, see the export's health, and run the player-photo tools
- Open Every room.
- Tap League Admin.
- Tap a team to hand it to its owner.
**Joining a league:** the league's card (owners, open teams, when it last advanced), the ten-second /link route for anyone already in its Discord, an invite waiting for you, an invite code, or an application with the team you'd like. Once you're in, the app switches to the league. **Setting up:** the commissioner's checklist, in order, ticked off from the league itself. You can name the league right there. **Starting a league:** the Founding 100. Ask for a slot, and when one is yours, name it and create it. A Madden league shows its export link, which you tap to copy for the Companion App. A 2K league goes straight to its set-up. **The guides:** "Your first five minutes" for members and "Start here" for 2K commissioners, rewritten for the app and ticked off as you go. **Terms and privacy** are drawn from the same text as the website, so the two can't disagree. A league's plan shows where it stands (trial, active or grace), read-only. Arrives on your phone with the next app update.
- Open Every room.
- Tap Set up (commissioners) or Help.
- Follow the steps in order.
**The hub:** your builds, who's on tonight (call a squad for any mode and say which positions you need, or tap I'm in on someone else's), your crew and its invite code, the latest rec games, and the top of the ratings board. You can file a game-stats screenshot straight from your photos, and every gamertag on it starts a rating. **Your build:** name, position, height, weight, overall, gamertag, archetype, takeover and badges. Tap the hot zones in, or read them off a photo of the hot-zone screen. **The build lab** answers "what should I build?" for Pro-Am, Rec, Theater, Casual or Park, from your position, how you want to play and the height you want. It also works out what your speed with ball unlocks as you type. **Your crew:** who runs what, the best five you can field with its chemistry score and what it's missing, Pro-Am standing, averages and recent games. Owners can set the ranked tier and home mode, and remove a member with a reason. **The crew ladder** and **Rec ratings** are native too. Arrives on your phone with the next app update.
- Open the Rec.
- Register your build.
- Call a squad, or file a game-stats screenshot.
**2K fantasy:** join the side league, set your starters for the week with a tap each, and follow the week's matchups and the standings. Commissioners can open it, auto-draft, close it, or clear the draft and redraft, with a confirmation before anything is wiped. **The bracket:** every series by round, with seeds, wins and who advances. Commissioners can seed round one from the table (best of 7, 5, 3 or 1) and type in series results. **Season honours:** the MVP, the All-NBA teams and the rest as your commissioner announced them, with any seat the commissioner picked marked as such. **The animation desk:** if you have a build, it shows what you can equip now, what's one upgrade away and what your height rules out. Below that is every package with its blend, requirements, height range and letter grade. You can vote, and mark a ranking as matching or differing from outside analysis. With this build a 2K league's room list has no web pages left in it. Arrives on your phone with the next app update.
- Open Fantasy from Every room in your 2K league.
- Join, or tick your starters for the week.
- Save the lineup.
**The Book tab is the 2K book.** It has the spread and total on every game left on the calendar, props on the men playing in them, futures on the champion, the MVP race and the scoring title, your tickets and the bankroll table. Tap a line and a slip opens with your stake and what it pays. **Make a prop** lets you pick any game, any player on either side and a stat, and the book sets the number. Before this, the tab told every 2K member there was no board. **Every stat, every man** shows the leaders from the box scores your league files: per game, totals, shooting and big nights. Tap a column to sort. Set a floor (games, or shot attempts for shooting) so a two-game man doesn't top a forty-game one. **The ratings** for a 2K league are basketball ratings: power (SRS and strength of schedule), efficiency per 100 possessions, the four factors, and real or lucky. Before this the app said to open them on the website. **The badge book** lists all 53 2K27 badges by how much they matter, with what each one does and who in your league has it at what tier. **My tickets** in a 2K league lists your single bets, settled the moment a game is filed. Arrives on your phone with the next app update.
- Open the Book tab in your 2K league.
- Tap a spread, a total or a prop.
- Set your stake and lock it in.
**What was wrong:** in a 2K league the app drew the football home over the Court and said "No team yet". The Scores tab was empty, and the room list offered Passing and Rushing leaders and a fantasy draft room 2K leagues don't have. **Home is the Court.** A game? waiting on you is at the top, with a one-press answer. Box scores waiting to be confirmed come next, with Confirm, Wrong and Backwards (commissioners can file a disputed one or throw it away). Then your games with game? and box, Log a game, Report a score, what's coming up, the latest scores, the table and the leaders. **Post the box score from your phone.** Press box, pick up to six pictures from your photos or take them with the camera, and they're read and held for the other owner to confirm, the same as on the site. **The Scores tab** is the calendar (every game by date, or one team's with a tap) plus the conference table with the play-in line. **Teams, players and box scores open as screens.** A team shows its starting five and bench with trade values, the road ahead, and a front office section that only its owner sees. A player shows his card, his category ratings, every attribute with the point that would unlock a badge, his season and game log, his shot-chart zones (with Chart a game), his badges and his bio. A box score shows who decided the game, the four factors and both box scores, and commissioners can correct what was read. **The room list matches the site's 2K menu:** the calendar, the bracket, one leaders board and 2K fantasy, with no football-only rooms. The bracket, the leaders, 2K fantasy and season honours still open in the web view for now. They're next. Arrives on your phone with the next app update.
- Open the app in your 2K league.
- Answer a game? call, or press game? on one of your games.
- After you play, press box and pick the box score pictures.
**The GOAT League:** the race to name the best person playing in any league on the platform, with each league's shortlist and the final ballot. Vote for your league's shortlist and then in the final, straight from the screen. Commissioners can put forward their league's pick from the same place. **GOAT TV** shows whichever nominee is playing right now. **Recruiting:** the leagues that are hiring, with an Apply button on each, and the free-agent board of players open to offers. Commissioners can invite a free agent to an open team in one tap. Under **Mine** you'll find your open-to-offers switch, any offers waiting for you (accept or decline), and every league you've applied to. **Collectibles:** your cards grouped by rarity, each with its own page showing everyone who has held it. Trade card-for-card with anyone: pick what you want from them, pick what you'll give, and send it. Incoming trades can be accepted or declined, and your own can be cancelled. Crests and frames can be equipped from the same screen. Arrives on your phone with the next app update.
- Open the GOAT League.
- Vote for your league's shortlist pick.
- Come back for the final ballot.
**Messages:** your conversations, newest first, with unread counts. Open one and new messages show up on their own while you're in it. Long-press your own message to unsend it. **Block** and **Report** are under More. A report sends a frozen copy of the conversation to the site owner and blocks them, so it can't be emptied by unsending. A notification tells you who wrote, never what they wrote. The Message button on someone's card goes straight into your conversation with them. **People** is everyone on the platform: search by name, filter by platform or open-to-offers, and message anyone you share a league with. Your own "open to offers" switch is at the top. **Also native:** every league ranked by games actually played by people, the Arcade's site-wide leaderboards, **What changed** (with Try it opening each feature in your league), the league directory, and the draft-class Resources page (tap a filename to copy it for the in-game download center). **One fix under all of it:** opening a screen straight from a notification could flash the signed-out version of the page and get stuck on it. The newest request now always wins. Arrives on your phone with the next app update.
- Tap a notification about a message, or open Messages.
- Write back.
- Long-press your own message to unsend it.
**The Exchange** lists your positions and every board: futures, each game's money line and the props. Tap one and the ticket **quotes as you type**: the average you'll actually get, how far your own order moves the price, the fee, and what it pays. That matters because a big order moves the line while you're buying. Selling works the same way, and commissioners can settle, close, reprice or void a market from the phone. **The show reads like a show on a phone now.** Each segment draws its content: the scoreboard's scores, the storylines, the Players of the Week and their lines, the ratings, contract talk, the playoff picture, and the draft class and grades. Before, the app only listed segment titles. The **Draft Recap, Free Agency and Off-Season** specials and any single game's recap open straight to their own episode. **Competition, Media and the Market** each open as a small set of tiles, one per room, instead of a list of links. **The tape** (filing your broadcast against a game and marking its moments) and the staff **Compare moments** audit view are native too, and so is the page that lists everything the site does. Arrives on your phone with the next app update.
- Open the Market in the app and tap The Exchange.
- Tap a board, then Back beside an outcome.
- Type an amount and read the quote before you place it.
**Field Goal, Snap Count and QB Drill** are drawn natively. Tap for power, tap to aim, and watch the ball fly. Wait for HIKE. Hit the targets before they disappear. The server grades the run exactly the way it grades one in a browser, so a phone run and a website run are the same run against the same winds and targets. **Two-Minute Drill and Higher or Lower** show the real clock bar, and Higher or Lower reveals the rating after you answer. **Coordinator Clash** works play by play. Lock your offensive call or your defense and leverage, see the snap revealed, and make the read. The screen checks for the other coach's move on its own while it's their call. **The Arcade hub** lists challenges waiting on you, your live matches, recent results and the Most Wins board. To challenge someone, tap a game, pick an opponent (or leave it open to anyone), put up a stake or don't, and you go straight into your run. **Drive Architect** is native too: read the defense, make the pre-snap check, pick the read, and your QB career follows you across leagues. Arrives on your phone with the next app update.
- Open the Arcade in the app.
- Tap Field Goal, pick an opponent and tap Challenge & play now.
- Tap once to start the meter, once to set power, once to kick.
**Home, My squad, Matchups, Waivers and Rosters** are one room with a tab strip, because they're one league seen five ways. **Set your lineup** by tapping a slot and picking who plays it. Pull a man out of one slot into another and the first slot empties, same as dragging him. Players who already played stay locked, same rule as Discord. **Matchups** go slot against slot for the live week, benches included. **Waivers** is two taps: tap Claim on a free agent, then pick who he replaces, and anyone else chasing the same player is shown. Keepers and your wallet are on My squad too. **The draft room** counts down the clock, shows **YOU'RE ON THE CLOCK** when it's your pick, and lets you draft, star players onto your private board and reorder it. If your clock runs out, the draft takes the top man still on your board. Commissioners can set rounds, the pick clock and snake order, then start, randomise, auto-tier, sim the rest or reset, and each destructive button asks first. Arrives on your phone with the next app update.
- Open Fantasy in the app and tap My squad.
- Tap a slot, pick who plays it, and Save lineup.
- Tap Draft room during your draft; when it's your pick, tap Draft beside the player.
A name in a box score, the stat tables, the injury report, a trade offer, the ratings: fifteen places in the app led to a player, and every one of them opened the website's player page inside a browser sheet. That's now a native screen with four tabs. **Overview** has the season line, what makes him go, abilities, the advanced numbers, contract, traits, personality, scouting and every upgrade ever put on him. **Ratings** has every rating group as a bar, plus how his ratings moved week to week. **Games** is the game log, and **Career** is every season. It has the same buttons the website gives you: **Make an offer** on someone else's player, **Upgrade him** on your own (the upgrade desk opens with him already picked), **Compare**, and **Missing ability?** to flag an ability the export dropped. **Every team** is a screen too, grouped by conference and division, with your club marked and open teams labeled. **A correction to last night's count:** the "63 of 71 rooms" number covered the room list only. Checked against every page a link in the app can open, 136 pages still use the web view. They're being rebuilt most-tapped first, and a test now keeps that list honest: it fails the build if a page falls through to the web view without being on the list. Arrives on your phone with the next app update.
- Open any box score or stat table in the app.
- Tap a player's name.
- Switch between Overview, Ratings, Games and Career.
Sixty-three of your seventy-one rooms are their own screen — the contract board, the draft class, the Ladder, the ratings, the Door, the booth, and everything else that used to open a browser inside the app. **Tap any room in the list and it opens like an app opens.** The eight that are still the web view say **ON THE WEB** beside them, so nobody is surprised by one: the six Fantasy rooms (they're being rebuilt properly, and a copy of the pages being replaced would just be thrown away), Drive Architect (it's a game, not a page), and League Admin (that one's genuinely a desk job).
- Open the app and tap Every room.
- Anything without ON THE WEB beside it is a real screen.
- Search it — there are seventy-one.
Sixty-three of your seventy-one rooms are native now. Eight aren't, each for a reason, and until last night you'd find out which by tapping one and watching a browser open inside the app. The room list says **ON THE WEB** beside those eight — a member isn't surprised by it, and you can see what's left without reading the router. The list lives on the server and a test asserts it's exactly the set that has no native screen, so the label can't quietly become untrue.
The update channel ships JavaScript, not native code. All fourteen new rooms are JavaScript, so once review clears they go out over the air to everybody on the current build. One exception turned up on a read-through: the recruiting room's **copy** button uses a clipboard module that arrived *with* that room, so on a phone running the build that's in review the button would have done nothing at all. It falls back to the share sheet now, which is always there and has a Copy in it. **And a test now refuses to let that class of thing through again**: a room added between builds may only reach for something the shipped app already has, or it has to survive not finding it. **Also:** the advanced-numbers tables leave out any column where every player reads zero. Yards over expected needs yards-after-contact in the export, and a league whose file doesn't carry it was being shown a real table of real players with 0.0 beside every one — which reads as "these men gained nothing" rather than "this league hasn't got that number".
The animation desk's three buttons — "I run this", the vote, and the verdict — each read the request by hand. That guard catches a body that isn't JSON and misses one that *is* JSON but isn't an object, which is exactly what a phone that loses signal mid-tap sends. All three answered with a **crash** instead of a refusal. They answer properly now, and so does the hot-seat threshold, which had the same hand-rolled read. **The stress suite was reporting sixteen failures that weren't real.** It hammers the public endpoints from one address, on purpose, and the site's anti-scrape limiter does its job and starts saying "slow down" — which the suite read as "the search is broken". It was a test lying about which thing was broken, and this is the suite that found the crash above. A "slow down" is now counted as what it is: the site answering, and not leaking. **And one check was measuring the machine instead of the code.** "A database connection is cheap" was a stopwatch threshold that went red on a busy box with nothing wrong. It now counts the statements a connection actually runs, which is the thing it was always trying to say.
Two rejections in a row were the same thing, and both times the settings *looked* right. A page that says three settings parse can't tell you a person typing them in actually gets through — and the gap between those two sentences has cost two review cycles. **So it does what the reviewer does.** Same address check, same code check, same account, same seating into your league — inside a transaction it rolls back, so nothing is created and no league gains a member. It reports every step, in order, and stops at the first one that fails with the reason. **And it asks the question nothing was asking:** once the reviewer is signed in and seated, **is there anything in that league to look at.** Every other check passes for a league with no clubs in it, and a reviewer staring at an empty page rejects the build for a reason none of the settings can show. It still never prints the code, and it's still honest about the one thing it can't know — whether the code you typed into App Store Connect is the same one. That last check is a private window and thirty seconds.
- Open /owner/review-account before you submit.
- Read down the steps.
- Then sign in at /signin in a private window to confirm the code matches the one Apple has.
Since build 324 the Playoff picture has known the race is over once the postseason starts — and then said so, over a list of settled seeds, and stopped. **If your league was in the Divisional round, the phone told you the race had finished and showed you nothing about the games being played.** Now the room opens on **the bracket**: every round, every matchup, the score and who won, and the champion when there is one. **Tap a game and you're on its page** — the one that's had a full box score on it since build 367 and that nothing in the app pointed at. **Also:** the card headlines in Discord are in Lato again. The bot's font loader had been looking in the wrong folder since build 154, so every headline meant to be heavy was quietly being drawn in a fallback typeface. Nothing broke — the cards just looked thinner than they were designed to.
- Open Playoff picture in the app once the postseason starts.
- It opens on the bracket.
- Tap any game for its box score.
Twenty-five screens went in over the last eight builds. Every one was opened against a real league before this shipped, which is how these turned up: **Recruiting said "open seats: [object Object]".** It was being handed the list of unclaimed clubs and printing the list where the number goes. It says 29 now. **Team archetypes showed a dash for every club.** A club is built twice over — one way with the ball and one way without it — and the room was looking for a single label that doesn't exist. Both are there now, with the sentence that says what to do about each, and the runner-up when the read isn't clear-cut. **And the coverage table was ranked on one number and printing another.** It's ranked on stop rate, so stop rate is what it shows.
- Open Team archetypes in the app.
- Every club now reads offense and defense.
- Recruiting counts the open seats properly.
**The advanced numbers** — rushing yards over expected, passer efficiency, completion percentage adjusted for how often the ball got knocked down, receiving and coverage — sit with the ratings now, which is what they are. Everybody sees the top five of each; the full tables are still the Prestige 1 perk. A 2K league gets told these are football numbers and where its own are, instead of an empty page. **Settings carry only the switches that mean something on a phone.** Where the crest takes you, how much detail Franchise HQ shows, table density, autoplay, motion. The ones about where the chat panel docks in a browser aren't there — a settings screen made of controls that do nothing is worse than no settings screen. **And notifications are finally set from the phone**: every kind, on or off, one tap each. Turn one off here and it's off everywhere you're signed in.
- Open Every room in the app.
- Advanced analytics opens on the ratings room's fourth tab.
- Settings opens under Running it.
These two are the ones that can't wait for you to get back to a desk. **Somebody's in the game right now and needs an invite**, or somebody applied an hour ago who'll join another league tonight if nobody answers. **Light your beacon from the phone** — "I can send invites" or "I need one" — and everybody it's for gets the ping. It tells you how many it reached. Put it out with one press. **The queue answers from the phone too.** Every applicant arrives with his record attached — how many leagues, how many seasons, how he left them — which is the one thing you can't work out from a Discord name. Let him in or decline, and it lands in the same place it would from a browser. **Your live join links are there with a copy button**, with how long each one has left and how many uses are gone, and the recruiting posts are already written and ready to share. **Billing is deliberately not in the app.** It stays on the website, where paying for a league belongs.
- Open Every room in the app.
- The Door and Invite & recruiting open in it.
- Light the beacon when you're on and can send invites.
**The newsroom** reads properly on a phone — the tag on every card, the picture, the clip, who wrote it — and it loads more as you scroll without ever showing you the same post twice. **The booth has faces.** Every broadcaster covering your league, what they notice, how much they've filed and the last thing they wrote. It's open without signing in, like the website's, because it's the page a commissioner sends to somebody he's recruiting. **The Week in Review shows its rundown** — every segment in order, what each one says, and the video when there is one. A week that hasn't been played says so instead of erroring. **And the streaming kit ticks off from the phone**: this week's challenge, the checklist, the milestones. Tick a box on the sofa and it's ticked at the desk. **The Redzone opens League TV.** On the phone it was already the same week and the same clips as the TV room's Clips tab, so rather than build a second list that would drift from the first, it goes straight there.
- Open Every room in the app.
- Newsroom, The Booth, The Week in Review and Go Live all open in it.
- RedZone opens League TV on Clips.
One question asked three ways: how good is this squad, and which way is it moving. **The ratings table is one column at a time.** The website draws thirty-two rows and fourteen columns, which is a spreadsheet, and a spreadsheet on a phone is a thing you pinch at and then close. Tap a chip — overall, offense, defense, yards per attempt, what they allow, strength of what's left — and the league sorts itself by it, with your club marked and any club that hasn't played enough games greyed rather than hidden. **Archetypes say what each club is built as**, in a sentence, and a league that hasn't exported yet gets told that rather than a page that doesn't exist. **Progression splits risers from fallers** instead of handing you one list to sort yourself, shows who is about to fall off the age cliff, and breaks the movement down by club so you can see where it came from.
- Open Every room in the app.
- The ratings, Team archetypes and Progression all open in it.
- Three tabs, one room.
The four rooms that aren't about a game anybody played — they're about the league as a thing being run. **Help leads with a person.** The topic list answers "how do I do X". It has never answered "I did X and it didn't work", which is the only question anybody actually brings to a help page — so the way to reach somebody who can look sits at the top of the room now, above the search. The topics are still there, searchable, and a 2K league gets the basketball set rather than answers about exports and kickoffs. **The pulse draws itself.** The number, the last thirty days of it as a chart, and a bar for each thing it's made of, so you can see which part is dragging it down rather than just that it went down. **HQ Certified says which tests are failing**, by name, not just how many. **And the arcade boards show this league and the whole site**, side by side — best run at each game, most head-to-head wins, and the QB careers.
- Open Every room in the app.
- Help & How-To, League Pulse, HQ Certified and Arcade leaderboards all open in it.
- Four tabs, one room.
The class and the big board were two different pages on the website, which is most of the reason hardly anybody built a board: the list you take into the game was made somewhere other than where you read the class. **The star is on the prospect card now.** Tap it and he's on your board; tap it again and he's off. **Sort the class by position, or find a man by name** — and the filtering happens before anything reaches your phone, so a four-hundred-man class opens as fast as a ten-man one. **Your board reorders with one thumb.** Move somebody up, move somebody down, drop him, or fill the top thirty from the class order and work from there. Anybody already drafted is struck through with the club that took him. **The order tells you who picks when and what they need** — including the picks that have been traded, and who actually holds them now. **And the recap grades the last draft** against the slot every rookie was taken at: the steals, the reaches, and every club's class.
- Open Every room in the app.
- Draft board, My big board, Mock draft and Draft recap all open in it.
- Star a prospect from the class — it's the same board.
The three things you do in a league that aren't football: decide something, call the week, climb. All three were web pages in a frame; they're one screen with three tabs now, and everything in them is tappable. **Vote on a poll, call every game on the week's card, and spend a level for a star — from the phone.** **A live poll still won't show you the board until you've voted.** That's always been the rule on the site, and it's a real rule now rather than a polite one: the counts aren't sent to the app at all until you've had your own say. Seeing the board first is how a vote turns into a bandwagon. **Pick'em tells you how you did without you having to work it out.** Your call sits on each game, a final says whether you had it, and the week board and the season board both carry the hit rate. **The Ladder shows your bar to the next level** — how much XP is left, what the next rungs buy, and who is top of the league. If you're at the prestige line, the star is one press.
- Open Every room in the app.
- League polls, Pick'em and The Ladder all open in it.
- Swipe between the three tabs — it's one room.
Three of the last pages that opened in a frame. They're one screen with three tabs, because they're one question asked three ways: what has this club actually got to work with. **The contract board opens on the deals running out**, filters by your club, by position or by name, and tells you which clubs have the most coming up. **The pick chest is one club at a time.** The website draws all thirty-two grids at once, which is a wall on a phone. This opens on yours — picks held, where you stand against the club that started with the same chest, and every pick that came in or went out with the club it came from. **And the filtering happens on the server.** The website sends a browser every signed contract in the league and lets it sort them in place; that's seventeen hundred rows down a phone for a list of twelve. The app asks for the slice it's showing. **Fixed: a room opened from a notification said "sign in first" to somebody who was signed in.** Open the app straight onto a room — from a push, a link, or just leaving it on that screen — and it asked the site for the page a fraction of a second before it had finished reading your session, got turned away, and then sat there. It waits now, and loads itself the moment the session lands.
- Open Every room in the app.
- The contract board, Draft capital and Attribute points all open in it.
- Swipe between the three tabs — it's one room.
Open the Book tab on the phone and it said *"No board yet — the Book isn't set up for this league yet,"* on leagues with a full board of spreads, totals and player props sitting right there on the website. The screen was fine and the lines were fine. The app asks the site for the page and then reads the answer out of it, and when the request comes from the app the answer arrives in a different envelope than the one it was opening. It opens both now. **The board, the spreads, the totals, the player props, the read on each line and the edge all reach the phone.** **Fixed: a slip you locked could vanish off your own screen.** Lines go up for the week that's about to be played, but the week counter only moves when the export of the week just finished lands — so from Tuesday until kickoff your legs and your ticket were filed under a week the screen wasn't looking at. You'd lock six figures, come back, and the parlay station would be empty as if you'd never bet. **Your open ticket now rides at the top of the board wherever it sits, until it's graded.** **Fixed: a locked ticket said "To win —".** It knew the stake, it knew the legs, it just couldn't find the multiplier for the number of legs you'd played. Every ticket now shows what it pays.
- Open the Book tab in the app.
- Tap over or under on any line.
- Set a stake and lock it — the ticket pins itself to the top until it grades.
Every ticket it ever took money for, across every season — and it asks the **ledger**, not the ticket, whether the money actually moved. Those are two different claims and only one of them is cash. It finds three things: winning tickets the ledger never paid, slips whose legs are all graded that nothing ever settled, and tickets that can never be graded at all because a leg's game was never filed. **Paying is one press, and pressing it twice pays once.** **A refund is not a payout**, so handing back the stake on a ticket that can never be settled is a separate decision a commissioner has to make on purpose. Guessing what it would have won is the one thing a book must never do. **Fixed: a slip left open when a season rolled over was never looked at again.** The pass that grades and settles only ever swept the current season, so anything still open when the league moved on stayed open forever, with the stake taken. It sweeps everything now — which also means most of the backlog above clears itself. **Fixed: the Arcade wouldn't take a stake out of your bank.** Bets, the Casino and the store learned that yesterday; the Arcade was missed, so a challenge you could plainly afford came back "not enough" if your cash happened to be at zero. It's a flag on the one place money moves now, rather than something each feature has to remember. **And the site owner can now check, on a page, whether Apple's reviewer can actually sign in** — before another review cycle is spent finding out. It never shows the code; it says whether the account is usable and which setting is wrong if it isn't.
- In Discord, run /book-audit.
- It names every ticket and every person owed.
- Press "Pay what's owed" — or add refunds:true first to also hand back the stuck stakes.
They never stopped; they'd only ever been built for the regular season. The moment a league reached the Wild Card round, every game channel the bot opened sat there and never got a card, because a playoff game's stats are filed in a different place and nothing was looking there. From the outside that's identical to the feature being broken. **Now a recap reads a game's stats from wherever that game actually lives.** Post the final, the stats land, the card posts in the channel — same as it always did in the regular season, all the way to the Super Bowl. **And the card says which round it was.** It used to print "REGULAR SEASON · WEEK 20" on a Divisional game, which is two wrong things at once. It names the round now: WILD CARD, DIVISIONAL, CONFERENCE, SUPER BOWL — worked out from how many games are in it, so a league with a shorter season gets it right too. **The same bug had a quieter twin on the website.** A playoff game has had its own page since build 323, and that page has been opening with an empty box score ever since, for exactly the same reason. It's full now — performers, team stats, the drive numbers, the props on that game. **A streak carries through the bracket.** A recap used to count a team's third straight win as its first, because the Wild Card game it had just won was invisible to the count.
- Play the game and export.
- The recap posts itself in the game channel.
- Or run the channel-refresh command to pull the week's cards immediately.
Polls and Game of the Week always had buttons. Nothing else did, so the bot could only ever hand you a link and hope you'd go and sign in. **`/vote` lists every vote that's open to you and lets you cast it right there**, without leaving the chat. Five names or fewer gets buttons; more than that gets a menu. **It is the same vote.** One row, one tally, one rule about who's allowed to cast it — vote in Discord and the site already has your answer marked when you open it, change it in either place and it's still the one vote you have. Nobody can vote twice by using both. **The counts stay off the card until you've voted**, the same way polls work: seeing the board first is how a vote turns into a bandwagon. You get the running total back privately the second you press one. **And a card still works after the bot restarts.** Buttons on an old message used to die permanently — the league is looking at a card that answers "this interaction failed" forever. This one carries everything it needs to count your vote whenever you get round to pressing it.
- Run /vote in Discord.
- Press a name, or pick one from the menu.
- Change your mind any time while it's open.
The board asked two different questions about whether a line was still takeable. The buttons asked the right one — open, ungraded, game not played. The page asked a second, stricter one, and either half of it could switch off **every button at once**: it wanted a status the export usually leaves blank, and it wanted the line to be in the newest exported week. When it said no, the whole board greyed out with no reason given, which is why this looked like the site was broken rather than like a rule. There's one question now, and it's the button's own. **Your stake comes out of your bank when your cash is short.** Place a bet, spin something in the Casino or buy from the store with less cash than it costs, and the shortfall is taken from your bank automatically — same account, your own money. **It never borrows**: if the two together still don't cover it, it's refused, and the refusal now tells you what you have in each. The ticket says how much came out of the bank, so nothing moves quietly. **Fewer steps to get a bet down.** Quick stakes — 10%, 25%, 50%, ALL — so nobody types a number. The "your balance looks low" pop-up is gone: it asked a question whose answer was always yes, and the bank covers the gap anyway. The real check happens where it always did, on the server, against your real balance, at the moment the money moves. **And signing in is no longer a dead end.** A live line you're signed out of used to render as a greyed-out button that did nothing, with the only sign-in prompt buried below the whole board. It's a door now — same shape, same place, marked SIGN IN. On a 2K league's Book the sign-in button pointed at a page that doesn't exist and returned a 404. It doesn't any more.
- Tap the side you want on any live line.
- Pick a quick stake, or type one.
- Lock it in — if your cash is short, your bank covers the rest.
Look a single man up in Discord and you get a picture instead of a block of text: his portrait, his overall, his badges or abilities, his key ratings and his contract, all on one card you can drop in a trade thread. Search a team or a position group and you still get the list — that format isn't going anywhere. **It's set in the same two typefaces as the website and the app**, and painted in the same palette, so it looks like it came from here and not from a generic card maker. **Ratings are bars, not a traffic light.** A colour-coded grid can't be ranked by eye; a row of bars can — you see the shape of a player in about a second. Gold is kept for a genuinely top-of-the-league rating and amber for a real hole, and nothing else on the grid is coloured at all. **And it carries the things only this site knows about him**: what he's worth in a trade, how much upgrade headroom he has left, whether cutting him frees money or costs you money, and — for a defender — his processing score and whether he's fast for his position. **Nothing is invented to fill a gap.** A free agent's card has no contract panel. A 2K player's has no college or years-of-service cell, because a 2K roster doesn't carry them. "Normal speed for a linebacker" is the answer when there's nothing to say, so it isn't printed.
- In Discord, run /ps with one player's name.
- Search a team or a position group instead to get the list.
- Every number on the card is the same number this site shows on his player page.
2K has no export. Nobody is ever going to send this site a file, which means the box score on your screen **is** the record, and every 2K league runs on somebody photographing it. The steps were written down on the page; they had never been shown. **Ninety seconds, one real game.** Pick the two teams and the in‑game date, press box score, hand it the screenshots — as many as you need, up to six, because the console shows one team at a time. It reads every line back and checks the columns against the printed team total. Then it sits there: **you cannot confirm your own game.** The other owner opens The Court, sees the read, and presses Confirm — or presses Backwards if the two teams came out the wrong way round, and the score turns with them. The moment he confirms, the standings, the leaders, the record book and the box score all move. **The clip is on the page it explains**, and in every 2K league's how‑to.
- Log a game — away team, home team, the date your game showed.
- Press box score and pick your screenshots.
- Your opponent opens The Court and confirms it.
Madden's export sends a cap figure in one of two units — either plain dollars, or in ten-thousands — and **both turn up in real leagues**, sometimes on different teams of the same one. Half this site multiplied by ten thousand and half read the number as it arrived, so each half was right about one kind of league and wrong about the other. That's why the contract board had Travis Kelce at **$489**; on the other kind of export the player card was quietly turning an $18.2M hit into $182 billion. **There's one reader now and every page uses it.** It works out which unit a figure is in from its own size — the two are four orders of magnitude apart, so there's nothing real in between — and hands back dollars. Fifteen places that each had their own opinion now ask the same question: the contract board, the cap room, the trade block, the trade builder, the player card, the player table, the roster CSV, the free agency class, the front page, the arcade and the storylines. Salary, bonus, release penalty and net savings were all wrong the same way and are fixed the same way. **The draft class can finally be worked.** It was three hundred cards in rank order with no way to ask *who are the corners* — a document, not a board. **Search it, filter it by position, and sort it** by board rank, name, position, school or combine score. **And you can build your shortlist while you read it.** Tap the star on any prospect and he goes on your big board — the same board that already existed, and the same one the bot reads back to you when you're on the clock in Madden. It was on a different page to the class the whole time, which is most of the reason nobody built one. **Shortlist only** filters the class down to the men you starred.
- Open the draft board.
- Pick a position, or search a name.
- Tap the star to put him on your big board.
Build an offer, work the block, read the log, search every player, put two of them side by side. Five more rooms out of the frame. **The builder asks who first.** The website hands your browser every tradeable player in the league and lets you filter down to two rosters — right on a monitor, wrong in your hand. So the phone asks who you're trading with, and from then on it only ever holds the deal: your side, their side, both sets of picks, and a running read on whether it's fair. **Nothing is priced on the phone.** The values you see are the site's, and **the site prices every piece again the moment you send** — under your league's own pick chart. A number that changes on submission is what makes a trade builder impossible to trust, so there is exactly one pricer and it isn't the app. **The block leads with what fits you.** Forty names is a shelf; the four that answer a hole on your own roster are the reason to open it. Tap one and the builder opens already pointed at that team. Listing your own man is two taps and everybody sees it immediately, in Discord and in a browser. **The player list is seven columns and no column picker** — name, position, team, overall, age, dev, value. That's what fits a phone; thirty columns wants a desk. Search and position filters are the site's own, so a column added there shows up here on the same deploy. **And the comparison hands down the site's verdict**, in the site's words, so Discord, a browser and your phone all describe the same gap the same way. **None of this replaces Discord, and there's now a test that says so out loud.** Every one of these rooms reads; every write — a bet, a purchase, a loan, a trade offer, a block listing — goes to the same route the website posts to and the bot's own commands reach. The board of props and spreads, taking an over/under, locking a slip: all still exactly where they were. **If you never open the app, you lose nothing.** That's a promise the build now fails on if anybody breaks it.
- Open the app.
- Every room, then Trade Center.
- Pick who you're trading with, then tap the pieces.
Every code this site mails you is six digits, so the box was built to hold six and the button refused anything else. That was quietly wrong — not every code that opens this door is a mailed one, and a box that stops at six characters doesn't fail, doesn't log anything and doesn't tell you why. It just doesn't take the keystrokes. **The field accepts a longer code now**, and the button turns away only what's too short rather than anything that isn't exactly six. The label stopped promising six digits, and the app stopped telling you to go and check your email before you've been sent anything.
- Open the sign-in page.
- Enter your address.
- Type the code you were given.
The Hall of Fame, the all-time record book, your league's own record marks, players of the week and the crests. Five more out of the frame — and these are the five worth having in your hand, because they are the ones you show somebody rather than operate. **The Hall opens for anyone**, signed in or not, exactly as it does on the site. It is the page a commissioner sends to a man he is recruiting, and a door that asks a stranger to sign in first is a door he cannot send. Every inductee comes with his citation and the vote that put him there. An open ballot sits at the top while it is open — a vote nobody knows about is a vote that closes with four entries in it. **Three different memories, and they stay three different rooms.** *League records* is Madden's own marks off your exports. *The record book* is the one built to survive every season reset, and it says whose book it is. *The Hall* is a vote and nothing automatic at all. Putting any two of them on one screen would have quietly hidden one. **The record marks lead with who's on pace.** Everything else in that room already happened; the watch list is the man who might do it *this* season, and it's the only part anybody can still affect — so it goes first, with how far along he is. **Players of the week gives the newest week the whole page** — faces, the line, the team — and lets the weeks behind it be cards you scroll past. It's read the day after the sim and almost never again. **And the crests lead with what you haven't got.** Forty-five badges in a list is a museum. The handful that are rare, that somebody else in your league holds, and that you don't — that's a thing to go and do. Opening the room still earns anything you've newly qualified for, same as the site, so which device you happened to open never decides whether an unlock landed.
- Open the app.
- Every room.
- The Hall of Fame, League records, The record book, Players of the week or Achievements.
The economy, the bank, the item store, the casino and the daily spin were all web pages loaded inside the app. All five are real screens now, and each one leads with the thing you opened it for. **The economy** puts your own net worth and your rank at the top and the league table underneath, with the four people who actually moved this week pulled out — in a league of thirty, that is the only part worth reading twice. **The store** shows what you are already holding before it shows you the shelf, and says plainly whether you can afford something instead of letting the till say no. **The bank** leads with your credit score, your rate and what you can still borrow; asking still goes to your commissioner, and nothing moves until he says so. **The casino** keeps your cash pinned at the top, because it is the number every other decision on that screen depends on. **The spin** shows the real odds of every wedge — the same list the wheel actually picks from, because there is no second table anywhere. **The balance is read from where the money actually is.** If your league's economy lives on the site, every figure on these screens comes off the ledger — the same rows a purchase and an upgrade take from — rather than the last copy the bot pushed over. If your league still runs its money in Discord, it reads the push and **says so on the screen**, so a number that can be two minutes behind never pretends to be live. **Not one coin moves in the new code.** The stake, the cooldown, the credit tier, the stock limit, the payout table and the odds all stay exactly where they were, and the phone asks the site the same way the browser does. So a phone cannot win a hand the website would have refused, and a rule your commissioner changes on Tuesday is the rule your phone plays by on Tuesday. **And opening the bank still settles the whole league**, not just whoever is reading — moving the room to a phone was not going to become the way to skip a payment.
- Open the app.
- Every room.
- The Economy, The Bank, Item store, The Casino or The Daily Spin.
The app has always been able to open any room in your league. What it did with most of them was load the website inside itself — which works, and which feels like exactly what it is. **Five of the rooms you actually open on a game night are built properly now:** the playoff picture, roll call, the opponent gameplan, head-to-head and the injury report. **They are not the web page shrunk.** The **injury report** puts your own squad at the top, because that is why you opened it — you are looking for a hole to plan around, not browsing the league's misfortune. **Head-to-head** is one row instead of the grid: your record against every other manager, and a tap to read somebody else's. The grid is a trophy cabinet on a monitor and a thousand unreadable cells on a phone. **The gameplan opens on whoever you play next** without being asked, and leads with the verdict — *attack on the ground*, *their left tackle is the soft spot* — with the numbers underneath, because a man checking his opponent on the way to the console has thirty seconds. **Roll call** leads with the people worth a message and lets everyone who is fine be a quiet line. **The playoff picture** says out loud when the odds engine is still locked and which week it opens, instead of showing less than the browser and looking broken. **Every number on all five is the website's own.** Not a second calculation that agrees this month — the same function the page renders from, so the two can't drift apart. **And one thing got stricter on the way.** An absence you asked to keep private now has the typed reason **removed on the server** before it is sent to anybody but your staff. It was already hidden on the website; now it never leaves the building.
- Open the app.
- Every room, or the menu.
- Injury report, Roll call, Gameplan, Playoff picture or Head-to-head.
An upgrade in most of these leagues costs an item, and Franchise HQ has always shown you what you are holding. It was reading the wrong shelf. That panel took its number from the last inventory the Discord bot pushed over, which was right for every league until the economy moved onto the site — after which the bot's copy is a record of a store it no longer keeps. So an item you bought here, or one your commissioner handed you from the site's own item admin, was not in it: the panel said **nothing in your inventory yet** to somebody looking straight at that item on the store page. And the number could never move when an upgrade spent one, because the spend came out of one place and the panel was reading another. **It reads the ledger now** — the same rows the store page shows you and the same rows the spend comes out of. Ask for an upgrade and one is **held**, marked committed so the same token cannot be promised twice. The moment your commissioner marks it applied it is **gone**, and the number you are looking at says so. Leagues whose money still lives in the bot are untouched and read exactly as they did. **And the desk has stopped crying wolf.** A commissioner who pressed Done watched the upgrade drop straight into a red panel on his own desk headed *marked done, but the export disagrees* — accusing him of skipping an edit he had had about one second to make. The site cannot know whether an edit landed until an export arrives, so until one does the row now reads **next export checks it** and says nothing else. Once an export HAS landed and the rating still has not moved, that is a real miss and the panel is there for it. A warning that fires every single time is a warning nobody reads, which costs you the one time it mattered. **Both of those screens are in the app now too** — Franchise HQ → Upgrades to ask, The Desk to decide, on a phone.
- Open Franchise HQ and press Apply an upgrade.
- Send one, spending an item.
- Watch your count after the commissioner presses Done.
An upgrade is the most phone-shaped thing this platform does: you decide about your own player in thirty seconds, and a commissioner decides in ten. Both needed a browser until now, which is why both kept happening in Discord instead — and a rule enforced by somebody remembering it is not a rule. **Your own screen** carries your roster and nobody else's, every rating that can be raised with the number it reads today, the items you are holding, and what you have already asked for. **The Desk** carries what is waiting, who asked and for whom, and the number the player carries in the Madden menu right now rather than the number he carried when the request was made — plus a tab for what was marked done that the export has not confirmed. **Nothing is decided on the phone.** The item cost, the cap on one player, the cooldown in your league's own weeks, the attribute ceilings, what a 2K league may ask for — every one of those stays in one place and the app asks the site for it, so a rule your commissioner changes on Tuesday is the rule your phone enforces on Tuesday. A member who opens the desk is turned away rather than handed an empty queue, because an empty queue is a promise that nothing is waiting.
- Open the app.
- Franchise HQ, then Upgrades.
- Staff get The Desk in the same place.
There's no password on this site — every way in needs either a Discord account in somebody's league or a code mailed to an inbox, and Apple's beta reviewer has neither. So there's a single review account, configured from three settings, which exists only while it's needed and switches off the moment it's unset. **The trap was that it fails silently, and it was designed to** — nothing is configured in anybody else's deployment and nothing there should be special. But that made a code one character too short look **exactly** like a working account: three settings sitting there looking right, and a rejection days later for the same reason as the first one. **Now it reports at boot**, in one line: active and which league the reviewer is seated in, or not active and precisely which of the three is wrong — a code that's five characters when it needs eight, an address that will never match, or a league name that isn't a league here. **The code itself is never printed**, and neither is the whole address; a deploy log is not a place to keep a secret. Try it: the deploy log
- Open the deployment.
- Read the startup lines.
- One of them is about the review account, or there isn't one because nothing is set.
A commissioner marks an upgrade **Applied**, the item the member paid with is supposed to come out of his inventory, and **it wasn't.** The desk said it had; the number never moved; the item could be spent again, traded, or sold an hour later. **Fixed.** The burn is one instruction sent from the upgrade desk to the economy, and the two halves had been calling the same thing by different names — the desk has always said `item_name` and the economy was looking for `item`, so it went hunting for an item with no name at all, found nothing, and gave up. It only ever broke in leagues whose **money lives on the site** rather than in the bot, which is why it survived: the bot's own half was reading the right name the whole time, and the bug arrived the day the economy moved. **A miss now says which item it couldn't find**, by name, instead of "no such item" about something you can see in your own store. **If yours didn't burn, you can put it right without touching anybody's inventory by hand:** open the upgrade and press **Applied** again. The request already says applied, but the burn never recorded, so pressing it now runs the one that failed. It cannot double-charge — an upgrade that already burned its item refuses to do it twice, and that guard is older than this bug.
- Open an upgrade that was applied with an item.
- Press Applied.
- Check their inventory — it's one lighter.
Every page of a basketball league carried **seven mentions of Madden** before anybody scrolled — the browser tab said *the franchise hub for your Madden league*, and the card that appears when a commissioner pastes his league into Discord to recruit led with a game his league doesn't play. **Both say NBA 2K now**, and the share card describes what a 2K league actually is: it builds itself from a photo of the box score. **Advanced analytics has left the 2K menu**, because every number on it is football — passer rating, yards over expected, a deflection-adjusted completion percentage — and a 2K league opening it got an empty page in a vocabulary it doesn't use. Its real equivalent was already one line above it: **the four factors, offensive and defensive rating and pace, on the ratings page.** The page now says that in a sentence instead of rendering blank. **Sync & EA Connect and Load a draft class are gone from the 2K admin menu** — there is no Companion App and no EA Direct Connect in a basketball league, and nothing on either page it can use; **2K Rosters** is where both of those jobs live. And the last few **"Super Bowl"s have gone**: the Exchange tile, the weekly show's champion card and its free-agency board all say **the Finals** now. Scheduling a game asks for a **tip-off**, not a kickoff.
- Open a 2K league.
- Look at the browser tab.
- It knows which game you play.
Press **Tour** on any page and the site talks you through it. That has been true for a hundred and twenty-three pages and quietly untrue for sixteen — the Arcade, Drive Architect, the arcade boards, the contract board, draft capital, HQ Certified, League Pulse, the show, the Tape, the three room fronts, and four staff pages. Those fell through to a three-word generic card, which on a page like the clip desk teaches nothing at all. **Each one is written now**, to the same rules as the rest: explain the thing rather than the button, say where the numbers come from, assume you have never used a site like this, **say plainly what is safe**, and finish by naming one place worth going next instead of listing nine. Some of what they say is worth knowing even if you never open a tour. **The Arcade's stake can be zero** and both players still get a first-play-of-the-day bonus, so the loser walks away up. **Drive Architect's career follows you, not your team** — reading a defence is your skill — and your browser never holds the right answer, which is the only reason its leaderboard means anything. **The contract board flags the rows that are actually a warning**: a deal running out on a team that just changed hands, because the man who took over in week 12 could not renegotiate anybody. **Draft capital labels a pick's slot a projection**, because that is what it is. **HQ Certified can be lost** — it is recomputed every time anyone looks — but never over one bad week, and only your own staff ever see "at risk". **A clip with no game on it isn't broken**: the site refused to caption it with a fixture it was only guessing at, and the clip desk is where you tell it.
- Open any page in your menus.
- Press Tour.
- It explains that page, not the site in general.
The Find box (the 🔎 button, or just press `/`) builds its list from the menus, so it knows every page on the site. Except three: **a tab's own destination was never indexed**, only the pages in its dropdown — which meant **My Team, the team list and league home**, the three most-opened pages here, were the three Find could not take you to. Typing *my team* returned everything except My Team, and the empty box's shortlist of "where most people go" leads with *my team* and had nothing to match it against. **All three are in there now**, and a page still keeps the name its own menu gives it. Behind that, a sweep of the whole test suite — 303 files — and a clear-out of thirteen standing failures. Almost all of them were the suite describing a decision the site had since improved on: the hot seat was rewritten in build 248 so a **fair sim counts against both owners** (the man who won the coin flip didn't turn up either) and the test still described the old sim-losses-only rule; a quarterback's key ratings were rebuilt in build 281 around stamina rather than change of direction; the cosmetic frames became franchise art in build 265; the league switcher moved into the masthead so it can say *which* league you're in with one league or five. A few were genuinely stale plumbing — the keep-alive clock reads **refreshed_at**, not *updated_at*, and a test driving the wrong column made every EA session look stale. **One was a crash**, not a failure, which is the version nobody reads the output of. And one could only ever have passed on the day it was written: it pinned the bot's build stamp to that build's wording. Try it: press `/` on any league page
- Press the `/` key.
- Type *my team*.
- Press Enter.
**On Scores, a sideways drag changes the week.** The week chips are still there and still do the whole job; the drag is the shortcut, for the hand already holding the phone. **On the Wire it moves between your league and the Network. On League TV it moves between the guide, the clips and who streams.** One meaning per screen, chosen from what that screen is about — two competing horizontal meanings on one screen is how a gesture turns into a coin toss. **It follows your finger rather than waiting for a flick**, and it rubber-bands at the first and last week, which is how a phone says *that's the end* without a message. Each step buzzes. **The things it deliberately won't do are the point.** It never takes the drag from the edge of the screen, because that one belongs to iOS's back swipe. It stands down the moment a drag is more up-and-down than sideways, so scrolling a long list never snags on a page turn. It stands down entirely on League TV's clips row, whose content is itself a sideways scroller. **And the Stats screen didn't get it at all** — its category and week rails already own that direction, and a gesture that breaks the controls it's sitting on is worse than no gesture. **Nothing here is ever the only way to do something**: every screen that took the drag kept its buttons, which is what matters if you use Switch Control, Voice Control or a keyboard. **It tells you once it's there, then shuts up** — the hint disappears the first time you actually use it and doesn't come back. And if you have motion reduced, you keep the change and lose only the slide. Try it: the SapphireSportz app
- Open Scores.
- Drag the list sideways.
- You're on the next week.
Until now, tapping League TV in the app opened the website inside the app — the nine-player wall, on a phone, as nine postage stamps. **The wall is the wrong shape for a phone and always was**, so the app ships the two parts a phone is actually better at. **Who's on right now** sits at the top, one card each, big enough to read across a room: the stream's own title, the viewer count, and the club that owner runs. **Tapping it opens Twitch** — the real Twitch app, with the chat, picture-in-picture, AirPlay and the account you're already signed into. A player squeezed into the app would have been a worse Twitch with none of that. **Underneath is the guide: what's on this week.** Every fixture with the projected line, both owners by name, when they've said they can play, who's away, and the game of the week — and that list reads better on a phone than it ever did on a monitor. Tap one and you're in the box score. **Clips run sideways**, each one captioned with the game it came from *only when the site can prove which game it was* — a clip labelled with the wrong fixture is worse than one labelled with nothing, because you'd have no way to tell. **And the third tab is who streams in this league at all**, live or not, which is what somebody deciding whether to join actually wants to see. If your own channel isn't on it, there's one line to fix that. **It keeps itself current without you pulling down on it.** While the screen is open it asks who's live every forty-five seconds and asks nothing else, so the guide and the clips stay put. **Neither half of it ever calls Twitch** — both read what the bot already collected — because a screen that polls, on every phone in every league, must never be able to put a league's go-live notices under load. **And nothing about a person leaves the phone's reach**: the app gets the same public fields the website's public page gets, and no more. Also fixed: the site's own check that every page has a link pointing at it had been reporting a false alarm for several builds, because it read code comments as though they were links.
- Open League TV from the rooms list.
- Tap whoever's on.
- It opens in Twitch.
Open Weekly awards in a basketball league and you were offered a **Special Teams Player of the Week**, with a page underneath it reading passing, rushing, receiving, defence and kicking — five kinds of stat a 2K league has never filed one of. So it wasn't only worded wrong; **it could never fill in.** There are five basketball awards there now: **Scorer, Rebounder, Playmaker, Stopper and Stat Line of the Week**, worked out from the box scores you've already put in. **None of those five is called anything Madden calls anything**, in either direction, so a record book that runs both games never has two trophies wearing one name. **The Scorer award counts what the points cost** — 28 on 15 shots beats 30 on 30, and a board that said otherwise would teach a league to chuck. **Playmaker is assists net of turnovers**, because fourteen and nine is not a night running the game. **Stopper is a judgement and says so**, with the weights it's judging on printed right on the page, the same way the football one always has. **Stat Line of the Week is the whole night, not the biggest number** — a 22/11/10 can win it over a 38-point evening. **A man who only exists in a box score can win one**, which matters here because half a 2K league is CPU and a created player has no roster row to be found on. **The money and the attribute points follow your sport's own awards**, so what you set a Rebounder to pay stays a Rebounder payout forever. Also: **the Exchange stops offering a basketball league football trophies** — asking it for Offensive Rookie of the Year now gets an honest no instead of the MVP board wearing the wrong name. **Season honours has left the menu in Madden leagues**, where it was only ever a dead link; it's still exactly where it was in 2K. The upgrade desk asks a 2K league for a **Dev tier** rather than a *development trait*, which is a thing 2K doesn't ship. And **the app's Scores tab is a basketball when you're in a basketball league.**
- Open Weekly awards from the admin menu.
- Pick the week.
- Take the site's picks or choose your own, then publish.
Everything on this platform sits downstream of an export — the standings, the book, the recap cards, the wire, the game channels — and starting one meant being at a desk. **It's a screen in the app now.** One button that says what it does, then a real bar with the words underneath it: *Rosters, 12 of 32*. **It keeps going if you leave.** The import runs on the server, the phone is only watching, and the screen says so out loud — because the instinct with a progress bar is to stand there holding it for four minutes. **A bar that hasn't moved gets a reason:** one league imports at a time across the whole platform, so *"two leagues ahead of you"* is a different feeling from a bar that's simply stuck, and it costs one sentence to tell them apart. **Tapping it twice doesn't import twice** — a phone is exactly where a double tap happens, and the queue hands back the ticket you already have. Your phone buzzes when it lands. **Members can watch too**, without the button: *why are the standings wrong* is a member's question and *an import is running, it's 60% through* is the answer. What a member doesn't get is the franchise name or the failure note. **The one part that still needs a desk is the first connection** — EA's sign-in has a console prompt in the middle of it — and the screen says that in plain words instead of showing a button that can't work.
- Open Sync from the rooms list.
- Pull it now.
- Close the app — it'll be done when you come back.
A commissioner reported that making game channels for a week gave him **a few fixtures from last season along with this season's**. He was right, it wasn't the bot, and "a few" is the clue. Every fixture is filed under its league, its week and the ID Madden gave it — and **Madden hands out fresh IDs every season**, so a new season's week 1 never landed *on top of* last season's week 1. It landed **beside** it. Anything that asked for week 1 got both, and the handful of IDs that happened to repeat did overwrite, which is why it looked like a glitch rather than a whole duplicate season. **Every fixture now knows which season it belongs to**, and the moment a new season's export lands, the one before it is retired. **Leagues already carrying two seasons are repaired on the next deploy** — the season was always written on each fixture, nothing was ever asking — so you don't have to re-export to get a clean week. **And it isn't only channels.** The same pile decides what week your league is on: one unfinished game from a season somebody abandoned could pin a league on that week no matter how far it had actually got. It can't now. Playoff rounds are covered too — last year's Wild Card and this year's share a week number by design, and a commissioner making Wild Card channels gets this year's. **The cleanup is careful on purpose:** a fixture that doesn't say which season it's from is never touched, a league with one season on file loses nothing, one league's cleanup never reaches another's, and a single stray fixture claiming a season that hasn't happened can't take a real one with it. Also fixed: **Team archetypes returned "not found" for a league that hadn't exported yet** — the league exists, it just has nothing in it, and the page already had the right words and a link to the export that fills it. A page that says what to do next keeps you on the site; a dead end sends you back to Discord. And one bad timestamp in a league's mirror could take the upgrades page down outright — a column says it holds a number, the database will store whatever it's given, and the reader now copes instead of crashing.
- Run an export for a new season.
- Make game channels for week
- You get week
- Just week 1.
Tapping **Accept** on a trade committed it. First touch, on a list that had just scrolled under your thumb, no way back — which is the single most likely input error there is on a phone. **Now it asks, and it asks properly:** *"Accept this trade? You take Amari Cole and give up a 2027 2nd. It goes to your commissioner from here, and you can't pull it back."* The button says **Accept the trade**, not OK, because on a two-button box "OK" is the one word that tells you nothing about which one you're pressing. Same for declining, withdrawing, approving and killing a deal — and the ones that end somebody's offer come up red, which is the phone's own way of saying this one takes something away. **Voting deliberately doesn't ask**, because you can change a vote until it settles, and a box you learn to dismiss is a box that stops protecting the thing two lines above it. **Your phone now buzzes differently for landed and refused**, so you know which one happened without reading. **And every row, chip and tab is at least 44 points tall** — a list row was 39, and the four points you were missing by are the difference between opening a player and opening the one underneath him. On the site: taking a tape off a game now tells you how many marked moments go with it before you do it. Try it: the SapphireSportz app
- Open Trades.
- Accept something.
- It tells you what it costs before it does it.
Five places on the site still popped the browser's own **alert** or **confirm** box — the unstyled grey one with OK and Cancel, which on a phone is a box your thumb dismisses before you've read it and which an installed app can suppress outright. **They're gone.** Cancelling an arcade challenge, wiping your Drive Architect career and sending a broadcast to every league now ask properly, with a title that says what's about to happen, a body that says the consequence, and a button that says the actual action — *Start over*, not *OK* — and the two that just reported a problem now write it onto the control you touched instead of over the whole screen. **The Exchange in a 2K league's menu said "Super Bowl, MVP & the awards."** The markets behind it were always the right ones; the words were football, on a basketball league, where anyone would read it as broken. It says champion, MVP and scoring title now. **Six dropdowns had no name a screen reader could announce** — the team picker in the 2K admin, the rung filter, the show's week and music pickers, the waiver drop list and the build switcher — all named. And the waiver claim box was set to hide and to lay out at the same time, which meant the hiding never won; it closes now.
- Claim somebody off waivers.
- Pick who comes off.
- The box closes when you're done with it.
There's a rule this whole codebase is built on: one file failing to upload must never take the site down. It's why a missing feature prints a loud line and keeps going instead of crashing on boot. **Two files were quietly breaking it** — and the one they depended on was billing, which is the worst possible choice. A missing store means nobody can pay today; a site that won't boot means **nobody can play tonight**, and the export door your league pushes into is part of what goes with it. Both now let that import fail and carry on, and the paid pages **refuse out loud** with the actual reason rather than quietly reporting everybody as unsubscribed — a wrong "your league is unpaid" is worse than an honest "that page can't load right now." Also fixed: the panel that explains *why* a page is empty was crashing on its own timestamp for some leagues and being silently swallowed, so the page rendered with the explanation — the only part of it anybody needed — missing.
- Open an empty economy or fantasy page.
- It tells you what's actually wrong.
- And what to do about it.
Yesterday's build stopped the bot announcing all sixteen finals the same way. Run against a real week — the last Sunday of a regular season, nine of its sixteen games decided by a touchdown or less — **exactly one of them made it to Discord.** A division game that came down to a two-point finish scored the same as a comfortable eight-point win, because "one score" was one flat number from one point all the way to eight. That's the scale saying the last drive didn't matter. **It's graded now.** A game decided by a field goal or less is its own thing and outweighs a one-score game that wasn't really that close, and the post says which it was — **A FIELD GOAL DECIDED IT** rather than just ONE SCORE. On that same week it takes the announcements from one to three before the line is even counted, and the games it adds are the two-point and three-point division games in the week that sets the bracket — which is what anybody would have picked out of that slate by hand. **A level game counts as a finish too**, and 0–0, which is no football at all, still scores nothing.
- Play a week.
- The games that came down to the last drive post with the reason.
- The rest are on the ticker and in their own game channels.
They were three web pages loaded inside the app; they're one screen with three tabs, because they're one question asked three ways — **who's having the best season: by a number, by the argument, by the club.** Leaders opens on passing with every category a tap away and **a week picker that means that week alone** — who threw for the most in week 3, not the season up to it. Each row says the man, his club, his games and **the number the board is actually ranked by, named**, because six numbers in four-point text with no label is a table nobody reads on a phone; the full sortable version is one tap away on the site. The MVP tab carries **the case, not just the price** — the argument for each man alongside his odds, since a number with nothing behind it is the opposite of what an MVP race is for — and when the season's too young for a race it says how many games it takes instead of drawing an empty board. The power tab is the league by SRS with each club's record and its offence and defence ranks, and **row one is rank one all the way down** — the site's rankings page once sorted by one calculation and stamped ranks from another, and a table whose first row isn't ranked first is a broken table. **Switching category doesn't re-send the MVP race**: the frame and the board are asked for separately, so tapping RUSHING costs one board and tapping back costs nothing at all.
- Open Leaders in the app.
- Tap a category, or a week.
- MVP and Power are the other two tabs.
The Book tab was already a proper screen — its own cards, its own slip, its own lock-in — but it was getting its data by loading the whole website page behind it and throwing most of it away. **What your phone was being sent, every time you opened it:** the league's entire graded slip history, the past-weeks archive, the bot's command queue and its health, the board a second time in a flat list the app never draws — and, if you're a commissioner, **every single player in your league**, name, position and overall, for an admin form that isn't in the app at all. **Now it asks for the board and gets the board.** Same weeks, same cards in the same order, same stale-line warnings, same spread and total and props under each fixture — proved against the website's own board so the two can't drift — just without the twenty-five kilobytes of things nobody was looking at. **Nothing about the screen changed**, which is the point: it opens faster, it refreshes faster, and coming back to the tab costs a few hundred bytes instead of the whole book. Your open slip, your cash and the payout table come with it as before.
- Open The Book in the app.
- Same board, same lines.
- It just gets there quicker.
Tapping Trades used to load the website inside the app — the whole page, eighty-two kilobytes of it, built for a mouse. **It's a screen now, and it's 690 bytes**, because it asks for what it draws instead of what a browser would have needed. What it carries is what you actually do about a trade on a phone: **what's waiting on you, whether it reads fair, and yes or no.** Both sides are named from your end — **what you get** and **what you give up** — because the database says "from team" and "to team" and which of those is you depends on which end of the deal you're on, and getting that backwards would have somebody accepting the opposite of what they read. Every deal wears the same verdict the website gives it — **READS FAIR**, **LEANS ONE WAY**, **LOPSIDED** — from the same calculation, so the two can't disagree about your own trade. **Agreed is not done**, and it doesn't pretend to be: a deal that's been accepted sits under *Waiting*, with the vote tally and how many it takes to pass, or the approve and reject buttons if you're the commissioner. And there's a Block tab that answers one question rather than listing everybody: **who on the block would actually start for you** — not just play your thin position, but beat the man already there. If nobody would, it says so instead of showing an empty list. **Accepting, declining, withdrawing, approving and voting all go through the site's own route**, the same one the website posts to, with the same rules about who's allowed to do what — so the app can't say yes to something the site would have refused. Building an offer is still the trade centre on the site: a package builder is desk work, and one squeezed onto a phone is something nobody finishes.
- Open Trades in the app.
- Offers waiting on you are first, with what you get and what it costs.
- Accept, decline, or check the Block tab for who'd start for you.
A week is sixteen finals, and the bot announced all sixteen in the news channel the same way — the 45-3 walkover between two teams going nowhere sat in the same feed, at the same volume, as the overtime game that ended somebody's six-week run. **Sixteen posts that all read alike is not coverage, it's wallpaper**, and the one that mattered was buried by the fifteen that didn't. Now the news channel gets **the games that are actually a story** — an upset, a one-score finish that ended a run, a division game decided in overtime — and the post says which of those it was: **UPSET · ONE SCORE**. Everything else still happens, it just stops interrupting. **Nothing is deleted and nothing is summarised away.** Every final is still on the ticker, still on My HQ, still has its own page with the full advanced breakdown, and **still gets its own recap card posted into its own game channel**, which is a different route entirely and is untouched. The recap videos cover the football now; the news channel goes back to carrying news. **What counts as a story is one number in one place**, and the site's ticker, the app's strip and the bot all read that same number — so the game your phone calls the story of the week can't be the game Discord never mentioned. Also fixed: the projected line was never reaching the ticker. The ratings hand back a list and the line calculator wants them keyed by team, so the call failed silently inside a guard and came back empty every single time — **no final on the ticker has ever been weighed as an upset since the strip shipped.** It is now, on the site, in the app and in the bot's decision.
- Play a week.
- The big results post in the news channel with the reason.
- Every other game is on the ticker and in its own game channel.
Everything this site knew about Twitch until today it worked out for itself — a clip's timestamp against the minute a game landed final, a window either side of kickoff — and all of it shares one hard limit: **it can only ever see what somebody already cut.** Most nights nobody cuts anything. The game gets streamed, the stream becomes a four-hour video, and that video is the opposite of a highlight because nobody knows where in it anything is. **The Tape is the other direction, and it guesses at nothing.** Paste the broadcast, pick the game off a list with your own fixtures at the top, and mark the plays — *1:04:12 — 60-yard TD*. Each mark becomes a RedZone moment that opens the tape a few seconds before the snap, and says where it's taking you before you commit to it. **If the link you paste already has a timestamp on it**, because you scrubbed to the touchdown and hit share, that second gets marked for you without being asked. **One broadcast can be filed against several games** — people play three in a sitting — and the third game does not inherit the first game's caption. **A filed tape beats the clock:** a clip from a broadcast you filed belongs to that game even if it was harvested outside the window, because you said so and the window was only ever a guess. **A play you clipped AND marked is one moment, not the same touchdown listed twice** — the clip survives, because a clip plays, and it wears the words you typed. You can file tape for games your own team played; staff can file any, because a fixture label is the site telling everyone what they're looking at. **Nothing is downloaded, re-encoded or re-hosted** — a position in a broadcast is a link, and a link needs nobody's footage to move. Also in: commissioners get a switch to let Twitch cut real clips out of the recording. It is **off**, and it stays off until somebody turns it on, because Twitch shipped that in open beta with a published fault — the second you ask for and the second the clip starts at don't always agree, which on a highlight means the clip opening after the play. Try it on one game and look at what comes back. The marks link into the tape either way; that half doesn't depend on it.
- Paste your Twitch VOD link.
- Pick the game it came from.
- Type the times worth watching.
The website has had a real ticker across every league page for a long time. The app had **no strip at all** — and the thing in it called "Wire" is a posts feed, which is a different thing wearing the same name, and is most of why nobody noticed the absence. There's a strip now, under the league bar, on **every tab**: one continuous run that never stops and never stutters, because the stories are printed twice and the track slides by exactly one copy — at the moment the first leaves the screen the second is sitting where the first began. **It carries the same eight the website carries**, from the same function, scored by the same rules, so your phone and your browser can't end up disagreeing about what the big story of the week is. Each one says what it is, what happened, and — when there's a reason it's near the top — *why*: **ONE SCORE**, **BIG UPSET**, **ENDED A 6-GAME RUN**. Tap any of them and you land on it. **If your phone is set to reduce motion the strip stops moving and stays put** rather than disappearing — the stories are the content and the movement is decoration, and somebody who asked their phone to hold still shouldn't lose the league's news over it. The second copy is hidden from screen readers so nothing gets read out twice. Try it: the SapphireSportz app
- Open any tab.
- The wire runs under the league name.
- Tap a story to open it.
Linking a channel used to be step one of five, and the other four lived on a page you had to go and find — which is why people linked a handle, saw "Linked", and assumed that was it. **Most of it never needed a step at all**, and none of that changed: the moment your handle is saved, going live is noticed, your stream title is matched to your league, you show up on League TV and the Discord hears about it. **Clipping is the one part nobody can switch on for you.** Cutting a clip acts on *your* channel, so Twitch makes you say so yourself — that's their rule, not ours, and no amount of assuming gets round it. What we can do is stop making you hunt for it: **the Twitch button now comes back with your handle, in the same breath.** Save the name, tap once, done — and clipping is already on from that moment, so there's no second switch waiting somewhere else. Once you've granted it you're never asked again; it just says your games are being clipped. Nothing is offered on a league whose server can't clip at all, and unlinking your channel doesn't throw a consent screen at you on the way out. You can take it back whenever you want and it forgets the grant rather than flagging it.
- Put your Twitch name in.
- Tap the button that comes back with it.
- That's it — your games get clipped from then on.
A clip was an orphan: thirty seconds cut out of a three-hour night, with no way back to the context around it. Twitch hands back the video and the exact position on every single clip and this site had been throwing both away. **It keeps them now**, and backfills them onto clips already stored the next time Twitch is asked. That one field turns a clip into a door: **watch the full play** takes you into the broadcast a few seconds before the snap, so you see the drive it came out of and not just the touchdown — and it says where in the tape you're going (*1:04:12*) before you commit to it. **When two owners in the same game both streamed, the same instant exists twice**, from both points of view, and both are offered rather than one being thrown away as a duplicate. **And the game is weighed before its moments are.** This is the part a tool that only looks at footage can't do: the same clip out of a 38-10 walkover and out of a three-point upset that ended a six-game run are not the same clip, because the second one mattered. The pass scores the game first — the line it beat, what it cost the loser — and ranks the night inside that. **Nothing is downloaded.** No video is fetched, re-encoded or re-hosted here; a position in a broadcast is a link, and a link needs nobody's footage to move. That was already this site's answer for live clipping and it doesn't change because the video stopped being live.
- Open RedZone after a night of streamed games.
- Each moment offers the clip and the point in the full broadcast it came from.
- Where two people streamed the same game, both angles are there.
The ticker had been building **thirty-odd items** — twelve finals, twelve fixtures, ten roster moves, then the leaderboard on top. That isn't a wire, it's a queue: the one thing worth seeing was as likely to be forty seconds away as in front of you. **It's capped at eight now, chosen by weight rather than by whatever got built first.** A story is scored on the things that actually make it big: an upset against the line the ratings already compute, a one-score finish, a shutout, overtime; a streak of four or more ending, somebody eliminated, first place changing hands; an individual game clear of the rest of that week; a starter traded or a dev trait jumping. Everything else is still a story — it just gets a line on the strip instead of the front of it. **The strip stays a strip.** Sorting by weight and taking the top eight looked right and wasn't: on a week where six games finished inside a score, all six scored the same, filled the wire, and pushed the fixtures, the trades and the trade block off it entirely. At most three of any one kind get a seat while other kinds are still waiting — weight decides who goes first, variety decides that being the seventh-best final doesn't beat being the only trade. On a thin week the leftovers backfill, because a short ticker is worse than one carrying a fourth final. **A performance is judged against its own week, not a number.** Four hundred passing yards is a monster in a league that throws for two hundred and an ordinary afternoon in one that throws for three-fifty, so the bar is the rest of that week's field. **And every score comes with its reasons** — *one score*, *big upset*, *ended a 6-game run* — so a strip that puts something on top can always say why it did.
- Look at the ticker across the top of any league page.
- Eight stories, the biggest first.
- The finals that were close outrank the ones that weren't.
Four of the sixty-seven rooms in your league opened a real screen in the app. The other sixty-three opened the website inside it — the site's layout at phone width, a page load and a flash, no gestures, scroll position lost on the way back. You can tell instantly even if you can't name it. **Franchise HQ is the first one rebuilt properly**, and it's deliberately the room an owner opens most, so whatever was awkward about doing this showed up on the first one instead of the eleventh. It draws your crest and record, the game in front of you with the projected line said out loud (*you −6.1*, not a signed number), how the last few went with the result marked win or loss, where the roster is thin, who's inside their final year and what they cost, and what the advisor makes of it — in the app's own type, with figures that line up in columns. **It asks for two kilobytes.** The page it replaces sends a signed-in owner **a hundred and eighteen** — three quarters of that is your full roster with every attribute, for a section this screen doesn't draw, plus eighty-three wire posts on a page about your team. **It opens instantly the second time**: the last numbers are on screen before the request goes out, and correct themselves when it lands. Come back and it costs a few hundred bytes instead of everything. A refresh that fails leaves your numbers up with a quiet note saying how old they are, rather than blanking the screen. **Two real faults turned up while building it and both are fixed:** the app was computing your positional needs with the free-agent pool counted as a thirty-third team, which moved every league average and therefore every gap — the app and the website disagreed about where you were thin, and the website was right. And a screen opened straight from a notification asked the server for data before the app had read your session, got refused, and sat there. Neither would have been found without building the thing. The room list takes you here now instead of to the web page; eleven more rooms follow this one, and they follow its pattern. Try it: the SapphireSportz app
- Tap the grid icon on any tab and open Franchise HQ.
- Your team, this week's game, your form, your needs, your contracts.
- Leave and come back — it's there before it loads.
The app asks the site for a page and gets that page's data back as JSON — which is how every screen got an API without anybody writing one, and it was a good idea. It went one step too far: along with the page's data the app was also handed **the base template's navigation state** — the CSS asset version, the conference logo map, which nav dropdown is open, the odds-style options, the support Discord invite, the founding-slot count, the whole league switcher. Chrome for a page a phone does not draw, on all 159 surfaces. Thirty-one names of pure furniture are now dropped before the app is answered. Every one was checked against the app's own source first — it reads none of them — and the two it does read were deliberately left in. Nothing about the website changed: a browser gets exactly what it always did, and there's a check on that so it stays true. **Measured, it's about 1.4KB off every screen** — worth having and not a transformation. The honest finding was the other one: Franchise HQ sends a phone eighteen kilobytes, and what's left after the furniture is mostly *the page's own data for parts of the page the app doesn't draw* — eighty-three wire posts, on a screen about your roster. That's not furniture, that's the app fetching whole web pages, and it's fixed by giving the app's screens their own endpoints rather than by trimming. This is the first rule of that work: an app screen asks for its data, not for a page. Try it: the SapphireSportz app
- Open any screen in the app.
- Slightly less travels down the wire, on every one.
- The screens that stop being web pages entirely come next.
The app had five tabs. Your league has **sixty-seven rooms** — the Casino, the trade block, the draft board, the Hall of Fame, the record book, the leaders in seven categories, the Booth, League TV, the Bank, the Daily Spin, the contract board, the Pulse, Pick'em. The app could *open* every one of them the whole time; what there was no such thing as was a list of them. So a phone with the entire league behind it read as an app with nothing in it. **There's a list now** — grouped the way you'd look for things (this week, my franchise, the market, the draft, the Book, fantasy, leaders, media, the record, the league), searchable by name, and reachable from the grid icon at the top of every tab or the section at the foot of the home screen. **A room is called the same thing here as on the site.** Every label was lifted from the league page rather than written fresh, so nobody has to learn two names for the same door. **Staff rooms only appear for staff** — Admin, Sync, Invite, Settings, Billing — because a door that shuts in your face is worse than one you never saw. **And no league is shown the other sport's rooms:** every path in the list was fetched, one at a time, against a live Madden league and a live 2K league before it shipped. Exactly one came back 404 — season honours, which is All-NBA and has no Madden equivalent — and that is the reason the list knows which sport you play. Tapping a room opens the real screen where the app has one, and the page itself, signed in, where it doesn't. Try it: the SapphireSportz app
- Tap the grid icon at the top right of any tab.
- Search for a room by name, or scroll the groups.
- Tap it — it opens signed in, no second login.
The front page has said **no Discord required** since build 130, and the website has meant it for a while — an address in, a six-digit code back, the code in, and you're a member like anybody else. **The app only ever had the one button.** So on a phone that promise was false: no Discord account, no way in at all, however much of the league was yours to see. The sign-in screen now carries both doors. The Discord button is where it was and does what it did; underneath it, *No Discord? Use your email* opens the same flow the website has, in the app, and drops you straight into your league when the code comes back. **There is still no password anywhere on this site** — nothing to invent, nothing to forget, nothing of yours sitting in a database waiting to leak. The code is emailed each time and it's dead a quarter of an hour later. **The screen itself was rebuilt too.** It had become the layout every generated app ships with — a big centred icon, a stretched-out wordmark, a boxed list of four features selling the app to somebody who had already installed it, and a dead gap in the middle where the centring ran out of things to centre. It's a title card now: the mark small in the corner the way a network bug sits, the claim in the same condensed face the rest of the app uses, and the controls where a thumb actually is. Try it: the SapphireSportz app
- Open the app and tap "No Discord? Use your email".
- Put in your address and we'll email you a six-digit code.
- Type the code and you're in your league.
The app asks the site one question the moment you sign in, and again every time you open it: *who is this, and which leagues is he in?* Until that question is answered there is nothing to show, so the app showed a spinner. **If the answer never came, the spinner never stopped.** A request that timed out, a moment on a bad connection, an error at the site's end — none of those are "your sign-in failed", so the app kept your sign-in and waited. Forever. No message, no retry, no way back to the sign-in screen. And because the sign-in had already been saved to the phone, **every launch after that came straight back to the same spinner** — one unlucky request and the app was shut for good, looking exactly like a sign-in that never worked. A loading screen that cannot end is a broken screen. It ends now: it says what went wrong in a sentence, it offers to try again, and it always offers the way out. **The question itself got harder to break, too.** It was assembled in one go, so any single part of it going wrong — the league list, a league's name, working out which league to feature — took the whole answer down with it and left the app with nothing. Every part of it is optional now except *who you are*: a piece that breaks costs its own line and nothing else, so you land in the app and see what's missing instead of staring at a spinner that will never stop. Try it: the SapphireSportz app
- Open the app.
- If the site can't be reached, the screen now tells you and offers Try again.
- Sign out is always there, so you can start a fresh sign-in whenever you want one.
The iPhone app signs in through the same Discord door the website uses, run inside the system's own sign-in window. That window closes on exactly one thing: the site sending it back to `sapphiresportz://`. **The site had one route that did that — the one where everything worked.** Every other ending went to a web page instead: a sign-in declined on Discord's screen, a request that took too long, Discord not answering. A web page doesn't close the window, so the window sat there loading, the promise behind it never came back, and the button underneath spun forever with nothing anywhere saying why. From the outside it looked like the app simply couldn't sign anyone in. **And one of those endings was firing on perfectly good sign-ins.** The mark that says *this one started in the app* was a cookie, set on the way out to Discord and read on the way back — but the system sign-in window can start with a clean cookie jar, and when it did, the site saw an ordinary browser sign-in, failed its own security check, and sent the window to a web page. The correct sign-in and the broken one ended in the same place. **That mark now rides in the handshake value Discord is required to hand back**, signed so it's still the same security check it always was, and the cookie is kept alongside it so a sign-in already in flight isn't interrupted. **Every ending now goes back to the app**, failures included, carrying the reason — so a sign-in that goes wrong closes the window and tells you what happened in a sentence you can act on, instead of leaving you looking at a spinner. Try it: the SapphireSportz app on iPhone
- Open the app and tap Sign in with Discord.
- Authorise on Discord's screen the way you would on the website.
- The window closes on its own and drops you in your league.
Two faults, one sitting on top of the other. **The Wild Card round had been filed twice**: the same six games under the postseason *and* under "regular season week 19". Every fixture existed in duplicate, which made the week counter jump to 19 — an unplayed regular-season week that was really the playoffs — doubled every playoff result inside the book's scoring averages, and left the fixture lookups taking whichever copy they reached first. No regular season has ever run past week 18, and EA's own numbering puts the Wild Card at 19 and the Super Bowl at 23, so a game whose own week says 19 or later is a playoff game whatever it was filed as. That rule now sits at the point of writing, because nothing in the site's request plan asked for a regular week 19 in the first place — the origin isn't fully understood, and a guard at the write holds however those rows arrive. **Leagues already carrying the duplicate are repaired on their own**, on the next restart: the stray copy is dropped where the correct one exists, and moved where it's the only one. It says how many it fixed rather than doing it silently. **Underneath that was the real gap:** the commissioner's line builder had never known about the playoffs. It offered *this week's regular-season games* — so a league in the Wild Card round got a dropdown of fixtures played a fortnight ago, and there was no way to write a spread on a playoff game at all. The duplicate had been papering over it by accident. It now offers the round actually being played, names it (*"Pick a Wild Card game…"*), leaves out fixtures whose teams aren't decided yet, and hands back to the ordinary week counter the moment the Super Bowl is done. **And one quiet thing:** a spread queued on a playoff fixture couldn't be told which week it belonged to and fell back to the bot's own counter — the exact failure that lookup was written to end, arriving again through a door nobody had thought about.
- Open The Book's commish tools during a playoff round.
- The game dropdown is named for the round and lists that round's fixtures.
- Queue a spread or a total on one the way you would any week.
The seeding page is about who is *going* to make it. A league already playing the Wild Card round was still being handed it, headed **"Week 18 · 7 seeds per conference"** — a page about a race that had been settled, stamped with a week that had passed. It now says which round the league is actually in, says the race it describes is settled, and points at the bracket, because the football has moved and the page should say so rather than sit there looking current. The round is **named by how many games are in it** — the same rule the bracket, the schedule, the game page and the Discord bot all use, so it reads right whatever length your regular season is. Two details it gets right that a simpler version wouldn't: **a round whose games are all final is behind you** even though later rounds exist on the schedule, so the header follows the football rather than the first playoff week it finds; and **a round whose teams aren't decided yet isn't the one being played**, because nobody can play a game with no teams in it — though it still counts toward naming the round. A league still in the race keeps the header it has always had, untouched. **The week counter itself is deliberately not moved.** Forty queries across seventeen files pair that counter with a regular-season lookup, and shifting it underneath them would trade a wrong number for a page full of blank panels. The honest fix is to teach each surface what part of the season it's in — this is the first one, and the others follow the same way.
- Open the Playoff Picture once your league is in the bracket.
- It names the round instead of a regular-season week.
- The button takes you to the games.
The rounds arrived and the bracket drew them, but a bracket is a picture. Every playoff fixture **404'd on its own game page**, and the schedule page didn't list a single playoff week — so a league sitting in the Wild Card round opened its own schedule and found the season had apparently ended at week 18. That's worse than a missing page, because **the game page is where a matchup's chat room door is**, along with the kickoff time, the scout, the tags and the game review. Each match is supposed to get its own room, and for a playoff game there was nowhere to open it from. Both now read the postseason: the schedule lists the rounds, each fixture links to its own page, and the page carries the door. **Rounds are named, not numbered** — the schedule says WILD CARD, the game page says WILD CARD, and the name comes from counting the games in the round, exactly the way the bracket and the Discord bot name it, so it's right whatever length your regular season is. **A round whose matchups aren't decided yet isn't listed at all.** The export files those fixtures with no teams in them; they still count toward naming the round, but "somebody vs to-be-decided" is not a fixture and won't be drawn as one. **And the matchup rooms learned something.** A playoff fixture now gets a room of its own rather than sharing one with the regular-season meeting between the same two clubs — because the postseason continues the week numbering, and on a shorter season the Wild Card round and the last week of the regular season are the same number. Two clubs who met in both would have been handed one room holding both conversations. Existing rooms are untouched. **One more thing that had been quietly wrong:** a playoff game's form line jumped back past the round that had just been played. A Divisional matchup now shows the Wild Card result, which is the game everybody actually just watched.
- The schedule now runs past the regular season into the rounds.
- Open any playoff fixture for its own page.
- Talk about this game opens that fixture's own room.
Three separate reports — the playoffs not exporting, the book having no playoff games, the wildcard round refusing to be created — and they were all one thing, sitting nowhere near any of the places that looked broken. Leagues on EA Connect don't upload through the Companion App; the site goes and fetches from EA itself, and it builds that request by walking week 1 to week 18. **Regular season, then stop.** Directly above that loop sat a list of the playoff week numbers, correct, with a note explaining that the Super Bowl is week 23 because EA skips 22 for the Pro Bowl — **and nothing anywhere referenced it.** The numbers were right and the wiring was never done, so the site had never once asked EA for a playoff week. Nothing downstream was broken. Every one of them was starved. So the pull asks for the four rounds now, each under its own week number, each as a postseason week. It asks when your league has actually advanced past its regular season — four rounds is thirty-two extra calls a night and there's no sense making them in September — and a full import from the admin button asks regardless, because that's the moment you want everything. **And the reason this took four goes to find:** the arrivals panel was marking every single EA Connect fetch as *"nothing recognised this path"*. Four hundred out of four hundred, on a league whose regular season was landing perfectly. The pull archived every reply and never recorded what became of it, so the one panel built to answer *why aren't my exports working* was crying wolf on every row it held — which is worse than having no panel, because it sends you hunting a fault that isn't there while the real gap sits somewhere else entirely. Every fetch is now stamped with what understood it and how many rows it got. An empty playoff round reads as **understood, nothing in it yet** rather than as a failure; a refusal reads as a refusal; and a path genuinely nobody knows is still flagged, so the panel keeps the one job it had.
- Open ADMIN → Sync & EA Connect and run a full import.
- The progress bar now says "Pulling the playoffs" once it reaches those rounds.
- The arrivals panel underneath tells you what each fetch actually returned.
A league advanced to the Wild Card round and the site carried on saying week 18. It had every fact it needed to know better and was throwing them away. The week counter reads **regular-season** schedule rows only — so once all eighteen are played and there is no nineteenth to find, it settles on the last one and stays there for the rest of the year. Meanwhile **the standings knew the whole time**: every export carries the week the league has advanced to, and that league's standings were reporting week 19 while week 18 was the last regular-season week on file. Comparing those two numbers is all it ever took. So the front page now says it: *past the regular season*, both numbers, and — the part nobody could see — **whether a playoff schedule has actually reached the site**. That second half is why the bracket was empty, the game channels had nothing to build from and the book had no games. **It works off your league's own schedule, not a calendar.** An eighteen-week season puts the first playoff week at 19; a seventeen-week one puts it at 18. Neither number is written down anywhere — the site compares what the standings report against the weeks that league actually holds, so it is right either way. **And it does not read the export's stage field**, which would have been the easy way: this site knows two of that field's values for certain and not the rest, and a season phase decided by a number whose meaning was guessed is a guess wearing a fact's clothes. **It also never names the round.** Wild Card, Divisional and Conference are told apart by how many games are in them, and with no playoff schedule on file there are no games to count — so it says what it knows and stops. The moment the bracket lands, the notice goes away on its own.
- If your league has advanced past the regular season, the front page now says so.
- It also tells you whether the playoff schedule has arrived.
- If it hasn't, export those weeks and check the arrivals panel under ADMIN → Sync & EA Connect.
The book had no playoff games, and neither did five other things — for one reason, repeated six times. Six separate places each had their own copy of the rule "a game is a regular-season game": the board working out which fixture a line belongs to, the board deciding whether a line is still live, the book's own game list, the money line finding the game it settles on, the money line deciding a week is finished, and the lookup that tells you who you're playing this week. All six mean the same thing — *a game somebody can put money on, and that grades when it's played* — and six copies of a rule is six chances to miss one, plus a seventh written next month. So there is now **one** place that answers it, and all six ask it. **The half that actually mattered is settlement.** A money line that can't find its own game never settles, and a market that never settles holds everybody's stake forever — so offering playoff bets without fixing that would have been worse than offering none. The fixture lookup now reaches the postseason, and it matches on **both team names**, which is what keeps two rounds apart when they share a week number — and they can: the postseason continues the week numbering, so how far the regular season runs decides where the Wild Card lands, and that isn't the same in every Madden. A round that still has a game to play is not "finished", so nothing gets voided out from under anybody. **Playoff results now count toward a team's scoring average too**, because they are real games and the projections were quietly ignoring them. **The preseason stays out** — nobody bets a preseason game and a 99-0 exhibition has no business in a scoring average. That's a decision, and it's written down as one so nobody adds it back thinking it was forgotten.
- Post your spreads for a playoff round the way you would any week.
- The money line opens off it and the board shows it live.
- When the score lands it grades and pays, same as the regular season.
A report came in that playoffs weren't exporting. The receiver was fine. The bracket was fine. Between them was a hole nobody could see into, and it was one word wide. The three week-scoped upload addresses declared the week segment as **a number**. If the Companion App ever put anything else there — a named round rather than a digit — the site rejected the upload *before any of its own code ran*: the body was never archived, the arrivals log was never written to, and the catch-all that exists precisely so **no export is ever lost** never got a look at it. The app reported a failure the site had no record of, which is the exact situation the arrivals log was built to end. It was also a hole straight through the rule that catch-all was written for: a rejection loses a payload just as completely as a missing address does. **That floor is now shut.** Every week token gets through, whatever it says. A number is a number; anything else is not guessed at — the game's own week index, which the site already trusts over the address, files each game under the week it truly belongs to. **And a week type the site doesn't recognise is now named out loud in the arrivals log.** It is still stored exactly as it arrived rather than renamed into something the bracket would read, because guessing at what a label meant would build a postseason out of a guess — but "23 games arrived under an unknown week type" is now a line a commissioner can actually see, instead of rows sitting in a table that nothing on the site ever looks at. **If your playoffs aren't showing:** run the export again, then open ADMIN → Sync & EA Connect and read the arrivals panel. Whatever the app is really sending is now in there, named.
- Export the playoffs from the Companion App as normal.
- Open ADMIN → Sync & EA Connect on the site.
- The arrivals panel now lists every upload that reached the door, what understood it, and how many rows it got.
The picks were never missing from this site. They were just never in one place you could plan from. The draft board shows round **one's** order. The trades page shows only the picks that have **moved**. Neither one answers the question an owner actually asks in the off-season — *what have I got to work with, and what have I already spent?* — and neither answers the one he asks before he picks up the phone: *who has picks to burn?* So here is the whole thing on one grid: every club, all seven rounds, both drafts. A blue number is the club's own pick. A green tag is one it acquired, and **it names the club it came from**. A faded number is one it traded away. On the right, how many picks it holds, how that compares to the fourteen everybody starts with, and what this league's own trade chart makes of the lot. Two things worth knowing. **A level pick count is not the same as a level chest** — a club that sent a first and got a third back still shows fourteen picks, which is exactly why the grid is round-by-round and not a single number. And **a pick that passed through a middle man is credited to whoever ended up with it**, so a club that sold its first is told where that pick actually is now, not who it handed it to on the day. Ownership is a replay of every approved trade in the league — the same replay the Trade Center runs, so the two cannot disagree — and a deal that is merely proposed, or that both owners shook on without the commissioner signing it, moves nothing here, because it has not moved anything anywhere. This year's picks project off live records, worst first, like the real thing. **Next year's price as mid-round for every club, because nobody knows yet**, and the page says so rather than dressing a guess up as a projection. It prices nothing itself — it asks the module that already prices picks — so there is one number on this site and not two that argue.
- MENU → LEAGUE → TALENT → Draft capital.
- Your club is the highlighted row — the grid is your seven rounds across both drafts.
- Green tags are picks somebody sent you; faded numbers are ones you sent away.
Two questions get asked in every league, and neither one can be answered from a team page. The first belongs to the people running it: **a man takes a club over in week 12 and cannot renegotiate anybody**, so his expiring players walk for nothing through no fault of his. Staff fix that by hand in Madden — but first they have to *find* those men, which until now meant opening thirty-two rosters and reading every contract on each. So the board finds them: **COULDN'T RENEGOTIATE** is a list of expiring deals sitting on a club that changed hands in the last 45 days, with how many days ago it happened so staff can judge each one rather than have the page judge for them. It is staff-only, because it is a to-do list and not a notice, and it reads the date each team was assigned rather than guessing. **If a league's teams were all assigned in one go** — an import, a re-sync — every club carries the same recent date, nothing separates a real takeover from the rest, and the list would name everybody, which is the same as no list. So it doesn't build one: it says plainly that it can't, and comes back on its own once teams start being assigned one at a time. And it only ever fires on an **expiring** deal — a new owner's four-year contracts are nobody's problem to fix, and flagging those would bury the handful that are. The second question belongs to everybody else: **"do I let my guy test free agency, or re-sign him?"** That's unanswerable without knowing who *else* is about to be available, and nowhere on this site has ever shown you that. **Free agency class** is exactly that list — every player in the league whose deal is up, league-wide, best first — so you can see whether there's somebody better coming before you let your own man go. Search a name, narrow it to a position or a club, sort by rating, age, years left or cap hit. A deal showing **1 or 0 years is the same thing**: which one an export says depends on when in the season it was taken, so both count as up at the end of it. Practice squad and injured men are on the board like anybody else, marked as what they are. Free agents aren't — they have nobody to be under — and a player the export gave no contract data for is left out rather than printed as a zero-year deal. And the thing it deliberately does not do: **it never edits a contract.** There is no button, no form and no write of any kind on this page. Contracts live in Madden. This is where you decide what to do; the doing still happens in the game, and a page that pretended otherwise would be writing numbers the next export overwrites.
- MENU → LEAGUE → TALENT → The contract board.
- Free agency class is every deal in the league that's up — that's the list to read before you let your own player test it.
- Staff also get COULDN'T RENEGOTIATE: the expiring men on a club that changed hands too late to re-sign them.
Two bugs, and the second one has a real answer at last. **The question marks:** Madden renumbers team ids, and this league has been through it. Build 282 repaired the Trade Center when that happened and left behind a helper so any page reading an old row could still print the club — and then nothing else ever called it, so the rivalries board showed `? — ?` for every pair, and so did a dozen other places quietly. Patching twenty pages is twenty chances to miss one and a twenty-first written next month, so the fallback now lives in the one place every page already reads its teams from: an old id resolves to its club, while *listing* a league's teams still yields only the real ones. Nobody sees ghosts and nobody sees question marks. The stored rivalries are repaired at boot too, not just displayed — a rivalry that names ids the league stopped using had also stopped matching its own fixture, so the badge and the Game of the Week weighting had silently gone with it. **The faces:** this one has been worked around three times and never fixed, and the reason is that it was never a matching problem. **EA's portrait CDN answers 403 to everything** — every Madden title, with or without a browser's headers — and the one ratings endpoint still replying hands back an image address pointing straight at that closed door. The photos on the site are survivors from when it was open; nothing harvested since has had anywhere to come from. So the source is replaced. Faces now come from Sleeper's public player database — **12,228 players**, against EA's launch-day roster — with ESPN's headshot CDN preferred for the image where the cross-reference exists. Every picture is re-encoded to a real PNG and trimmed on the way in, rather than a quarter-megabyte file written under a name that does not match its contents. The rule that keeps two men with the same name apart is unchanged and still does its work: Sleeper carries both Justin Jeffersons, the receiver and the linebacker, and now they each get their own face instead of one of them going without.
- Rivalries now read as team names instead of question marks.
- For the faces, open ADMIN → Portraits and run a refresh.
- It re-fetches everything, because the photos picked from the old source are all stale now.
An item made in Discord with `/item create` never reached the site. Not a slow sync, not a bug in the copy — the command wrote to the bot's own database and told the site *nothing at all*, so a commissioner would add something to his store, see it in `/store`, and never find it on sapphiresportz.gg. The one-time migration carried the catalogue across once, and everything made after it lived in Discord only. The bot now mirrors its whole store to the site after every create, delete and restock — and on `/sync web`, which **backfills every item you already have** without anybody running anything. Two rules hold it up. It sends the **whole table, never a change**, so a call that went missing while the site was slow or the bot was restarting is corrected by the next one instead of leaving a hole forever. And **nothing is ever removed by being absent from a push** — a retired item comes across marked retired, which is a fact in the message rather than a guess from a gap in it, because a short payload must never empty a store people spent money in. Both sides also agree on item numbers now: they were each picking their own, which meant the same item could be #4 on the site and #9 in Discord while every inventory row and every `/item` command points at a number. **And the recap videos:** every game has had its own episode since build 279, the browser has been able to draw it into a file since 283, and the bot has been able to post that file into your game channel just as long — nobody was ever told. Now, the moment a game goes final, the game page puts it in front of the commissioner: one tap to the episode, one to post it. It's drawn on whatever you're holding, phone or computer, so nothing happens until somebody presses it — the page says that plainly rather than implying it appears by itself. Once it's made, everyone sees the video on the game instead of the button.
- Open a game that's gone final.
- THE RECAP VIDEO offers one tap to that game's episode.
- Make the video, then Post to Discord — it lands in the game channel.
Madden tells you what you're spending *this* year, and the roster table has always shown you that. It does not tell you the thing a general manager actually plans around: what comes off the books at the end of the season, and what's still on them the year after. That was sitting in the export the whole time — every contract carries its years left — and nothing had ever added it up. So the ROSTER & CAP tab opens with it now. Every contract you're carrying, grouped by how many years are left on it, with a bar showing the shape of it: expiring money, next year's, the year after, and the long money. One headline number — *"$21.0M comes off the books at the end of this season — 2 contracts, 28% of what you're carrying"* — and under it, **what is eating the room**: your biggest cap hits with the overall, the age and the years left beside each one, plus the hit divided by the overall rating. **That last figure is a division, not a verdict.** Whether a number is a problem depends on the position and the player, and that's your call rather than the site's. And one thing is deliberately missing: **there is no "cut him and save this much" anywhere on it.** Releasing a player in Madden carries dead money, the export does not include the figure, so the saving from a release is not something this site can work out — and a page that printed it anyway would be guessing at the one number the whole answer depends on. The page says so in as many words, so nobody adds it later thinking it was simply forgotten. A team whose export carries no contract data at all gets no panel rather than a screen of zeroes.
- Open your team and pick the ROSTER & CAP tab.
- THE CAP ROOM is at the top — the bar is your money by years remaining.
- WHAT IS EATING THE ROOM lists the biggest hits with what's left on each.
Rooms are no use if you have to go and find them. So every page that is about something now has the door to the room about that thing. On a game, **Talk about this game** opens the chat straight into *this fixture's own room* — not the matchup room in general, this one, week and both teams — and your opponent lands in the same room whichever side of the fixture he opened it from. On the Trade Hub and the trade block, one tap into **Trade Talk**. On any player's page, the same door with **his name already typed into the box** so you're writing the offer instead of writing his name. That last part has a rule attached: it **fills the box, it never sends**. Nothing on this site posts words in your name that you did not choose to post, it won't overwrite something you were already typing, and it won't type into a box you aren't allowed to use in the first place. Underneath, a door is just an attribute on a button — the page says which room it wants and the chat works out how to get there — so the next page that needs one is a one-line change rather than another copy of the same script.
- Open any game and look at THE ROOM — the door is in its header.
- It opens the chat into that game's own room.
- Same on the Trade Hub, the trade block and any player page.
One chat box became five named rooms: **Locker Room**, **Announcements**, **Trade Talk**, **Matchup** and **Support**. A fixed five, the same in every league, and that is the point rather than a limitation — Discord already lets anybody make a channel, and what that produces in a franchise league is eleven channels, nine of them dead, and the one conversation you were looking for in whichever of them somebody happened to be standing in. Five that mean something beats fifty that don't, and a man who joins his second Sapphire league already knows where trade talk happens. **Nothing moved and nothing was lost:** every message ever sent is still in the Locker Room, exactly where it was said. **Announcements is the room everybody reads and only the commissioner writes in** — that is the whole reason it exists, because a channel anybody can post in is just the Locker Room again, and a commissioner who needs something *read* needs somewhere it isn't three messages up by the time people look. It also can't be trimmed away: each room keeps its own history, so a busy Locker Room on a Sunday night can never delete the advance notice out from under everybody, which is exactly what one shared cap would have done. **Matchup is about one game** — week 4 against him and week 11 against him are different rooms, and both of you land in the same one whichever side of the fixture you opened it from. A dot on a tab means something was said in there since you last looked, not merely that the room has messages in it, so a dot is worth a click. And a stale link to a room that doesn't exist puts you in the Locker Room rather than on an error page.
- Open League Chat from any page.
- The tabs across the top are the rooms — tap one to switch.
- A dot means something new in there since you last looked.
No new feature this time. Every recap written on this site has been missing a layer, and nothing anywhere said so. The engine that writes them has always asked for the season context behind a game — the streak, the season high, the man in form, the quiet afternoon from a star — inside a piece of error handling that, if the answer never came, shrugged and carried on with nothing. The function it was asking for did not exist. So it shrugged, every single time, silently, for as long as that call has been there, while the sentences written for those storylines and the fact-checking rules for the numbers in them sat finished and unreachable. It is built now, and it shows its working: a storyline only prints if the numbers in it are numbers the checker was handed, and a run of big games only counts if it reaches the most recent one — a man who had four big weeks and then a quiet one is on no run at all, and saying otherwise is exactly the kind of confidently wrong line the checker exists to stop. Three other quiet ones went with it. Whenever the Network was up, the footer carried the link to it **twice** — the duplicate door the menus are swept for, sitting just under the menus the sweep doesn't cover. With the Network switched off, a league's page still advertised a GOAT League card and a NETWORK tab that both answered 404 when pressed; advertising a page that 404s is worse than hiding it. And a member could set a post to go out platform-wide before his commissioner had ever agreed to put the league on the Network — **the league's consent is not the member's to give**, and now it takes the commissioner's actual decision rather than merely the league existing. The site owner's own page about who is using the site had nothing anywhere pointing at it, so the only way in was typing the URL; it's in the menu now. Behind all that, the suite that knocks on every door looking for one left open **could not build a web address for fifteen of them** — the collectible trades, the Arcade and Clash moves, the Matchup Room's controls, the tag question, the game review — so it had never knocked on any of those, and passed green while never trying. It tries them all now, and they all hold.
- Open a recap for a game from a few weeks into the season.
- The storyline sentence is the one about the season, not the afternoon.
- Every number in it is one the fact checker was handed.
The Scout's league data describes a team, and a team's season totals include whatever the *last* owner did with it. A franchise that changed hands in week six has one set of numbers and two completely different managers inside them — and the question you're actually asking the night before a game is about the man across from you. So HOW THEY PLAY sits on the game page and counts only the weeks the record says each man actually held that team. Pass-run split, points for and against, margin, giveaways a game, sack rate per dropback rather than per game, who carries it, who catches it, and how often the quarterback runs. Plain labels on top of it — Throws it, Runs it, Protects it, Gives it away, One back, One target, Runs the quarterback, Takes sacks — and **every one of them carries the number it came from**, because a label without its number is the start of a claim nobody can check. Under four games it does not hand out a single label; it says in words that there isn't enough on the record yet, which is a more useful thing to read than a confident number built on two games. Two hard limits, both deliberate. It only counts weeks the ledger can attribute, so a man who takes over a dead franchise does not inherit the last man's habits, and a week nobody can be credited with is simply left out. And it is **this season only** — the export carries no season stamp on its stat lines, so rather than quietly blending two years the page says which weeks it read. Nothing above claims a coverage, a blitz rate or a playcall. The export does not carry those. It never will, and the site will not say them.
- Open any game between two owners and scroll to HOW THEY PLAY in the Scout.
- Each card is one man's last few games, not his team's season.
- Hover a label to see the number behind it.
A Madden export does not say what gave you trouble. It never has and it never will, so the only honest way to know is to ask — and then to be scrupulous, forever after, about whose claim it is. After a game you played, three optional questions about **your own** game: what gave you the most trouble, what worked for you, and when it turned. Five seconds, from a fixed list, and the site asks **once** — answer it or say no thanks and the prompt is gone for good. There is no notification attached to it, ever. What you get back is a training recommendation that says why: *"Because you said pressure — Drive Architect, level 4, Pressure looks."* That is a true sentence. *"Sapphire found you struggle with pressure"* is the sentence this whole stack exists to refuse, and you will not find it anywhere on the site. Say the same thing three times and it stops following one bad night and starts following the pattern; one new answer never overturns three. And when there is no honest recommendation it says so instead of inventing one — name your own defence and it tells you straight that Drive Architect is a quarterback-reads game and there is nothing in it that coaches that, noted for your own record. **It is yours and it stays yours.** What opponents say about you and what you say about yourself are separate things and they are never plumbed together: your review is not in anybody's scouting report, your opponent's copy of the same page carries none of it, and staff cannot read it either. A man who admits a weakness and then reads it back in his next opponent's report would be a fool to answer twice — so the wall is the feature, and there is a test that fails the moment it cracks.
- Open a game you've played — the review sits under the tag question.
- Answer any one of the three, or tap No thanks and it never asks again.
- WHAT YOU SAID counts your own answers back to you, with what to practise and why.
There is no application here, no fee, no form and nobody to ask. Five things the site already measures, checked every time somebody looks: **it advances** (four or more advances in sixty days and never quiet for a fortnight — and six exports on one Sunday is one advance, not six), **the record runs deep enough to mean it** (twenty owner-weeks on the books), **its games get played** (ninety per cent of fixtures league-wide, from the Passport ledger), **every seat is taken** (no team without an owner), and **the staff play their own games** (a commissioner who no-shows cannot certify his own league — that one is on the desk, not the members). All five, or no crest. The page shows the line, exactly where you stand on each, and for anything you're short, the one sentence that would fix it. It can be lost, which is the whole point — a standard that only goes one way is a participation trophy with a delay on it — but not over one late Tuesday: a certified league that slips keeps the crest for a week and is told which test went, privately, because a man on holiday is not a bad commissioner. Recruits only ever see certified or nothing. And when the numbers come back, so does the crest, with no application and the original date still on it. The recruiting card picked up two more facts off the same record while it was there: what share of its fixtures a league actually **finishes**, and how long the **same desk** has been running it — held back until the ledger has enough on it to mean something, because a percentage off four weeks is a number that moves twenty points on one missed game.
- Open Certified from LEAGUE → LEAGUE HQ.
- Read the five tests and what each one says about your league right now.
- Fix what's short — the crest appears on your recruiting card by itself.
There is no login streak on this site and there never will be. A badge for showing up rewards the man with nothing else to do, not the man who runs a good franchise, so the eleven crests added today all measure the same thing from different angles: whether you finished what you started. **The long haul** reads the Passport ledger. Ironman is ten weeks on the books with every single one played — no sims, no chasing, no excuses. Never Misses is twenty-five games at better than 95%, which is the number that makes you the man everybody else can plan around. Wire to Wire is a whole season played out, every fixture of yours that went by. Club Captain is a full season with one franchise and no rebuild jump; Franchise Icon is doing that again and again. Day One is being there the first week a league's record exists, and The Standard is the one you don't apply for. **The grudges** come off the record between you and the men you play. Friendly Rival is a real history with one opponent; He Owns You is what it sounds like, and it is a badge for the man on the right side of it. Scout Team counts the games you gave a read on after playing, because the tag list only works if people actually answer it. The Notebook counts what you wrote down in your own scouting notes, which nobody else ever sees. Every one of them has its own crest, they show up on your page on The Network the same as the rest, and the ones you already earned were backfilled quietly — your board is right the moment you open it, without a wall of notifications about things that happened months ago.
- Open Achievements and scroll to THE LONG HAUL and THE GRUDGES.
- Locked crests show exactly how close you are — 12 of 25, 4 of
- Play your weeks, answer the tag question, keep your notes; they unlock themselves.
The Scout already told you about the team you're playing. Now it tells you about the man. THE SERIES is the record between the two of you — who leads it, the average score, the biggest one, the current streak, and your last five meetings with scores — and it follows the people rather than the franchises, so a man who rebuilds in a new city takes the grudge with him. It's built off the record the Passport started keeping, which means only meetings Sapphire can actually attribute to both of you are counted: a Madden export never says who owned a team last season, so rather than crediting whoever holds the team now with somebody else's wins, the series just starts where the record does, and says so under the numbers. Two new tags in What Opponents Say, both asked for: **Checkdown demon** for the man who lives in the flat, and **Cheese head** for exactly who you think. Same rules as every other tag — three separate opponents before it shows at all, nobody is ever named, and it falls off the record inside ten games once you stop giving people a reason to pick it.
- Open any game between two owners and scroll to THE SERIES in the Scout.
- It counts every meeting the record can attribute to both men.
- After you play, the tag list now has Checkdown demon and Cheese head on it.
After a game goes final, the two men who played it get one question: what stood out? Tap up to four from a fixed list — heavy passer, scrambling QB, deep-ball hunter, checkdown-heavy, aggressive on 4th, strong user defender, aggressive blitzing, and the rest. It shows up in the Matchup Scout as its own labelled layer, WHAT OPPONENTS SAY, sitting under Personnel and above your private notebook. Four rules make it worth having instead of dangerous. It is an observation and says so — never a percentage, never "Sapphire found this", just "six opponents agreed on three things". Nobody is named, ever, and nothing shows at all until three separate opponents say the same thing, so one annoyed man can't label anybody. There's no free text, because free text turns into name-calling inside a fortnight — every tag on the list is something that happens on the field, never a judgement about a person. And it **expires**: only your last ten tagged games count. That last one is the important one. A tag that sticks after you've fixed the habit is a scouting report that's confidently wrong, which is worse than none — so stop doing the thing, stop getting tagged, and the record catches up with you. You can read your own, too. That's not a leak, that's self-scouting: coaches do it, and if six opponents say you hunt the deep ball and you start taking the checkdown, the site just made you better.
- Open a game you've played — the question is at the top.
- Tap what you actually saw; it saves as a count, never your name.
- On any future matchup, the Scout shows what enough opponents agreed on.
Life happens and a booked kickoff sometimes has to move. Until now that meant going back to Discord and hoping, or one man quietly changing the time and the other man sitting there at nine o'clock. So the room does it properly. Once a game is booked, either owner can ask to move it — with a reason, and with the times that do work put up at the same moment, because "can we move it?" and "to when?" are one message and making you send two is how this ends up back in Discord. The important part: **asking is not moving.** Until your opponent answers, the booked time is still the game, and the room says so to both of you in as many words. He can say Keep the time and nothing changes at all, or Yes — which releases the booking and reopens the board with the times you offered already on it, so the very next tap books the new one. Change your mind before he answers and you can take the request back. It lands on his desk in Franchise HQ as the most urgent thing there, his phone gets told once, and the advance board marks a game somebody's trying to move so a commissioner reading it isn't surprised. Staff can settle a stuck one either way.
- Open your booked game and press "Ask to move it".
- Say why, and put up the times that work — they go on the board with the request.
- Your opponent taps Yes or Keep the time; until he does, the original stands.
There's one number every serious question about an owner comes down to — a recruiting card, a commissioner deciding who to invite, a badge for the people who never miss — and the site has never kept it. It does now. Your Network page carries a Passport: seasons on the books, championships, and the share of your own fixtures that actually got played, with a plain-English read on it — Never misses, Reliable, Mostly shows, Patchy. The same number rides the recruiting board, so a league looking for owners can see it before they invite anybody. Two things about it are deliberate. It cannot be backfilled and we didn't pretend otherwise: a Madden export is a snapshot of right now, it never says who owned the Bears in week 4 of last season, so a man who took a dead franchise in week 9 would inherit eight weeks of somebody else's no-shows. Instead it's a ledger that starts the day it was switched on, each week written down with whoever held that team when the week went by — take over a franchise and you start your own record from the week you took it, and the line under the tiles says when the record began so a fortnight can't read as a career. And it says nothing until it means something: under six weeks you get "4 of 4 games played so far", not a percentage, because one missed game out of three swings a number by thirty points and a number that swings thirty points isn't a fact about a person.
- Open your Network page — the Passport tiles are in the row under your name.
- Weeks are counted from your own fixtures: played, or gone by unplayed.
- On the recruiting board, every free agent's card carries the same figure.
The advance announcement used to be @everyone and a sentence. In a thirty-two team league that tells thirty-two people something that's true for six of them, and it teaches the other twenty-six to mute the channel — which is the same twenty-six you then can't reach when it IS about them. So it's a board now. Every fixture in the week, with exactly where it stands: FINAL, BOOKED with the kickoff time, ON THE BOARD when times are up but nobody's taken one, and NOTHING YET with both owners named. Nobody is @-mentioned by the post. The owners whose game is still open get a notification of their own instead, naming their own game — "vs the Chiefs, nothing on the board yet. The league advances in 5h" — with a link straight into the room. And a week where every game is already in sends nothing at all, because a message that fires on a schedule rather than on something being wrong is a message people learn to ignore. It goes out once when the advance is six hours away and once more if the deadline passes with games still open. The same board is now on Roll Call, under the clock, so anyone can check it any time — if it's your game that's open, it's the first thing on the page — and a commissioner can post it to Discord whenever he likes from the button up there.
- Open Roll Call — THE BOARD is under the advance clock.
- If your game is still open it's called out at the top; tap it to open the room.
- Commissioners: "Post it to Discord" sends the board as it stands, any time.
Scheduling a game was one man typing one time into a box and the other man either taking it or the pair of you going back to Discord — which is the thing this site is supposed to stop. One proposal isn't a negotiation, it's a guess, and a wrong guess costs a round trip through an app nobody wanted to open. So every game page is now a room. Both of you can put up to three times on the board at once, the board says whose each one is, and your opponent taps the one that works. That books it: on the schedule, on the ticker, announced in your Discord, and off both your desks in Franchise HQ. Under it: **I'm on now** — the half hour before kickoff finally has somewhere to live. It pings him once (not every time you reload), shows in his room for ninety minutes and expires on its own, so "is he actually on?" stops being a guess. The room also just says where the game is in one line — nobody's put a time up / two times on the board / booked for Thursday 9 / he's on right now / final — and the other side's moves arrive without you refreshing. A fourth time from the same man pushes his oldest off rather than being refused, you can't accept your own proposal because that isn't an agreement, and staff can book a stalled game outright. Everything the Matchup Scout added last build is still right underneath it.
- Open your game from the MATCHUP tab.
- Put up the times that work for you — up to three.
- Tap one of his and it's booked; press "I'm on now" when you're ready to play.
Two things were wrong with it and both are fixed. First, the size picker was squeezing the bitrate and nothing else: a 10 MB cap over a long show is about a quarter of a megabit, and the recorder was spraying that over whatever your monitor happened to be — often 1080p. No encoder makes a picture out of that; it makes the macroblock mush that came back on the file. The frame is now sized to the bitrate instead of the other way round, so a tight cap gives you a smaller picture that actually looks like a picture, and there's a line beside the size picker that tells you exactly what you're about to get — "360p at 0.9 Mbps" — before you press anything. Pick a bigger size or hide a few cards and it climbs to 720p and 1080p in front of you. Second, the recorder was asking for a plain "MP4" and some browsers say yes and then put VP9 video inside the MP4 box. Windows Media Player half-decodes that and shows a one-second smear, which is exactly what it looked like. MP4 is now only taken when the browser names H.264; anything else records as WebM and is called WebM, which Discord, Chrome and VLC all play. Both the Record & download button and Make the video went through the same fix.
- Open the show and look at the line beside the size picker — that's the file you're about to get.
- If it says 360p and you want it sharper, pick a bigger size or hide a few cards to shorten the show.
- Then Record & download, or Make the video on a phone.
Build 296 promised no page would be linked from two places, and two builds later there were duplicates back in the bar: the LEAGUE menu listed the league page it hangs off, SWITCH LEAGUE offered the league you were already in, the Recruiting Board sat under the Recruiting Board tab, Find people and Most active leagues each appeared in two rooms, and "All teams" showed up under a MY TEAM tab that already went to All teams if you hadn't claimed a franchise. That happened because keeping a hundred and twenty links unique across four different signed-in states was something somebody had to remember every time a link was added. It isn't now: each room claims its own address first, then a link is only kept if nothing has claimed it yet, and empty groups disappear on their own. The phone's menu, the avatar menu and Find all read that same cleaned list, so they can't drift apart from the bar. Seven ADMIN rows were renamed while we were in there — they were named after the member pages they control, so "The Hall of Fame", "The Booth", "Season honours", "Attribute points" and the item store each read identically in two different menus. The admin rows now say what you actually do there: run the Hall of Fame vote, assign your beat writers, publish the season honours, set the attribute-point rules, stock the item store.
- Open any menu in the bar — nothing in it goes where another room already goes.
- A menu never lists its own tab, and SWITCH LEAGUE only offers leagues you're not in.
- Can't find a page? Press / (or tap Find) and type what you'd say out loud.
Every game page now carries a full scouting report on both teams, split into three clearly labelled layers so nothing blurs together. LEAGUE DATA is what Madden counted and arithmetic on top of it: pass/rush split and offensive identity, yards per attempt, completion %, yards per carry, yards and giveaways a game, recent form, and who carries their passing game -- "Primary weapon: 42% of the receiving yards, DEPENDENCY VERY HIGH". The numbers we work out ourselves are labelled SAPPHIRE METRICS so they're never mistaken for something the game exported: sack RATE rather than a raw sack total, back usage (the backs' carries as a share of all plays, which is not the same as the rush rate once a scrambling QB is in the mix), a balance score, a ball-security score, and a QB efficiency rating with a read on his profile. PERSONNEL comes off the roster: unit averages for every group, the best man, the fastest man, how many are star dev or better, and who's hurt -- then MATCHUP ADVANTAGES puts them against each other, your receivers against their corners, your line against their front, with anything inside three points called a push. And YOUR NOTEBOOK is private: after you play somebody, write down what he actually did -- "runs the QB on 3rd and short", "user-controls the MIKE" -- and it's waiting there next time you're matched up. Nobody else ever sees it, and it is never presented as a Sapphire statistic. One rule ran through all of it: nothing here claims a coverage or a blitz rate, because the export doesn't carry that. If we can't count it, we don't say it.
- Open any game on the schedule and scroll to THE MATCHUP SCOUT.
- Tap either team's name to read their side.
- After you play someone, add a line to YOUR NOTEBOOK -- it'll be there the next time you draw him.
Franchise HQ opens with ON YOUR DESK: the short list of things that will not move until you move them. A kickoff your opponent proposed and is waiting on. A game with no time set and an advance coming. Offers on your desk. A trade the league is stuck behind because you haven't voted. Your call in Coordinator Clash. A fantasy lineup you never set. A poll nobody's answered. Each row says what it is and takes you straight there, and it clears itself when the thing is done -- nothing to dismiss. The same list rides the league's front door, short, so it finds you wherever you land. Underneath your week is SINCE YOU LAST CHECKED: everything the league did since your last visit, newest first, and then it STOPS -- "You're caught up." No endless scroll, and a refresh keeps the window you were half way through. New this build too: Sapphire Sunday, a once-a-week notification with your result, your record, who's next and one line on them, and what's still waiting -- and it isn't sent at all to anyone with nothing to report. It's its own notification switch in Settings, so you can have it without the rest or the rest without it. Also fixed: the Game of the Week card on League Home was printing raw code where the kickoff time goes.
- Open Franchise HQ -- ON YOUR DESK is the first thing on the page.
- Tap a row and you land on the thing that needs you; it leaves the list once it's done.
- Scroll past your week for SINCE YOU LAST CHECKED, which ends where you left off.
Two tidy-ups to the nine rooms. The MARKET is now everything money and nothing else: the Book first, then the Exchange, your tickets, the Casino, the Daily Spin, the Economy, the Bank, attribute points, the item store. Trades and talent -- the Trade Center, the block, transactions, every player, the draft board, compare -- live under LEAGUE, where the league's business belongs. And no page is linked from two menus any more: each lives in exactly one room, and a menu never repeats its own tab. If you're looking for something and don't know its room, Find (/) searches every page on the site. Also fixed on League Home: the "Got it — hide this" button on the Start Here card and the live import strip had both been dead since the 9th; they work again.
- MARKET is the money: the Book, the Exchange, your tickets, the Casino, the Economy.
- LEAGUE now carries TRADES and TALENT next to standings and the numbers.
- Can't find a page? Press / (or tap Find) and type what you'd say out loud.
The menu was fifteen flat links, five drop-downs and a strip of shortcuts -- three different ideas of a menu on one bar, and the phone carried a fourth. Now it's organised the way you think about your week: MY HQ (what needs doing), MATCHUP (this week's game -- yours, straight from the bar), MY TEAM (your war room), LEAGUE (home, standings, playoffs, polls, pulse, the numbers, the history), COMPETE (the Arcade, Drive Architect, Coordinator Clash, Pick'em, the Book, fantasy, the ladder, achievements), MEDIA (the show, newsroom, RedZone, awards, the Hall), MARKET (trades, talent, money, collectibles), NETWORK (the feed, the GOAT League, your crests, finding leagues and people), and ADMIN for staff. Three of those rooms have a front door for the first time -- Competition Center, Media Center and the Market -- with live numbers, not just links. Nothing moved address; the phone shows the same nine in the same order.
- The bar reads left to right in the order of your week: what to do, who you play, your team, your league.
- Hover or tap a room to see everything in it; Find (/) still searches every page.
- On the phone, the same nine rooms scroll along the top; ☰ MENU opens the full list.
Every badge is something you did in football: won a game, took a title (The Crown, and Dynasty at three), made the read (Drive Architect, Play Caller, Field General, Green Dot, Sapphire Elite, Perfect Drive for five elite reps in a row), out-called somebody (Coordinator Clash, Chess Match at ten, Chess Master at twenty-five), won in the Arcade (Challenger, Ranked Beast). Nothing is earned for opening the app. Each badge has its own crest, the crest rides the Discord post when you unlock one, and every crest you've earned in any league now sits on your Network page -- your résumé, not a streak.
- Open Achievements under your league -- your badges show in colour, locked ones show how close you are.
- Play a Drive Architect rep or win a Coordinator Clash and the competition badges start unlocking on their own.
- Open your page on The Network -- every crest you hold, from every league, is on the rail.
The two-player version of Drive Architect, and it's real online now, not pass-the-phone. Challenge somebody from the Arcade (a stake or none). On offense you see the formation, the personnel and the situation and lock a hidden call; on defense you see the formation and their tendencies -- never their call -- and lock a coverage and a leverage. Both reveal together, the matchup edge and the rotation are shown, the offense makes the read, and yards, downs, clock, score and each side's IQ move. Three possessions each, sides swap, so you both coach both ways. It's turn-based on purpose: you're pinged when it's your call, the page checks on its own, and a side that sits on a call for a day forfeits. Winner takes the pot and the league's arcade bonus, and it counts on the Most Wins board. Every move is checked on the server, so nobody can peek.
- In The Arcade, pick Coordinator Clash, choose your opponent (or leave it open) and a stake, and challenge.
- When it's your call you get a ping: lock the offense, or the coverage and leverage.
- When the snap reveals, the offense makes the read -- then it's the next snap, or the other side's ball.
A new game, and the first one you play alone: read the call, the personnel and the defence, make the pre-snap decision, then make the read once the ball is live. Right call plus right read is an elite rep; three in a row pays a streak bonus; QB XP takes you from Rookie Camp through Play Reader, Field General and Green Dot to Sapphire Elite, with harder looks at every level -- disguised coverages, pressure, RPO conflicts, clock and score. Your career is yours across every league you're in, and it needs no play money to start. Every decision is graded on the server, so the leaderboard is real. Which brings the other half: the Arcade now has leaderboards -- best single run in every game, most wins, and QB careers -- for your league and for the whole site. The tap games and Drive Architect rank site-wide (they're the same everywhere); the quiz games rank inside the league they're built from.
- Open The Arcade → Career Mode (Drive Architect). Read the coach's note, then tap your pre-snap call.
- The ball is live: tap the read. The feedback tells you why, and the XP lands on your career.
- Tap Leaderboards on any Arcade page to see your league and the whole site -- best runs, most wins, QB careers.
The weekly show lives on League Home -- the video your staff made plays right there, or the week's show is one tap away -- with the week's three storylines under it. The advance countdown is in the header for everybody, not just the commissioner, next to how many of this week's games are in. The Game of the Week is its own card with records, power ranks, kickoff and the preview. The rail leads with About your league (your listing's words, platform, schedule, Discord), the stat leaders (passing, rushing, receiving, tackles) and the race; the wall of quick links folds away -- every one of them is in the menu anyway. And Up Next no longer disappears mid-week: the games still to be played this week stay listed until they're final.
- Open League Home -- the show is at the top; tap Play (or watch the video staff recorded).
- The countdown in the header is when the league advances; the Game of the Week card opens the preview and the odds.
- Staff: fill in Admin → Invite so ABOUT shows your league's own words, and record the show under The Show → Make the video so it plays on the front page.
The Network is SapphireSportz across every league: handles, posts, the GOAT League. Until now a league was on it only after staff found the page and pressed Join, and a member only after claiming a handle -- so most of you weren't. Now every league that's up and running is on the Network, and every member of one has a handle made from their Discord name. Don't want it? Settings → The Network → Off hides your handle and anything posted as it, and nothing puts you back on without you; staff can take a whole league off under Admin → Network. And because every kind of notification is already on unless you muted it -- what most members never did is the one tap a phone needs before it'll show any -- a bar now asks you to turn them on when they're off. One tap, then game pings, the advance, trades and your league's posts reach your phone.
- Open Settings. Under THE NETWORK you'll see your handle -- tap it to see your page, or Off to leave.
- If a bar at the top of the page says your notifications are off, tap Turn on and allow it.
- On iPhone, add SapphireSportz to your home screen first (Share → Add to Home Screen) -- Apple only allows notifications from there.
Leagues don't die all at once; they go quiet. The Pulse takes a reading every day -- heartbeat (the export), games played this week, owners around, seats filled, and the room (posts, chat, trades) -- scores it out of 100, and tells you what to fix first, with a link to where you fix it. Once a week the bot posts the score and the first fix to the league. Under it, staff get "Who's using it": every member, how many days they opened the site or the app this month, on which one, and when -- so you can see who's actually here before a seat goes cold. Showing up now counts toward prestige: every day you open the site in your league earns XP, a day in the app a little more. The directory shows each league's pulse, and the weekly around-the-network post lists the liveliest leagues first.
- Open Admin → League Pulse. The dial is the score; the box next to it is what to do first, with a Go link.
- Each of the five parts shows its points and why -- the bars go green when that part is healthy.
- Admin → Who's using it lists every member by days on the site and in the app; route the weekly post under Admin → The Wire → League Pulse.
Once a week, every league's Discord gets one post from the network -- the other leagues on SapphireSportz that are taking owners right now, which of them want a co-admin, how many free agents are on the board, and the directory link. Your own listing is never in your own post; it's in everybody else's. On the recruiting desk you can now say you want a co-admin, and the promotion kit got a POST IT row: one tap opens X, Threads, Bluesky or Reddit with your post already written (real open count, join link and all), plus a recruiting card -- your listing as a picture with a QR to the join page -- to attach anywhere.
- Open Admin → Invite, fill in the listing and tick "we want a co-admin" if you do.
- Under POST IT, tap the network you want -- the post is already written -- and download the card to attach.
- Every week the bot tells every other league who's hiring; route or switch it off under Admin → The Wire → Around the network.
Madden 27 exports the practice squad and injured reserve inside the team's roster, so every team on the site read as 63 to 68 men, a practice-squad rookie could sit at the top of a depth chart, team needs and team strength counted men who never play, and the Trade Center offered players Madden won't let you trade. The active roster, the practice squad and IR are now three separate lists on the team page with the counts up top; the depth chart, needs, ratings starters and the team-build tracker read the 53 only; practice-squad players are off the Trade Center (any team can sign them instead); and the Players table has a Squad column so you can filter to practice squads league-wide. If a roster still looks wrong after this, that's an export problem -- re-export the team from the Companion App.
- Open your team page.
- The roster count reads "53 on the active roster · N practice squad · N on IR", with the practice squad and IR in their own tables underneath.
- On the Players table, add the Squad column to see every practice-squad player in the league.
The Arcade's games are played on the site (Field Goal, QB Drill and Snap Count are tap games; Discord can't run those), but the fight can start in Discord: `/arcade` picks the game, calls somebody out or posts it open, puts play money on the line, and drops the challenge card in the channel with a Play it button that opens the match. Same money, same identical run for both players, same arcade bonus as a challenge made on the site. Needs the bot's next update for the command to appear.
- Open The Arcade under THE PEOPLE and pick a game.
- Call somebody out or leave it open, set the stake, tap Challenge & play -- your run starts right away.
- From Discord, /arcade does the same and posts the challenge with a Play it button.
Nobody should have to find the Collectibles page to look like the prestige they earned: the highest crest and frame you've unlocked are now on automatically, everywhere they show -- the ladder, your card, the role icon in Discord. Pick a lower tier only if you want to; clearing a slot puts it back on automatic. Discord draws a role icon at twenty pixels and nothing changes that, so the crest now also rides big -- as the picture on every post the wire makes about you: a level, a star, a casino win, an achievement, a GOAT nomination.
- Open Collectibles -- your best crest and frame are already on.
- Leave a slot on Automatic to always wear your best, or pick a lower tier.
- Watch the wire: posts about you carry your crest as the picture.
Update posts used to describe what changed and leave you to find it. From now on each one links straight to the feature in your own league, lists the steps, and comes with a short clip of it being used, because most people learn by watching. This first one shows the newest thing: making a show video and posting it to Discord in one tap.
- Open any show -- the week in review, a game recap, the draft recap.
- Tap Make the video and let it draw every card.
- Tap Post to Discord. The bot drops it in your channel as a video that plays inline (pick the channel under Admin → The Wire → Show video).
When a show finishes rendering there's now a Post to Discord button next to Save / share. One tap hands the file to the site, and the bot drops it in Discord as a real attachment that plays inline -- the week in review, a game recap, the draft recap, whichever you made. Route it: Admin → The Wire → Show video picks the channel; unrouted, it lands in the server's front room. The Discord-ready size fits every server; a bigger file posts as a link when the server's upload limit is under it. Needs the bot's next update to deliver the file (until then the wire posts the link).
When Madden handed every franchise a new team id, the site moved rosters, schedules, standings and the wire onto the new numbers -- but the trade log kept the old ones, so every deal from before showed a question mark on both sides in the Trade Center. Those deals now resolve to the club they belong to (matched by name against the archived exports, so nothing had to be re-entered), the stranded ones were repaired on deploy, and the next renumber carries the trade log along with everything else.
A defensive tackle's page used to list the same eight numbers as a corner's -- speed, acceleration, agility, strength and the rest -- which told you nothing about either of them. Every position now has its own list: the two physicals that decide whether he can play it, then the skills that decide how well (a DT leads with strength and block shedding, a corner with speed, man coverage and press, a left tackle with pass blocking, a quarterback with the three accuracies and throwing under pressure). The player card in Discord and the app print the same list, twelve deep, and the almanac's cards match.
The name a Discord server gave you used to follow you everywhere: a nickname from one league showed up on the ladder, the economy page and the chat of every other league you were in, and so did the crest of a team you only own over there. Now each league calls you what its own Discord server calls you -- your server nickname there, or your real Discord name if you haven't set one -- and the crest by your name is for the team you run in that league. The bot sends every member's nickname to the site and keeps it current when it changes (once it picks up its update); until then, signing in to the site once puts your real Discord name back.
The Draft Recap episode now carries the draft the way the page grades it: Steals of the Draft (the picks that beat their slot by the most), The Reaches (the ones that fell furthest short), and a Draft Grades board with every team's letter grade and how far over or under the slot their class landed -- the same numbers as the Draft Recap page, so the video and the table can't disagree. And every final now has its own episode: open the game page and tap The Game Recap for the score with the booth's take (and any League TV clips filed on it), The Stars with each man's line, By the Numbers with the team stat lines and what decided it, and the storylines those two teams carried in. Staff can make any of these into a video with the same Make the video button and post it in Discord.
The bot can now paint every team role in that club's own colour, straight from the league file -- so a name in chat and in the member list is Cardinals red or Vikings purple, the same colours the team plate wears on the site. A navy or a black gets lifted just enough to show on Discord's dark theme and no further. On a server boosted to Level 2 the role icon is the owner's equipped crest, and the club logo until they equip one, so every franchise looks like one. Commissioners: `/teamroles create` builds new roles in colour, and `/teamroles sync` or `/teamroles crests` repaints the ones you already have (once the bot picks up its update).
A winning money-line ticket was only paid when somebody happened to open a page that still listed the market -- and that card leaves the book as soon as the game has a final, so the stake could sit unpaid until the Exchange was opened. Now the payout runs the moment the export lands the score, and again every fifteen minutes as a backstop, so nobody waits on a click. A money line typed the wrong way round (Jets @ Vikings for a game the Jets hosted) or with abbreviations (MIN @ NYJ) now finds its game and pays the right side; a line on a game that never existed in that week is refunded once the week is played out. Market Movers on the Economy page used to compare the last two statements, which are a single bet apart in a league whose money lives on the site -- so it read +0 for everybody. It now shows each account's net change over the last seven days, bets included.
Tapping through the show quickly could leave an old scene stuck under the new one, so by the time you reached The Ratings you were looking at three screens at once. Every scene now leaves properly before the next one lands. The video maker's top setting made a 1080p file that came out of phones as a blue smear -- the phone's encoder spreads the same bitrate over twice the pixels -- so every setting now makes a crisp 720p file and "No cap" spends all of the bitrate on it.
On a server boosted to Level 2, the bot can put each owner's equipped crest on their team role as the role icon -- so the crest sits beside your name on every message you send and in the member list, the way it does on the Ladder. Commissioners: `/teamroles crests` sets them, and `/teamroles sync` keeps them current after trades and new equips (once the bot picks up its update). Change your crest on the Collectibles page and the next sync carries it over.
Field Goal -- eight kicks from 30 to 60 yards with wind in play: tap to start the power meter, tap to lock it in the green, tap again to time the aim, and watch it fly. QB Drill -- thirty seconds of targets popping up on the field; hit them before they shrink away, and quicker hits pay more. Snap Count -- wait for HIKE, then tap; jump early and it's a false start. Same rules as the quiz games: both players get the identical kicks, targets and snap counts, the winner takes the pot plus the arcade bonus. Higher or Lower now shows the players' faces.
Two head-to-head games, both built from your own league's data. Two-Minute Drill -- ten questions about this league (who's the highest-rated corner, how many wins the Jets have, who put up the most points in week 9), four choices, twelve seconds each, points for being right and being quick. Higher or Lower -- fifteen players in a row, is the next man's overall higher or lower, streaks pay extra. Challenge one person or post it open to the league, put up a stake or play for nothing, and play your run right then; your opponent gets the identical set and can't see your score until their run is in. Higher score takes the pot, a tie goes to the faster run, and the winner also earns the league's arcade bonus (the commissioner sets it; three rewarded wins a day). Everyone's first play of the day pays a little, win or lose. Find it under THE PEOPLE in the menu. It opens for leagues whose money lives on the site.
The old fifty-million ceiling on a parlay slip is gone, the same way it went from the casino and the single bets in build 264 -- if the cash is in your account, the book will take it. Also some plumbing so the iPhone app stays signed in as long as the website does.
Nothing changes on the site today, but underneath it every page can now answer the SapphireSportz iPhone app directly, sign-ins can land in the app, and the notifications you already get on the web (pings, advances, DMs) will reach the app the moment it exists. The app itself is being built now; TestFlight invites go out to league members first.
There's now a plain-language Privacy page (footer, next to Terms) that says exactly what SapphireSportz holds: your Discord login details, your league activity, a Stripe reference for billing, and nothing else -- no ad trackers, no selling data, and the show video never leaves your phone. It's also the page the Google Play listing points at: the SapphireSportz Android app is built and heading into Play Store testing.
Every row on the leaderboard now leads with your Discord picture -- inside your franchise frame if you've equipped one -- with your crest beside your name and your level as a small pill, the way Discord shows people. In Discord, `/rank` wears your equipped crest as the card's thumbnail (once the bot picks up its update).
Tier III is in: the sapphire crest and frame for all 32 franchises, unlocked at Prestige 3. The perks now do what the ladder promised. Prestige 1: the Prestige Edge on every prop, the full Analytics page (everyone else sees the top five of each table), and the Tier I frame. Prestige 2: the combine read on the whole draft class (everyone else gets it on the first ten prospects), Tier II, and your name in gold. Prestige 3: Tier III. Your prestige counts across every league you're in -- earn it in one, carry it to all. And it isn't permanent any more: each time your oldest league starts a new season, one prestige comes off. Nobody loses a star today or for the season already under way; it starts at the next week 1. Climb again to keep the edge. Also: your picture now sits inside the frame's window on your handle page instead of behind it, so the ornate frames read properly.
The crown-and-ball crest is the icon now -- on the home screen when you install the site as an app, on the tab, and on Android's shaped icons. If you already have SapphireSportz on your home screen, remove it and add it again to pick up the new one; phones don't refresh an icon on their own.
The second set is in: a laurelled crest and frame for every franchise, unlocked at Prestige 2. They sit beside the Tier I set on your Collectibles page, so you can run the Tier II crest with the Tier I frame or any mix you like; whatever you equip is drawn for the team you hold now.
The first set of cosmetics is drawn: a crest and a frame for every franchise. The crest comes with your team -- equip it on your Collectibles page and it sits by your name on your handle page. The frame is the first prestige's reward: hit Prestige 1 and your picture goes inside your franchise's frame. Both are drawn for the team you hold now and follow you if you move. Later tiers stack on top of this one.
The $50M ceiling on a stake is gone from the book, the parlays and the casino, and the 25,000 ceiling from the 2K court book. Your cash is the limit -- the ledger still won't let anyone bet money they don't have. The bot's stake modal no longer stops at 50M either.
No more explaining the formula on air: the card is the top five, each with its number, and nothing else.
A full sixteen-game week was running off the bottom of the scoreboard card. The grid now goes to three columns past eight games and four past twelve, with the rows sized to the column, so nothing sits under the ticker. On a phone it stays two across.
Madden exports a team that is over the cap as a wrapped-around number -- about $4,294M of "room". The team page, the trade desk, Contract Talks and the Free agency episode now read it the way the game means it: a negative figure, shown in red as Over the cap.
A third off-season episode, Free agency, for after the re-sign window: the top free agents as cards with what they're asking, the best available at every position, who has the room to pay them, and what has moved since the Super Bowl -- signings and the men who hit the market -- all read off the rosters and the transaction log. The motion pass: headlines now come up a word at a time through a mask, rows lean in 60 ms apart, cards turn in, scores count up and land -- and every one of those moves is transform and opacity only, so a cut costs the screen nothing and stays smooth on a phone. The exit is quicker than the entrance, the way a real graphics package does it. Reduced-motion users get fades, not stillness. Getting around: tap the left quarter of the stage to go back, the rest to go on; swipe left and right on a phone; and an on-stage control strip (back, play, next, script, music, fullscreen) shows on any touch or mouse move and hides itself, so fullscreen has controls too. Fullscreen and recording now keep the stage a true 16:9 box on black at any screen size instead of stretching it, and a phone held upright fills the width. Also: the crest upload limit is 3 MB now, up from 2.
The show's size picker now matches what your Discord can take: a standard server (under 10 MB), a Level 2 boosted server (50 MB), Level 3 (100 MB), posting with Nitro (500 MB), or no cap. The more room, the sharper the file -- bitrate scales with the cap, and from 50 MB up the file is made in 1080p. Commissioners set the league's default on the edit desk's Sound panel, so members of a boosted server get the better file without thinking about it; it can still be changed on the show page for a one-off.
The show page has a new control for commissioners: Make the video. It draws every card of the show into a video right there on the device -- phone or computer -- with the same running order, holds, count-ups and cuts, the music and effects you picked (Music off first for a voice-over version), and then hands you the file to save or share straight into Discord from the share sheet. Pick Discord-ready and it stays under Discord's 10 MB; Full quality for an edit. Twitch clips can't be copied into a file the page makes, so a game card shows the clip's title where the clip would play; Record & download on a computer is still the version with the footage in it, and it now honours the same size choice. Keep the page open and in front while it makes the file -- about the show's running time. Also: a storyline or contract card that joined the show after you'd saved an edit now slots in where it belongs (after the scoreboard, after the ratings) instead of after the sign-off.
Storylines: right after the scoreboard, the week's cards -- read off the export, never made up. A team on a win streak or a skid, the upset (a winner with at least three fewer wins going in), a heater (three or more straight 100-yard, 300-yard, three-touchdown or sack games), from Week 6 the league leader on pace for a big number, a man in the last year of his deal sitting top five in a category, and the rookie in the top ten. Four cards, each with the numbers behind it; hide or reword any of them on the edit desk. Contract Talks: after the ratings, the expiring deals by overall with the cap hit and years left, the cap crunch -- teams with more money coming off the books than they have room -- the richest deals and the bargains (85+ on the cheap). The Off-season preview, after the Super Bowl: the champion and who gets the ring, the final ratings, who improved and who regressed as a team over the season (every roster's overall movement, graded Building, Ageing, Rising or Slipping -- the same numbers as the progression page), and contract talks going into free agency. The Draft recap, after the draft: the class by team with each team's best pick, the six highest-rated rookies as cards, who improved and who regressed since the Super Bowl, and the cap as it stands. Both episodes are in the week list on the edit desk and linked from the show.
The race segment of The Week in Review is split the way the playoff page is: the seven seeds as they stand, numbered, then an In the hunt band with the next three chasing the field -- each with their record, their odds of making it and of the 1 seed, and, for anyone still in the thick of it, who they should be pulling for this week. The host's line names the hunt teams and the one with the best shot from outside.
Music under the show: commissioners pick a track on the edit desk -- from the SapphireSportz shelf, where every track is listed with where it came from and its licence, or a song of their own they upload for their league (their choice, their responsibility, and the desk says so). Volume slider, and the effects switch: every cut now gets a whoosh, scores land with a hit, the open and close get a stinger, and a riser tips the next card when it's running itself. The effects are ours, made from scratch, so nothing in them can be claimed by anyone. Music ducks under clips and comes back up on the cards. First tap on the show turns the sound on; M mutes the music. Players of the week are the men, not emoji: each award is a card with the player's photo, his overall, position, dev trait and the ratings his card prints, on his team's colours, with the line that won him the week. From the Week 10 show on, the playoff race gets its own segment after the seeds: every team's chance of making it and of the 1 seed from the same 3,000-season simulation the playoff page runs, with the odds bars, and for the teams in the middle of it, who they should be pulling for this week and by how much. Commissioners get Record & download on the show page: it records this tab, runs the show from the top with the sound they picked, and saves a video file when it signs off -- post it in Discord, or turn the music off first and lay a voice-over or your own track on it in any editor. Chrome or Edge on a computer. And the motion pass: cards leave to the left as a light bar sweeps the stage, headlines are unmasked instead of faded, rows lean in one after another, scores and overalls count up. All of it stands still for anyone who has asked their device for less motion.
Under League TV there's now a show. It opens on the week, runs the scoreboard biggest margin first, gives every game with footage its own card -- the score, the booth's take, and the clips filed to it, each playing for its length -- then the players of the week, the top of the ratings, and the playoff picture, and signs off. Cards slam in like a real graphics package, there's a ticker underneath, and a teleprompter you can turn on for whoever's hosting. Space steps through it by hand; A lets it run itself; F goes fullscreen so you can press record and post it. Members get the link, no download needed. Commissioners get an edit desk for each week's show: move segments, hide the ones you don't want, and rewrite the words on any card -- that's what the prompter reads. Only the cards you actually change are kept, so the rest keep following the week's numbers. Which clip belongs to which game is decided on the Clip Desk, and the show reads that, so the show and RedZone can never disagree about whose footage a clip is. The hot seat stays off it on purpose; that's staff business and this page is public.
Clips file themselves to whichever game their owner was playing when they were cut, and that's usually right. When it isn't -- a stream from another league, a clip cut a minute late, a member with no team assigned -- there's now a Clip Desk under your admin tools. It lists every clip the league has harvested with what it's filed under, and lets you pin it to the right game or mark it as not this league's footage. Your call beats the automatic one everywhere the clip shows up, RedZone included, and it's per league: hiding a clip here does nothing to the clipper's other leagues. Clear a pin and the automatic filing takes over again.
If somebody is in more than one league, going live used to put him on every one of those leagues' League TV at once -- his other league's draft night on your front page. Now, for a member who's in other leagues too, his stream shows here only when the title carries your league's acronym as a whole word, the same rule RedZone already uses for clips. Members who are only in your league are never gated; there's nothing to disambiguate. If you'd rather see everything your members stream regardless of title, there's a switch for that on the Twitch settings page, per league. If you've never set an acronym and haven't ticked the switch, the settings page now tells you your multi-league members won't appear until you do one or the other.
The page that lists what EA sends that the site never uses only understood Companion App uploads. Leagues the site pulls from EA itself were filed under a question mark, and the page read exactly one of their payloads -- the franchise list, which has nothing in it -- and reported that every field was in use. It now understands both doors, so the answer it gives is about the league it was asked about.
When a commissioner added a player prop from the site, the site handed it to the bot with the name read straight off the raw roster export -- which carries a first name and a last name and no full name. So the bot got "?", and in leagues where the site runs the rosters it had nothing of its own to fall back on. The board printed a question mark, and so did the wire post announcing the line. The name is stitched together properly now before it leaves the site. Props already sitting on a board with "?" were created before this and won't repair themselves -- remove and re-add those.
Making the playoffs and taking the bye are different races with different people in them. A 10-2 team has the field all but locked and the 1 seed wide open, and the games it should care about this week are not the same games. The playoff page now shows every team's odds of the 1 seed next to its playoff odds, and a second rooting guide -- which of this week's games move those odds, and which way to pull. Same 3,000 simulations, same seeding as the playoff picture, so the two can never disagree about what a record is worth. Teams with no realistic path to the 1 seed don't get the line at all, so the page stays about the teams that are actually in that race.
The hot seat used to count sim losses only, so an owner who kept getting fair-simmed but happened to win the coin flip never showed up on it. The rule is wider now: being involved in a fair sim counts against both owners whichever way the CPU went -- nobody scheduled that game -- and a force loss counts against the man who didn't show. A force win counts for nothing; it's the other owner's absence, not yours. A played game still breaks the streak, win or lose. Alongside the streak, every owner's season totals are shown -- fair sims, force losses, force wins, games played -- and a new section lists everyone who has marks on the year even if they've played since, worst first. Five fair sims spread across a season is a pattern the streak alone would never show you. When somebody crosses the bar, every commissioner of that league gets a private notification, once, on their phone -- nothing is ever posted to the league, because a person's absence record is staff eyes only. That check runs every fifteen minutes whether or not anyone opens the page. And when you've decided, there's a Remove from league button on the row: two clicks, no dialog, and it records the reason as stopped playing games with the record attached.
If your league had the overnight sync running and you were still being asked to sign in to EA every week or so, this is why. EA gives a connection about ten days and hands back a fresh ten every time it's used, so a site that touches it every few days keeps you signed in forever -- and that's what the keep-alive does. But the overnight sync marked the connection as "just touched" the moment it claimed the night, before it pulled anything and whether or not EA was ever actually reached. The keep-alive believed it and stood down. Every night. So the connection was never renewed, and ten days later you were signed out -- and the leagues it happened to were exactly the ones doing the right thing. The two now keep separate records, and only a real sign-in or a real renewal counts as one. When this deploys, every live connection gets renewed once, so everybody starts from a fresh ten days. Second thing, same area: a night that got claimed but never actually imported -- the server restarting at the wrong moment was enough -- disappeared silently. Nothing recorded a failure, so the three-strikes pause never triggered and nobody was told. Those now count as failed nights, which means a sync that has stopped working says so in your Discord instead of going quiet for a month. Third: EA Health now shows whether the overnight sync is on for each league, when it last ran, when that league's EA sign-in was last renewed, and one line at the top saying whether any connection is overdue. Whether this is all working is now something you can look at rather than something you have to notice going wrong.
Upgrades could only ever be a rating, an overall, or a dev trait. Anything else went through "Something else" as free text, which meant your commissioner reading a sentence and doing the bookkeeping in his head. Madden leagues can now ask for a Superstar or X-Factor ability, and 2K leagues can ask for a badge at Bronze, Silver, Gold or Hall of Fame. Same desk, same items, same cooldowns and caps -- nothing new to set up, and each league only sees the one that belongs to its game. The ability list is built from your own league's rosters rather than a list we typed in, so it's whatever Madden actually shipped this season instead of something that goes stale the next title update. The site also refuses the two asks that used to waste your commissioner's time: an ability the man already has, and a badge at a tier he's already at or above. Legend isn't offered at all, because 2K doesn't let one be given -- those only come through Synergy and season play. Separately: if a player is missing an ability you know he has in the game, the man who runs that team can now report it from the player's page. That does NOT change the card. The site keeps showing exactly what EA sent, because a card that quietly disagrees with the game can't settle an argument -- and settling arguments is the whole job. What it does is put the player in front of your commissioner on the upgrade desk so he can pull the league again and look. Only the team's owner can file one, one per player per ability, and you can see on the player's page whether yours is still waiting or has been confirmed.
Borrowing used to mean one lump sum on a deadline, and a deadline is easy to forget until the day it bites you. You can now choose a plan instead: four weekly payments or eight, and the bank pulls each one itself. The figure is quoted before you borrow -- you see what each payment is and what the loan costs in total, and because the interest is worked out on what you originally borrowed rather than compounding, that quote is exactly what comes off. Your loan shows the whole schedule with the next date on it, so nothing ever arrives as a surprise. If the money isn't there when a payment comes due, the payment does not go through -- it will not push you into the red -- and that bounce goes on your credit for 25 points. The bank asks again with your next payment, so being short one week and flush the next puts you square. Catching it up settles what you owe; it does not unsay that the account was empty when the bank came for it, which is the part that makes the score worth anything. Pay a loan off by hand and the rest of the schedule stops immediately. The old way still works -- one payment, whenever you like, inside the term.
Every commissioner keeps a pinned message listing who owns what and which teams are free, and every one of them goes stale within a week. The site can now post it for you, built from what's actually true this minute: every team grouped by division, who drives it, and what's open -- plus this week's fixtures with the men who owe you a game, and which ones are already in. The part worth having is that it tells the two kinds of empty apart. A team nobody has claimed here but that Madden says somebody owns is flagged, not listed as free -- offering that one to a recruit starts an argument with whoever is already playing it, and that mistake costs you a member and a recruit at the same time. Genuinely free teams are marked separately. Commissioners will find it under their league's admin tools.
The site works out an MVP race from the numbers, and on the Madden side it sees every stat EA exports. A 2K league is different: its box scores are photographs somebody remembered to take, so a man can have the season of his life in the games nobody filed and the model will never hear about it. Telling that league the numbers say otherwise is telling them their own season is wrong. So a commissioner can now name the candidates himself and open a ballot -- everyone gets one vote, you can change it while it's open, and the result posts to Discord when he closes it. The model's board doesn't go anywhere; the ballot sits above it, and every nominee's real season line is printed next to his name so anyone can disagree with the pick using the same numbers. A tie won't close: the site says it's tied and leaves it to the commissioner rather than inventing a tiebreak nobody agreed to. Reopening a ballot clears the votes, since votes cast on a different list of names aren't answers to the new question.
The only message this site could send to all of your servers at once was the note that rides along with a new build -- so when something like today's EA trouble happens, saying anything meant either pushing a release or going server to server by hand. There's now a proper way to say one thing to every league through the bot. It goes out as a platform notice, which reaches a server even if it has most other notifications switched off, because a platform telling you it's having problems isn't a notification preference. Sending the same words twice does nothing the second time -- the usual way a broadcast goes wrong is somebody pressing the button again because the first press didn't look like it worked. And it defaults to Madden leagues only, since a 2K server has no reason to hear about EA.
With EA's servers struggling, imports have been failing across every Madden platform and leagues were sitting hours without a fresh pull. There was no way to kick them all off at once -- each commissioner had to go and press Pull himself. Now there's a single button that queues every league whose EA connection is actually working. It can't cause a stampede: the import line has always run one league at a time, so this writes the tickets and the queue walks them at its own pace. It also skips the leagues it would be pointless on -- a sign-in EA has already refused will be refused again no matter how many times it's asked, and queuing it just puts it in front of a league that might have worked. Those still need thirty seconds from their commissioner, and the page says which ones.
The matchup card listed both lineups and not a single point, so the one question you open it to ask -- who's carrying me, who's killing me -- had no answer on the page. The numbers were already being worked out for every player; they just weren't being shown. Now each matchup reads line by line the way a matchup actually reads: both men at the same slot on one row, their points facing each other in the middle, and whoever won that slot lit up. Totals up top with a bar so you can see the gap and not just the score. Benches fold open underneath, best week first, because the only reason anyone opens a bench is to find out who they should have started. Slots also come out in the right order now -- the page was showing WR2 above WR1 and the halfback last, because two parts of the site spelled the same positions differently and everything one of them didn't recognise got shoved to the bottom.
EA's sign-in expires about every ten days, and exercising it buys another ten. The site was already renewing yours -- but only when somebody opened your league's front page. That works fine for a busy league, which was never going to lose its session anyway, and does nothing at all for a quiet one. In other words the renewal was wired to the exact signal that disappears when it's needed. This morning that had seven leagues locked out of their own imports, one of them for nine days, all reading the same thing: sign in again. It now runs on a clock instead, sweeping every connected league every few hours whether or not anyone has looked at it, so a connection stays alive indefinitely on its own. A session that has already expired is deliberately left alone -- EA has refused that one, and asking again just fails on a loop, so those still need thirty seconds from the commissioner.
The Bot Feed page started telling nearly every league that a second copy of the bot was running. It wasn't. The wire and the roster-news feed each number their items separately -- the wire was up around 25,900 while news was around 3,600 -- and the readout was judging both as one stream. So every time the bot alternated between the two, which is every cycle, its position looked like it had jumped backwards, and backwards is the one thing that can only mean a duplicate. A perfectly healthy bot was being accused twenty times over. Each feed is now judged on its own and a league reports the worse of the two, so that warning means something again. Nothing was ever wrong with the bot, and nothing needed stopping.
EA's update started handing every club a brand new team ID -- same thirty-two franchises, same names, same rosters, different numbers. Madden ships no transaction log, so this site works out moves by noticing that a player's team changed since the last export. Renumber all thirty-two clubs and every player in the league looks like he was traded on the same morning, which is why some leagues saw a flood of trades that never happened, teams showing up twice in rankings, and owners told they were on a bye in a week they had a game. The site now recognises a renumber for what it is: when an export brings back the same clubs wearing new numbers, your league is moved onto the new numbers before the roster is even read, so nobody gets traded, nothing gets duplicated, and your schedule follows your teams. It is deliberately hard to trigger by accident -- a relocation, a rename or one team fixed by hand all fall well short of it. Leagues already hit are repaired on startup, and the trades that never happened are binned rather than left in your history. Nothing produced by a renumber is allowed out to Discord.
When the bot started repeating itself there were two possible explanations and both look identical from inside Discord: either one bot posted a batch and failed to write down that it had, or two copies of the bot were running, each keeping its own place in the queue and neither doing anything wrong. Rather than guess, the site stopped depending on the bot's memory and started keeping its own. Each league's feed now has a floor that only ever rises: ask for something at or below it and you get nothing back instead of a repeat. A bot that forgot gets silence. A second copy gets silence. The loop can't become noise in your channels either way. Reopening a closed feed is safer too -- the skip is now written down here, so a feed that was shut while the bot was switched off still doesn't dump a day of catch-up when it comes back. And because a watermark that jumps backwards can only mean a second bot, the Bot Feed page now says that in as many words, since that one is fixed at the host and not here. If something genuinely is missed, Rewind hands it back deliberately.
A 2K box score already produced a recap -- but it went to the wire and the team's posts, and the one page built to be opened after a game didn't show it. So for most people it may as well not have existed. Now the game page carries the read itself, with the writer's name and face on it, and under that the booth: the analyst, the loud one and the old head, arguing about what just happened. The booth used to be football-only for a silly reason -- it was hardwired to build its facts from a Madden export -- so a basketball game never got a room. The analyst also had nothing to work with: the numbers he's allowed to cite came from the football ratings table, which says nothing true about a basketball league. He now gets this league's own -- net rating, offensive and defensive rating per hundred possessions, effective field-goal percentage, pace, turnover and offensive-rebound rates, and the opponent-adjusted rating -- and the fact-checker treats them exactly like everything else: say a number nobody gave you and the sentence is thrown out. All of it fires the moment a box score is uploaded, so the write-up is waiting when the first person opens the game rather than starting when they do.
EA's companion app is struggling to push exports across Madden right now, and every league is hearing about it. But on this platform most leagues aren't affected at all -- the site pulls your franchise from EA directly rather than waiting for the app to push it -- and the handful that are stuck are mostly stuck behind an EA sign-in that quietly expired, not behind EA. One banner saying "EA is having problems" would be wrong for nearly everybody, and would tell the people who can fix their own problem in thirty seconds to sit and wait instead. So the notice is one switch, and what it says is read from your league's own connection: if your sign-in lapsed it says so and gives you the button, if EA is genuinely refusing your data it says to sit tight, and if you're fine it says this doesn't apply to you. League staff only -- an alarm with no button isn't news to anybody else.
Every time the bot asks this site for news it says which item it already has. A bot that is posting properly asks for a higher number each time; a bot stuck in a loop asks for the same one forever, because it posts, forgets it posted, and comes back to the same place. The site was serving that number thousands of times a day and throwing it away. It's written down now, and the Bot Feed page says in one word whether each league's bot is climbing, parked with nothing to send, or still looping -- so bringing the bot back after a bad day means opening one quiet league and watching, instead of reopening everything and hoping.
When the Discord bot starts repeating itself, the only fix used to be turning the bot off -- which also takes every slash command, every button and every DM down with it, usually in the middle of somebody's lineup change. The site can now close the feed instead: the bot stays up and keeps answering people, it just stops being handed anything to announce until the feed is opened again. Announcements that happen while it's closed are skipped rather than stockpiled, so reopening it never dumps an hour of catch-up into your channels. Anything a member actually asked the bot to do is the opposite -- those are held, not dropped, and they run the moment the feed opens.
The page was one long column with a half-empty one beside it, and the two things worth opening it for -- who to call, and who is running out of contract -- were buried under everything you don't read every day. Now: your game and the scouting read on this week's opponent sit side by side across the top, the trade advisor and the contract ticker are the first things under them, and the reference stuff (your season, the dev board, the quick links) fills the column that used to run out halfway down. The contract ticker no longer hides behind "Everything" -- it's there in both views. The bulky panels fold up with a line telling you what's inside, so the availability grid, the upgrade form and the post box are one tap away instead of 300 pixels each. Same page, same everything on it, about half the scrolling.
Some leagues had every team twice -- the same 32 names under two different sets of ids, which happens when an export from a different franchise file lands on a league's link. It showed up as 64 teams on the Teams and Standings pages, and, worse, as an owner being told he was on a bye every week because his team was pointed at the copy the schedule never mentions. The site now folds the copies into the real teams on startup: duplicates are archived (nothing is thrown away), and every assignment, post, kickoff, trade and upgrade request that pointed at a copy is moved to the real team. Franchise HQ finds your game again.
Scouting an opponent used to be all-or-nothing: if one part of the report couldn't be built, the whole page said "hasn't played enough games" and showed nothing -- not their power rating, not the line, not the scouting. Now every section stands on its own. Each one either shows its numbers or tells you in plain words why it can't yet (no completed games on file, no box score for the matchup, and so on). A pocket passer with zero carries finally gets his quarterback card, the team picker no longer pretends the first team in the alphabet is selected, your real next opponent is marked right in the list, and picking a team scouts them immediately. The Gameplan card on Franchise HQ follows the same rule: it always shows who's next, even when there's no strong read yet. And the MY GAME panel no longer just declares a bye: it says which week it looked at, how many games are filed there, and when your next real game is -- so if the schedule and the site ever disagree, you can see exactly where.
League Home's Quick Links panel -- the one grouped into The League, Your Team, Money & the Book, Look Something Up -- never got a group for The Network, GOAT League or Collectibles, all three shipped after this panel was written. Added one, so the newest parts of the site are one tap from the page everybody actually lands on, not just buried in the top menu.
The walkthrough that greets a new member was still teaching a menu from months ago on some pages -- naming a menu that no longer exists and never mentioning Trading, Draft, The Network, GOAT League, or Collectibles. It now reads your actual menu bar and describes whatever is really there, so it can never go stale like that again -- and it stays current the day a new menu ships, no separate update needed.
Normal, Star, Superstar, X-Factor -- every dev trait on the site now shows as a real badge instead of plain text, colored the way you'd expect (bronze, silver, gold, and a red one that actually crackles). Shows up on every player page, the Draft Recap's steals and reaches and pick-by-pick grades, and the public rankings on the homepage. Same trait data as always, it just finally looks like it.
A real binder, not just a badge shelf -- earn a GOAT League nomination and you get a numbered card for it; win the whole thing and you get a one-of-one champion's card. Every card carries a visible history of everyone who's ever owned it, and you can propose a straight card-for-card trade with anyone else on the Network -- they accept or decline, no open marketplace, and never anything but cards on either side. Accessories work differently: a Team Color Frame, a Franchise Crest, a Dynasty Banner for anyone who's won three or more titles -- these are earned by playing, and equipping one is free and reversible. Find your binder under Collectibles in the menu, or on anyone's Network profile.
A league's own shortlist vote now settles its GOAT nominee unless that vote genuinely couldn't -- nobody voted, turnout came in under quorum, or the top spot tied. Only then does a commissioner override unlock, and it now says exactly why it fired. And in the network-wide GOAT vote itself, only members who currently run a team somewhere on the Network get a ballot -- an account with no roster spot anywhere doesn't get a vote, and losing your last team loses it too.
A new page for the person who's thought about streaming their games and never gotten around to it -- a getting-started checklist (two of its five items check themselves off the moment you link a Twitch handle or post your first clip, the rest is an honest self-check), a weekly challenge every league sees together, the real current Twitch Affiliate and Partner numbers and both YouTube Partner Program tiers with sources linked, growth tips, and a list of free and cheap tools to actually get set up with. Find it under Your Team in any league's Quick Links, or from the Features page.
There's a lot on your team's own page, and not all of it needs Madden's own jargon already in your head to be useful. A new toggle at the top -- "Just the essentials" or "Everything" -- lets you pick. Everything is the default, so nobody who already knows this page loses anything today; Just the essentials tucks the dev board, the contract ticker and the roster-by-roster start/sit calls out of the way until you want them, while your game, the trade block, and trade suggestions stay right where they are either way. It follows you into every league you're in -- set it once, not per league. Also added: a link to your own Draft Board and the Injury Report, both squarely "your team" and neither one on this page before. And a real fix underneath it all -- the front office panel used to disappear ENTIRELY on a week the trade advisor had nothing to suggest, taking your gameplan, dev board, contract ticker and season schedule down with it even though each of those had its own content that week. Split into two panels now, each shown on its own merits.
The front page of a league used to be scores, standings and not much else -- everything else that mattered was one more click away. Four new panels bring the rest of the league's world onto it: your league's own place in the GOAT League race, right in the sidebar; the last few trades that actually went through, next to the wire; who's hurt and for how long; and, for whoever runs the league, a quiet "Commissioner's Desk" that only shows up when something actually needs him -- an advance deadline closing in, or a trade sitting in his inbox. Every one of them stays out of the way entirely when it has nothing to say.
The Features page's "what's new" list and the site-wide "a new release dropped" banner were both quietly reading from a list that stopped getting updated weeks ago -- so neither one had noticed anything shipped since then. Both now read straight from this same changelog, so they can never drift out of date again.
A commissioner used to just pick his league's best user by hand. Now every league gets its own top five, built from the record: first from THE PERMANENT RING -- whoever actually controlled the team the moment it won a Super Bowl, frozen forever so a later trade can never quietly reassign somebody else's ring -- then, for a league still chasing its first one, the site's own opponent-adjusted power rating. The league's own members vote on those five, and whoever they pick becomes the nominee on the network board, recomputed every time somebody votes until nominations close. A commissioner can still override it by hand for the rare case the vote gets it wrong -- doing so locks the pick so the vote can't quietly move it back.
The GOAT League already let every league nominate its best user and the whole network vote -- what it never did was tell you when one of them was actually playing. GOAT TV (Network -> GOAT TV) watches every current nominee's own league at once and puts his game up the instant he goes live, in the Hall of Fame's own gold-plaque style. Nothing new is detected -- it's a cross-league filter over live-stream detection the site already runs per league, just never pointed at "the handful of people the whole network is watching this season" before. And closing a GOAT race now actually means something after the fact: the winner is enshrined into his own league's Hall of Fame permanently, not just left as a row in a ballot table nobody opens again once the next season's vote opens.
The scouting board could always hold a grade, an archetype, a pro comp -- a human's read, typed by hand. What it never had was a single real number. Six actual combine drills (40, vertical, broad jump, bench, 3-cone, shuttle) are now their own fields on every prospect, and a new formula turns them into a 0-99 Combine Score weighted by position -- a 4.9 forty reads very differently on a corner than on a nose tackle, and the math knows it. Shows its own work (the per-drill breakdown), never overwrites the scout's own grade, and stays honest about what it is: athletic testing only, not a substitute for tape.
An advance deadline (Roll Call already had this) now actually gets said out loud in your own Discord when it's close, and again, separately, if it's blown past -- @-mentioning you by name, not just posting quietly to a channel nobody's watching. Two modes right next to the deadline: **spell it out for me** (an early heads-up a day out, plus a walk-through if you miss it) or **I've got this** (one ping, only once it's actually overdue). Beginner is the default for a new league -- advanced is one click away for anybody who already knows the drill.
A commissioner deciding whether to let somebody into a league has been able to see their real history for a while now -- how many leagues they've left, how rough those exits were, whether the league's own network calls them a hopper. A crew founder never got any of that, and never even had a way to remove a member who needed removing -- leaving was the only door, and only the person walking out could open it. Both are fixed the same way a league already works: a founder can now remove someone and say why, and every crew exit -- walkout or removal -- counts toward that person's real standing across the whole network, Madden leagues and 2K crews together. Nobody's negative record shows up anywhere but to the person deciding whether to trust them with a spot.
Every box score and hot-zone photo -- Rec, crews, leagues, all of it -- now gets read by Sonnet 5 instead of Haiku. The real reason: Haiku downscales anything bigger than 1568px on the long edge before it even looks at it, which is exactly how small stat numbers on a screenshot go blurry and get misread. Sonnet holds onto detail up to 2576px. Costs more per read (roughly $7/mo becomes $18-22/mo at where we're at right now) -- worth it for accuracy today, and cheap enough not to think twice about pre-revenue. We'll look at whether it's worth going further once real volume makes that math worth doing again.
Not in a league and don't have a crew? The Rec hub now shows what your membership is on (free trial, paid, or lapsed) and a button that starts it. Being in ANY league already covers this -- you'll never see the banner or be asked to pay twice. The gate that used to only cover a crew's box scores now covers hot-zone photo reads too (same reader, same cost), and covers everyone: a league member is always free, a crew's fee covers its members, and everyone else needs the membership once their trial runs out. Typing hot zones in by hand is still free either way -- only a photo touches the model.
Founding a crew opens its hosting trial the same second, and only the founder can ever be handed the card. If a crew's hosting lapses, the one thing that stops is filing box scores from a screenshot -- the only part of Rec that actually costs us money -- and it stops before we ask the vision model to look at the picture, not after. Joining, leaving, picking a build, setting a standing: still free, gated or not, same as it's always been. Also fixed a bug from build 211: the page Stripe sends you back to after paying for a solo membership or crew hosting was always treating it like a league plan -- it now knows which of the three it's looking at, and a lapsed crew's status no longer tells its founder "this league is read-only."
A $1/mo solo membership for 2K players with no league at all -- build tools, Rec, Crew HQ, Park and Theatre, no franchise required. And crew hosting at $2.99/mo, paid by the founder only, same as a league: everybody in the crew uses it, one card is on file. Everyone already using Rec or running a crew before today keeps it free for good -- the new fees only apply going forward.
Build 209's /terms page pulled its subscription price from a retired constant left over from the old flat-rate plan -- the real, live plans (Basic, Emerald, Sapphire Ultimate) start lower and scale by league count. The page now states the honest floor and links to /pricing for the rest, so it can't drift out of sync again.
A real page at /terms — what SapphireSportz is, accounts, the subscription, and the one rule build 208 exists to back up: no scraping or bulk automated pulls from /api, /csv or /neon.
Standings, rosters, stats and schedules are public on purpose — a recruit should be able to click through a league before joining. What was not on purpose: /api, /csv and /neon (built for the bot and for Companion App / NeonSportz-CSV compatibility) had no key and no limit at all, handing back a whole league as one clean file to anyone who asked.
- /csv and /neon are capped at 20 requests a minute per address; /api at 100; every rendered page at 180 — a real visitor, member or the bot itself (holding its own key) never comes close.
- robots.txt now keeps honest crawlers off the bulk data surfaces.
What changed lived nowhere but the very bottom of every page. It's now a link under FEATURES, right next to what the site does.
Build 199 replaced every "Are you sure?" browser dialog with a real one. This is the sibling fix for the browser's OTHER default dialog. Six places still used a bare alert() to tell you something went wrong: the door's admit button, the feed's comment box, the injury report's clear/restore buttons, the player finder, and the player-compare picker. On a phone that box is dismissed before it's read, or suppressed outright inside an installed app — the message now writes itself in, right next to whatever you just tapped, instead.
- No page on the site pops a plain grey system alert anymore.
- The message from a failed action now appears right where you tapped, not in a dialog that can vanish before you read it.
The site's own front door has had a choreographed opening for a build now — the label, the headline a line at a time, then the proof — but The Network's home page just appeared, all at once, like every other page. It now opens the same way: the eyebrow, THE NETWORK, the promise, the numbers, in order, in under a second, and everything below the fold settles in once as you reach it instead of sitting there fully formed.
- The Network's hero reads in the same one-second sequence the front door already uses.
- Nothing new was added to do it — the front door's own motion script, unchanged, now runs here too.
The auto-clipper has cut a clip the instant something happened in a live stream since it shipped, and posted a shout about it to the wire every single time — but that event was never registered with the wire's own catalogue, so it was quietly thrown away before it ever reached a channel. The batched clip reel from League TV still worked, which is exactly why nobody noticed the instant one never showed up.
- The auto-clipper's "Clipped it" shout now actually posts, same as every other wire event.
The personas arguing under a recap were real and already good — they just never reached anywhere anybody was reading. The thread only existed after two manual visits to a finished game's own page, and it never once reached the league feed or Discord. It now writes itself in the background the moment the recap does, and posts as one combined take from the booth on the feed and the wire for every game that earns a bylined recap.
- The thread generates automatically after a national game is recapped — no page visit required to make it exist.
- One combined post from the booth lands on the league feed and the wire, not three separate rows under one game.
- Quiet on local games, same as the recap itself — a slow league does not get extra noise under every result.
The LEAGUE tab's dropdown is five columns wide, and on a real 1864px window it opened 200px past the right edge of the browser with no way to reach it — not a rendering glitch, just nowhere else for a menu that size to go when it always opens flush to its own tab. It now measures itself against the window the moment it opens, the same way the tab bar already measures itself to decide when to hand tabs to the mobile menu, and slides left by exactly however much room it's missing.
- Every dropdown on the site checks itself against the browser window the instant it opens — nothing pins it to the exact spot the tab happens to sit at.
- A menu that already fits is left completely alone — nothing about a normal-width dropdown changes.
- No menu can be pushed off the LEFT edge chasing the right one back into view — it stops at a small margin instead.
Settings' "YOUR LEAGUES" list only trusted one table, and a handful of its rows had no league name at all — nine blank, unlabeled "Left" entries for someone who is actively playing in every one of them. The list now agrees with the league switcher in the nav: holding a team or a staff seat right now means you're in the league, whatever an old row says.
- The blank, nameless rows are gone — swept out on every deploy from here on, and nothing can write a new one.
- If your team was ever handed to you directly rather than through the usual join flow, your leagues now actually show up here, correctly marked Active.
- No visual change to the page — same table, same pills, just fed real data.
data-sport has sat on every page since build 119 with nothing reading it — the only real split was #FF9B4A, hand-typed into nineteen places because that's what "2K" meant on those specific pages. It's a real token now, on every league page, not just the six that happened to have it hardcoded.
- The league crest ring and every section rule pick up the sport's own colour automatically — sapphire blue on a Madden league, hardwood orange on a 2K one.
- No visual change on any Madden page — blue was already the site's own colour. The 2K side gets the identity it already had, formalized so it can't drift.
Thirty-one places asked a real question — release this name, write off this loan, reset the season — through the browser's bare confirm() box, a button labelled "OK" for an action that was anything but. All thirty-one now open one themed sheet, and every button names the actual action instead.
- Delete, release, reset, write off, ban, veto — every destructive control on the site opens the same on-brand confirm sheet, styled to match its page, with a button that says what it does ("Reset league," "Write off loan") instead of "OK."
- It respects the same off switch as every other motion on the site — turn animation off and it still asks, just without the entrance.
- No third-party script was added to build it — same reasoning as the sportsbook's numbers: a page that shows what you're holding is not where you hand the frame to a CDN.
Not just MVP: Offensive and Defensive Player of the Year, Offensive and Defensive Rookie of the Year, and Coach of the Year — priced off the season and moving on every bet.
- 📈 The Exchange: seven futures — the Super Bowl, MVP, OPOY, DPOY, OROY, DROY and Coach of the Year. The rookie boards are first-year players priced against each other. Coach of the Year is about the people running the teams.
- The award books stop trading the moment the Super Bowl market settles, and pay out when your commissioner reads Madden's awards screen and resolves them.
- Commissioners: ADMIN now opens on two boards — SET UP (every step, done or not, with the link that does it) and MAKE IT YOURS (colours, rules, the wire, the booth, awards, the store, the network — each saying whether you have touched it yet).
The network pages were rebuilt like a broadcast: a live lower third, score bugs, a crawl of what just happened, and a GOAT League board that turns into a ladder when voting opens.
- 🌐 THE NETWORK and 🏆 GOAT LEAGUE now have their own spots in the top menu. Teams, Trading and the Draft moved under LEAGUE.
- The GOAT League is for the best USER in every league — commissioners pick a member from their league's roll, and his record as an owner shows on the board. It was never a Madden player.
- Only people post on the network. Nothing is generated and nothing posts itself — no auto-recaps, no bot posts. A league's @handle speaks when its staff type.
- Every page with a walkthrough now carries a HOW THIS PAGE WORKS line under the menu — tap it for the steps.
- A member's network page is a player card: followers, record as an owner, leagues, vouches, and how long he has been here.
SapphireSportz is no longer a hundred separate league sites. Every league that joins is in one feed: follow a franchise three leagues over, watch a dynasty get built, and carry your name and your record with you wherever you play.
- 🌐 The Network → sapphiresportz.gg/hub. Claim your @name once (it never changes), post as yourself or as your franchise, tick "network" to go site-wide.
- 🏆 The GOAT League, Season 1, is taking nominations NOW at /hub/goat. Every league on the network puts forward its best USER — the man who runs a franchise; then the whole platform votes. The prize goes to him AND to his league.
- Commissioners: ADMIN → NETWORK puts your league on the map, gives it its own @handle, and hands each franchise its name.
- Your record follows you: a person's page shows his W-L-T across every league he holds a team in, how many commissioners have vouched for him, and how long he has been here.
- No other Madden or 2K platform has this. Tell your league.
Type a score for any game still to be played and the seeds rearrange live. Copy the link to share your scenario; download the bracket to post it.
- Playoff picture → the machine sits right under the seeds. "Fill in the favourites" projects the rest of the season in one click.
- A real Playoff Bracket page — Wild Card through the Super Bowl, past seasons, downloadable graphic — at /league/your-league/playoffs/bracket.
- Developers: the machine answers as JSON at /league/your-league/playoffs/machine.json?s=…
Every time SapphireSportz updates, this post lands in your league's Discord. Route it wherever you like from ADMIN → The Wire ("Platform update"); unrouted it goes to your server's system channel.
- The full history is at sapphiresportz.gg/changelog.
Finals, the playoff bracket, the record book, keepers and pick'em all live on sapphiresportz.gg. The bot's commands still work — they read and write the site.
- A fantasy week closes itself when every game in it has been played. Standings and waiver order follow.
- The playoff bracket seeds itself from the standings when the regular season ends, and crowns the champion — no command needed.
- Keepers: declare next season's keepers on your squad page. They fill your first picks in the next draft.
- Pick'em has its own page: /league/your-league/pickem. `/pickem` in Discord is the same sheet.
- The record book is written by the site as weeks close; the bot's old records are carried in.
Props, picks and slips are the site's; slips settle through the league ledger.
- Lines grade themselves from the exports — including tackles, sacks and interceptions.
- A refused bet or line tells you why on the spot instead of failing silently.
- Commissioners: `/eco migrate` carries the money AND the prop board across. Run it once per league.
Balances, the bank, items and the store now live on sapphiresportz.gg; every economy command in Discord reads and writes it.
- `/eco migrate` (commissioner, once per league) moves everything. Nothing is deleted in Discord.
- Bets, buys and bank moves made on the site are applied instantly.