/lineup build is gone. Use /lineup pick, or /lineup create, which opens the same lineup builder.
Set up your profile and say if you are looking for a team in one go with /register. /signup still works for now and points you to /register; posting an LFT also marks you as looking.
/lineup pick shows your lineup picture, change a spot then pick who plays it, More for formation, skills, bench and captain, and Open on website. /lineup quick makes a one-off graphic.
Transfer leaks, trade rumours and bidding wars now post as designed cards with more varied headlines.
Signing, trade, result, loan and calendar cards show the right club crest again, even when the crest link has expired or the name differs slightly.
Rank changes and loan leaks now always post as cards; plain text is only a fallback.
The /profile card has the new glass look with form dots, milestone badges and a layout for free agents and unsigned players.
New players set up their profile in four clear steps - name, nationality, position, then a final check before anything is saved.
Loan leak rumours and ranking-log updates now post as designed cards.
Renders fall back to the team emoji, the real-club crest or the initials badge when an uploaded icon is dead.
Match results and team rosters can now show as one tidy card in Discord, with quarter or set scores under the title.
Leagues with skills now check /lineup lines (Name | Skill), show the skill on the image, and /league skills lists the rules. Match announcements can show as one tidy card.
/season generate works again for a league whose schedule was from last season, changing the gameweek length moves the upcoming gameweeks, basketball and volleyball results show each quarter or set, and bot DMs also land in your website bell.
The Sardinia flag now shows on player, profile and transfer cards, and /lineup draws a lineup image for basketball, volleyball and american football.
New schedules land in the current season. When a league had two active seasons, schedules and stats were stamped on the older one.
/results report takes quarters or sets (periods:"25-20 22-25 25-18") for sports that score that way, /stats add and edit take your sport's stats (like rebounds or blocks), /lineup offers your sport's formations, /leaderboard works for every sport, and transfer offers also reach the website bell.
/season stats posts the season statistics (top scorers, assists, clean sheets, MOTM, ratings) to the channel set with /configchannels seasonstats.
The standings image now shows how many places each club moved since the last gameweek (green up, red down) and a points bar under every club. The full-time card shows the goals on a timeline from kick-off to the final whistle, home goals above the line and away goals below, with the minute beside each one.
/pack opens up to 50 packs at once; past 10 cards the picture lists the rest under the best 10. Pick a ready-made template when you create a team. Sardinia is now a nationality.
Staff can set how many days a team waits before re-signing a player it released. Leave days empty for one gameweek, or use 0 to turn it off. /cooldowns shows the countdown.
/offer list shows every offer waiting on you and /offer accept or /offer decline answers one by ID, so closed DMs no longer block a move. /signup join signs you up as a free agent. Signed players who leave the server are released after the days staff set. Releasing a player no longer locks them out of other teams, and a signing offer from a deleted team is cancelled instead of erroring.
Pick football, basketball, volleyball or American football. Results, /standings and the standings image count and label the table the way that sport does.
Name a position, choose which ones your league uses and their order. Rosters, rankings, drafts, loan offers and player menus show your names.
Card matches played from Discord keep the whole match - the Watch on the website button replays it in the Match Centre.
The card match screens in Discord (team sheet, live, shootout and full time) now carry a Watch on the website button that opens the match's page in the Match Centre.
Friendlies, Arena battles, Rush, exhibitions, Formation Trials, Squad Battles and Legacy now use the same match engine as Manager Mode: football scorelines and real draws instead of 7-5 shoot-outs. The chat play-by-play shows the goals, saves and attacking moves.
An 11-a-side /friendly is now played live in the channel, like a Draft Challenge: you both manage your own squad with tactics, substitutions and a half-time talk, and a wager is paid out at the final whistle. A 7-a-side still plays out at once.
When your opponent in a Manager World league kicks off a shared match, /world now tells you to open the Match Centre on the website to manage your own side. Until you do, your assistant has it.
/configmisc positions can give each custom position a group, for example ATT=FWD, so renamed positions stop landing in Other on rosters, rankings and position caps. List shows each position's group.
A Draft Challenge that is level after 90 minutes now goes to extra time and, if it is still level, a penalty shootout shown a kick at a time. The winner takes the Kon reward and the result card says how it was decided.
The /help page for /carddraft now says the drafted squads play the match live: team sheet, tactics, subs and a half-time talk.
Press Start Match on an 11-a-side Arena attack and the match plays out minute by minute on one live message in the channel. You manage your squad: pick a tactic before kick-off and change it any time, make up to five substitutions from your saved bench or your best spare cards, ask your assistant for a read, and give a team talk at half time. The defender's squad is run by the AI manager, so they are not pinged and do not need to be there. Full time ends with a result card - the score, the scorers and the player of the match - with your Arena points and any new rank, and substitutes who played get their appearances and XP too. 7-a-side attacks still play out instantly.
After both drafters press Ready, the match plays out minute by minute on one live message in the channel. Each of you manages your own side: pick a tactic before kick-off and change it any time, make up to five substitutions from a bench of five, and give a team talk at half time. Tired players play worse, and your assistant can give you a read on who is tired, the score and who is on top. Full time ends with a result card - the score, the scorers and the player of the match - and the winner takes the Kon.
Card game commands now show players by their Roblox display name (then Roblox username) in /card, /cardmarket, /gemshop, /claim, /drop, the Icon, Showtime, Captain, TOTW and TOTS lists and the weekly card posts, instead of the registered name.
Pressing Continue in a Manager World league shows every manager's match by name (played with the score, playing live, ready or still to play) and when the round is played. The person who created the league gets a button to play the gameweek for everyone.
Team of the Week, Icon, Team of the Season, Showtime, Performance and Captain cards can now be upgraded with /upgradespecial: up to five levels, one overall point each, with the same odds and optional insurance as normal upgrades.
The /leaderboard header now says it counts league matches only, and which season (or All time) you are looking at.
Transfer, loan, release and demand messages, offer DMs and transfer leaks now name players by their Roblox display name, like the website and leaderboards.
/showtime list shows the top cards by rating with real player names, and marks the Gem Shop's showcase cards as such. Card ids only show for staff and for the card's own owner.
/help now opens on a short For Players page (your profile, your league, finding a team, the card game, looking up any command) instead of the admin setup checklist. Admins still open on Server Setup.
/leaguemarket free-agents is now paged (20 per page, with Prev and Next), lists the best players first and can be filtered by position. Roblox display names now show in free agents, market listings, /award suggest, /nationalteam, /konboard and the card game /awards (and on the website's card game Awards page). Names with underscores no longer turn into italics, and Golden Glove only suggests a keeper who has kept a clean sheet.
Pro Career's decisions in Discord. /pro contract shows your deal and lets you ask for a new one, ask for more, sign, walk away or run it down. /pro transfer lets you ask to leave or come off the list, and answer moves other clubs have agreed for you. /pro continue now tells you the day's news: interest, offers and cup draws.
Objectives, SBCs and the card market fit on one screen, the market shows what you can buy right now first, squad pictures show your team rating (the average of your eleven, not the sum), and selling all your duplicates now asks first. /heist and /revenge no longer break when they can't go ahead.
Cooldowns in /claim, /daily, /drop, /arena, /quest and /cooldowns show a live countdown, /daily leaves out bonuses that are zero, /pack lists its odds from the best tier down, and trivia tells you the right answer when you miss. Cooldown notices are one short line, and the Gem Shop fits on one screen.
The card game's welcome message and its page in /help now link the full How to play guide on the website.
/staffutils syncroles now lists the roles it couldn't hand out - deleted ones, or ones above the bot's own role - with how to fix each, and only counts the changes it really made. /staffutils refreshrankings says what's wrong with the rankings channel instead of failing quietly.
Opening packs shows your pulls as a picture of the cards, best first, with shiny pulls in foil, instead of a list of numbers. A shiny pull now shows its shiny rating. /claim, /daily and /card view drop the stat lists that repeated what's on the card picture, so each is a couple of lines.
The welcome DM's position menu lists your server's own positions, and picking one gives you the position role, like /editmyprofile does. Buttons take you to the league website and your career page. When the bot joins a new server, its hello has buttons to the league website (or to create one) and the getting-started guide.
/viewteams shows each team's emoji (it printed raw codes like <:name:id>) and how many players are on each roster.
The DM new members get used to say little more than 'Main position: not set'. It now introduces the server's leagues, shows what's left to set on your profile (with the main position picker), how to get signed with /leaguemarket lft, your first card game steps (/claim, /daily, /11 autofill) and links to the league website and your career page.
The pitch in /11, /switch, the /arena and /friendly previews and /carddraft draws Icon, TOTW, TOTS, Showtime, Captain, Shiny and Legacy cards in their own designs, with each player's name on the card. The long text list under the picture is gone: one line sums up your chemistry and average rating.
The /quest steps and dozens of hints named commands that were renamed long ago (/cardbuy, /mycards, /market, /upgradecard, /tradedmarket, /evolution, /sign, /loan, /release, /demand, /lfp, /lft, /submitlineup). They all name the current commands now, e.g. /card buy, /card mine, /cardmarket browse, /transfer sign.
/card sell, sell-rarity, convert and quick sell work on cards that were once listed or auctioned. sell-rarity now pays for every copy of a stacked card (it paid for one and removed them all) and leaves cards in your squad alone. Prestige works again for anyone who bought a card on the trade market. /resetcardgame no longer stops halfway when auctions exist. Hints now point to /cardmarket traded mylistings.
If your pro's contract has run out, /pro continue now finds them a new club and says who signed them. A pro who has retired is told to start a new one.
Career Mode is gone from Discord too: /manager now shows where to play - Manager World (/friendsleague), Manager Career (/world) or Pro Career (/pro).
In a Manager World league, the reply after the season's last matchday now includes the summer's World Cup or European Championship: the winners, your players' games, goals and how far their country went, and the final.
/friendsleague invite shows the code of the Manager World league you're playing and /friendsleague join takes a league code. In a league, /world season-simulate plays your own match and tells you when the rest of the round is played. Each league's gameweek is played at its daily deadline, even when nobody opens the site.
On an international day, the reply now shows the World Cup or European Championship: your players for their countries, the day's results and, after the final, the winners, with a link to the tournament on the website.
/transfer and /leaguemarket now check the transfer window and the per-window limits your division sets in Manage > Divisions, so a division with windows turned off can do deals at any time while the rest of the server keeps its windows.
Moving to the Server Behavior page in /setup failed with "This interaction failed" - its Next and Health check buttons clashed. It opens normally now, from Next, Previous or the page picker.
/pro status shows your Roblox name, your overall, age and potential as your save has them, your squad role, this season and your career, and your next match. /pro continue tells you your own rating, goals and assists after each matchday.
/transfer sell, buy, release, demand and loans, /leaguemarket listings and bids, and release clauses now use the rules staff set for the team's division in Manage > Divisions on the website. A division that sets nothing follows the server's /config settings exactly as before.
On servers where many members have left, /staffutils syncroles no longer stalls asking Discord about each of them, skips roles people already have, shows which step it's on while it runs, and posts its summary in the channel if it runs past the 15 minutes Discord allows for a reply.
/friendsleague invite makes a one-time link that brings a friend into your Club Mode save, and /friendsleague join redeems a code a friend sent you.
/pro status shows your pro's card, club, stats and contract, /pro continue moves your pro's world on a day, and /pro rest asks to sit out the next matchday (run it again to cancel). Create your pro on the website first.
When a command, button or form can't finish, the bot now says why and how to fix it - a missing permission, a deleted channel or role, closed DMs, Discord or the database being busy - instead of 'Something went wrong'. Team, league and cup names work in any capitals, and a misspelt one gets a 'Did you mean...?' with the closest names in your server. /results report explains a fixture it can't find (teams the other way round, or already reported), and every error points to /help command: for that command.
Budget changes made for many teams at once on the website (Manage > Bulk Tools) post one budget-log message per division that lists every team, and each division's budgets message refreshes once.
/configroles access gives a role one kind of staff work - results, discipline, disputes, rankings, news, announcements or awards - without making it full staff.
/league tiebreakers sets how ties are broken and /team pointsdeduction takes points off with a reason; /standings and every table on the website follow them.
Staff schedule posts to any channel - once or repeating, with an optional role ping - and the bot sends them on time. /announce list shows what's coming, and any post that couldn't be sent says why.
A server with nothing set up now starts /setup on a guided setup, and every /setup page has a Guided setup button: five steps with progress - staff role, core channels, player roles, your first league, and a go-live check. The bot can create the channels (a League category with #transactions, #fixtures, #results, #market and a staff-only #league-logs) and the Free Agent, Signed, Team Manager and Head Coach roles for you, when it has the permissions.
/roast, /compliment, /beef, /ship, /vibecheck, /eightball, /excuse and /wouldyourather are now /fun roast, /fun compliment and so on - the same jokes, one command. It frees room for new league commands. /chant, /penalty and /worldcup-draw stay as they are.
Staff get a Health check page in /setup, with a Health check button on every page. It finds channels that were deleted, channels the bot can't see, post or embed in, roles it has to hand out that sit above its own role, and essentials nobody has set. A Fix what I can button forgets the deleted ones and gives the bot back its posting permissions wherever it's allowed to; everything else comes with what to change.
The "Can't release players rated" setting on the league's Economy page (54.0) wasn't being saved, so no limit ever applied. It saves now, and the bot refuses a release at or above the rating you set. Staff force-release still works.
Type /help command: and start typing: every command and subcommand shows up, and picking one shows what it does, how to type it, every option and who can use it. It's built from the bot itself, so it's always up to date. A server that adds the bot now gets a short welcome with its first three steps, and the /help pages no longer mention commands that were renamed.
League staff can now set "Can't release players rated" on the league's Economy page on the website. A release of a player at or above that star rating is refused, and the team is told to sell the player instead, or let another team pay their release clause. Leave it empty for no limit.
Listing a player with `/leaguemarket listing add` or taking them off with `/leaguemarket listing remove` worked, but the bot then also replied "Something went wrong running that command" and posted an error to your server's error log. That false error is gone. `/stats add`, `edit` and `remove` had the same problem and are fixed too.
Continue on `/world` now includes your career news: the board's ultimatum and how it's going, clubs approaching you, licence courses, and managers sacked and appointed around your save. If you've been dismissed or have resigned, `/world` points you to the website's Job Centre to find your next club.
In servers where one position role covers several positions (say one Defender role for CB, LB, RB and CDM), a position change could quietly undo itself. You'd set a player to CDM on the website's Player Rankings page or with `/editmyprofile`, and a moment later they were a CB again, without the role. RB could come back as LB and RW as LW the same way, and `/staffutils syncroles` could do it to a whole server at once. The bot now leaves a shared role on anyone whose position it covers, so the position you pick is the one that stays. Giving someone a shared position role by hand no longer moves them either, if their position is already one the role covers.
When the bot can't see or post in a team's roster channel, it used to try again every 30 minutes, forever. It now waits 6 hours between tries. A roster change (a signing, a release, a transfer) still updates the post straight away, so once the channel's permissions are fixed the roster catches up on its own.
Typing a server-only command in a DM with the bot showed "Loading options failed" where the suggestions should be. It now just offers none, since those commands only work inside a server.
A loan ending counted as a transfer action, so a player who had just returned to their parent club was transfer-locked for the next 7 days (or whatever your server's transfer lock is set to), and their club couldn't release them either. A return now clears the lock instead of starting one - including a lock still running from the loan's own start - and it no longer counts as being signed in for the release cooldown. Both ways a loan can end are covered: running out, and `/transfer cancel-loan`. Cancelling a loan early also records the return properly now, so `/profile` no longer shows the player as still at the club that borrowed them. Players who were already stuck on a cooldown from an earlier loan have had it lifted.
Continuing your Club Mode save with `/world season-simulate` now plays its cup days: every cup match due that day, your own tie first, with extra time and penalties where a tie needed them, then the draws and trophies that followed. Quiet days and matchdays report cup news too, like a season's draws. The full brackets are on the website's Cups page.
The rankings board refreshes every 6 hours, but only a successful post restarted that clock. If the bot wasn't allowed to post in a server's rankings channel, it tried again every 5 minutes, all day, and one server had racked up more than 4,000 failed attempts. A refused or deleted channel now waits the normal 6 hours before the next try. Fixing the channel's permissions and setting the rankings channel again posts the board straight away.
`/team delete` could fail with "nothing was removed" when someone had a bet on one of the team's fixtures, and `/league delete` and deleting a tournament had the same gap. All of them, plus changing a league's format, now clear everything linked to those fixtures first, including bets (open ones are refunded), fan votes, match events and lineups. The reply tells you what was refunded. Deleting a league is one step now: a failure part-way used to delete some of its teams anyway. The website's own delete buttons go through the same code.
`/season new` now ends the old season's schedules along with the season. Results stay. Fixtures that were never played are removed, and any open bets on them are refunded. A schedule that never got going moves into the new season instead. Pass `endschedules: false` to keep every schedule running. The preview lists what will happen to each competition before you confirm. Gameweek announcements already posted are updated to match, and one whose whole gameweek was removed is edited into a short "this gameweek was never played" notice instead of listing fixtures that no longer exist. It's the same new-season process the website's Manage > Site & Season runs. When a server is renamed, say for a new season, its website's name now follows within a few minutes.
`/stats add` and `/stats edit` have a `secondassists` option, for the goals where two assists are counted. It is one OF the assists, not an extra one - so a player with one first assist and one second assist is assists 2, secondassists 1, and the command refuses anything where the second assists outnumber the assists. The match report graphic shows it as its own A2 column, and only when somebody in that match actually had one. The website's result reporting has the matching second assist box.
A result now posts as a full-time card and a match report sheet: every player who got a stat line, in their match position, with goals, assists, cards as real card glyphs, and a colour-coded rating, with the Man of the Match, MVP and Honourable Mention badged on their own rows. The nine categories that used to print as paragraphs of "Goals / name: 2 / Assists / name: 1" are gone from the text entirely. Fixtures post the same way: the matchday board carries the clubs, scores and states, and the text under it is now just the kickoff times, still in each viewer's own time zone. /fixtures shows you that board too - it was the last fixture view still sending plain text. If a channel blocks the bot from attaching files, everything falls back to the old full text version, so nothing is ever lost.
Matches played through /world and /manager now use the same new match engine as the website's Manager Mode, at about 2.6 goals a game instead of 7.5, with home advantage and more believable top scorers. Every player who played gets a match rating, so Man of the Match in results is picked from the whole team. Card game matches are unchanged.
Each /world season-simulate press now lists what happened in your Club Mode dressing room: a player asking for a word or handing in a transfer request, a promise kept or broken, or a player who felt ignored. Anyone waiting for an answer is marked, and the reply links to the Dressing Room on the website, where you answer them.
Every post in the transaction log now shows a Transfer ID at the bottom. Staff can undo a completed signing, release, transfer, release clause buy, loan or trade with /transfer revert: pick the move from the list, or paste its Transfer ID, the post's message ID, or its message link. Posts from before today work too. You see exactly what will happen before you confirm. The player goes back to where the move found them, fees and compensation go back to whoever paid them, and a whole trade is undone together. A demand suspension is lifted, the move stops counting toward release and window limits, and the player has no transfer cooldown afterwards. The revert is posted as a reply under the original post. Only a player's latest move can be reverted, so if they've moved again since, undo that move first. A revert that would put a team over its roster limit is refused.
Training could push a youth prospect past the potential /world youth showed for them, so some prospects played above their ceiling. Growth now stops at their potential, and points already past it are scaled back everywhere /world uses the prospect's rating, matches included.
/world season-simulate is Continue for your Club Mode save, and each press now moves the same living world as the website. Clubs answer your bids, AI clubs bid for your players and trade with each other, and at the end of a season contracts run out and the board pays prize money. The reply lists what happened under Transfers & contracts. Anything that needs your answer is marked and comes with a link to Recruitment on the website, where you answer it: a bid for one of your players, a club's counter-offer, an agreed fee or a contract in its final year. Every press is also a training day. Your plan, tactical familiarity and youth development all move with it, so a formation or style your squad hasn't drilled plays below full strength in /world matches too.
/world season and /world season-simulate play the new home-and-away seasons: every club meets every other club twice, once at each ground. A save that's already mid-season upgrades the next time you Continue, whether that's on the website or with /world season-simulate. /manager's season text says home and away as well.
The season recap now posts an awards poster instead of five lines of text. The Golden Boot winner's Roblox render stands lit on a stage, and Playmaker, Golden Glove, Man of the Match and Best Rating each get a tile with the player's face and club crest. If the poster can't be drawn or attached, the recap posts as text like before.
The bot's busiest posts now carry rendered graphics in the same style as the website. Every completed move in the transaction channel gets a card: the player's Roblox render on a stage, a stamp (DONE DEAL, SIGNED, ON LOAN, RELEASED, TRADE), both crests with the fee between them, and the key facts. The 30-minute reminder, the kickoff ping and the predictions vote carry a match poster with both clubs, the kickoff time, table position, form, top scorers, head-to-head and officials. Results get a full-time card with the scorers and the Man of the Match. Gameweek posts get a matchday board, roster messages and /roster view get a squad sheet, and the budgets message and /budget all get a finance board. If a channel doesn't let the bot attach files, posts go out as plain text as before.
Every /world command now acts on your own Club Mode save from any server, the same save as on the website: /world team, lineup, gameplan, youth, challenge, season and halloffame all show your own world. /world season-simulate is Continue for your whole save, and if your assistant covered an injured starter it tells you who. You pick your club by starting a New Game on the website, so /world claim and release point you there.
Fixed two bugs that hadn't hit anyone yet but would have on the next use: any Manager Mode auction with a winner would have failed to complete and stayed stuck, and every draft pick would have failed at the roster-cap check.
Star-rating and position roles weren't reaching members, and /staffutils syncroles couldn't finish on a big server: it re-added roles people already had and removed ones they didn't, burning through Discord's rate limit. It now only changes what's actually different, and the website's rating editor pushes role changes straight to the bot.
TOTW and TOTS drops now post as a titled broadcast poster: the league crest, the real cards standing on a lit pitch in formation, each player's name and match rating under their card, the star of the week called out, and a summary strip with average OVR, average rating and clubs. Showtime drops stand the week's picks on a spotlit stage instead of three cards glued edge to edge.
/standings, /leaderboard, the market value and Kon boards, /profile (overview, stats and history), /lineup, the fixture calendar and the draft wheel are all redrawn on one design shared with the website: sharper 2x rendering, real fonts instead of a fallback that looked like a typewriter, club crests and Roblox faces, medal coins, form boxes, and your league's own accent colour.
/manager season-simulate and /world season-simulate now use the same real Continue mechanic the website has - a quiet day shows your squad's real condition/injury status, a day that reaches a matchday resolves it. /world season-start and /world season also dropped the "X/Y clubs eligible" math - Club Mode's clubs are AI-run, there was nothing to actually wait on.
/world now has claim and release subcommands - claim any unclaimed real-world club (no captaincy needed) and manage it directly from Discord, or release it back to AI control any time.
World Challenge's opponent naming and match recaps could show blank club names after the real-Team retie - fixed by reading the name through the real Team relation everywhere it's needed.
/world now follows this server's own real Teams instead of a fictional 78-club list - claim removed entirely, any current captain or vice-captain manages their Team's Club Mode side automatically. season-start/season's league option is now autocomplete, matching this guild's own real Leagues.
/manager news now shares the same varied phrasing engine as the website's News feed - each result/season event picks from several real variants instead of one fixed template, consistent between Discord and the website.
World Mode moved out of /manager into its own /world command (browse, claim, team, lineup, gameplan, quickfill, challenge, season, season-start, halloffame, youth). A claimed club can now set its gameplan too - set-piece takers, target man, tactical style, the 9 Tactics dials - closing the last real gap between managing your own squad and managing a claimed club.
Your claimed club's own Youth Academy - overall, potential, and training progress for every prospect in its squad.
World Mode's own Hall of Fame - World club titles only, separate from /manager halloffame's Career-only view.
Every title-winning squad this server has ever produced - champion, competition, season, and points. Full squad snapshots on the website.
Career Mode custom leagues - list/join/leave a named competition among friends (create it on the website, costs Sparks). Signing now respects a transfer window: closed while your league's season is active, matching real FM's own window shape.
A real auto-generated news feed - recent results and season events for this server, narrated in one embed.
A dedicated Youth Academy overview - aggregate stats across every prospect in your squad (count, avg current/potential OVR, high-potential count) plus a per-prospect list.
A real Managers directory subcommand - every manager in this server, sorted by reputation score, with record, win rate, and title count.
An incomplete lineup used to just tell you to run /manager lineup. Now it names the actual slots nobody in your squad can cover (e.g. "missing: RB, ST"), on both /manager team and /manager world team, so you know what to go sign instead of guessing.
AI squad-building now allows a real, sensible substitution (a center-back covering right-back, say) instead of requiring an exact position match - unlocks far more of the real player pool. Every league gets the same, even number of clubs now, and /manager world season-start basically isn't needed anymore - a league's season starts itself the moment enough clubs are ready, and a new one begins automatically once the last one ends.
Most World clubs were quietly coming up short a starting spot (missing a right-back especially - real registered players skew heavily away from that position) despite holding a full squad. Club generation is now bounded by the real supply of the scarcest position, and /manager lineup auto:true (and club generation) fills 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/clubs only) and regenerates correctly next time it's viewed.
A real Inbox - welcome, match results, and season news. filter: all/unread, sort: newest/oldest, markallread:/clearread: to clean it up. A claimed World club's results reach your inbox too.
/manager world season-start league: and /manager world season league: - each of the 4 real leagues can now run its own genuine season, a full round-robin among that league's own clubs, resolving automatically with a real table and a real champion.
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 - real registered players are completely untouched. Run /manager join whenever you're ready.
The card-choice list was offering Captain Cards as an option - a separate, unrelated card-game special type that never made sense here. Removed.
A real person registered on more than one server (sometimes as a different position entirely) used to only ever show up as whichever registration rolled the best overall - the others were invisible. Every real match now lists, tagged with its server name when someone has more than one.
/manager world browse and /manager world claim (moved from the old flat /manager world and /manager claim) are joined by 3 new subcommands giving World Mode real parity with your own squad for the first time: /manager world team (view your claimed club's squad/lineup/record - claiming used to leave you with no way to see any of it), /manager world lineup (set its formation, slots, and tactical roles), and /manager world quickfill. /manager world challenge replaces the old club: option on /manager challenge (now real-manager-only, opponent: required) - always played as your own claimed club.
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 - real registered players are completely untouched. Run /manager join whenever you're ready to jump back in.
New staff-only subcommand to wipe a server's Manager Mode data (squads, auctions, fixtures, seasons, loans, watchlists, World clubs, and manager profiles) without touching that server's real card game or league data. Requires typing an exact confirmation phrase.
/manager quickfill instantly signs cheap, real Unranked players into whatever lineup spots are still empty, position-matched to each slot - no auction needed. Handy early on, or on a quiet server where auctions haven't been getting bids.
/editmyprofile gained a playstyle: option - autocomplete only offers the ones that actually fit your position (a Poacher or Target Man for a forward, a Sweeper Keeper for a keeper, and so on). 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. clearplaystyle: true removes it.
/manager world browses this server's real World (Premier League/La Liga/Bundesliga/Serie A, 78 clubs, auto-populated from real registered players). /manager claim takes an unclaimed one to manage. /manager challenge gained a club: option - challenge any World club, AI-controlled or claimed, as a real second game mode alongside challenging other managers directly.
/manager lineup gained a role: option (autocomplete shows every real role for whichever slot: you've already picked) - a genuine match-sim bonus, not flavor text. Roles are tied to the tactical slot itself, so replacing who plays there keeps the role you set.
A player's Traits now genuinely affect matches, not just flavor text - specialist traits sharpen shooting, tackling, and goalkeeping, a few affect fouls conceded or how often a chance turns into an assist. No new command - it's automatic on every squad player.
/manager gameplan gained nine new tactical dials - Build-Up Style, Width, Tempo, Defensive Line, Pressing Intensity, Defensive Shape, Marking Style, Counter-Press, and Break Speed - each with a real, single effect on match simulation, all defaulting to neutral until set. View them alongside your existing set-piece takers and tactical style, same command.
A tired starter now has a real (small) chance of getting injured, sidelining them for a few days - more likely the more exhausted they are. /manager lineup won't let you select an injured player, and /manager team shows their real status in place of a fitness percentage while they're out.
/manager team now shows each squad player's condition% inline. Starting a resolved season fixture or exhibition challenge costs your XI some fitness; it recovers a little every real day they're not playing. A tired player's effective attributes take a small, real hit until they've rested.
/manager training now has a mentor: option - assign any ranked squad-mate to mentor a Youth Prospect and speed up their development. 'none' clears an existing mentor. Their training status now shows who's mentoring them, if anyone.
The auto-posted matchday recap now tags each result with a Man of the Match and rating, computed from the same full match report the website's Portal and Match Day pages now show. Free Kick/Corner routines set via gameplan also have a real effect on set-piece chances now, not just a label.
New freekickroutine (Direct shot, Approach play) and cornerroutine (Near post, Far post, Short) options - a flavor tag shown next to your taker in the gameplan reply. Opposition Instructions were also added to the website's Portal Scout Report (a counter suggestion based on the opponent's own tactical styles) - no bot-side equivalent yet.
List a squad player for loan at a fee/duration you set (loan list), browse other managers' open listings (loan browse), take one (loan take), withdraw your own before it's taken (loan cancel), or check your own loan status (loan mine). The fee pays out immediately, and the player returns to you automatically when the loan ends.
New inpossession and outofpossession options on /manager gameplan - set a separate attacking style and defending style instead of one Style dial. Leave either unset to keep following Style. Both feed the real match engine on challenges and season matchdays.
Shortlist a player to track before you have the budget to bid - /manager watchlist player: toggles them on/off, no options lists your current shortlist. Same shortlist the website's Player Pool star button uses.
/manager lineup gained an auto option - fills every still-empty slot with your best-fitting available squad player, leaving anything you've already set alone. /manager gameplan gained captain and vicecaptain options (a flavor tag, must be a current squad member), shown as (C)/(VC) on /manager team.
Same follow-up as the website's Player Pool: a listed player's row now gets a (Card) tag if their overall comes from a card they chose via /manager mycard, not the plain auto-roll.
New subcommand: set which of your own owned cards (an upgraded copy, Shiny, Icon, TOTW, etc.) decides your Manager Mode overall and attributes, autocomplete-listed alongside "Auto" for the plain rolled base card. Same choice as the website's new Player Pool picker - either one sets the same thing.
New /manager training - set a Youth Prospect's training focus (or leave it Balanced) and watch their overall grow toward their existing Potential range over time via daily training ticks. Ranked players are untouched - their card overall already is the platform's real, proven number.
/manager pool, /manager team, /manager standings, /manager season, and sign autocomplete now show a player's real Roblox display name instead of just their registered platform name - the same real identity now shown on the website.
/manager challenge was unlimited free-pick exhibition duels with no schedule and no guarantee anyone ever played anyone. /manager season-start now kicks off a real round-robin among every manager with a complete starting XI (needs 3+) - one matchday resolves automatically per day, with results posted if you've configured a channel for it. /manager season shows the live table and this matchday's fixtures. Recruitment (/manager sign) stays open all season. Unranked players in /manager pool are now flagged as Youth Prospects instead of just showing a confusing low rating.
A real person can have a separate Player row per Discord server. /manager pool and sign autocomplete used to keep whichever row came back first, which could show someone's unranked stray row instead of their real, ranked one - now always keeps the person's best-rated row.
/manager sign now starts or raises a real 1-hour auction instead of buying instantly - the opening bid must meet real market value, every later bid must beat the current one by 5%+, and a bid in the final minute extends the auction by a minute. New /manager auctions shows what's currently up for bid. Your budget only reserves a bid until the auction actually resolves, so you can run several at once without overspending. You'll get a DM when you win (or lose one you were leading).
Thrown away and rebuilt: player ratings and match simulation now reuse the exact same systems the card game's Arena mode runs, not a bespoke formula. A player's overall is the same number already on their trading card. Set a real formation with /manager lineup, assign set-piece takers and a tactical style with /manager gameplan, and /manager challenge now runs a genuine sequence-by-sequence match with a live play-by-play reveal - real goals, real assists, real saves - instead of one dice-rolled scoreline. Sign prices are now real transfer fees (the same market values /transfer uses), and budgets/squad sizes were rescaled to match (16-player squads, an 11-man starting XI required to play).
Once a player is signed, they were locked to your squad forever with no way back - a mis-sign or a squad you wanted to rebuild was permanent. /manager release <player> frees up the slot, refunds 50% of what you paid, and puts the player straight back into the open pool for anyone else to sign.
Strength came entirely from recent match stats, so a 3-star player on a hot streak could show up stronger than a genuinely higher-ranked player. It's now based mainly on the staff-set star rating, with recent form applying only a capped boost or penalty on top - form can move you within your tier, but can't out-rank someone actually higher-ranked.
/manager sign and /manager pool now draw from every registered player across every server, not just the one you're in - more real people to actually manage. Once someone signs a player, that player is off the market for every other manager in that server's game - a real player is only ever on one squad at a time, same as real football. Standings/squads/challenges stay separate per server.
Strength used to come from whichever single guild's Player row you looked someone up in - since real match stats are only ever measured against opponents in that one server, a small, low-competition server could inflate someone's numbers. It now uses that person's single best profile across every server they're registered in with at least 300 real members, and falls back to the same neutral baseline as a brand new player if they don't have one - a small-server-only profile now gains nothing.
/manager - draft real registered players (yourself, friends, anyone in the server) into a personal squad within a budget, then challenge other managers with /manager challenge. Each player's strength is computed live from their own recent real match performance, so an actual hot streak makes them stronger here too - separate from real team rosters. v1: simple simulated scorelines with weighted goalscorer credit; standings and Kon rewards included, tactics and a deeper match engine to come.
Companion fix to the shared library's wallet race: draft entrant seeding and the card-game welcome-bonus check both had the same empty-update upsert non-atomicity gotcha. The welcome check now goes through the already-fixed shared wallet lookup, and entrant seeding swaps to create-then-catch-duplicate.
Mirrors the website: 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.
An extensive audit found and fixed the same root shape repeated across the platform - a status/balance check read once, then a write that didn't re-confirm it, letting a duplicate click, page reload, or two near-simultaneous actions both go through. Closed in match results reporting, forfeits, transfer releases/force-releases, loan expiry, Higher/Lower, Trivia, card draft, Arena, card duels, team/1v1 friendlies, directory badges, SBC, weekly challenges, and giveaways, plus a tournament-bracket race fixed with a real database constraint. The bot also now logs and recovers from unexpected crashes instead of going silent.
A shared outcome-text lookup evaluated every branch's message eagerly, including ones that reference values (like a stolen amount) that don't exist for a warning/prison outcome - crashing instead of showing the message. Fixed by only evaluating the branch that's actually needed.
When the parent club cancels a loan, they're the one who should pay the remaining fee and get the player back - it was charging the loaning club instead. Fixed, plus every historical loan-cancel transaction that had this backwards was found and corrected, with the balancing entries logged to #budget-logs.
Each team's vote square is nearest-color-matched to its Discord role color - the away team's square is now picked excluding whatever the home team's own match landed on, so two teams can no longer render identical color squares.
A label mismatch between the website's result-entry wizard and the shared formation definitions meant every CDM/CF performance was silently uncategorized, so those two slots never had a qualifying player to show. Fixed going forward, plus a one-time backfill that corrected every already-reported fixture's stored stats and regenerated the affected TOTW posts.
TOTW posts no longer render a plain formation/pitch diagram - each qualifying performance now gets its own real player card, laid out in a genuine 4-3-3 shape using the exact position that player was selected for (not their profile position), club badge included.
Browse used to dump every league's listings into one undifferentiated list, always newest-first, hard-capped at 25 with no way to see more. Now takes an optional league filter, a Newest/Highest Price sort, and Prev/Next paging past the cap - each row is labeled with its league when browsing isn't already scoped to one.
Closes the gap with the website's own player page: /profile now shows a recent-form arrow (last 5 rated games), nationality, milestone badges (10/25/50/100+ Appearances/Goals/Assists), and a Career Highs section on the Stats tab (best single-match Goals/Assists/Rating/Points).
Transfer, Loan, and Release Clause offers all posted a vague "leak" to the news channel the moment they were created - Trades never did. Now they do too, naming only the proposing team, never the players involved or the other side.
Every leak used to render the exact same sentence every time, for every player, forever. Now pulls from a real pool of differently-worded "insider" phrasings instead, so the news channel doesn't read as one hardcoded string on repeat.
Appointing a free agent straight into a leadership role (e.g. Head Coach on a captain-less team) auto-rosters them - but skipped roster cap enforcement entirely, unlike every other move path (force-sign, transfer, the website's own set-team-roster). Could silently push a team over its star-tier, position, or size cap. Fixed - same enforcement every other path already has.
A release clause skips captain negotiation by design (the selling club can't block it) - but that meant nobody on the selling side got notified at all when it happened, only the player. Now DMs your Team Manager/Transfer Manager immediately, with a real @-mention in the transaction channel as a fallback if DMs are off.
A team's vote-bar square is nearest-color-matched to its real Discord role color - if that color was light/white, it could land on the exact same white square already reserved for Draw, making the two indistinguishable at a glance. That square is now off-limits for team matching, so a team always gets a visibly different color from Draw.
A transfer/loan offer that gets declined, ignored until expiry, or fails a check no longer leaves the original market listing stuck dead - it now reopens the same listing message with working buttons again, as long as the player's still at the selling club. Fixed going forward for every offer type, plus a one-time backfill that reopened 11 listings already stuck this way.
10 new just-for-fun commands: /roast, /compliment, /beef, /ship, /vibecheck, /chant, /excuse, /penalty, /worldcupdraw, and /wouldyourather. Also new: an opt-in quiet-member nudge (/configmisc quietnudge) that DMs a small Kon comeback bonus to members who've gone quiet in chat, on a cooldown so nobody gets spammed - off by default per server.
/standings and /leaderboard now render in your league's own accent color and the site's real Oswald font instead of a fixed blue/purple and a generic font. /leaderboard also gained 4 stats it was missing - Points, Average Rating, MOTM Awards, and Appearances - plus a mingames qualifier filter and Prev/Next paging past the old 25-entry cap.
/results forfeit can now record "Both teams" for a genuine double no-show - scored as a 0-0 draw for both sides (draws + the normal draw payment), blocked for knockout fixtures since a draw has nowhere to advance. Also fixed a real bug where the results message always blamed the home team as the forfeiting side, regardless of which team actually lost by forfeit. /standings now uses your league's real point values (win/draw points) instead of a hardcoded 3/1, matching the auto-updating standings message and the website.
Every bulk-DM command (giveaways, announcements, etc.) now shares one real anti-spam safeguard instead of each having its own copy - consistent cooldowns and abuse limits everywhere DMs go out in bulk.
New /recruit command - DM a free agent directly to scout them for your team. Position-role linking (matching the website's own version) lets you tie a Discord role to a player position.
/requestfixturetime is its own command again, not a /results subcommand - real feedback that it's a regular team-manager action (proposing a kickoff time), not a staff results action, so it didn't belong bundled in there.
/editprofile was throwing "targetUser is not defined" on every real use since the user option was never actually read into a variable - staff couldn't edit anyone's market value or star rating through the command at all. Fixed.
Consolidated related commands into hubs to free real headroom under Discord's 100-command cap: /stats (add/edit/remove/parse), /results (report/forfeit/requesttime/preview), /season (generate/advancegroups/new/recap), /roster (view/appoint/dismiss), /staffutils (DM and maintenance tools), plus /spin, /sell, and /compare folded into /draft, /transfer, and /card. /deleteleague removed outright (duplicated /league delete). Also fixed a dormant bug where /deletetournament's autocomplete never actually matched what the command looked up.
Found and closed a real exploit: the current card's exact overall was shown before every guess, and the tier bands (Unranked-5★) never overlap - so an obvious guess paid the same flat 1.5x as a genuine coin flip, letting one player wager up to 1.7B Kon in a session. Payout is now priced off the real probability of your guess being right (an obvious guess barely pays over 1x, a real toss-up pays close to 2x, shown before you pick) - plus a 10,000 Kon max wager and 15 games/day.
/configchannels spectators and the website's Spectator Voice Channel picker now also accept Stage channels, not just regular voice - a better fit for a broadcast-style spectator experience.
Match threads are now real private threads (both team rosters auto-added) instead of public - a role mention in a public thread wasn't real access control. New /configchannels spectators - a public voice channel mentioned on every match announcement for people to watch/listen along.
The Ranker role (/configroles ranker) was gating Power Rankings by mistake - it now correctly lets holders set player star ratings via /editprofile and the website Rankings page instead. Market value edits stay staff-only.
/help rulebook posts the rulebook as a real Discord message with a dropdown to switch sections. New /configchannels matchannouncements + predictions and /configroles matchping - the 30-min-before and kickoff announcements now use their own configurable channel (previously unreachable) instead of the fixture channel, with a Join Match Thread button.
New /arena mode:trial option - a fixed scripted opponent requiring your squad to be set to today's rotating required formation. Real Kon reward, one attempt every 24 hours.
New /gemshop bundle subcommand - 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.
/newseason now also archives the current rulebook (all sections, frozen) alongside team standings before starting the new season - the live rulebook carries forward unchanged, only the archived copy is frozen for history.
When a gameweek's fixtures are published (via /postfixtures or the automatic weekly announcement), each fixture now gets its own Discord thread pinging both teams - a shared place to coordinate, instead of only DMs. Created once per fixture.
/newseason now archives every team's current record (wins/draws/losses/goals, name/icon frozen) as history before resetting for the new season - previously it only relabeled the season with no reset at all. Preview first with confirm left unset, then run again with confirm:true. Also new: /configroles ranker - a role that can edit Power Rankings on the website.
New /gemshop trivia subcommand - 5 knowledge questions, no wager, 40 Kon per correct answer plus a 10-Gem bonus for a perfect run. One attempt every 24 hours.
New /gemshop insurestreak subcommand - spend 8 Gems to protect your /daily streak once. The next time you'd miss the claim window, your streak is saved instead of resetting to 1.
Higher/Lower leaderboard - biggest single-game wins.
Wager Kon, guess higher or lower on the next player's overall, each correct guess multiplies your pot ×1.5 (up to 8 rounds). Cash out anytime with a button.
Icon and TOTW summon pulls no longer mint fresh cards - only succeed as an exact copy of an already-existing card for that player, falling back to Showtime otherwise.
One free spin every 24 hours for Kon or Gems, real 0.5% jackpot chance.
Training Ground/Scout Network/Stadium bonuses now also apply to the website's Claim/Daily - previously bot-only.
Matches now run 16 attacking sequences instead of 10 - applies to every match type (Arena, Legacy, Challenges, Friendlies).
Icon/Showtime/TOTW hits are now restricted to 3 randomly-chosen Featured players (rotates daily, see /gemshop view). Every other card in the pool is always regular now. Also fixed a real bug: a second TOTW pull hitting the same league could previously crash mid-summon with gems already spent.
/arenachallenge team send/accept/decline/ready/list/cancel - challenge another duo, either opponent can accept, any of the 4 can ready up. Same match engine as Direct Arena Challenges, run twice and scored on aggregate.
Was goals-only. Now shows Top Assists (same season-scoped tracking as goals) and Top Team alongside Top Scorers.
New /cardmarket direct offer|list|accept|decline|cancel - propose trading one of your cards for one of someone else's, either side optionally adding Kon on top. Distinct from /cardmarket traded (fixed-price, anyone-can-buy listings) - this targets one specific person.
Accepting an Arena Challenge no longer instantly runs the match - both sides get an I'm Ready button once accepted, and the match runs the moment both have clicked it. A Rematch button also shows up on the finished-match result.
/card sbc list shows Squad Building Challenges and your completion status (submit them from the website - a real card picker fits better than a wall of options). /arenachallenge leaderboard shows the top 25 by Arena points plus your own rank. 4-1-2-3 joins /formation and /11's formation choices.
Roblox's thumbnail API doesn't always have an image ready on the first request - a fresh or recently-changed avatar can come back "Pending," and every avatar lookup used to just accept that and give up, which is very likely why profiles didn't always render. Now retries briefly before giving up for real. Also fixed a real, previously-silent bug: /cardmarket traded watch|unwatch|pricecheck's player-name autocomplete has done nothing since the command was renamed from /tradedmarket - it was still checking the old name.
/sign's Accept/Decline buttons run through the same core the website's inbox now uses for the exact same offer (see the website changelog) - only the ranked-player random-team spin animation stays Discord-specific, everything else (roster caps, role assignment, transaction log, initiator DM) is identical either way.
Two confirmed live bugs, found in the error log after a direct "he clicks the button but the bot doesn't respond" report. The preview's Confirm & Send button never acknowledged the click before doing real work, so Discord's 3-second interaction window regularly expired first, leaving the clicker with nothing even though the offer itself had usually already gone through. Separately, the preview posted publicly in the channel with no check on who clicked it - anyone could confirm-send someone else's offer. Both fixed: an immediate acknowledgment, and the preview (plus /sell's own confirmation) is private to whoever ran the command now.
checkTeamDebt only ever DMed the Team Manager and Transfer Manager when a team's budget went negative - Head Coach was silently left out, even though they have identical day-to-day team authority to Team Manager everywhere else. Fixed on both the bot and the matching website inbox notice.
/legacy itself is unchanged - same commands, same behavior, verified live. Its logic moved to a shared module the new website Legacy hub also uses, so a season started on Discord and one started on the website are genuinely the same league, not two separate implementations that could drift apart.
Direct report, confirmed real: granting a player as a 5-star Icon showed 5 stars, but the actual attributes (and the overall averaged from them) still sat down around whatever tier that player naturally was - a small flat bonus was never enough to bridge the gap. /icon grant now rolls fresh attributes AT the chosen rarity first, matching how every other special card (TOTW, Showtime, Captain Cards, Gem Shop's summon) has always worked, then applies Icon's own bonus on top of numbers that actually belong to that tier. Verified live: a real 2-star player granted as a 5-star Icon now averages 94-95, not the high-70s it would have before.
Found in the error log, not reported directly: the bot was regularly timing out waiting for a free database connection (across GuildConfig, Fixture, Gameweek, Giveaway, and more) - its connection pool was sized off a default formula that came out far too small for its real concurrent load. Raised, with plenty of headroom confirmed against the database's own actual connection cap.
Found while auditing the bot and website's trade-market logic for drift: the bot's own listing path let a special/non-tradeable card be listed via /cardmarket list, a check the website's version already enforced. Both now share the exact same core logic, so this can't happen from either side again.
When a transfer offer or player-consent DM can't be delivered, the failure message now links straight to the Career Portal inbox, which has the exact same Accept/Decline the DM's buttons would - a real fallback, not just a "sorry, couldn't reach you" notice.
A second release-clause or standard transfer offer could be created for a player who already had one PENDING or awaiting their own consent - confirmed live on a real duplicate case. Both entry points now check for an existing offer first and point at it instead of creating a second one.
A Team Manager/Head Coach/Transfer Manager can now Accept or Decline a standard transfer offer sitting on their own roster straight from the website's existing inbox - previously that only ever arrived as a Discord DM. Runs the exact same PENDING re-check and player-consent handoff the Discord Accept/Decline buttons do; Counter still requires Discord's negotiation modal.
Every rostered player's profile page on the site can now start a real standard transfer offer - same market-value floor, transfer-window allowance, and captain-protection checks /transfer offer runs, same Discord DM the responding team gets either way. Loans, trades, and release-clause offers still stay Discord-only for now.
/team create's validation and Discord-role/log setup is now shared with a new internal endpoint, so Manage > Teams on the website can create a real team - its own Discord role, budget, optional Team Manager - without a second, weaker implementation of any of it.
Updated undici to clear 3 known vulnerabilities (1 high, 2 moderate) flagged in it.
Transfer window length, the market bid raise percentage, and loan/transfer offer expiry hours are all real per-server settings now instead of hardcoded values. Also fixed loans silently assuming every gameweek is the same length, and a Loan Price Floor display that didn't match what was actually being charged.
An invalid IconCard relation filter meant filtering the gem shop by icon flavor crashed every single time. Fixed.
/budget revert and adjust-confirm could both be double-clicked into firing twice - now guarded. /sell was able to go through even while transactions were paused for the server, the only stat/transfer command that could; closed, and Results Reporter's permissions extended to cover the stat commands too.
The Results Reporter permission previously only existed as a website concept with no Discord-side equivalent. /configroles resultsreporter gives it a real role, matching every other permission the bot already models both places.
Every other real roster-move path (transfer, loan, draft, trade) already rejected a move that would bust a league's roster size/position/star caps - the website's own roster manager was the one path that didn't. Closed.
Player cards were rebuilt against a real FUT-style reference: real per-tier backgrounds and text colors, a full-body Roblox avatar in a portrait frame instead of a cropped bust, and a real 6-stat row. Went through several rounds of avatar framing/crop tuning per tier before going live as the card everywhere /card and the shop render one.
Real Referee/Cameraman/Commentator roles with Discord-native claim/release buttons, a dedicated kickoff channel, and scheduled match announcements. Predictions got rebuilt as a real free 3-button vote widget (no currency involved) posted alongside the reminder at the 30-minute mark, sent via webhook for its own branded identity.
A staff-only, confirmed, fully-audited manual budget credit/debit command - and every other budget-touching path (not just releases/transfers) now logs through the same audit trail, not just some of them.
Suspensions, forfeits, releases, roster moves, and schedule generation all got a shared "core" function extracted from their slash command, plus a matching internal API endpoint - the foundation that let the website start triggering these with full Discord parity (role changes, DMs, channel posts) instead of a second, DB-only implementation. Team creation and transfer offers (v8.0/v9.0/v10.0) build on the exact same pattern.