Recruitment's Squad Planner now tells the truth: a position can look fine on paper (2+ players) while everyone there is actually injured - that now shows as NO ELIGIBLE PLAYERS, a distinct, more urgent state from just being thin. And when a player you want is already signed, Place a Bid becomes Make an Offer - a real negotiation with a new Offers tab to respond, counter, or accept. Injury rate also roughly halved and max time out trimmed - matches were sidelining people too often.
Continue now lives in the top-right corner on every Manager Mode page, not just Match Day/Club Season - no more hunting for the one page it's on. Career Mode's own day-gate is now tied to real elapsed time instead of a click counter, so it can't be spammed through ahead of other real managers - the whole reason Career runs on a real clock in the first place.
Club Season no longer shows tabs for every other league in the server - it's scoped to your own claimed club's league now, the way it should have been from the start.
Resolve This Matchday is gone. Continue now works the way it should: a quiet day off just shows your squad's real condition/injury status, and a day that reaches a matchday resolves it exactly as before. Club Mode also lost its manual Start Season button and eligibility math - a league with enough clubs just starts itself.
Fixed a real bug where an AI-controlled World club could release its only cover at a scarce position, leaving it unable to field a full XI - the cause of leagues stuck on "1/2 clubs ready" indefinitely.
Club Season's matchday button is now a real, primary action - press it and see your own result plus the rest of the round in one clean summary, instead of a small secondary link sitting on top of a timer.
Every matchday in a World season, with a real date - played ones show when they actually happened, upcoming ones show an honest estimate - instead of just a single vague countdown.
A World season used to take a real week+ to play out (one matchday per real day, same as Career). Club Mode's own clubs are mostly AI-run, so seasons now resolve a matchday every 30 minutes instead - a full season plays out in well under a day, not over a week.
Claimed a club? You can now actually recruit for it. Club Recruitment shows where your club is thin and the best available real players to fix it, and the Player Pool's bid panel now lets you bid as your club directly, not just your personal Career profile.
Club Mode's navigation now mirrors Career Mode's own structure - Browse Teams as its own quick-access item, Squad Building and Match Prep as real categories - instead of every destination dumped into one flat list.
Every unclaimed club is actively run by an AI manager - it signs the best real player it can afford for whatever position it's thinnest at, and occasionally releases its weakest player, the same way a human manager would. Claim a club any time to take over from the AI.
Club Mode now lets anyone claim any unclaimed real-world club (Man City, Real Madrid, and 76 more across the Premier League, La Liga, Bundesliga, and Serie A) - no captaincy or credential required, just sign in and claim one.
The manager creation wizard and 15 other Manager Mode pages (Squad, Tactics, Portal, Challenge, Loans, Match Day, and more) had a real bug causing them to fail to load for signed-in users on certain visits - found and fixed.
Anyone can now pick any real registered Team when creating a Manager Mode Career and take over its current roster as their own independent squad - a real snapshot copied once, then yours to build from, same as picking a Custom Team.
Manager Mode now starts with a real choice between Career (build your own squad from the player pool) and Club Mode (claim a real-world club), instead of mixing both modes' navigation into one confusing menu. Practice vs AI also moved out to its own page, no longer a toggle buried inside Challenge.
The Player Profile's Scout Report and the Tactics Compare Players tool now show attributes as colour-coded number chips in dense category panels, matching real Football Manager's own attribute screen, instead of soft progress bars.
Challenge now has two modes: play a real manager like before, or jump into a Practice Match against a computer opponent any time - pick Easy/Balanced/Hard, get the full result instantly (same Match Theater replay), and it never touches your real record, squad condition, or injury risk.
A new Recruitment tab for Career Mode - Squad Planner shows a real per-position average rating and flags where your squad is genuinely thin, Player Recommendations surfaces the top available real players for exactly those spots (or any position you flag), and Recruitment Focuses lets you target up to 4 positions yourself.
World Mode's separate header - built with zero code shared against Career's - is gone. Every Club Mode page now lives under a real 'My Team' group in the same nav as everything else, with the same unread-inbox badge and pinned shortcuts. Also fixed a few name-display bugs the real-Team retie left behind.
World Mode's fictional clubs (Man City, Real Madrid, etc., staffed by random registered players) are gone - every real Team now has its own Club Mode side, with a live roster mirroring who actually plays for it. Management is automatic for a Team's current captain or vice-captain - no more claiming, no more race to click first.
A real setup flow before you start: choose your Coaching Style (Attacking/Balanced/Defensive - sets your starting tactical bias) and Personality, then a Custom Team (build your own Career squad) or an Existing Team (claim a real World club) - picking your team is now a real first step, not something you fall into after the fact.
Manager Mode's News feed now picks between several real phrasing variants for each result/season event, instead of always rendering the exact same template - the same event always narrates the same way on a repeat view, but different events read differently, closer to a real narrated feed.
Claimed World clubs can now set their own set-piece takers, target man, tactical style, and the 9 Tactical Phase dials - the exact same real Tactics screen your personal squad already had, now reused for a claimed club too, plus a Compare Players tool for its roster.
A claimed World club's own Youth Prospects - a real chunk of every auto-generated squad - had no way to be viewed before this. New Youth Academy page under World Mode's own header, same view Career managers already have.
World Mode had no way to reach Hall of Fame at all, even though a World club's title win is recorded there - it now has its own link, showing only World titles. Career's own Hall of Fame now correctly shows only Career titles instead of both mixed together.
Every title-winning squad this server has ever produced, recorded the moment they win it - champion, competition, points, and the real starting XI that did it, frozen forever. Covers both Career managers and World clubs.
The Inbox nav item now shows a real unread count, updating as you read messages or get new ones - no more guessing whether something's waiting.
A proper glass-panel tooltip (matching the site's own look) now backs hover hints across Manager Mode, the card game, and league pages - reputation scores, potential ratings, fixture proposals, and more - replacing the plain unstyled browser tooltip that was the one thing every page had in common.
Create a named Career Mode competition among friends (costs Sparks) or join one someone else made - separate from this server's default pool, same real round-robin/standings engine either way. New transfer window: signing freezes once your league's season is under way, reopening when it ends - real FM's own summer/winter window shape, fairness for a market built on real people.
A real auto-generated News feed - recent match results (exhibition + season) and season start/complete events narrated in one place, real FM's own News tab. Career Mode only, on purpose - World Mode already gets its own recap posts and stays a separate feed.
A dedicated Youth Academy overview - every prospect in your squad with aggregate stats (count, avg current OVR, avg potential, how many are flagged high-potential) plus a per-prospect list showing training focus, mentor, and progress.
A real Managers page (World > Managers, from the user's own openfootmanager walkthrough) - every manager in this server, sorted by a real reputation score, with record, win rate, and title count. Deliberately real-people-only, kept separate from World Mode's own club browse page.
An incomplete starting XI used to just say "incomplete" - now Portal tells you exactly which slots have nobody who can cover them (and calls out a missing goalkeeper specifically), so you know whether to sign someone or just reassign your bench, instead of guessing.
Every AI-controlled World club used to set up identically - balanced, no lean either way, regardless of the club. A newly generated World now gives each club a real, consistent tactical identity: bigger, higher-reputation clubs skew toward an attacking, high-pressing setup more often, smaller clubs skew toward sitting in and defending - the same tendency real football actually shows. Regenerate a server's World to see it take effect.
AI squad-building now allows a real, sensible substitution (a center-back covering right-back, say) instead of requiring an exact position match - real football teams do this too, and it unlocks far more of the real player pool. Every league now gets the same, even number of clubs (10 apiece on a well-populated server, was an uneven 4-5). And a league's season now starts itself the moment enough clubs are ready - no more waiting on someone to trigger it, and a new one begins automatically once the last one ends.
Real registered players skew heavily toward some positions and away from others - most World clubs were quietly coming up short a starting spot (missing a right-back especially) despite holding a full squad, which meant most of the World wasn't actually challengeable. Club generation is now bounded by the real supply of the SCARCEST position instead of raw headcount, and both club generation and Auto-fill Suggested XI now fill the rarest position first instead of a fixed order - every club generated from here on has a genuine, complete, ready starting XI. Every server's World was cleared (claims and clubs only - real players and everyone's own squad are untouched) and will regenerate correctly the next time it's viewed.
A new Inbox - welcome, match results, and season news, sortable by newest/oldest, filterable by read/unread, mark-all-read and delete-read in one click. A claimed World club's results reach your inbox too, right alongside your own.
The Player Pool only ever shows players from this platform's top, real-population servers - the new "Also Registered As" picker was missing that same rule, so it could surface (and let you sign) a registration from a small server that would never have qualified for the Pool on its own. Fixed.
Each of the 4 real leagues (Premier League, La Liga, Bundesliga, Serie A) can now run its own genuine season - a full round-robin among that league's own clubs, one matchday resolving automatically per day, a real table, and a real champion. New Season tab in World Mode.
With World Mode fully separated and a real bug in claimed-club squads fixed this round, every squad, club, and manager profile was reset again so everyone starts clean on the corrected systems - your real registered-player pool is completely untouched. Rejoin with /manager join in Discord, or from the website whenever you're ready.
Every generic emoji across Manager Mode's website pages (budget, record, trophies, stars, injury tags, and more) is now a proper icon matching the site's own visual style, not a plain Unicode character.
The "which card represents you in Manager Mode" picker was listing Captain Cards as an option - a separate, unrelated card-game special type that never made sense in this context. Removed.
The same real person can be registered on more than one server - sometimes as a different position entirely. A player's Pool profile now shows every OTHER server they're registered on (with that server's own position and rating), each a real link to sign that version instead, right from the Player Pool.
Switching servers, then clicking Menu, could silently bounce you back to a different server than the one you'd just picked - the Menu link was the one spot in the nav that didn't carry your server selection forward. Fixed.
World stopped being just another tab next to your own squad - it's a genuinely separate mode now, with its own header, its own nav, and real visual identity for every club (a generated crest, not a plain text card). Claimed a club before and found no way to actually see or manage it? That's fixed too - a new My Club page gives your claimed club the exact same pitch lineup editor your own squad has. And World Mode gets its own Challenge page, playing as your claimed club against any other club - Career Mode's own Challenge is real-manager-only again.
With attributes, playstyles, roles, and World all reworked this round, every squad, club, season, and auction was reset so the new systems start on a level field - your real registered-player pool is completely untouched. Rejoin with /manager join in Discord or from the website's Club page whenever you're ready.
A real Challenge page - pick any other manager with a complete starting XI, or any World club, and resolve the match right here. Same live Match Theater replay every result already uses, same Kon rewards, no Discord required. Manager Mode is now genuinely playable end-to-end from the website.
Empty lineup spots no longer need a full auction to fill - a new Quick-Fill button on the Squad page (and /manager quickfill in Discord) instantly signs cheap, real Unranked players into whatever's still open, position-matched to each slot. Useful early on, or on a quiet server where auctions haven't been getting bids.
Set a real Playstyle on your Career page or with /editmyprofile - a Poacher, a Ball-Winner, a Sweeper Keeper, and more, only the ones that actually fit your position are offered. It reshapes your Scout Report attributes to match (a Poacher leans into Finishing and Positioning over Passing and Dribbling), still built on your position's own profile, not a separate rating.
The last attribute recalibration pushed too far the other way - too many genuinely good players were reading as merely average. Re-tuned the curve so real quality shows up clearly again without sliding back into everyone looking elite.
A whole new way to play - a real World of Premier League, La Liga, Bundesliga, and Serie A clubs (78 in total), automatically populated from this server's own real registered players. Claim an unclaimed club to manage it, or challenge any club - AI-controlled or claimed by someone else - as a genuine second game mode alongside challenging real managers directly. See the new World tab.
A new collapsible section on the Tactics page - pick any two of your signed players and see their full Scout Report side by side (overall, best role fit, every attribute category, traits) to help decide who starts.
Assigning a player's role (Poacher, Wing-Back, Deep-Lying Playmaker, and 12 others) is no longer just a scouting readout - open any filled spot on your Squad page's pitch to give that slot a real role, with a genuine match-sim bonus behind it. A Poacher hits harder in the box, a Wing-Back surges forward, a No-Nonsense Centre-Back locks the defense down - roles are tied to the tactical slot, so whoever plays there inherits it.
Too many players were reading as an outright ELITE attribute almost everywhere - a genuinely strong 3-star player and the platform's actual best 5-star player looked nearly the same on the Scout Report. Recalibrated so the top color band is meaningfully exclusive again - a player's real standout areas still shine, but the platform's true elite now stands out from everyone else.
The server switcher used to only exist on the Club dashboard - every other page (Tactics, Squad, Portal, Season & Fixtures, Career, Loans) had no way to change servers at all without going back to the dashboard first. It's in the header everywhere now, and switching keeps you on the page you're already on.
Every player's Traits (shown on their Pool profile) now actually do something in a match, not just describe them - a Sharpshooter-style trait sharpens their shooting, a Hard Tackler strengthens a defender, a Sweeper Keeper backs up their goalkeeper, and a few affect fouls conceded or how often a created chance turns into an assist. Small, real bonuses on top of their attributes, not a second rating system.
Tactics gained nine new dials underneath Tactical Style - Build-Up, Width, Tempo, Defensive Line, Pressing, Defensive Shape, Marking, Counter-Press, and Break Speed - each with a real, single effect on match simulation (an aggressive press wins the ball back more but tires you faster; a high defensive line concedes better chances in behind; fast breaks and quick re-presses can now spring a genuine counter-attack). Every dial defaults to a neutral setting until you touch it.
Playing a tired player is now a real gamble, not just a small rating hit - starting a match carries a real (small) chance of an injury that sidelines them for a few days, more likely the more exhausted they are. An injured player can't be selected in your lineup until they're back, and the Squad page shows exactly when that is.
Playing your best 11 every single matchday now has a real cost - a Squad Fitness section on the Squad page shows each starter's condition, color-coded from Fresh to Exhausted, and bench tiles show their own fitness too so you can compare before making a substitution. A tired player's effective attributes take a small, real hit in matches until they've had a few days to recover.
Every resolved matchday can now be watched, not just read - a real animated pitch replay (possession, shots on target, every goal/save/corner as it happens) on Match Day and Portal's Recent Results, the same Match Theater experience the card game's own results already have. Standings, fixtures, and results all show real player avatars now too, and Man of the Match gets a real gold badge.
The 'NEW' tags on the Menu screen, Portal results, and Portal auctions were reusing the same red glow reserved for an actual live match - switched to the plain badge style already used for 'NEW' tags everywhere else on the site (Power Rankings).
A search box on Free Agents now filters the list instantly as you type, alongside the existing position filter - a real fix for leagues with a long unsigned-player list.
Assign any ranked squad player as a Mentor to a Youth Prospect on the same squad, straight from the Squad page's Youth Development section - every attribute that grows on a training day gets an extra push while a valid mentor is assigned, on top of their Training Focus. A mentor stops helping automatically the moment they leave the squad. See the Glossary's new Youth Development & Mentoring section for exactly how it's computed.
A new Menu screen lists every Manager Mode section in one place, each with a real one-line description - including Loans, the Player Pool watchlist, and the Glossary, which previously had no real home in the nav at all. The rail itself is regrouped by actual workflow instead of copying FM26's own tab names: Squad Building (My Squad, Player Pool, Auctions, Loans), Match Prep (Tactics, Season & Fixtures, All-Time Record), and Club & Career (Club, Career, Glossary) - Tactics in particular moves out of Squad and in with the rest of match preparation, where it always belonged.
Free Kick and Corner routines are no longer just a label next to your taker - Direct/Approach Play and Near Post/Far Post/Short each nudge the actual chance of scoring based on real squad attributes (your taker's shooting, your target man's physicality, or your attacker's passing, depending on the routine). Portal's Opposition Instructions now have a one-click Apply button that writes the suggested In/Out of Possession style straight to your Tactics.
Every resolved matchday now gets a real full-time report, not just a score - goals, assists, saves, tackles, a full ratings list, and a Man of the Match, shown right on Portal's Recent Results and a new expandable history on Match Day. Previously this data was computed during the match and thrown away the moment the final score was recorded.
Tactics gained Free Kick and Corner routines (Near Post, Far Post, Short, Direct, Approach Play) shown next to your takers. Portal's Scout Report now includes Opposition Instructions - a short counter suggestion based on the opponent's own In/Out of Possession styles. Career shows a new Reputation tile derived from your lifetime record and titles. The nav rail lets you pin any Squad/Recruitment/Match Day sub-page as a one-click shortcut (the ☆ next to each link in a flyout).
A real temporary transfer - list one of your squad players for loan at a fee and duration you choose, and they stay yours until another manager actually takes it. The fee lands in your budget the moment they do, and your player returns automatically when the loan ends - no need to remember or chase it down. New Loans page under Recruitment: list a player, browse everyone else's open listings, and track who's out on loan or on loan to you.
Tactics now split into two real shapes instead of one dial - set an In Possession (attacking) style and a separate Out of Possession (defending) style, matching real Football Manager's own headline tactics feature. Leave either on "Follow Tactical Style" to keep the old single-dial behavior. Both feed the same match engine that decides real results, on the website's Tactics page and Discord's /manager gameplan.
Player Pool: star any player to add them to your Shortlist, then filter the Pool down to just your starred targets. Portal: your next fixture now expands into a real Scout Report - the opponent's recent form, current formation, and their most dangerous player. Club: a Season Objective card tracking your real position against this season's table, plus a Squad Value tile. New Glossary page explains exactly how Scout Report attributes, tactical role fit %, and player traits are computed - no more guessing what the numbers mean.
Four real Football Manager references, closing gaps found researching FM26's own UI. Squad: an "Auto-fill Suggested XI" button fills any empty lineup slots with your best-fitting available player, plus a new Team Stats + Squad Depth breakdown grouped by position. Gameplan: set a Captain and Vice-Captain (a flavor tag, shown on your pitch and roster). Portal: a 2-week matchday calendar strip alongside the single next fixture, and real NEW badges on auctions/results since your last visit. Career: a derived Achievements grid (Champion, Century Club, Unbeaten Season, and more) built from your existing history, nothing new to earn separately.
Match scores on Results/Schedule cards now pop in with a quick reveal instead of just sitting there, standings trend lines and player trend charts draw themselves in instead of appearing pre-drawn, and a player's Career Highs tiles now get a gold glow and star badge so a genuine personal best actually reads as one. Respects your reduced-motion setting throughout.
Homepage's Leagues/Teams/Players stats, a team's Standings points, and a player's Stats/Career Highs tiles now animate in with a real count-up instead of just popping onto the screen - small touch, but the site felt a bit static in a few high-traffic spots. Respects your reduced-motion setting the same as everywhere else.
Manager Mode has a new home - Portal, first tab in the nav. Researched real Football Manager's own current UI (FM26 replaced its old Home/Inbox with a literal Portal hub, and it's right - we were missing it): a real feed of what needs your attention right now, in one place. Shows open auctions you're leading, an incomplete-lineup or unset-training-focus nudge, your next fixture, recent results, and every real signed player who's hit their training ceiling. The old dashboard (identity, pitch preview, standings) stays put as Club, unchanged.
Follow-up to the Manager Mode card picker: Player Pool cards now show a small CARD badge for anyone who's set their own Manager Mode card, so their overall doesn't look like an unexplained outlier next to everyone still on the plain auto-roll. Correctly stays hidden if a chosen card was since sold or converted, matching the same self-heal already used everywhere else.
Direct follow-up to Squad Builder's own card-choice feature: "players should be able to choose what version their card should be in the manager game." Your Player Pool profile page now has a Your Manager Mode Card picker - pick any card you own of yourself (an upgraded copy, Shiny, Icon, TOTW, etc.) to set your real Manager Mode overall/attributes, or leave it on Auto for the plain rolled base card. Applies everywhere your Manager Mode strength is used - Player Pool listings, squad strength, matches - and self-heals back to Auto if the chosen card is ever sold or converted.
Manager Mode's biggest remaining gap against real Football Manager: a signed player used to never change at all. Youth Prospects (unranked signings) now actually develop over time toward their existing Potential range - pick a training focus (or leave it Balanced for a wider, slower spread) from the new Youth Development section on your Squad page, same focus/progress the bot's /manager training command shows. Ranked players are untouched - their card overall is already the platform's one real, proven number.
The player detail page is rebuilt around real Football Manager's own profile structure. Personal now shows real Team, Nationality, and every position they can play. Performance shows real in-game career stats (appearances, goals, assists, average rating, Career Highs, recent form and matches) alongside a fixed, more realistic Scout Report - a striker's defending was showing as good as their finishing before; it now correctly reads as a real weakness. Career shows real club history, awards, and achievements. New this round too: a Best Role tag and a full Style of Play breakdown (real tactical role fits like Poacher or Deep-Lying Playmaker, plus real traits like "Shoots From Distance") - both computed from the Scout Report, not invented separately.
Players now show up by their real Roblox display name across Manager Mode (Squad, Tactics, Pool, Standings, Match Day, Dashboard) instead of just their registered platform name - both stay visible on the player detail page. Player Pool search now matches a Roblox username, Roblox display name, or platform name, not just the one name it used to check. The Scout Report nearly doubled - 22 attributes for outfield players (11 for keepers), now including a real Set Pieces category (Corners/Free Kicks/Penalties, the same numbers that decide who actually takes them) - and every attribute value is colour-coded by how good it is, green to red.
The biggest structural gap is fixed: Manager Mode now has real Seasons - a round-robin schedule among every manager with a complete XI, one matchday resolving automatically per day, a real table, a real champion. New Match Day page shows it live, with a Start Season button once enough managers are ready. The main menu is rebuilt around real Football Manager's own sections - Club, Squad, Recruitment, Match Day, Career - as a proper icon-rail nav instead of a flat tab row. Unranked players are now Youth Prospects (cheaper, shown with a Potential range) instead of confusing junk entries, and the Player Pool's detail page now has a deeper Scout Report attribute breakdown beyond the original 6-stat summary.
Two real screens Football Manager has that this site didn't: Tactics (set-piece takers, target man, tactical style - previously Discord-only) and a dedicated Standings table (previously just a short preview on the Dashboard). The main nav now has 6 real destinations instead of 4, and "Dashboard" is now "Overview" to match the real game's own naming.
Player Pool sorting was broken (it only ever sorted an arbitrary alphabetical slice) - now it sorts the platform's full player list and pages through it properly. Clicking a player opens a real detail page: a hexagon attribute radar and bars from their actual card stats, every open auction they're in, and a real bid form - buying was Discord-only until now. The Dashboard's server switcher also no longer dumps every server in one row; only the servers you've actually joined get a pill, the rest live in a compact dropdown.
The Squad page's pitch is now interactive - click any spot to assign a signed player from your squad, filtered to players who can actually play that position, or change formation entirely. Same rules /manager lineup already enforces in Discord, now available without leaving the site. Also fixes a bug where Player Pool and sign autocomplete could show a person's wrong, unranked Player row from a different server instead of their real one.
Researched real references first: Player Pool and Auctions now have a real filter bar (position, sort by overall/price/time-left) instead of just a name search, same shape FIFA Ultimate Team's own transfer market uses - and Auctions splits out a real 'Ending Soon' section. The Dashboard is now a real tile grid (Budget, Record, League Position, Starting XI) with the formation pitch as its own dedicated card, matching how Football Manager's own dashboard actually structures itself.
The old text-list pages are gone. New Dashboard with a live pitch preview of your starting XI, a dedicated Squad page with a full-size formation pitch, Player Pool rebuilt as real player cards rated by trading-card overall, and a brand new Auctions page showing every live bid with a color-coded countdown - all tied together with a real persistent nav. Researched real Football Manager's UI for reference; built using the same pitch/card components already proven elsewhere on the site.
The price on Player Pool is now the minimum opening bid for a real timed auction (see the bot changelog) instead of an instant-buy price - check /manager auctions in Discord for what's actually up for bid right now.
Publishing a News article was supposed to announce it in Discord, but that failed completely silently whenever the announcement channel wasn't configured (true for most servers) - staff had no way to tell. There's now a real 'Send to Discord' button next to Edit/Delete on any published article, with a real reason shown if it can't send (e.g. no channel set yet in Manage > Channels & Roles).
Player Pool and the squad view now show a player's real trading-card overall and a real transfer-fee price instead of the old bespoke strength number, and your squad page shows your formation and which signed players are actually in your starting XI. Matches now run through a real tactical match engine - see the bot changelog for the full rebuild.
The match page used to stack up to 7 separate bare dropdowns and plain-text links under the scoreline (Report Result, Go Live, Live Match Controls, Edit Schedule, Declare Forfeit, Edit/Delete Result) - real clutter for staff/reporters/broadcasters. Now one real 'Match Controls' panel, each action a clearly labeled section inside it, open by default while a match is live. Player Pool is also now the same global, cross-server pool /manager sign draws from.
New page linked from Football Manager - every registered player's live Manager Mode strength and sign price, with the specific server that number came from shown right on the row. Makes the same formula /manager pool uses in Discord fully transparent instead of a black box, and doubles as a visible answer to 'why is this number what it is.'
Shop was only ever a small unlabeled icon in the top nav - it now also has a real, labeled home in a new 'Play' section on the homepage and every league site, alongside KonTok, Card Game, Football Manager, and the Spark Leaderboard. The Shop tab also shows your current Spark balance as a badge wherever the KonTok/Leaderboard/creator pages link to it, so you actually notice when you've got Sparks worth spending. Football Manager (the new Discord-only management sim) now has a read-only web page too - standings and your own squad.
Career Portal now recaps your first appearance, first goal, first assist, first Man of the Match, and first clean sheet as a real timeline with dates and the match it happened in - the story of your account, not just running totals.
A new combined Master Rankings board at /master-rankings, ranking players across every real server running this platform - not just one league site. Linked from every per-league Master Rankings page.
Come back to Career Portal after time away and you'll now see a welcome-back banner recapping what your own team did while you were gone - every result, your W-D-L record, and a direct link to each match. Only shows up when something actually happened, and won't spam you for revisiting within the same sitting.
The Next Fixture spotlight on every league home page, and your own next match on Career Portal, now show a live ticking countdown alongside the kickoff date - "Kicks off in 2d 4h" instead of just a static timestamp.
The ball used to snap back to center the instant a match's final shot or save landed, before you actually got to see it rest there - now it holds at the final spot for a real beat, same as every earlier moment in the match, across every result screen (Squad Battle, Friendlies, Challenges, Arena, Rush, 2v2). The possession bar also now eases toward its real final split as the match plays out instead of sitting frozen on one number the whole time.
Standings, Leaderboard, Results, and every other multi-division league page used to show one button per division in a row that only got wider as a server added more. Replaced with a compact dropdown, and gave it a proper solid background so it stays readable no matter what's on the page behind it.
Any card you've upgraded all the way to its max level now gets an automatic golden glow and a ★ MAXED badge on My Cards and its own card page - a free status symbol for maxing it out, no purchase needed.
A new Card Frames section in the Gem Shop - unlock a Silver, Gold, Neon, or Diamond border with Gems and equip it to show around every card you own on My Cards. Purely cosmetic, no gameplay effect, just a status symbol.
Keeping your daily claim streak alive now pays off beyond the Kon bonus - every 7-day milestone grants a free Silver Pack, and every 30-day milestone grants a free Legendary Pack, on top of your usual reward. No extra cost, just for staying consistent.
Every Direct Arena Challenge now shows your career record against that specific opponent right up top - wins, losses, draws, and a form guide of your last 5 meetings - visible before, during, and after a match, not just in the result screen.
A new leaderboard on every league site that folds goals, assists, win rate, average rating, Man of the Match awards, and discipline into a single Master Score - no more hunting across separate stat pages to see who's actually best. Shows your own standing, how far you are from the rank above you (even if you're nowhere near the top), and whether you've moved up or down since last week.
The pitch is noticeably bigger now, and the player behind every save, tackle, and goal shows up as a real avatar on the ball - with its own action icon (🧤 save, 🛡️ tackle, 🥅 goal) so you can tell what happened at a glance. Playback is also a lot slower by default, and every result page now has 0.5x-2.5x speed controls plus Skip, right next to the pitch.
Every card game result page now opens on a live animated pitch, not just scrolling text - the ball tracks tackles, saves, and shots in real time, and goals hit with a full flash-and-spark celebration synced to the scoreboard. Live across Draft Challenges, Friendlies, Arena Challenges, 2v2 Team battles, and the Arena ladder.
The browser tab icon, iOS home-screen icon, and every Discord/social link preview (match results, team pages, standings, news) now match the site's real neon-glass look instead of the old gold-and-green theme they'd quietly kept.
The projection used to extrapolate each team's own form with zero regard for who they're actually playing next. Now every remaining fixture is predicted head-to-head - evenly matched teams split points instead of both getting full credit for beating each other.
Staff-facing pages (Rankings, Awards, Channels & Roles, Suspensions, and more) picked up the same glass styling and cleanup pass the public pages already got.
A real timeline of your card game career - first card claimed, first shiny, first Icon, first real-match performance boost, first Card Duel win, biggest pull ever, and more, all in order. Find it under Card Game Hub → Progress → Milestones.
Typing in the News/Rulebook body editor could insert new letters in the wrong order instead of where the cursor actually was - fixed. Both editors also moved off a single cramped column onto a real two-column layout, and Rulebook's category field now offers your existing categories to pick from instead of only free typing.
Each page now uses the layout that actually fits its data instead of a flat text list - card grids for Free Agents/Rankings, a real value bar on Market, color-coded rows on Transfers, gold-glow trophy tiles on Awards, and proper match-ticket cards on Schedule/Results/This Gameweek.
A non-square team or league logo could lose part of its edges wherever it was shown at a fixed size. Every crest on the site now shows in full.
Roblox avatars could fail to load and just show a broken image with nothing recovering it, especially in the Card Game's Arena/Challenges/Friendlies pages. They now fall back cleanly instead.
The site menu (and a couple of other dropdowns) could render behind the page instead of on top of it, making them unusable below the header. Fixed.
A team with both a custom crest and an emoji set was showing both side by side on Standings and team pages. Now shows one - the crest if set, the emoji otherwise.
New color palette, new typography, and real glass-blur surfaces across the whole site - the nav, cards, dropdowns, forms, and every league's own theme color now sits inside the same near-black, glowing look.
The result-reporting form (the most common way results get entered), directory badge purchases, and every "run the match" step shared with the bot (Higher/Lower, Trivia, card draft, Arena, card duels, friendlies) had the same double-processing gap fixed here too - see the bot changelog for the full rundown.
The formation picker in the result-entry wizard mislabeled two 4-3-3 slots, which was the root cause behind TOTW's CDM and CF spots always coming up empty (see the bot changelog). Fixed.
Deleting an already-finished result correctly reversed standings and budgets, but left any bets on that fixture still marked resolved with Kon already paid out - a wrong payout from a deleted result could never be corrected. Fixed.
Arena, 2v2 Team Challenges, Card Duels, and Friendlies pages used to sit on a stale or blank screen for the few seconds a match takes to actually resolve - each now shows a proper "resolving" state and auto-refreshes into the real result.
A server running multiple leagues used to have Transfers force-split into per-league tabs, with no way to sort - the only whole-server page shaped that way. Now shows every league combined by default (each row labeled with its league), with a Newest/Highest Price sort. Staff can switch back to the old per-league-tabs view with /configmisc serverdefaults splittransfersbyleague.
Each squad row on My Team now shows how many days a player has been with the team and the date they arrived, right under their position - no extra digging through transaction history needed.
Every text input, select, and textarea used a font-size just under the 16px threshold iOS Safari uses to decide whether to auto-zoom the page on focus - fixed site-wide on narrow viewports.
The group-stage standings table used overflow: hidden instead of scroll - a long team name just got cut off with no way to see the rest. Now scrolls like every other table on the site.
Same root cause as the friendly-match dash fix below: a handful of other spots (the directory review queue, a star-rating label, every "None" dropdown option in Channels & Roles) were showing raw escape text like \u2014 instead of the real character. Swept the whole site for the same pattern and fixed everything found.
The friendly-match result wizard's "Add Loan" button was overflowing off-screen on a phone - a hardcoded 2-column layout with no mobile breakpoint, found and fixed there and in 9 other places across the site (league creation, rulebook manager, economy settings, team creation, division settings) that had the same issue.
Every Discord link-preview card (league, standings, match, team, player, tournament, friendlies) now shares a real grid texture and a framed glass content panel instead of floating text directly on the gradient, plus one consistent brand mark in the corner instead of each page repeating its own footer line.
A forfeited match's page and its Discord link-preview used to fall back to "vs" / "Upcoming" instead of the real score - fixed everywhere. The Declare Forfeit control also gained a "Both teams" option for a genuine double no-show, now scored as a 0-0 draw for both sides.
The knockout bracket preview now shows "Winner of X vs Y" for an undecided slot instead of a flat TBD.
A round-1 bye now appears in its actual bracket slot instead of a separate note above it.
Player Stats now shows each player's position alongside their numbers.
Manage > Polls can now edit an existing poll instead of only creating and deleting.
Channels & Roles can now link a Discord role to a player position (matching the bot-side version), so the website's own role tooling stays in sync.
The website's own Higher/Lower copy now shows the real dynamic odds, wager max, and daily limit instead of stale placeholder numbers.
Declining or cancelling a confirm dialog (delete/release/etc.) used to throw all the way to the site's error page - an expected rejection, not a real failure. Fixed.
A tournament's page now shows round-1 byes and the full bracket structure (TBD placeholders through the Final) as soon as it's created, instead of only once matches exist.
Channels & Roles gained a Ranker role picker and a Spectator Voice Channel picker, which - like the bot's own /configchannels spectators - now also accepts Stage channels, not just regular voice.
The Ranker role now gates the actual player Rankings page (star ratings) instead of Power Rankings, which was the wrong target. Power Rankings stays staff-only.
New daily Formation Trial - a fixed scripted opponent that requires your squad to be set to today's rotating required formation. Real Kon reward, one attempt every 24 hours.
New Bundle Deals in the Gem Shop - spend Gems on a bundle of Kon plus a guaranteed pack pull, priced as real value against the pack's own Kon cost. 3 tiers: Starter, Value, and Mega.
The Rulebook now has a season picker - past seasons show the frozen rulebook exactly as it stood then, read-only, unaffected by later edits. /newseason archives the current rulebook automatically.
New Ranker role (set via /configroles ranker) - members with it can now edit Power Rankings on the website without needing full staff access.
Don't know who to challenge? Post your 2v2 duo for Open Matchmaking instead of naming 2 specific opponents - any other duo can join in from the new Open Matchmaking board, and the match locks in automatically once both spots fill.
New Cross-Server Exhibition Match - battle a random battle-ready squad from a completely different server. Friendly and unranked (no AP/rank at stake, no card ever changes hands), but real Kon and card XP either way. One match every 30 minutes.
New Auction House - list a card with a starting bid and a countdown (1h/6h/24h), anyone can outbid until time runs out. Kon is held the moment you bid and refunded instantly if you're outbid. Website-only, same as the other 2-player-market features.
New Memory Match game - flip tiles to find all 6 pairs, pure memory, no wager. Clearing the board pays Kon, plus a Gem bonus for solving it in 8 attempts or fewer. One attempt every 24 hours.
New Football Trivia game - 5 knowledge questions per attempt (24h cooldown), no wager, no way to lose Kon. 40 Kon per correct answer plus a 10-Gem bonus for a perfect run.
New Manager Profile page under Progress - one showcase pulling together your Trophy Case badges, Collection totals, Arena rank/record, and biggest Higher/Lower win, with quick links into each.
Buy Streak Insurance in the Gem Shop (8 Gems) to protect your /daily streak - the next time you'd miss the claim window, it saves your streak instead of resetting it. One-time use, shows up on the Overview claim result too.
Biggest single-game win, ranked - see /cardgame/higherlower.
Top Arena players across every real server on this platform, not just your own - see how you stack up platform-wide.
A real stakes gambling game - wager Kon, guess whether the next random player's overall is higher or lower, each correct guess multiplies your pot ×1.5 (up to 8 rounds). Cash out anytime, or push your luck - a wrong guess forfeits the whole pot.
Buying a pack now shows an actual sealed foil pack (idle shimmer, stacked visual for multi-pack buys) that you tap to open - a shake, flash, and tear-apart animation plays before the cards reveal, instead of jumping straight to the card grid. Pack tier tiles also got the same foil shimmer at rest.
A 4th hero tile alongside Claim/Daily/Packs - glows when a free spin is ready. Also gave the wheel itself a real visual pass: bigger disc, gold-forward palette, decorative hub, properly-centered segment labels.
The Featured showcase was still rendering the plain regular card with a text caption - it now renders the real Icon/TOTW (if one exists) or a freshly-generated real Showtime card as the actual card art, with a badge showing which.
Icon and TOTW pulls no longer mint fresh cards - they only succeed as an exact copy of an already-existing Icon/TOTW card for that player (falls back to Showtime otherwise, which always rolls fresh).
One free spin every 24 hours for Kon or Gems, with a real 0.5% jackpot chance (2,500 Kon + 15 Gems). New /cardgame/wheel page with a real spinning animation.
Training Ground, Scout Network, and Stadium are now manageable from /cardgame/facilities - same upgrades, costs, and construction times as Discord's /facilities, and their bonuses now apply to website Claim/Daily too.
Collection now tracks every card variant (Regular, Shiny, Icon, Showtime, TOTW) separately, survives selling a card away (all-time, not just current ownership), and pays real Kon at 7 milestone thresholds (10 to 500 total combos collected).
Matches now run 16 attacking sequences instead of 10 - noticeably more goals, saves, and set-piece chances per match.
Matches now run 16 attacking sequences instead of 10 - noticeably more goals, saves, and set-piece chances per match.
Every pending challenge/friendly/draft invite across all 6 match types now shows up right on the Card Game Hub overview, with a direct link to respond - no more hunting through each hub separately.
Team Challenges, 2v2 Combined Friendly, and 2v2 Draft Challenge results now play out goal-by-goal like every 1v1 mode already did, instead of a flat final score.
Pick a teammate and two opponents - all 4 of you draft your own 11 from random candidates (same as a normal Draft Challenge), then your squad merges with your teammate's into one best XI, same for the opposing duo, and it's a single match. Winning duo splits 500 Kon. Built as its own independent system - doesn't touch the live 1v1 Draft Challenge at all.
The flat 12-tab row is gone - navigation is now an icon-rail with category flyouts (Play, Arena & Friendlies, Market, Progress, Gem Shop), same proven pattern as the Manage panel. Every previously-buried page (Leaderboard, Challenge a Friend, 2v2 modes, General Market, Direct Trading, Watchlist, Awards, Collection) now has a real, findable spot instead of only being reachable via an inline link on some other page.
Every pool entry and Featured card now shows an example Icon and Showtime overall (illustrative, not guaranteed - real rolls are randomized). TOTW draws from a genuinely different pool (a real league's own roster, not the regular summon pool) - it now gets its own dedicated section instead of just a caption explaining the difference.
Fixtures and the leaderboard stats (Top Scorers, Top Assists, Top Team) used to sit as equal-weight boxes in one grid, stretching awkwardly. Fixtures now gets its own wide column; every leaderboard stat is grouped together in a dedicated panel next to it.
Filter by position, minimum star rating, and buyable-now-only, plus sortable columns (Player, Rating, Overall, Price) - click a column header to sort, click again to flip direction.
Team up with a friend and merge your two squads into one best XI (better card wins each slot) - then battle another combined duo in a single match. No rank effect, optional Kon wager split between the winning duo. Distinct from 2v2 Team Challenges, which runs two separate legs instead.
Team up with a friend and battle another duo - pick a teammate and two opponents from the Arena page, ready up together once accepted, and watch both legs (you vs. their first opponent, your teammate vs. their second) run as an aggregate score. Each leg still counts as a normal Arena result for AP/rank on all 4 accounts.
Direct request. Challenge someone to a practice match at /cardgame/friendly - no Arena points or rank effect either way, doesn't use an attack, with an optional Kon wager (winner takes the pool, a draw refunds both). Same rules as Discord's /friendly, which stays completely untouched - accept, preview both squads, then the challenger starts the match when ready.
General Market (new /cardgame/market/browse) - buy a fresh copy of any claimable player at the base economy price, same as Discord's /cardmarket browse + /card buy - this was genuinely missing from the website, only Trade Market and Gem Shop existed. /awards also has a real website page now (Card Game Hub - Server Awards). Legacy's leaderboard was goals-only - now tracks assists too (same season-scoped system as goals) plus a Top Team line.
Direct Trading (new /cardgame/market/direct) - propose a specific card-for-card offer to a specific person, either side optionally adding Kon, distinct from Trade Market's fixed-price listings. Same offers as Discord's new /cardmarket direct. Challenges and Arena Challenges duel screens now show both players' pfp and their top Trophy Case badge. Shiny's gold glow, previously only in the Packs reveal, now shows everywhere a Shiny card's real image appears - My Cards, the per-card manage page, and the claim reveal.
Direct "I couldn't see the animation of him joining because it auto-started the match" report. Accepting an Arena Challenge used to run the whole match instantly - now it locks in both squads and stops at a real Ready phase, where you can preview your own squad AND the opponent's before either of you commits. Match only runs once both sides hit Ready. Also added: a Rematch button on completed Challenges and Arena Challenges, and Card Draft Challenges now show the opponent's squad (as far as they've drafted) once you're done with yours.
Packs can now buy more than one at a time (up to 10) with a real +/- picker showing the live total cost - the backend already supported bulk buying, the UI just never exposed it. New Collection page (My Cards > See your full collection progress) shows every real player you can collect and which ones you already own, grouped by star rating, with a completion bar. On Gem Shop: fixed the featured cards visually overlapping (real spacing fix, not a bandage), and clarified that Icon/Showtime/TOTW pulls draw from the exact same pool shown - they're a rarer version of the same players, not a separate hidden list.
Direct request. The 3 highest-overall players currently in the summon pool now render as real card art above the Summon buttons - the best one bigger in the middle, the next two smaller and fanned out on either side, same card renderer every other card image on the site uses.
Squad Building Challenges (new /cardgame/sbc) - 5 challenges (Bronze Foundations, Silver Statement, Star Power, One Club, Elite XI), each burns real cards from your collection for a guaranteed Kon/Gems reward, live requirement checking as you pick. One claim per challenge. Discord gets a read-only /card sbc list - submitting really wants a real card picker, which fits the website better. Also: a real Arena Leaderboard (top 25 by Arena points, your own rank if you're outside it) existed nowhere before now - new page linked from Arena, plus /arenachallenge leaderboard on Discord. And 4-1-2-3 joins the formation list everywhere (Squad Builder, /formation, /11, Legacy).
Direct requests. Challenges and Arena Challenges now show a pulsing radar animation while you're genuinely waiting on the other player, plus a brief celebratory flash the instant live-refresh picks up that they've responded - instead of the page just silently redrawing. Gem Shop's Summon section also gained a "View Pool" list showing the actual real players you could pull, sorted best-first, instead of just a bare "150-player pool" claim with nothing to check against.
Several real, confirmed root causes fixed in one pass after "loading takes a lot of time" and "Roblox profiles don't always render" reports. Roblox avatar lookups had zero caching anywhere and never retried a still-rendering ("Pending") image - both are now cached and retried, on the bot and the website. Server info (name/icon) was sharing a 15-second cache with security-sensitive staff checks, getting re-fetched live on almost every Card Game Hub page load - given its own much longer cache, with staff/role checks left untouched. A permanently-broken server ID was retrying live on every request forever with no backoff - now capped. Pack-opening's flip animation used to run on a fixed timer with no idea whether the card's image had actually loaded, so a freshly-pulled card's art (which is often rendering for the very first time) could pop in with no animation at all - it now waits for the image to genuinely finish loading, with a shimmer placeholder while it renders. Also: any "use server" action failing right after a deploy (expected Next.js behavior, but was showing a dead-end error screen) now auto-refreshes instead.
Direct "only the one who accepted it can play" report - confirmed it wasn't broken game logic, both sides were always set up correctly. The real problem: these pages never refreshed themselves, so whoever DIDN'T just click Accept was sitting on a frozen page with nothing telling them anything had changed - Arena Challenges especially, since accepting resolves the whole match instantly. Both challenge-detail pages and both hub lists now auto-refresh while you're waiting on the other person, same live-refresh Match Center already uses for live fixtures.
Win/draw/loss payments, card fines, and default roster size on Manage > Economy are server-wide fallbacks - a division's own value on Divisions & Teams always wins, but that was only ever explained once in a paragraph at the top of the page. Both affected sections now link straight to where the real override lives. Also fixed a real layout bug in the slider fields where the narrowest columns could let the slider spill its number box out of its own row.
Buttons site-wide went from a flat solid fill to a real glossy gradient with an inset highlight - fixed a rule-order bug along the way where hovering used to flatten the gloss instead of brightening it. The homepage's big headline and every page's section-heading accent bar picked up the same gradient treatment already used for hero stat numbers. All additive CSS, nothing structural changed.
Direct "can we add an auto sell option?" request. My Cards now has a one-click "Sell All" next to a tier picker (Unranked through 4★) alongside the existing Sell All Duplicates - clears out a whole tier of low cards at once instead of one at a time. A card currently in your squad, on the bench, or listed on the trade market is skipped rather than blocking the rest of the batch. Deliberately caps at 4★ - never offers to bulk-sell your best cards by accident.
Direct "the animation looks bad it just looks like slow internet" feedback - confirmed real: every log line paused a flat 1.2-1.5 seconds regardless of whether anything happened, which reads as stalling on a full 15-20 line match. Routine lines now move quickly; only an actual goal gets a real pause, timed to actually show the new goal animation - a small ball that flies from center toward whichever side scored and fades like it's landing in the net, per direct request. Added a Skip to Result button for anyone who doesn't want to wait at all. Arena's own battle reveal had the exact same flat-pause problem and no scoreboard styling at all (plain score text) - it now shares the identical scoreboard, pacing, and goal animation Challenges/Legacy already have, per direct "the whole scoreboard could be used everywhere" request.
Direct "players can't accept offers through their inbox" report - confirmed real, and distinct from the transfer-consent flow: a signing offer (from /sign or Make an Offer to a free agent) never moves through the same AWAITING_PLAYER_CONSENT step a standard/release-clause transfer does - it stays PENDING until the player themselves responds. The inbox's Accept/Decline only ever recognized AWAITING_PLAYER_CONSENT, so a signing offer showed up with no buttons at all, and even a fixed frontend would have been rejected bot-side. Both sides now handle it - full parity with the Discord button, including a ranked player's random-team assignment (silent on the website, since there's no interaction to animate a spinning wheel into).
Direct "wheres even legacy mode" report - a real gap. Legacy (your own generated 8-team solo career league, separate from real leagues) was the one card-game system still Discord-only after everything else moved over. A new Legacy tab covers the full thing: start a season, standings, fixtures, top scorers, and playing your next match - which gets a full animated replay (same treatment as Challenges) instead of just a final score, since the website can simulate and persist the whole match at once instead of live-ticking it the way Discord does. A season started on Discord and one started here are the exact same league either way.
Direct "the animation looks bad" feedback on 45.26's pack reveal - confirmed two real bugs, not a taste issue. The 3D card-flip had no perspective set anywhere, so it rendered as a flat, broken-looking horizontal squash instead of an actual flip. And the gold glow on a Shiny pull was supposed to start once the flip settled, but a CSS ordering mistake silently reset its delay back to zero, so it was pulsing from frame one and visually fighting the flip instead of following it. Both fixed.
Direct "make the 1v1 part look a lot better" feedback, plus packs. A Challenge now has a persistent VS banner across every phase instead of plain text, draft picks render as real hover-lift card tiles (Icon/TOTW pulls get their own glow), the drafted-squad review rows highlight on hover, and the match reveal has a genuine scoreboard with a goal-flash animation instead of a bare score line. Packs: each tier is now a themed gradient tile (bronze through legendary) instead of an identical flat row, and opening a pack reveals the pulled cards with a staggered flip-in animation - Shiny pulls get a soft glow. Both respect the site's existing Animation preference (Full/Reduced/None) automatically.
Direct report: "people are unable to add their own desired cards" - confirmed real. Owning more than one card for the same player (a regular one and an Icon/Shiny/TOTW/TOTS/Showtime/Captain version, say) used to silently collapse to whichever had the highest overall everywhere - the squad dropdown never even offered the others as options. Every owned copy is now listed separately with its own tag (Icon/Shiny/TOTW/etc.), so the exact desired card can be placed in a slot on purpose. Old squads and every Discord command (/11, /switch, /subs, /gameplan, autofill) are fully unaffected - this only adds a choice, it never takes the old "best copy" behavior away.
Found and fixed during the Squad Builder work above, before it ever reached production: Arena battle-strength calculation had its own, separate, older copy of the "resolve a squad slot to a real card" logic - it would have broken (and separately, was already silently scoring Icon/TOTW/etc. squad members as their live regular-tier stats instead of their real locked ones) the moment someone used the new card picker. Unified onto the same resolver the Squad Builder itself uses. Verified against real live squads before and after - identical results for every existing squad, correct results for the new per-copy choice.
Direct report: a site update landed mid-Challenge and both players got stuck staring at "waiting on your opponent" forever, even though both had already readied up. Confirmed two real, related bugs. First, Challenges: the match is only simulated once, inline in whichever request sets the second ready flag - if that request gets cut off (a deploy restarting the process being exactly what happened here), the ready flags are already saved but the match itself never runs, and nothing was in place to retry it. Fixed with a real self-heal: loading a Challenge that's fully ready on both sides but still stuck now finishes the match right there, no manual fix needed. Second, and the actual root cause of the interruption: deploys were rebuilding straight into the live folder the site was still serving from, which could hand an in-flight request a page chunk that had just been deleted out from under it - confirmed live (a rebuild-and-reload dropped real requests; a reload with no rebuild dropped none). Deploys now build into a fresh folder and swap it in atomically only once complete, so a deploy can no longer interrupt anyone mid-action again.
Progress toward every Quest tier and Weekly Challenge already moved from actions taken on the website, not just Discord commands - but seeing that progress, or actually claiming a finished reward, was Discord-only (/quest, /weekly). A new Quests tab on the Card Game Hub shows both in full, with real Claim buttons backed by the exact same reward logic (guaranteed rare card + Kon for a tier, Kon for a challenge, plus the full-completion bonus) the Discord commands use - no Discord required for either half now.
Root cause behind repeated "transfers aren't landing" reports: playing in more than one server, Career Portal would silently show whichever one you happened to land on, with zero sign a transfer offer or consent was actually waiting in a different one - the website-accept feature was working the whole time, just invisible. The server picker and the in-page switcher both now show a live pending-item count per server, sorted so the one with something waiting shows first, plus an "N elsewhere" flag on the switcher when what you're viewing isn't the server that needs you.
When a transfer offer or consent DM couldn't be delivered (DMs off, blocked), the message just said so and stopped - even though the exact same Accept/Decline already exists in the Career Portal inbox. All three of those messages (initial offer, team-offer, post-accept consent) now link straight to it. Also fixed a real duplicate-offer bug found while in there: a second release-clause or standard offer could be created for a player who already had one PENDING or awaiting their consent - now blocked with a clear message pointing at the existing offer instead.
The platform's two real personal-hub destinations were buried in the homepage's flat Explore list with no more prominence than Changelog. Both now sit in the always-visible top nav next to Search.
Direct feedback on 45.16's new category dropdown row, in two rounds. First: it showed the exact same Competition/Squad/Market/Content categories the hamburger already had, at the same time - "redundant/confusing". Fixed by splitting them by viewport: the hamburger's own copies now only render on mobile (where the dropdown row is hidden), so the two navs are complementary, never duplicated. Second: the pills themselves had no border or background at rest and sat 2px apart - "not highlighted and too close together". Both fixed with real spacing and a visible border/background at rest, not just on hover.
Every league site (standings, rosters, transfers, and ~25 pages more) sat entirely behind one hamburger menu, nothing persistent on desktop. Added an always-visible category dropdown row - Competition, Squad, Market, Content - mirroring the exact same taxonomy the hamburger already used, so nothing needed re-categorizing, just surfacing. Preserves a multi-division league's current division filter through every link, same as the hamburger does.
The full-width row of every server you play in, and an icon-tile grid for Overview/Stats/Achievements/Transfers/My Team/Scouting/History, both got a lighter treatment - a compact dropdown switcher and a horizontal pill-tab strip - freeing up real space above the fold for the profile itself.
Two real discovery bugs, found from direct reports. First, the hub required a Player row (league membership) to list a server - the card game has no such requirement anywhere else, so real card-game-only servers were invisible. Second, once that was fixed, the hub was still filtering by an old module-enabled allowlist that predated the Card Game feature - hiding the platform's 3 biggest, most-active card game servers (500-680+ real cards each) behind ones with a handful of rows. Both checks removed; only an explicitly hidden site is excluded now.
Moved off /[league]/card-game/* onto a top-level /cardgame hub, same shape as Career Portal - a server switcher instead of being nested under one league's own URL. Gained a persistent Kon/Gems currency HUD and a horizontal pill-tab nav (Squad, Market, Arena, Challenges, Evolutions, Gem Shop) instead of a per-page standalone wallet card on every screen. Quest and Weekly Challenge progress now also updates from actions taken on the website, not just from Discord commands - previously only the bot's own commands moved those needles.
Two real structural redundancies, not just visual polish. The stats block right after the 'I'm here to' cards repeated the exact same leagues/teams/players numbers the hero had just shown a screen-height above - same data, same visit. Replaced with the 'this week' pulse (matches/goals/transfers), moved up from much further down the page where a new visitor was unlikely to ever scroll to it, and given a third stat (transfers) to earn its more prominent spot; falls back to the original counts on a genuinely quiet week. Separately, Live Activity merged in the same recent clips the Clips grid two sections above it already showed as thumbnail cards - the same clip's title routinely appeared twice on one page load. Live Activity is now news-only and renamed Latest News to match.
Two more real layout bugs found by actually signing in and screenshotting at 390px (not just reading the CSS). My Team's squad rows (name, position, role dropdown, Release button) never wrapped - the row was measurably 592px wide in a 390px viewport, with no horizontal scroll affordance, and on the longest name it read as visually overlapping. Now wraps cleanly onto two lines. Separately, a team's budget figure (e.g. €5,000,000) has no natural line-break point, so it silently overflowed its stat tile and got clipped by the card's own overflow:hidden - a real number was reading as '€5,000' with the rest just gone. stat-value--hero now wraps as a last resort instead of losing digits.
Standings, leaderboards, and every other .data-table sit in a horizontally-scrolling card on narrow screens (more columns than a phone is wide), but nothing ever hinted there was more to scroll to - confirmed live at 390px, the table just looked cut off at the card's rounded edge. A CSS-only scroll-shadow now fades the trailing edge in/out as you actually scroll, complementing the sticky first column's own shadow (which only ever covered the 'don't lose the row label' half of this).
At narrow widths, the hamburger/search icons plus 'Sign in with Discord' and the brand name didn't fit on one line - the button itself wrapped into two cramped lines ('SIGN IN WITH' / 'DISCORD'), and the shop icon got stranded alone on a second row, flush left with a dead gap beside it. The button now shrinks to fit on one line below 640px, and the shop icon is pinned to the right edge (margin-left:auto) instead of wherever space-between's per-line math happened to leave it.
checkTeamDebt only ever DMed a team's Captain/Transfer Manager when their budget went negative - easy to miss entirely with DMs off, and the budget number itself was already visible on My Team without ever being called out as a problem. A new team_debt inbox item flags it directly for anyone holding those two roles, same scope the bot's own DM already used.
Two more DM-only silent-failure gaps closed. Approving your own market listing (Loan/Transfer/Release Clause) had zero website presence - a new listing_consent inbox item covers Accept/Decline, backed by a new respondToListingConsent core extracted from the same button handler Discord already used. Separately, a demand's outcome (accepted or denied) was DM-only too - denied in particular left no trace anywhere else on the site - so the existing demand inbox item now also surfaces DENIED and ACCEPTED, not just PENDING.
Loan offers (/getloan, /giveloan) had no website presence at all - the responding captain's only path was a Discord DM, the same silent-failure mode standard transfer offers had before their inbox item shipped. A new loan_offer inbox item covers Accept/Decline (no Counter - the Discord flow itself has none for loans either), backed by a new respondToLoanOffer core extracted from the exact same button handler Discord already used, so budget checks, roster caps, and the Discord role swap all run identically either way.
The team_offer inbox item deliberately skipped Counter when it shipped - a modal was the only way to collect a new price. It isn't anymore: a plain price field now sits behind the same Counter button fixture-time proposals just got, backed by a new counterTeamOffer core alongside the existing accept/decline path. Also fixed: the league-creation wizard's Overview step still said 'No teams yet - use /team create in Discord' and 'Website Transfers: Enabled (once built)' even though Manage > Teams and Make an Offer have both been real for a while - the team-count line now links straight to Manage > Teams.
/requestfixturetime's Accept/Counter/Decline reached the responding team's decision-maker(s) by Discord DM only - the same silent-failure mode already fixed for suspensions and warnings. A pending proposal now surfaces as a real inbox item on the career pages, with Accept, Counter (pick a new time), and Decline all backed by the exact same core functions the Discord buttons call - full parity, not a separate DB-only path.
/reportdispute used to be fire-and-forget - an embed in the logs channel, with no record staff could come back to. A new Manage > Disputes page (staff and Transfer Agents) reports and resolves disputes for real: an open/resolved queue, who reported and who resolved each one, and an optional resolution note - backed by the exact same executeReportDispute the slash command uses, so the Discord-side log post still happens too.
When website team creation couldn't auto-assign a Team Manager (member not found, or already on another team), it told the admin to 'use /appoint in Discord' - stale advice now that a team's own roster page can set that role directly, with the same caps/badge-sync/audit-log parity. The message now links straight there.
Both /suspend and /warn previously notified the affected member by Discord DM only - a known silent-failure mode when their DMs are off. The existing website inbox (career pages) now surfaces active suspensions, lifted suspensions, and warnings as real notification items, so they're never missed just because of a DM setting.
The existing inbox (career pages) already notified you of pending offers and demands - now a Team Manager/Head Coach/Transfer Manager also sees a PENDING standard-transfer offer sitting on their own roster there, with real Accept/Decline buttons, instead of only ever getting it as a Discord DM. Counter still needs Discord's negotiation modal.
Two corrections to the competition-type filter (v43.0/v43.1) on League Records, Player Stats, and Leaderboard: All Competitions was scoped to league + cup + tournament only, deliberately excluding friendlies - it's genuinely everything now, friendlies included. And Friendlies previously ignored the season filter entirely - it's season-aware like every other scope now, using each stat's own recorded season.
The other half of "let team managers start a transfer from the website": every rostered player's profile page now has a Make an Offer form, for that league's other teams' Team Managers/Head Coaches/Transfer Managers once a league turns the setting on. Runs the exact same market-value floor, transfer-window, and captain-protection checks /transfer offer does, and the responding team gets the exact same Discord DM with Accept/Decline/Counter buttons - only where the offer starts moved, not the negotiation. Loans/trades/release-clause offers still stay Discord-only for now.
Manage > Teams has a real Create Team form now - name, division, starting budget, emoji, and an optional Team Manager - instead of Discord being the only way in. Runs through the exact same validation and Discord-role/log setup as /team create, so nothing about it is a second, weaker path. The "Create teams (coming soon)" line at the end of the league-creation wizard now links straight to it.
A new comparison strip shows each available competition's own top scorer and top Man of the Match side by side - League, Cup, Tournament (once a server's actually recorded one of those), and Friendlies - without clicking through each filter tab one at a time to find them.
Confirmed bug: League Records' always-on "League" button silently combined league fixtures and friendlies into one number - never a real league-only view. Player Stats had the same button meaning "any competitive fixture" (league + cup + tournament) with no way to isolate one. Leaderboard had no filter at all and quietly excluded cup/tournament fixtures by accident, since a tournament fixture's own gameweek carries no league ID. All three now share one real model: All Competitions (league + cup + tournament, friendlies excluded) is the new default, League/Cup/Tournament/Friendlies are all real, separate filters, and Cup/Tournament only show up once a server's actually recorded a stat for one. Leaderboard's CSV export matches whatever's on screen now too.
Every new server's Overview checklist had a 'Review site settings' item that 404'd - it linked to a page that's never existed. Points at Site Appearance now (where that setting actually lives). Also stopped telling staff to leave for Discord's /generateschedule for the 'Generate a schedule' item - that's been a real button on Divisions for a while.
Confirmed report: the homepage's "Next Fixture" spotlight links straight to that fixture's own match page - which had an Edit Result link once FINISHED, but no way to report it at all while still SCHEDULED. Staff and Results Reporters had to leave and hunt for it in Manage's picker instead, even standing right on its page. Added a direct Report Result link.
Confirmed data-integrity bug: correcting a reported score (a win fixed to a loss, say) updated the goal/stat feed but left Team/TournamentEntrant standings and the match payment exactly as they were originally recorded - permanently wrong. Deleting a result had the same gap: the fixture reverted to scheduled, but whatever standings/budget it had applied stayed applied forever. Both now properly reverse the old effect before applying the new one (or nothing, on delete). Also found and fixed while in there: leagues with no payment override of their own were silently getting paid $0 via the website instead of the real server-wide default, and tournament fixtures never respected a tournament's own payment override - both now match the bot's /results exactly.
A full permissions audit turned up real gaps: editing or deleting a News post or Rulebook section only ever checked that you're a News Editor/staff member SOMEWHERE, never that the specific post/section belongs to your own server - closed on both. Bulk-deleting teams had the same gap for team IDs. Two currency endpoints (cosmetic purchases, passive Spark earning) had a real check-then-act race that a double-click or two open tabs could exploit to double-credit - both now use an atomic guarded write instead. Directory league icons and clip/creator avatars get the same fresh-fetch fix v42.1/v42.2 gave permission checks.
v42.1 fixed match/scrim pages caching a stale staff/Results Reporter check indefinitely. Audited every other page with the same pattern and found 14 more: Career/My Team, the whole Get Started create-league wizard, and Team/Rulebook/Rankings/Power Rankings/Rosters/Awards - a staff role grant or removal could sit invisible on any of them. All now check fresh on every request, same as the rest.
v37.0 fixed the Results Reporter role's staff-only gates, but a Results Reporter could still land on a match or scrim page and not see Edit Result/Send to Discord/Delete Result - those two pages were the only ones that never opted out of Next.js's own request cache, so a role grant could sit invisible behind a stale cached permission check indefinitely. Fixed alongside the rest.
A full sweep: every remaining stock emoji glyph on the site - star ratings, view counts, the football/goal marker, warning/suspension icons, the milestone and news icons, checkmarks, close buttons - is now a hand-drawn stroke SVG in the site's own icon style, matching the direction already used for section headers and awards. Star ratings (the '★★★☆☆' spread and the compact 'N★' badge) got a shared StarRating/CompactStarBadge component used everywhere a rating shows up. A couple of inline-text star mentions (release clause tiers, ranked-sign settings) read as '5-star' instead of a glyph, since they live inside plain sentences.
Per direct feedback, posting a clip was clunky - a bare '+' circle that didn't read as a real button, and a blind form: paste a link, submit, hope it embeds. Now there's a proper 'Post a Clip' button, and the form shows a live preview as you type the link - image, video, YouTube, Streamable, and Medal links all render exactly like the real feed card will, or you get a clear warning it won't embed before you post it.
Every award used to render the same generic trophy glyph everywhere. Manage > Awards now has an icon picker on both Create and Edit - 10 hand-drawn options (trophy, star, medal, crown, boot, gloves, shield, flame, target, bolt) - so a Golden Boot, a Discipline award, and a Hall of Fame entry can each look like what they actually are. Shows up everywhere an award does: Manage Awards, the public Awards page, player profiles, a team's trophy row, and the Career Portal.
Per feedback that editing a result was hard to find: Recent Matches used to just link to the match's own page, where Edit Result was a small, easy-to-miss text link. Every row now has its own Edit Result (or Report Result, for a still-scheduled fixture) button - Report Result pre-selects the fixture in the wizard instead of making you re-find it in a 50-item list.
A player currently under an active suspension now gets the same at-a-glance pill treatment Captain/Vice-Captain/etc. already get - on the public team page, the public Rosters directory, and the Manage roster editor. No more needing to cross-reference the separate Suspensions list to notice someone's unavailable.
Compare Players was scoped to a single division tab end-to-end: the player pickers only listed that division's roster, and stats only ever counted fixtures from that one league - so a player currently on loan to a team in another division had appearances from before (or elsewhere in) their loan silently missing from their totals. Both pickers now list every player in the server (grouped by division), a new Division row shows each side's actual competition, and stats are pulled from every division a player has ever appeared in - not just their current one.
Confirmed report: a Results Reporter could submit a brand-new result via Report a Result, but hit staff-only gates almost everywhere else - the Manage dashboard's own landing page denied them outright, Recent Matches (same menu section as Report a Result) was staff-only, and even the match/scrim page's own Edit Result/Send to Discord/Delete Result controls never appeared for them. All four now recognize the role. On the Discord side, /results was staff-only with no equivalent role at all - added /configroles resultsreporter (shown on /setup, same as News Editor) and wired it into /results, so the same role now works in both places.
A direct reversal of v31.0's direction: friendlies stay fully tracked (still show on /scrims, the Results feed with its own filter pill, match/team pages, clip highlights, Match Reports) but no longer count toward an actual league record. Golden Boot/Leaderboard (and its CSV export), Season Highlights (Biggest Win, Recent Results), Streaks, On This Day, Top Rivalries, match-page Head-to-Head, and the Results page's Top Scorer/Biggest Win/Underdog storylines are all real competitive fixtures only again. The Results feed's own raw list and per-row goal scorers are untouched - that's an activity view, not a record.
Underdog joins the Results storylines row - the biggest league-table rank gap where the lower-ranked team actually won. And the News editor now shows a real, live approximation of how an article reads as a Discord link embed once shared - Discord's own actual dark-theme colors, updates as title/excerpt/body/cover image change - so a bad crop or missing excerpt gets caught before publishing, not after.
A LIVE match now auto-refreshes itself every 20s with a pulsing indicator, instead of needing a manual reload. Compare Players is a new tool (Head to Head already did this for teams, nothing did it for players) - pick two, get a real side-by-side across team/position/rating/value/every season stat. Team pages gained a real Squad Depth Chart (the club's planned formation, previously saveable via Career Portal but never shown publicly) with a bench list, and an Unavailable strip surfacing active suspensions for that team's own players - both real data that existed already but were never surfaced where people actually look. Team Settings also now nudges staff to set a crest if they haven't (only ~13% of teams currently have one).
Fan MOTM and Fan Polls (interactive and read-only, Manage and public) were four near-identical inline vote-bar implementations that would have quietly drifted apart. Extracted into one real, shared component with the site's actual signature treatment - the same accent top-sliver every card gets, matching corner radius, a real hover-lift with an accent glow - instead of a flat bordered box with no polish of its own. Auditing for duplicate class names while doing this turned up a genuine, already-shipped bug: the Results feed's row wrapper was also named .result-row, silently colliding with (and overriding) the unrelated .result-row already used by Search's result cards, breaking their name-left/meta-right layout for every category - leagues, teams, players, articles - since Results feed shipped. Renamed to fix it.
Every Manage settings save now records who made it, which area, and when - wired into 12 save actions across Economy, Divisions (transfer window, league rules, friendly/match payments, roster caps, theme), Commands (disabled commands, pause-all), Channels & Roles, and Branding. One row per save action, not a per-field diff - real accountability for a server with more than one staff member touching settings, without the fragility of diffing every distinct settings form individually. Best-effort: a logging hiccup never blocks the actual save.
Standings now projects each team's final points from its own points-per-game extrapolated over its own remaining fixtures - not a placeholder or a single league-wide average. Leaderboard gained a real CSV export (every player who's made an appearance, every stat at once, not just one category's top N). And a real @media print stylesheet finally exists - the old "print-mode" toggle only stripped chrome for a Discord screenshot while keeping the dark theme and every button; actual Ctrl+P/PDF output now forces a light, ink-safe palette and hides interactive controls automatically, no toggle needed first.
This Gameweek combines the real current gameweek's fixtures (in progress if one's underway, else the next one up, else the most recent finished one once the season's over) with the latest articles on one page, instead of Schedule and News being two separate stops - added to the main nav. The homepage's Activity tab gained a real Community Activity feed (actual News comments and fan MOTM votes, not just staff-posted content) and a Recent Transfers ticker (last 5 completed moves for the league's own teams).
Golden Boot already counted scrims - Season Highlights (Biggest Win, Recent Results), Streaks, On This Day, Top Rivalries, and match-page Head-to-Head all only ever queried real fixtures. Same real direction applied consistently now: a friendly can be the season's biggest win, feed a team's win streak, resurface on This Day, count toward how often two teams have actually played, and show up in a match's head-to-head tally - always clearly labeled "Friendly", never conflated with a competitive result.
A free, one-click, changeable fan vote for Man of the Match now runs alongside the staff pick, live percentage bars, open to any player who actually recorded stats in the match. Staff can attach an already-submitted /clips highlight to a specific match or scrim, shown under a real Highlights section. And Fan Polls is a fully general-purpose staff-created poll - not tied to any match or player, any question, same free/one-vote/changeable pattern - for anything from "best kit?" to "player of the season?".
Results previously showed bare score rows - it now shows each goal's real scorer (and minute, when logged) inline. Staff reporting a result can now write an optional Match Report - a short recap shown on the match/scrim page and flagged on the feed. A Season Storylines row (Top Scorer, Biggest Win, Longest Win Streak) sits above the feed, computed from whatever's currently filtered. And a finished match/scrim can be turned into a real News article in one click - pre-filled with the score, scorers, and Match Report text, always a draft for staff to review before publishing.
News was a hero + accordion of raw titles on one page, and had a real bug: no status filter at all, so DRAFT posts were publicly visible the whole time. Every article now gets its own real page (cover image, YouTube embed, layout-aware treatment, comments), the index is a real hero + preview-card grid, and articles are strictly published-only. Also new: free-text categories with filter pills, scheduled publishing (pick a future time and it stays hidden until then), real public view counts (tracked prefetch-safely, not inflated by Next.js hovering a link into view), a per-league RSS feed, and indexing in site-wide Search - previously entirely invisible to it.
The Transfer Rules card was showing a dead field as the loan price floor - a fixed, never-actually-settable 10%, when the real enforced floor (loanMinPercent) defaults to 20% and is the one staff actually configure. Same wrong number appeared in /setup. Separately, clearing almost any blank field on the new Economy page (Win/Draw/Loss Payment, card fines, Min Sale/Loan %, release limits, signing offer minutes, demand comp/cooldown) and saving would throw - it wrote an explicit null for every blank field, but only 2 of the 14 are actually nullable. Blank now just leaves those fields untouched. Also fixed loan length and remaining loan-cancellation fees silently ignoring a server's configured gameweek length and always assuming 14 days.
The public Transfer Rules card only ever showed 4 of the real rules in effect - it now shows all of them (min sale/loan %, market bid raise %, trade fairness tolerance, offer expiry hours, signing offer minutes, demand compensation/cooldown, release clause price by star rating, listing consent, and the ranked-sign-spin mechanic when a server has it on), pulled live from the same config the bot enforces so it can never drift out of sync. On Manage: the Economy page gained Loan/Transfer Offer Hours, a Listing Consent toggle, Unranked Base Value, Gameweek Length, a full Release Clause Price editor (all 6 tiers at once), Star Rating Value Ranges, and the ranked-sign-spin controls; Commands gained a single Pause All Transactions switch; Divisions & Teams gained a trade-limit-per-window field and transfer window length. All of it was previously bot-slash-command-only.
Ported renderPlayerCardV4 - the current Discord card art - to the website and wired /api/playercard to it, including the bust-avatar lookup. Also fixed isShowtime never actually reaching the renderer, which meant Showtime cards were silently rendering with the wrong tier's art.
Three real, related features. Match Ping announcements now go out automatically 30 minutes before kickoff and again at kickoff itself, each its own branded embed (via a real per-channel webhook, so it shows the league's own name and icon instead of the bot's) naming the Referee/Cameraman/Commentator for that match. Predictions moved off any currency entirely - it's a free, one-click vote per person, shown as a live 10-square bar colored to each team's real Discord role color where one's set. And officials can now claim or release their own role with a real button, right on Discord, DM or channel - no website round-trip needed. Any slot still open 15 minutes out pings staff directly.
Claiming Referee/Cameraman used to be open to literally anyone signed in - now each server can restrict it to a real Discord role via Channels & Roles, same for the new Commentator slot (previously not claimable at all). Also added a Results Reporter role so match results can be reported without full staff access. Wiring that up surfaced a real, pre-existing bug: the Manage area's own access gate only ever checked for full staff, so a non-staff News Editor could never actually reach their own page - the more lenient check that page ran itself was dead code. Fixed for both roles at once.
Every budget change - match payments, transfers, releases, loans, card fines - was refreshing the live budgets message in Discord twice per event. Root cause: the function that posts a transaction's log line already refreshes that message itself, but nearly every caller across the codebase also called the refresh again right after, under the mistaken belief it was needed. Found by tracing a stale in-progress diagnostic that had been left mid-investigation; removed the redundant calls everywhere they existed and the diagnostic itself.
A lot of what /league rostercaps and /configmoney could already do in Discord had no website equivalent at all - confirmed this wasn't hypothetical, several servers already had real caps and payment overrides set that were completely invisible here. Divisions & Teams now shows and edits real match payments/fines and roster caps (overall size, per-position, per-star) per division. A new Economy page covers everything else that was Discord-only: transfer/loan price floors, release rules, demand settings, signing offer timers. The Manage sidebar's Operate category had also quietly grown to ten flat items while everything else had one or two - split the structural/recognition half into its own Competition category.
A real, explicit gap: every other budget-changing action (results, transfers, fines) had a website or Discord path, but a plain manual correction didn't. /budget adjust and a matching Manage panel form both require a preview-and-confirm step before anything changes, and log to the same places every other budget event does - the Discord budget-log channel and the audit table behind /budget history.
League Records already let you view every division's stats combined instead of one at a time - Leaderboard and Player Stats didn't. Same toggle, same place, now on both.
Explicit reversal of an earlier call - scrims were being tracked for a player's own career stats but deliberately excluded from league-wide leaderboards and records. They now count toward both, matched to a team by who was actually rostered for that specific match (not just whoever's on the roster today), so a later transfer can't misattribute a scrim played months earlier.
Shown on the league's own page and the public directory - a small addition, requested directly.
Career Portal moved from a single-column tab-switcher to a real 2-column dashboard. Captain/Vice Captain/Transfer Manager/Scrim Hoster badges - already shown in Manage - now show on the public roster and team pages too. The homepage's scoreboard cards got a real hover/select interaction with a front-and-back swap animation, both faces animating together. Rounded out with tabular-number styling swept across every remaining side-by-side stat display site-wide, for visual consistency with the tables that already had it.
v4's glass nav background broke the mobile menu - backdrop-filter directly on .nav made it a containing block for the menu drawer's position:fixed overlay, shrinking a full-screen drawer down to the nav bar's own height. Caught and reverted quickly, then redone properly here: the blur now lives on a ::before layer instead, which can't cause that class of bug regardless of what else gets added to the nav later. Section headers get a soft glow and a fading hairline for pages that stack many sections in a row (the homepage runs a dozen deep). Pills get a real border in their own color instead of reading as flat text labels.
Same dark neon-retro identity (glow accents, angular pills, animated grid, uppercase display type) - refined execution. Consolidated .card into one clean definition (three overlapping rules had accumulated across v1/v2/v3). Real keyboard focus states everywhere for the first time - buttons, links, cards, inputs had none, so tabbing through the site fell back to each browser's own mismatched default outline. Buttons now have an actual press state, not just hover. A shared, gentler easing curve on every existing transition. Themed scrollbar, branded text-selection color, richer icon depth, a glass nav. First pass on the visual rework - foundational and site-wide since it lives in the shared design tokens, more to come.
The rulebook editor has supported bold text, info/warning callout blocks, and embedded links/images/video for a while now - but the public rulebook page never rendered any of it, just plain-text tags. Confirmed live on a real server. Fixed, and brought the News editor up to the same level (it was still a plain textarea) with a matching render fix.
Following straight on from role management: a team's Team Manager, Head Coach, or Transfer Manager can now release a player right from My Team, same as /transfer release in Discord (Scrim Hoster excluded, never a teammate of equal or higher rank - both enforced server-side, not just hidden in the UI). Also cleaned up a real, live bug found while chasing this: a dead, already-hidden test server was still costing a failed Discord API call - and a loud error - on every Career Portal visit for anyone who'd ever had a profile there. Purged its data entirely and fixed the underlying code so a hidden site can never do that again.
Every staff action added this session left one gap: a Captain, Head Coach, Transfer Manager, or Scrim Hoster had nothing of their own on the website - /appoint and /dismiss were Discord-only for them too, even though the bot itself lets them manage their own team's leadership. My Team now has a role picker next to each squad member, limited to exactly what that leader's rank is allowed to touch, same hierarchy the bot enforces.
Two more staff actions moved to the website: Generate Schedule per division (Divisions page, same round-robin/knockout/group-stage algorithm as /generateschedule) and Start New Season (Overview). Also went back through everything added this session - Release, Declare Forfeit, Lift Suspension, Remove Warning, new Suspension, Generate Schedule - and added a real confirm dialog to each. One-click was too easy to fire by accident on actions that pay out compensation, apply Discord roles, or can't be undone.
The first transfer action on the website: release a rostered player with one click, with the exact same compensation, budget log, and Discord role cleanup /transfer release itself does. Sign, loan, trade, and buy still run through Discord (they each involve a real consent step that doesn't have a website side yet) - Release doesn't have a consent step in the bot either, so it's the one that maps cleanly onto a single button.
Three staff actions that only existed as bot commands before: Manage now has a full Suspensions & Warnings page (issue or lift a suspension, log or remove a warning), and any not-yet-finished match has a Declare Forfeit control next to Edit Schedule. Suspensions and forfeits proxy through the bot for full parity - the same ban role, results embed, and channel posts /suspend and /forfeit themselves produce, not a database-only shortcut.
Manage → Teams already had a role dropdown per player, but the endpoint behind it skipped every rule /appoint and /dismiss enforce - no cap check (a team could silently end up with two Team Managers), no leadership badge sync, no pinned Discord roster message refresh, and no entry in the staff log. All four now match the bot's own commands exactly, and the log now credits whichever staff member actually made the change on the website.
A player's star rating was rendering as literal text on their shared card image (Discord/iMessage previews) - the glyph forced a fallback font fetch to Google Fonts that's been failing on this server, so the rating silently rendered blank. Replaced with a real SVG that needs no font at all.
68 of roughly 90 pages had no title or description of their own - every browser tab, search result, and shared link for career, manage, get-started, and every league-scoped page (standings, rosters, suspensions, and the rest) just fell back to the bare site default. Every one now has a real, specific title - league-scoped pages show the actual league name ("Suspensions - Bundesliga", not just "Suspensions").
Like, comment, save, and share buttons on clips were icon-only with no accessible name - a screen reader would announce a bare number or nothing at all. Fixed across both clip feeds.
Found 10 pages with no way back to the rest of the site beyond the browser back button - creator profiles, the whole 7-step league creation wizard, the shop, the spark leaderboard, get-started, the manage picker, and the directory submit/review pages. Every one now has the standard site nav.
The Leagues section - the actual list of what's running on the platform - was the second-to-last thing on the homepage, below clips, results, and transfers a first-time visitor has no context for yet. Moved it up, right after the 'what is this site' section.
The staff dashboard's 'you don't hold a staff role' message was a single bare line of italic text, noticeably plainer than the rest of the site. Gave it a real card.
Every page rendered in a narrow 960px column regardless of screen size, and data-heavy tables (standings, leaderboard, rankings) hit horizontal scroll well before running out of real content. Widened to 1180px across the whole site.
A page's own title and a mid-page subsection header used to render at the exact same size everywhere on the site - no real visual hierarchy anywhere. Fixed that site-wide, and added a breadcrumb trail (no 'where am I' navigation existed before this) across leagues, career, and the manage dashboard.
There were no loading states anywhere on the site - opening any data-heavy page showed a blank flash until the server finished its queries. Added real skeleton screens that cover the whole site: leagues, career, manage, directory, and everything else.
The site never had a favicon - every browser tab just showed the generic blank-page icon. Added a proper tab icon, an icon for when it's added to a phone's home screen, and support for installing it like a real app.
A real page tracking what's shipped, instead of changes only living in commit history.
Standings now shows a small trend line for every team's season, and each team's own page has a bigger version of it under Records. Built from match history the site already tracked but never plotted.
Sharing a link to a friendly match was silently failing to generate a preview image - a leftover bug in that page's code.
Pasting a link to a league, team, player, match, or tournament into Discord used to always show the same generic description. Each one now shows real details - top-3 standings, a player's team, a live score.
Leaderboard and League Records now show a bar next to every ranked stat, sized against that board's own leader, instead of a flat list of numbers. Also found and wired up a player stat radar chart that existed in the code but was never actually rendered.
Every empty list or table across the site - standings, rosters, news, search - used to just say 'No data yet' in italics. Replaced around 55 of those with a small custom illustration. Also added a real step tracker to the league creation wizard.