Shipped scope
Feature list
Current feature set as of April 2026 — product V3.0.3 (changelog) on top of V3.0.0 stable line. V3.0.3: match auto-pause at a chosen minute (opens tactics / Personnel once per fixture; skips crowded event minutes); News Clear all for the current list; when side lineup rails are on (xl+), the bottom Live ratings strip hides to avoid duplicate rows; assistant counter-formation suggestions diversified. V3.0.2: career-path AI matchday substitutions (bench wired into full sims; your club still manual subs); experimental wide-screen side lineup rails (OS Config, xl+). V3.0.0: OS Config hub/ticker news type visibility; Season stats sortable columns. V2.7.38: World All Teams, continental division 0 + country, player portrait PNG pool, captain/set-piece UI; earlier: economy/physio stratification, game summary / AI scoreboard, Europe friendly picker — see src/data/changelog.ts. Roadmap, backlog, and FM-lite product direction: docs/PLAN.md (single source of truth).
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.
- •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. AI clubs can receive automatic substitutions during the pre-simulated match (simulateMatch with matchday bench from lineup slots 12–16); those SUB events appear in the live feed (e.g. Name → Name) like other events.
- 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 uses position-aware overall (goalkeepers weight goalkeeping); 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 — numbered PNGs under public/player-portraits/pool/ (default 98 files); each player.id maps deterministically to a slot; missing or broken files fall back to a procedural SVG face. Radar charts for attributes, position labels (e.g. D/M/F, DF/DMF); academy youth labelled “yth” in the squad.
- •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.
- •Career achievements: Local-only unlock flags (saved with your career) for 51 milestones — including Invincibles, treble / maximum points / Fortress / Road warrior (perfect home or away league seasons), Unbreakable run (10 league games unbeaten in a row), Shutout streak (five league clean sheets in a row), Giant killer, Transfer merchant (season net profit from sales), Homegrown regular, Loan army, Scout network, International star (10+ caps), 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.
- •Staff: Hire and fire Coach, Physio, and Scout to improve development, recovery, and scouting.
- •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, and it arrives after ~2–3 weeks with an inbox item (clickable player name). 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 quality 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 to scout a role/fee/OVR brief and receive delayed inbox recommendations.
- •Board confidence: Job security ties to results and finances; low confidence can lead to the sack.
- •Job market: If sacked, apply for other clubs; AI managers can be sacked too. New manager bounce (morale boost) 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.
- •Club identity: Rivalries (derbies, attendance, home advantage); fan mood (Furious / Concerned / Happy / Delighted) affecting attendance and pressure; 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).
- •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.
- •Transfers: Bidding with accept/reject/counter and wage demands; summer and winter windows; shortlist and scouting. When the window is closed, Office (career) and Market show weeks until the next window (winter from league weeks, summer after week 26).
- •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.
- •Foreign market: Regional overseas parent clubs and a flavour-first foreign pool support realistic external scouting/transfer context.
- •Stadium projects: Rename your home ground from the Stadium screen; expand stands (+2k each), add roofs, floodlights, pitch quality, commercial retail tiers, corporate hospitality (extra gate cash), and facility upgrades. Default club ground names in data are fictional.
- •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 (league, cup, friendlies); match day list grouped by League / Cup / Friendlies.
- •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, shutouts, giant killings, late winners 86′+, competitive debuts, injury returns) with deterministic variety so reloads stay consistent with the save. 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). 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, top scorer, best player, young player of the year, record signing.
- •Career: Manager office shows career timeline (appointments, promotions, titles).
- •Game summary (full screen): From the match header at half-time or full-time, Game summary opens a dedicated breakdown: goals & discipline per side (scorers with ball markers, optional assists and own-goal hints, cards with Y/R totals), competition label, half-time score (when viewing full match), weather, attendance, possession (live engine-aligned share when playing the match), standouts (top result.ratings each side), chance quality (goals vs xG with delta, shots-on-target %), assist leaders, injuries, substitution counts, penalties/shootout when applicable, then the full match statistics table. 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 / full-time overlays still show per-player ratings and team stats without leaving the pitch.
- •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).
- •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.
Quality & testing
- •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.
References
- •In-app changelog: /changelog.
| Doc | Purpose |
| docs/PLAN.md | Roadmap, backlog, storage, testing, numbered shipped/backlog, strategic tracks, FM-lite direction. |
| 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. |