Browser football manager
Retro Manager features
Retro Manager is a football manager game you can play online in your browser — a free demo with the core career loop, plus a Steam full edition for offline play and editors. Whether you call it a soccer management game or a retro football manager, you get scouting, transfers, live matches, and long-term squad building without a heavyweight install.
Manage your club
Run day-to-day operations from a retro dashboard: board confidence, finances, stadium upgrades, and staff hires that shape every season.
- •Quad-division league pyramid with cups and continental football
- •Board targets, job security, and season expectations
- •Campus stadium view with training and academy projects
Scout wonderkids
Build a scouting network that reveals ability, potential, and elite labels before rivals bid — then track development through the season.
- •Market REC toggle for scout-recommended targets
- •World Top 50 hot list with All and U21 filters
- •Wonderkid, generational, and world-class player labels
- •FUT-style player cards on profiles and scout moments
Sign new players
Hunt value in domestic and foreign windows, negotiate bids, and shape a squad with contracts, loans, and realistic wage pressure.
- •Searchable transfer market with position, age, and OVR filters
- •Shortlists and deadline-week drama
- •List your own players and respond to incoming offers
Win promotions
Tactics matter on match day: live commentary, momentum, half-time talks, and formations you can tweak while the clock runs.
- •Minute-by-minute match engine with ascendant chart and live ratings
- •Tactical hub: formations, training focus, and auto XI picks
- •Climb from the bottom tier or fight to stay in the top flight
Database editor
Steam editionThe full Steam edition includes a global database editor — rename clubs, tweak kits, edit players, and import JSON packs for future careers.
- •Edit teams, players, and competition names
- •Merge or replace database patches from hand-edited JSON
- •Offline play with local saves and no in-game store prompts
Argentina update
Play a full Argentine pyramid in new careers: four divisions, 80 clubs, bespoke crests, and domestic league football from Liga Profesional down.
- •Liga Profesional, Primera Nacional, Primera B, and Primera C
- •Country picker at career start alongside existing league packs
- •New tackling attribute and expanded player card presentation
Shipped scope
Retro Manager is a free browser football manager: you run a club, play seasons, and watch matches unfold in real time without installing a client. This page explains what actually ships — match flow, tactics levers, transfers, staff, stadium work, and the retro-styled UI — in language players can scan before they dive into the longer bullets below. Football manager match engine (plain English): matches tick minute-by-minute with commentary, momentum, and tactical pressure you can see on the pitch bars. You pause to change formation or style, make subs when legs fade, and use half-time team talks to tilt the second half. Optional auto-pause can stop once per match at a chosen minute so you can tweak personnel before the run-in. Football manager tactics system: formations and play styles interact with player attributes and fitness; the assistant can suggest shouts and counters, but the final call stays yours. AI opponents show live shape and intent on the scoreboard so you are not guessing what they switched to when chasing a lead. Transfers, contracts, and windows: scouting gates how much you see on non-squad players; bids, counters, and wages all hit the same budget; deadline weeks spike activity so you need to clear or confirm deals before advancing the week. Retro football manager features — no install: PWA-friendly, themeable UI with optional full-screen canvas art, desktop ticker for headlines, and deep career systems (achievements, continental cups, academy intakes) that stay in a single tab. Current feature set as of September 2026 — product V3.1.92 (see src/data/changelog.ts). Highlights on this line: harder permanent club transfer accepts (near-list no longer auto-accept). Prior V3.1.91 Windows fullscreen; V3.1.90 live SUB fix. Full history in the changelog. What is next: docs/PLAN.md (remaining backlog; shipped list is this page + changelog).
Match engine & tactics
- •Minute-by-minute simulation: Matches run in real time with a live commentary feed; you can pause, change speed (×1 / ×2), or flash to full time. Open-play shots favour strikers so two-up-front sides take most of the team's goals (wingers in a 4-3-3 count as forwards).
- •Text variety: Expanded deterministic phrase pools for live commentary (attack/midfield/defence buckets and tag buckets), assistant half-time/full-time and in-match shouts, and weekly inbox headlines — the same career or fixture still picks the same lines where the engine seeds them. Pools grow over releases (e.g. V2.7.20 match-week tabloid + commentary lines).
- •Engine-aligned display: Possession, momentum, and tactical battle bars use the same zone logic as the match engine (getZoneStrength + red cards, home advantage, live modifiers and event nudges), so what you see matches what the sim uses.
- •Attack-pressure chart (dual signal): Match timeline combines danger spikes (ascendancy, ATT-vs-DEF plus shot/SOT/goal events) with a smoothed control wave (control, midfield + possession territory signal) for clearer match flow storytelling; goal/card markers are tuned for cleaner readability on the chart.
- •Tactical battle view: Pitch pressure (home attack vs away defence, midfield, away attack vs home defence) as three proportional bars, plus a short narrative line (e.g. “Battle in the middle third”, “Dangerous attack building for …”). No separate DEF/MID/ATT bars; one unified tactical view.
- •Zone system: Squad strength is calculated per zone (Defense, Midfield, Attack) from formation, attributes, and form; the engine uses these for phase control and attack progression.
- •Momentum bar: Shows who is on top in the current phase (possession, zone pressure, shots), not just the score.
- •In-match control:
- Tactics: Change formation and play style (Tiki-Taka, Long Ball, Counter-Attack, etc.) during the match; AI opponents show live formation · style under their name from kickoff, with Chasing / Protecting / Adjusted when shifted off preferred (docs/TACTICAL_BATTLE_BARS.md).
- Substitutions: Your team swaps players manually (tactics pause) for fatigue, injuries, and red cards. Live Confirm changes (primary Confirm, secondary Undo) only for pitch↔bench; reshuffling two on-pitch players is tactics-only and does not mark anyone “already substituted.” Bench rows support drag-and-drop onto the pitch (parity with the hub). AI clubs can receive automatic substitutions during the pre-simulated match (simulateMatch with matchday bench from lineup slots 12–18); those SUB events appear in the live feed (e.g. Name → Name) like other events. Both sides are capped at 5 substitutions per match.
- Auto XI: Best XI + 7-man bench (empty chairs allowed when the squad is thin); when a spare goalkeeper remains in the pool, Auto XI keeps one GK on the bench even if star outfield leftovers fight for those slots.
- Auto-pause (optional): OS Config can pause once per fixture at a chosen minute (default 65′) and open tactics on Personnel — skipped on minutes that already have a goal, red, or injury (matchAutoPause* prefs).
- •Match ratings (who played): result.ratings only includes players who appeared (starting XI plus anyone who came on as subPlayerId in a SUB). Bench warmers have no rating; the UI shows “—”. When you advance the week, subs get a cameo rating from minutes on pitch and event stats (goals/cards/shots) where applicable.
- Half-time team talks: Encourage, Calm, or Aggressive — second-half live zone tweaks depend on score at the break (behind / level / ahead), with per-zone deltas that peak 46′–60′ and fade by ~73′ (see src/lib/team-talk-effects.ts). UI shows a short effect hint per option. When you confirm a talk, the AI opponent gets a deterministic talk of their own (pickAiHalfTimeTeamTalk) so the second half is not one-sided; skipping the talk buttons applies no talk effect for either side.
- Assistant match shouts (OK): For certain shout titles, confirming OK adds a short-lived live zone bar boost on your side (8–10 minutes), with a per-effect cooldown and smaller boosts when the shout also applies pressing high or low tempo so toggles are not double-counted (shout-zone-effects.ts).
- •Flash result: Jump straight to full time for quicker season play.
- •Match-day extras: Injury-time drama; derby modifier and “Derby Day” tag; weather (Rain/Snow) affecting conversion; Man of the Match on the full-time overlay; red-carded players shown with icon and greyed in lineups and summary.
- •Engine presets: In OS Config (Settings), choose Realistic (calibrated goals, cards, fouls) or Arcade (higher scoring, more cards) for the match engine.
Player depth & evolution
- •Attributes: Pace, Stamina, Skill, Shooting, Passing, Heading, Influence, Goalkeeping, Consistency, and more; used by the engine and visible in profiles. Star / OVR in lists and profile is derived from position-weighted attributes (role core + small crossovers); the sim still uses raw attributes in zone and shot logic — see docs/ATTRIBUTES_AND_MATCH_ENGINE.md.
- •Traits: Hidden personality traits (e.g. Professional, Leader, Big Match Player) affect development and morale; scouts can reveal some.
- •Recent form: Last 5 match ratings feed into performance modifiers.
- •Age & potential: Young players (<23) can grow with potential and staff; peak roughly 23–30; veterans (>31) lose pace and stamina over time. Wonderkids and high-potential youth are marked. Regional flavour: newgens use NATIONALITY_POOLS names; applyNationalityFlavour applies soft +1 stat caps (e.g. England stamina lean, South America pace/skill). Youth wonderkid rolls are slightly more likely for some South American and European nationalities (bounded multipliers in generatePlayer). V2.7.36 — division stratification (seniors): procedural squads use international mix by division (higher divisions → more foreign names); senior potential curves include rare sleepers in lower leagues (high PA with modest current ability — scouting matters) and a Premier League soft cap on elite PA saturation; continental invitee squads stay sharp. Official roster pack careers apply the same PA rules deterministically per player id on load (player-generation-config.ts, roster-pack.ts). Foreign market listings use a wider PA spread so not everyone is a superstar import.
- •Condition & sharpness: Match sharpness (condition) recovers with game time; low sharpness hurts performance.
- •Identity & display: Portrait pool — 259 numbered PNGs under public/player-portraits/pool/ (white plate) + background_removed/ (transparent, cards); missing or broken files fall back to a procedural SVG face. Careers created before nationality matching keep the original 200-face id hash (frozen). Nationality-matched faces (new careers only, portraitNationalityMatch): every face is tagged dark / medium / light / East Asian, and each player's auto face is picked deterministically with weights that follow his country's professional player base (e.g. England ~55% light / 15% medium / 30% dark, Nigeria ~97% dark, Japan ~95% East Asian; unknown nationalities draw from the whole pool). Editor-picked faces and custom uploads always win. Radar charts for attributes, position labels (e.g. D/M/F, DF/DMF); academy youth labelled “yth” in the squad. Career History tab lists every saved season stint (club + season stats); a winter-window transfer or loan writes a separate line for each club in that year; golden boot and season awards still count the whole year.
- •International: National squad selection by role quota; caps tracked; selection considers skill, form, suspensions, and injuries.
- •Suspensions: Yellow accumulation and red-card bans; suspended players cannot be selected.
Club management
- •80 teams, 4 divisions: Full league pyramid with promotion/relegation; cup entrants from all divisions.
- •Division playoffs (EFL-style): Divisions 2/3/4 use top 2 auto-promotion plus a 3rd promotion slot via playoffs (positions 3-6 -> PO-SF / PO-F) immediately after league week 42.
- •Club history / Hall of Fame: Career timeline and season archive tracking promotions, titles, and cup/continental progress for your club. Manager Hall of Fame ranks you and AI managers by major honours recorded at season end; Team Hall of Fame on Legacy & Records ranks club legends by apps/goals (with PlayerCards). Season rollover now archives assists, MotM, clean sheets, cards, and age onto Player.history for richer all-time plaques. Club → Records shows the longest league unbeaten run across seasons (with the current run) and all-time rivalry head-to-heads, counted from the first season the save runs this version.
- •Career achievements: Local-only unlock flags (saved with your career) for 78 milestones — including Invincibles, treble / the double / maximum points / Fortress / Road warrior, Unbreakable run, Shutout streak, Giant killer, playoff / Ballon d'Or / academy-sale goals, Transfer merchant, Homegrown regular, Loan army, Scout network, International star, league/cup/continental progress, derbies, hat-tricks, penalty wins, big wins and record transfers, academy/stadium/hospitality, captain and sponsor, fan mood, goals-for and concede goals bands, elite win rates, career length, Great escape, and more. View progress under Club → Legacy & Records → Achievements tab. Steam overlay syncs the same API names when you launch from the Steam client.
- •Staff: Hire and fire Coach, Physio, Scout, Youth Coach, Director of Football, and GK Coach (plus optional Fitness). Defaults: 3 / 2 / 2 / 1 / 1 / 1 — Your Team lists filled seats in backroom order; open seats stay empty after season end until you hire. Staff have specialism attributes (scouts: Current ability / Potential ability); overall rating is the rounded mean of those specialisms. Weekly wages are 100 / 250 / 500 / 1000 by ability (DoF one step up, Scout one step down). Applicants show interest (Keen → Not interested) from your division + reputation vs their rating — elite staff will not join weak clubs; the free-agent pool mixes quality bands and tops up every role on load. They age each season, retire at 62; AI clubs backfill defaults at season end — your club does not. Fired under-62 staff return to applicants. DoF modestly boosts permanent bid accept chance (capped); GK Coach boosts GK training. Tactics feeds weekly training (15% of every player's coaching rating, the whole base for keepers) and uses the best Tactics among the staff who work with that player: Coaches for everyone, the GK Coach for keepers, and the Youth Coach for academy-registered players (effectiveTacticsForPlayer in src/lib/staff-attributes.ts).
- •Available Staff refresh: each summer about 40% of leftover free-agent staff leave the pool and new applicants replace them. Your club always sees at least one strong applicant for every role and every specialism (a Recovery and a Prevention physio, an Ability and a Potential scout, and so on), pitched at your club's level: top-division clubs get elite candidates, and reputation 70+ lifts you one quality band. Older saves get this top-up once on load. Logic in src/lib/staff-lifecycle.ts.
- •Training focus: Club → Training sets a squad default (Balanced, Fitness, Attacking, Defending, Goalkeeping) plus optional per-player overrides. Everyone still develops — focus is extra push, not a lock. Fitness extra work on condition; Attacking extra for forwards and midfielders (keepers a little slower); Defending extra for centre-backs and keepers; Goalkeeping extra for keepers (outfield a little slower). Harder sessions on Attacking / Defending / Goalkeeping. Campus GK / Def / Mid / Att is next-summer intake, not weekly training.
- •Scout reports (profile & market): Squad players always get a written Scout conclusion on the Report tab (headline + detail from OVR, potential, age, traits, form). Other clubs’ players need a full scout report (requires a scout on staff): you request a report from the Market or profile (max 5 × number of scouts per week), and it arrives after ~1 week with an inbox item (clickable player name; same-week on transfer deadline weeks) and a player-card popup — including after Play Match, which used to drop the card when the hub remounted. Until then, Pot and numeric OVR stay hidden on the Market for those targets (no sorting leak from hidden potential). Reports persist in the save; scout judging ability/potential at delivery affects the snapshot. Nobody over 20 is labelled a raw “wonderkid” in copy.
- •Proactive scouting alerts: Inbox prompts flag profile gaps and suggest scouting focus when squad needs are detected.
- •Assistant discovery requests: Ask your assistant in Office → Assistant Manager → Scouting to scan All positions or one role (max value, min overall/potential stars, age). After ~1 week you get an inbox list of up to 6 names, player-card popups, and those hits unlock as full scout reports (does not spend the weekly 5×scout cap).
- •Board confidence: Job security is one overall % (sack at 15, or 8 with job-security credit). Office and Manager Profile also show League / Cups / Finances / Fans / Form meters that mix into that figure (league counts most). Overachieve/title seasons earn job-security credit that softens later league drops. The board holds fire during a four-win streak.
- •Job market: If sacked, apply for other clubs; AI managers can be sacked too. Vacant jobs stay open a week for you to apply, then AI clubs appoint a named replacement within 1–4 weeks (inbox news + new-manager bounce). Bounce also applies when you take over.
- •Captain: Select a captain from your squad (Squad/Team view); captain is shown in lineups (C badge) and in the full-time game summary. Optional engine/morale effects. Dropdown lists show influence next to names (primary colour, one decimal) to match set-piece picker styling.
- •Squad / tactics UX: assign players via Squad PK + (slot popover) or an empty Tactical Hub pitch seat; vacant roles list under Empty positions. Wide squad tables switch General / Attributes / Contract / Training / Status / Stats. On your own player profiles, Squad opens a quick switcher (position, name, OVR). Custom formations (up to five per club) snap to a five-channel pitch grid and can be shared as JSON packs. Youth Academy pipeline deals are ignored by contract-renewal assistant tips until graduation; the academy tops up when you commence the next season. Choose youth promotions: the new-season youth screen lists academy players with the game's suggested picks pre-ticked (21-year-olds flagged as leaving if not promoted), and Team → Youth Academy has a Promote button for mid-season call-ups. Both share one per-season budget (academy cap 1–3) and need senior room under 25 (your club's 25-man squad; AI clubs promote up to 22). AI clubs and the iOS shell keep automatic promotion.
- •Playing-time mood (#100): user club seniors outside the matchday 18 beyond their patience (stars ~3 match weeks, rotation ~6, fringe ~10; more for age ≤21 / 33+ and professionalism) turn Unsettled and lose morale. Only players whose rating ranks them inside the matchday 18 escalate further; prospects and fillers below that line just grumble (−1 morale a week, floor 40) and never ask to leave. Loaning a player out resets his mood. In an open window, matchday-18-calibre players hand in a transfer request — answer it in News or on the player's profile Contract tab (mood banner): List, Promise games (make the 18 within 4 weeks) or Refuse. Answering in one place clears the other (shared PlayingTimeRequestActions). Refused or broken promises make them Unhappy: no renewal, bids come in at ~85% of value, and 3+ unhappy players drag squad morale. Back in the 18, an unhappy player gains +3 morale a week and settles after 3 straight weeks (or at 60 morale). Injured, suspended, loaned, listed and youth players are exempt; AI clubs are not processed. Logic in src/lib/playing-time-mood.ts. Mood badges beside the name (UNS unsettled / PRM promised in amber, REQ wants away / UNH unhappy in red) show in every Squad view, the captain picker and the Tactics pitch/bench cards, with a tooltip explaining the mood (promise countdown included); shared text in src/lib/playing-time-mood-ui.ts.
- •Player roles (#101): every senior player's profile header shows a football role (in place of the old “Experienced Midfielder”-style age/position line, beside his club) — e.g. Ball-playing defender, Target man, Poacher, Box-to-box midfielder, Number 10 — worked out from his attributes relative to his position, so it changes as he develops. Players elite in every core attribute for their position get a Complete role (keeper, centre-back, full-back, defensive midfielder, midfielder, attacking midfielder, forward), shown in amber and kept rare. One optional tag can follow (Leader, Set-piece specialist, Long-range threat, Hard man, Penalty saver). The tooltip names the attributes behind the label. Other clubs' players are read from visible attributes only until scouted (unscouted keepers show nothing); after a report the scout's read is used, and the scout conclusion adds “Role: …”. Academy cards hide it. Roles also appear as a ROLE column in the Squad list and Market Attributes views, and the market has an exact Role filter (narrowed by Pos/Side, same knowledge rule as the profile so nothing hidden leaks). Logic in src/lib/player-roles.ts.
- •Player story beats (#66): when one of your players scores his first competitive senior goal, the game remembers it: minute, opponent, score, week and season appear in a Story tile at the top of his profile History tab, and a short inbox note marks the moment. Friendlies don't count, and each player gets it only once. Club milestones join the same list: 100 / 200 / 300 / 400 / 500 appearances and 50 / 100 / 150 / 200 goals for your club, each with an inbox note naming the opponent. Club totals are this season plus every past season saved under the club's current name (so a renamed club or very long careers with trimmed history may miss one); beats fire only when crossed, never backdated. The Story tile lists beats oldest first. Logic in src/lib/player-story-beats.ts.
- •Loyal / Mercenary personalities (#65): a rare hidden personality on top of the other traits. Mercenary (~1% of players, only 25+, never academy graduates, at most 2 per club) loses patience 2 match weeks sooner (minimum 2), hands in a transfer request at morale 45 instead of 40 and asks for 1.15× wages. Loyal (~8%, 15% of academy graduates) waits 3 weeks longer, only asks to leave at morale 30 and takes 0.9× wages. Shown as a Personality row in the profile Player traits panel for your own players or once scouted, with a tooltip, and as a line in the scout conclusion. Old saves roll personalities once on load. Logic in src/lib/personality-traits.ts.
- •Club identity: Rivalries (derbies, attendance, home advantage); fan mood (Furious / Concerned / Happy / Delighted) affecting attendance and pressure — a competitive derby win or loss moves your fans an extra step and gets its own fans-reaction headline (src/lib/fan-derby-mood.ts); stadium and sponsorship.
- •Academy cadence: Mid-season academy intake preview memo gives an early read on upcoming youth quality. After Commence next season on the season wrap-up, a full-screen Academy intake page lists your new graduates (scout summary, OVR/POT, wonderkid badge); dismiss with Continue to season to reach the hub (state persists in saves until cleared). Campus screen: set intake focus (GK / Def / Mid / Att / All) for the next summer class; upgrade training ground and academy tiers via timed campus projects.
- •Medical assignment control: Assign your physio to active injuries to improve recovery speed.
- •Dressing-room stories: Weekly flavour inbox items (morale, derby pressure, veterans, and form narratives).
Economy & infrastructure
- •Finances: Gate receipts, merchandise, wages, transfer spend, taxes, and sponsorship; tracked in the Finance Hub. Display currency (#75): eurozone playable countries show € and England stays £ — same numbers, no FX (formatMoney + Finance Hub / labels). Argentina-scale economies stay #76.
- •Transfers: Bidding with accept/reject/counter and wage demands; summer and winter windows; shortlist and scouting. Permanent club sales: near-list bids usually counter or reject — clear overpay and buyer prestige vs the seller raise accept chance (DoF still helps a little; listed / fire-sale clubs sell more readily). Free agents still go straight to contract talks at £0 fee; loans use separate accept odds. Youth Academy players (yth) cannot be bought, loaned, or listed. When the window is closed, Office (career) and Market show weeks until the next window (winter from league weeks, summer after week 26). Weekly negotiation patience: five failed bid / loan / transfer-wage attempts on the same player in one week and that club/player walks away until you advance the week (shared counter across those offer types).
- •Transfer deadline weeks (summer week 4, winter week 26): busier AI movement, more incoming bids and loan offers when you advance the week; board memo, optional tabloid-style rumour lines in the inbox, and an amber Market banner with clearer “window shuts after this week” copy. Advancing past the window while you still have open transfer business (pending deal, bids, counters, or loan offers) asks for confirmation so nothing is dropped by accident.
- •AI transfer texture (#68 P2): clubs keep one strategy for the open window; Market rows can show a wnt chip (tooltip lists interested clubs); CPU clubs may loan U23 fringe and fire-sale / splash headlines can appear in the inbox. AI clubs never sell, list, or loan their last two senior keepers (youth GKs do not count as cover); a 0-GK first team emergency-signs a free-agent keeper even at the 20-senior cap.
- •Foreign market: Single-pyramid careers use a flavour overseas pool. Multi-country careers browse real foreign leagues; those squads keep each country’s D1 overall pyramid (continental-only hydrates no longer mint a galaxy XI). Fees: England / Spain / Italy / France / Germany D1 stars list £20M+; other nations cheaper. OVR/POT stay fogged until scouted, same as domestic.
- •Stadium projects: Rename your home ground from the Stadium screen; expand stands (+2k each), add roofs, per-stand seating upgrades (terrace → seated → covered → modern all-seater), floodlights, pitch quality, commercial retail tiers, and a three-tier corporate hospitality track (extra gate cash). Seating / covered / modern also hold more of the crowd in rain and snow and add a small comfort extra on the gate (below commercial). New stadium: from the New Stadium tab, pick one of ten aerial designs, pay £200M, wait 80 weeks while you keep using your existing stadium, then open an 85,000 all-modern bowl (no further stadium upgrades; campus can still run). Default club ground names in data are fictional.
- •Campus screen: Dedicated training ground, youth academy, medical department, scouting network and data & analysis hub with tiered illustrated art (medical: three builds that clear some match knocks before they become injuries and add a weekly extra-rehab chance; your best Prevention physio adds to the knocks cleared, capped at 35%; scouting network: +3/+6/+10 report requests a week, +1/+2/+3 report accuracy, and same-week reports at the elite tier; data & analysis: +4/8/12% weekly player development, and from the good tier pre-match scouting covers the opponent's whole squad); academy quality, output, and positional focus; campus construction projects (separate from stadium build queue).
- •Sponsorship: Yearly shirt deals; better teams attract bigger sponsors; income paid at season start.
User interface
- •Retro aesthetic: Dense, 90s-inspired manager UI with modern layout and responsiveness.
- •PWA / shell entry: Installable on iOS, Android, and desktop; install prompt on intro; web uses the full landing page, while Capacitor/desktop shell can use a minimal intro flow before entering the game.
- •OS Config (Settings): Font choice (e.g. IBM Plex Mono, VT323, Press Start 2P), colour theme (Default, Warm, Classic Retro, Neon Night, Stadium Lights, etc.), Appearance — full-screen canvas background behind the floating UI (bundled art; classic stadium image remains the default; choice is device-local and reapplies after load, including static/Itch-style builds), engine preset (Realistic / Arcade), News feed — show or hide message types in the hub list and desktop ticker (device-local; TRANSFER / LOAN always visible), and Assistant mode (Full — adaptive tips + learning from accept/skip and match outcomes; Suggestions — same tips without history-based ordering; Off — no assistant panels or in-match assistant manager / opponent briefing blocks, no new learning). Reset assistant learning clears stored accept/dismiss and outcome tallies. In-match accepts can record score and minute for outcome learning. Outcome tallies use margin (1-goal vs 2+), per-key caps, seasonal decay, and weighted ranking; see docs/PLAN.md and in-app changelog V2.6.x. Under Appearance, Game options groups Attack pressure timeline vs classic momentum, Game summary assistant narrative, Match screen new vs classic layout, Auto-pause match at minute (once per live fixture; opens tactics on Personnel; default 65′, range 46–120; skips goal/red/injury minutes), Side lineups (wide screens) (xl+ home/away columns with live ratings and fitness; when on, the bottom Live ratings strip is hidden), and Squad list layout (two-column compact). Device-local; persisted keys remain experimental* for compatibility. Pro unlockables: device-local Pro flag (not stored in the career save) prepares a future bundle; development builds expose Grant Pro / Clear Pro for testing (src/lib/entitlements.ts).
- •Dashboard (HUB): Assistant card uses a compact layout on the home tab — redundant “Why this?” copy is hidden so the quote and actions stay primary (same assistant logic elsewhere).
- •Cup & results: Retro Cup view under World (fixtures by round); after advancing, a week results screen shows all that week’s results grouped by country (your nation first) when more than one country played, then continental; inside a country: league by division, cup, playoff, friendlies. Match day list grouped by League / Cup / Friendlies. Knockout draws that go to pens stay on the pitch for a watchable sequence (clock PENS, named kicks, SCORED / SAVED / MISSED) then name the winner on the full-time overlay, game summary, and match report (Club win 5-3 after a penalty shootout). Same for continental, playoff final, and two-leg playoff SF2 when aggregate is still level (no away goals; first leg is 90 only). List scores are home–away as 1-1 (5-3 - Pens).
- •Continental competition UI: Playable continental knockout rounds with dedicated fixtures/results flow.
- •Preseason: Four weeks; arrange one friendly per week against any other club with a Division / Europe picker (Europe prefers real invitee clubs in-save, with legacy fallback) or skip to next week from the hub. Toasts explain if a friendly can’t be arranged (e.g. not preseason, already scheduled). No need to open match day to advance.
- •Mobile: Scaled layout (GameScale) so one design works on desktop and phone; bottom nav, responsive tables, and touch-friendly controls.
- •News: League results, sackings, international call-ups, major transfers, and match-week tabloid lines (derby, high-scoring games, hat-tricks / big hauls, braces, giant killings, late winners 86′+), plus title-race lines for your division in the second half of the season (“blown wide open” when a 5+ point lead is cut to 4 or less, “all but over” when the lead passes 9 but isn't mathematically decided; src/lib/title-race-news.ts) with deterministic variety so reloads stay consistent with the save. Routine clean sheets, 0-0s, competitive debuts, and injury returns are not inbox items. Clear all removes every headline in the currently filtered hub list in one action. Desktop (lg+): a vidiprinter-style ticker under the header scrolls this week’s inbox headlines at ~constant linear speed (duration from measured text width, with min/max caps so one short item is not glacial); Space / hover / focus pauses; reduced motion rotates one headline every 16s.
- •Stats: League tables, top scorers, team records, and season stats (apps, goals, shots, SOT, clean sheets, ratings, Man of the Match) with sortable columns on the full season stats table (division hub).
- •World: World office hub includes All Teams — a grid of clubs for the selected division (DIV 1–4 strip), sorted like the table; click a tile for Team profile (same as standings): Overview (league name + place, record, last five, stature, wages, key people, tactics), Manager, Squad, and Youth (hidden for internationals), with hover tooltips on the tabs. Top 50 — live Ballon-style player rankings across Active Leagues (ability + form + influence; lower-division stats scaled; All / U21 toggle; OVR/POT fogged until scouted). International squads by role quota; links to player profiles. Continental (division 0) invitee clubs have a home country for display and procedural squad nationality mix; Europe friendly list can show Name (Country).
- •Season summary: End-of-season recap with champions, board review, promoted/relegated clubs, playoff-tagged promotions, domestic top scorer / best player / young player of the year, plus world Ballon d’Or, Golden Boy, and Golden Boot from Active Leagues; record signing. Winning the league, a promotion (including playoffs), the domestic cup, or the continental cup first shows a full-screen celebration (crest, trophy art, confetti); multiple honours queue one Continue each.
- •Career: Manager office shows career timeline (appointments, promotions, titles). Games managed / wins / win % on the manager profile update after each finished user match (not only at season end); season-end still handles trophies, reputation, and seasons managed without double-counting those games. Playable countries: 16 four-division packs (England through USA, Australia, Scotland, and Switzerland); pick at career start. Scotland and Switzerland use the same 4×20 pyramid (not the real 12-team SPFL / Super League).
- •Game summary (full screen): From the match header at half-time or full-time, Game summary keeps the score header (competition, HT score, weather, attendance, possession, compact home/away goals and missed pens) always visible, then three tabs: Story (2–3 fact bullets at full time, chronological timeline with labelled penalties/set pieces, cards, and substitutions), Stats (one home/away table including xG, SOT %, goals vs xG, saves; chance-split footnote; injuries; in-match pens), Notable (home/away card board: portraits, rating, chips for MOTM, ratings ≥ 8, 6+ saves, 2+ assists, misses/errors). Headline score and goal columns use the same benefiting-side credit as the attack-pressure chart (benefitsHome, else GOAL event teamId, else squad), so the score always matches the listed goals (incl. own goals and flash-to-FT continuation). Half-time overlay still has Assistant / Game Summary (portal) / Tactics / Opponent / Player Ratings. Full-time overlay is Assistant (station comments plus the Story timeline), Stats (same table as Game summary), Notable, Opponent, and Player Ratings — it no longer opens the portal from a Game Summary tab and drops the read-only Tactics card.
- •Live match — AI tactics line: Under the AI opponent’s name on the scoreboard, formation · play style is shown from kickoff and updates every tick; Chasing, Protecting, or Adjusted appears when their live shape/style differs from the club’s preferred ethos (see docs/TACTICAL_BATTLE_BARS.md). At kickoff vs you they pick this week’s Best XI (fitness, returning stars, new signings), not last week’s names.
- •Save: Single autosave with LZ compression; if localStorage is full, career blob moves to IndexedDB (same browser/site) with a small flag; successful saves also mirror to IndexedDB when available. Player career history (per season: apps, goals, average rating, club name) is kept in full; match fixtures stay on the slimmer save shape. Team name overrides in Database Editor. Optional cloud backup (when the deployment enables it): Club → OS Config → Cloud account — email sign-in only for uploading/restoring an online copy of your save across browsers/devices; playing does not require an account. Privacy notice (analytics, Supabase, local vs cloud data): public route /privacy.
- •Database editor (main menu = global edits for new careers; in-career = this save only): edit clubs (name, colours, crest, budget, rivals…) and players (identity, face, visible attributes, all 10 hidden match stats — finishing, positioning, aerial, pens… with ones a position doesn't use dimmed — mental values, and personality traits as chips; opposites can't be combined, and editor-set traits are locked so the game never re-rolls or caps them). Restore defaults at three levels: *Revert to default* on a player or club, *Reset country to default*, and *Reset all edits* — each asks twice and optionally deletes uploaded crests/faces; in a live career identity reverts but career attributes are kept. Download country (teams + players) writes one JSON with every club and player for a country (edits merged), re-importable via Import JSON. On the web, custom crests fit every domestic club and the continental invitees, and custom faces fit a full squad for the five big leagues. Steam does not use those caps.
Quality & testing
- •npm run test:ship: Pre-build mini suite (typecheck + curated vitest for engine/match/transfers/saves + fixture integrity + synthetic Play Match stress). Auto-runs on Steam / MAS / Microsoft Store / Capacitor static prebuild:* hooks; emergency skip SKIP_SHIP_TESTS=1. File list: scripts/ship-test-files.txt.
- •Vitest: Engine, engine-v2 (calibration, shots, phases, ratings), match display numbers (single match + bulk 150-game checks for display and result stats), player-path simulateMatchForGameWeek smoke + AI bench / SUB regression (tests/match-engine-player-path.test.ts), features (preseason, cup, fan mood, weather, etc.), storage round-trip, league table, season logic, player-generation-config (division PA / sleeper stats), news-ticker-duration (scroll timing).
- •Style behavior guards: tests/engine-v2/style-effects.test.ts verifies play-style fingerprints (e.g. Counter-Attack counter share, Long Ball long-shot/set-piece skew, Sit Back set-piece reliance, and home/away-balanced possession tendencies).
- •Minute CSV regression dump: tests/sim-minute-dump-csv.test.ts regenerates output/sim-minute-datapoints/minute_rows.csv (50 sims) and validates headers/shape so chart-input benchmark data stays fresh after engine changes.
- •Playoff & gap tests: tests/division-playoffs.test.ts validates playoff bracket generation/winners; tests/engine-v2/strength-gap.test.ts guards strong-vs-weak outcome separation.
- •Playwright: E2E including mobile viewport where applicable.
- •Gate: New features add or extend tests; existing suite must stay green. Store builds prefer test:ship over full npm test for wall-clock; CI still runs the fuller Vitest job.
References
- •In-app changelog: /changelog.
| Doc | Purpose |
| docs/PLAN.md | Remaining backlog, strategic tracks, constraints; shipped catalog lives in FEATURES + changelog. |
| docs/game-toasts-inventory.md | Designer inventory of in-game toasts (titles, copy, call sites). Regenerate with npx tsx scripts/list-game-toasts.ts. |
| docs/MATCH_RATING_SPEC.md | Match ratings: pointer to implementation + design intent. |
| docs/YOUTH_SUGGESTIONS.md | Optional youth ideas; see YOUTH_PLAYERS.md for shipped behaviour. |
| docs/2D_VIEW_DESIGN.md | How a 2D match view could work (formation dots + event-driven ball) without changing the engine. |
| README.md | Quick start, deploy. |