The project is open source
All code is MIT-licensed (see LICENSE) and public at github.com/Mike-Demo/football-universe-copilot. Design language: Microsoft Fluent 2 (see Components & licenses for the credit). The demo site itself has no framework, no bundler and no tracking — the replay engine and the force-directed graph are hand-written vanilla JS on a canvas. The single third-party script is CO2.js (The Green Web Foundation), used only for the per-visit footer estimate on this page, computed locally from transferred bytes.
Data policy: every match, event and season in this project is synthetic — generated by seeded simulators in the repo (deterministic: same seed, same season). No real Premier League or WSL results, footage or feeds are used or redistributed. The universe graph (players/clubs/managers) is a small hand-authored seed of well-known historical connections.
Architecture
Synthetic events → Interpreter agent (stats, momentum, control-vs-chaos, threshold alerts) → GraphContext agent (BFS shortest paths, Brandes betweenness → "Kevin Bacon Score", verified connections only) → Narrator agent (grounded narration; Microsoft Phi-4-mini on Foundry when configured, deterministic template otherwise — every output labels its narration_source) → Personalizer agent (analyst / casual / player-focus / club-focus / Spanish renderings + a timed, machine-readable broadcast overlay, schema football-universe-overlay/v1). Agents hand off through one shared state object; the same agent classes run locally (pure Python, zero dependencies) and in Azure.
Components & licenses
| Component | What it does | License / terms |
|---|---|---|
| Project code (pipeline, agents, simulators, this site) | Everything in the repo | MIT — © 2026 Mike Demopoulos |
| Python 3.11 (standard library only) | Core engine — deliberately zero third-party packages | PSF License |
| Microsoft Phi-4-mini-instruct | Narration model, deployed in Microsoft Foundry | Microsoft model; weights released under MIT on Hugging Face; hosted inference billed per token by Azure |
| Microsoft Foundry (AIServices) | Model hosting + agent registration surface | Azure service terms (pay-per-use) |
| Azure Functions (Consumption) | HTTP API: /api/health, /api/match/intelligence, /api/graph/path, /api/graph/leaderboard, /api/season | Azure service terms; first 1M executions/month free |
| Azure Cosmos DB (Gremlin, serverless) | Universe graph store (schema in repo; API also runs the graph in-process) | Azure service terms; per-RU pricing |
| Azure Application Insights | API telemetry | Azure service terms |
| Azure Blob Storage | Hosts the demo videos — the public media container on the Function App's storage account streams the plain-English friendly-tour video embedded in the Start here dialog (1080p stream + 4K master); the files are too heavy for the Pages repo | Azure service terms |
| Bicep | Infrastructure as code for the whole Azure stack (infra/main.bicep) | MIT (Microsoft) |
| Microsoft Fluent 2 + Fluent UI React v9 (design system, charts, motion) | The visual and motion language of this site and the live demo. Design tokens (brand #0F6CBD, neutral surfaces, Segoe UI type ramp, elevation, 4px/8px radius), Wait UX and onboarding patterns (Fluent 2); component anatomy — Button, TabList, Card, Switch, DataGrid — and chart anatomy (VerticalBarChart, HorizontalBarChart, LineChart, from @fluentui/react-charts) plus the Fluent Motion token set (durations 50–500ms; Accelerate/Decelerate/EasyEase curves; tracked by Microsoft's Fluent Motion project) from Fluent UI React v9, as specified in the Fluent UI Storybook. Everything is implemented as original hand-written CSS/SVG to those specifications; no Fluent UI or React code is bundled — the demo stays zero-dependency. Design guidance © Microsoft; the Fluent UI component libraries are MIT (Microsoft) | Design guidance, tokens & motion credited to Microsoft; implementation ours (MIT) |
| Microsoft Fluent Emoji (icons) | The menu, logo, tab bar, headings and feed markers use Microsoft's official Fluent Emoji Color SVG artwork — the same Microsoft Design set published as the "Fluent emoji" files on Microsoft's Figma profile — copied unmodified from Microsoft's fluentui-emoji asset repository into docs/assets/fluent-emoji/ (see SOURCE.md there). They replace platform-rendered Unicode emoji so the icons look the same on every device. 43 icons in total — the hidden Chaos Arcade mode (Konami code, or tap the logo ball 7 times) and the Pride Matchday mode (the Pride button, out in the open) are built entirely from the same set: player faces, hearts, the rainbow flag, the flamingo pitch invader, the flying pizza, and their soundboard icons. | MIT — © Microsoft Corporation |
| CO2.js (@tgwf/co2, The Green Web Foundation) | The per-visit carbon estimate in this site's footer: transferred bytes are measured locally via the Performance API and converted with the CO2.js Sustainable Web Design model (perByte). No external calls, no tracking, and no green-hosting or certification claim — the matching disclosure is published as carbon.txt. A machine-readable summary of the whole site is at llms.txt and the API is documented at api.html. | Apache-2.0 — © The Green Web Foundation |
| FIFA Connect Data Standard v3.3 (FCD / "FIFA Data Standard") | Data-alignment layer: our fixtures, phases, scores, teams and goal events are exported in the FCD model (namespace http://fifa.com/fc) and validated against the standard's XSDs — see the Data standard section below and src/fds/README.md. The standard and its schemas are © FIFA; FIFA's licence for the standard reserves implementation to authorised users, so this is an alignment to the published model, not a certified integration, and the schemas are not redistributed here. Synthetic identifiers (SYN prefix) are ours — no real FIFA data or IDs are used. | Standard © FIFA — credited, not redistributed; our export code MIT |
| GitHub Pages | Hosts this static demo | GitHub terms |
| Demo videos | The main 2-minute demo (on YouTube) and the plain-English friendly-tour video embedded in the Start here dialog (streamed from Azure Blob Storage, above) — both produced with Pexo from the project's own screen captures, with River narration and burned-in subtitles | Project content — © 2026 Mike Demopoulos |
| Microsoft Agent Framework | Agent manifest/mapping (src/agents/framework_adapter.py); local orchestrator is the deterministic fallback | MIT (Microsoft) |
The season simulator
A seeded Poisson goals model over plausible synthetic club strength ratings simulates the full calendars — 380 Premier League matches and 132 Women's Super League matches — producing standings, form, points progressions and season narratives that are computed from the simulated results, never hand-written. In the browser, any fixture can be loaded and a deterministic event timeline (shots, passes, pressure, alerts) is generated from its simulated scoreline, so all 512 matches are watchable.
Running costs
The full breakdown is in infra/COSTS.md: every Azure service is pay-per-use with a $0 floor, the deployment sits under its own billing profile with a $10 budget alert, and the realistic total through judging is $0–2.
Data standard — FIFA Connect Data (FCD) v3.3
The hackathon mandates no data format, so we aligned our match data to the FIFA Connect Data standard v3.3 (the "FIFA Data Standard" package) as an interoperability layer: fixtures, phases, scores, teams and goal events are exported in the FCD model (namespace http://fifa.com/fc) and validated against the genuine FCD XSDs — all three exports are valid.
Exports: featured match · Premier League season (380) · WSL season (132) · full mapping in the repo at src/fds/README.md.
Honest scope: FCD is a registration & competition-administration standard. Scores live in Phase elements (the only place its model carries them); season matches therefore carry a single 2H phase with the cumulative full-time score — no half-time split is invented. MatchEvent is emitted only for goals, the one FCD event nature our stream contains; lineup Player elements are omitted rather than fabricated (FCD requires shirt number / captain / goalkeeper flags we don't generate). Our telemetry events (passes, pressure, coordinates, xT) have no FCD equivalent and remain our documented JSON extension. Identifiers are synthetic 7-character IDs with an SYN prefix — not real FIFA IDs — and match status is Played, never Officialised. This is an alignment to the published model, not a FIFA-certified integration.
The models (exactly what runs, no black boxes)
Poisson goals model. Every fixture's expected goals come from club attack/defence ratings: λhome = 1.42 × attackhome ÷ defenceaway, λaway = 1.12 × attackaway ÷ defencehome (1.42/1.12 are the league-average home/away baselines). Season results are Poisson draws on those λ values; the demo's what-if panel recomputes win/draw/win probabilities live from any λ pair using two independent Poisson distributions.
Expected threat (xT), simplified. Each event carries synthetic pitch coordinates (105×68). The threat of a location is xT(x, y) = 0.38 · e−d/24 · (1 − 0.45·|y−34|/34), where d is the distance to the goal centre — an analytic surface peaking near goal and decaying with distance and width. ΔxT for a pass is xT at the ball's new location minus xT at its previous one. Shot xG (model) = min(0.95, 2.2 × xT at the shot location). These are deliberately simple, fully documented stand-ins for learned xT/xG models — the formulas are the product, not a fitted black box.
Positions & Voronoi. Key events (shots, corners, 35m+ passes) carry a snapshot of all 22 players: each team's formation template shifted toward the ball and jittered from the same seeded stream. Voronoi zones are computed in the browser by half-plane clipping — real geometry on synthetic positions, labelled as such.
Performance numbers. Any timing shown in the Tactical Lab is measured live in your browser with performance.now(). We never display invented throughput or latency figures.
Reproduce it
git clone the repo → python3 -m unittest discover -s tests (11 tests, no installs) → python3 tools/build_demo_data.py && python3 tools/build_season_data.py → open docs/ over any static server. Azure: infra/deploy.sh with your own subscription.