Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.

MITAuto-check passedData & Analytics

Install Football Match Report

skills CLI
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-report --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/football-match-report .claude/skills/football-match-report && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
football-match-report
GitHub stars
119
Token cost
~2.7k tokens
SKILL.md length
1,214 words
Files
5 (incl. scripts, references)
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.

  • Works in 4 steps: Scrape (network required, ~10-30s) → Render (offline, a few seconds) → Player-level reports (offline, optional) → …
  • Tasks that involve CSV and tabular files
  • SKILL.md covers When to Use, Prerequisites, How to Run and Quick Reference, plus 4 more sections
  • Runs Python scripts from its folder; calls uv, python and pip; reaches whoscored.com

What it does

Football Match Report is an agent skill from ricardoherediaj/football-analytics-tutorials. Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.

Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `references/metrics.md`, `scripts/render_report.py` and `scripts/scrape_match.py`).

It sits in Data & Analytics, covering CSV and tabular files. The repository describes itself as: Open-source tutorials and code snippets for football analytics. The licence is MIT.

When your agent uses it

  • Tasks that involve CSV and tabular files

Example prompts

  • “/football-match-report”

Requirements

  • Python 3

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Scrape (network required, ~10-30s)
  2. Render (offline, a few seconds)
  3. Player-level reports (offline, optional)
  4. As a CLI (same thing)

What it can do on your machine

Read from SKILL.md and the folder at commit 7ae8653. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 2 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • uv
    • python
    • pip
    • playwright

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • whoscored.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Football Match Report loads about 2.7k tokens when it runs, and up to ~3.9k if it reads all its reference files. Until then it costs about 34 tokens; SKILL.md has 1,214 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~34
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~3.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from ricardoherediaj/football-analytics-tutorials at commit 7ae8653, republished under its MIT licence (© ricardoherediaj). 1,214 words, ~2,702 tokens.

Download SKILL.mdSave it as .claude/skills/football-match-report/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
football-match-report
description
Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.
version
2.2.0
author
Ricardo Heredia (ricardoherediaj), Hermes Agent
license
MIT
platforms
linux, macos

Football Match Report Skill

Turns any WhoScored match URL into a two-page post-match team report by merging two data sources:

  • WhoScored (headless Chromium) → full event stream (passes, tackles, carries, recoveries). Powers passing networks, defensive blocks, progressive passes/carries, xT momentum and all zone charts.
  • FotMob (plain requests, no token) → shots with xG/xGOT, native match momentum, official stats, player of the match, and real team colors.

The FotMob match id is auto-resolved from the WhoScored match date + team names — a single WhoScored URL is all you need. Both sources are required for the complete report; a FotMob-only scrape (--fotmob-id) renders a reduced report (shots/momentum/stats) without the event panels.

Charts follow the Post-Match-Report-2.0 blueprint (Adnan Ahmed): UEFA pitch, black background, shirt numbers inside player nodes (circle = starter, box = sub), line-height markers, xT momentum.

Two commands, end to end:

bash
python scripts/scrape_match.py "<whoscored-url>" --out ./data
python scripts/render_report.py --data ./data --out ./report

A third command adds the player-level reports (Top Players dashboard, per-player dashboards, per-player stats CSV):

bash
uv run football-match-report players --data ./data --out ./report

When to Use

  • A user asks for a post-match report, match dashboard, or football analytics breakdown and provides a WhoScored match URL (or match id).
  • A recurring match-report job (e.g. after each round of fixtures).
  • Rebuilding/updating an old notebook-based report into the modern pipeline.

Don't use for: season-long datasets (use soccerdata/StatsBomb open data), live in-play streams, or non-WhoScored competitions (Understat etc.).

Prerequisites

  • Python 3.10+ with uv (or pip).
  • Install deps: uv sync --extra scrape (or pip install -e ".[scrape]").
  • One-time browser install: uv run playwright install chromium (WhoScored is bot-walled; the script launches headless Chromium to read the embedded matchCentreData JSON).
  • No API keys. FotMob's public endpoint (/api/data/matchDetails) is used for shots/xG/momentum/colors and does not require a token.

How to Run

1. Scrape (network required, ~10-30s)
bash
python scripts/scrape_match.py \
  "https://www.whoscored.com/matches/1873310/live/international-fifa-club-world-cup-2025-salzburg-real-madrid" \
  --out ./data

Produces data/{matchdict.json, events.csv, shots.csv, meta.json, xt_grid.csv}. The FotMob match id is auto-resolved from date + team names. Pass --fotmob-id <id> to skip resolution, or --no-browser to reuse a cached matchdict.json. Any match works — teams, colors, scores and stats all come from the scraped data; nothing is hardcoded per match.

2. Render (offline, a few seconds)
bash
python scripts/render_report.py --data ./data --out ./report

Produces two 4x3 report figures:

  • report/match_report_1.png — Team report: passing networks, shot map with xG stats bar, defensive blocks, goalkeeper saves, progressive passes, xT momentum, progressive carries, match stats.
  • report/match_report_2.png — Zones report: final-third entries, box entries, Zone 14 & half-spaces, crosses, pass-end-zone heatmaps, high turnovers, chance-creating zones, congestion map.
3. Player-level reports (offline, optional)
bash
uv run football-match-report players --data ./data --out ./report
# or, only specific players:
uv run football-match-report players --data ./data --out ./report \
  --players "Lamine Yamal,Mikel Oyarzabal"

Produces:

  • report/match_report_3.png — Top Players dashboard (4x3): top ball progressor pass maps, passes received by the center-forward, top defender actions, goalkeeper pass maps + Top10 stacked bar charts (ball progressors, shot-sequence involvement, defenders, threat creators via xT).
  • report/players/<name>.png — one 2x3 individual dashboard per starter (or the names in --players): pass map, carries & take-ons, shot map with xG/xGOT, passes received, defensive actions, touches heatmap with distance covered.
  • report/player_stats.csv — merged wide per-player stat table.
4. As a CLI (same thing)
bash
uv run football-match-report scrape "<whoscored-url>" --out ./data
uv run football-match-report render --data ./data --out ./report

Quick Reference

TaskCommand
Scrape any match (WhoScored + FotMob auto-merged)python scripts/scrape_match.py "<whoscored-url>" --out ./data
Render both report pagespython scripts/render_report.py --data ./data --out ./report
Render player-level reports (top players + per player + CSV)uv run football-match-report players --data ./data --out ./report
Limit per-player dashboards to specific names... players --players "Lamine Yamal,Mikel Oyarzabal"
Explicit FotMob id... --fotmob-id 4685754
FotMob-only reduced bundle (no browser)python scripts/scrape_match.py --fotmob-id 4685754 --out ./data
Skip browser (reuse cache)... --no-browser
Run testsuv run pytest
Lintuv run ruff check src tests

Procedure

  1. Confirm the URL is a WhoScored match URL. The match id is the number after /matches/. If the user only has a FotMob link or id, --fotmob-id still works but event panels degrade.
  2. Run the scrape (command above). Completion criterion: events.csv exists with 500+ rows and meta.json has teams.home.name.
  3. Run the render (command above). Completion criterion: both match_report_1.png and match_report_2.png exist.
  4. Inspect the PNGs (vision_analyze in Hermes) for empty panels or overlapping text. The most common failure is a missing FotMob id, which empties the shot map, xT momentum and GK panels — re-scrape with --fotmob-id.
  5. Deliver both PNGs inline to the user.
Show full SKILL.md (563 more words)Show less

Metrics included (per team)

  • Passing network — nodes at median positions with shirt numbers, circle = starter / square = sub, line thickness ∝ pass volume, verticality %, defensive/forward line heights + shaded zone.
  • Shot map — football markers for goals, hatched saves, orange posts, big-chance scaling, plus a Goals/xG/xGOT/Shots/On Target/BigChance/ BigC.Miss/xG-Shot/Avg.Dist comparison bar.
  • Defensive block — KDE heatmap, action-height line, compactness %.
  • Goalkeeper saves — goal-mouth view of shots faced per keeper.
  • Progressive passes & carries — comet lines / dashed arrows with left-center-right zone split.
  • xT momentum — average xT per minute (home above / away below zero) with goal and red-card markers.
  • Match stats — possession, field tilt, passes, long balls, corners, GK kick length, tackles, interceptions, clearances, aerials, PPDA.
  • Zone charts — final-third entries (by pass/carry), box entries, Zone 14 & half-space passes, crosses (acc./unacc.), pass-end-zone heatmaps, high turnovers (led to goal/shot), chance-creating zones (key passes = violet, assists = green), congestion map.
  • Top Players dashboard (figure 3) — top ball progressor pass maps (all/progressive/key/assist passes + progressive carries), passes received by the center-forward, top defender action maps, GK pass maps (open play vs goal kicks/free kicks), Top10 stacked bars: ball progressors, shot-sequence involvement, defenders, xT threat creators.
  • Individual player dashboard — pass map (accuracy, progressive, chances created, assists, final third, penalty box, crosses, longballs, xT), carries & take-ons (progressive, led to shot/goal, box entries, dispossessed, success rate), shot map with xG/xGOT (FotMob) and inside/outside box split, passes received (final third, box, progressive, cutbacks, ball retention, most passes from), defensive actions (tackles won, dribbles past, recoveries, blocks, aerials, possession wins per third), touches heatmap with distance covered and area covered.

See references/metrics.md for definitions and interpretation notes.

Pitfalls

  • Both sources are needed for the full report. WhoScored supplies the event stream; FotMob supplies shots/xG/momentum/colors. A FotMob-only scrape renders a reduced report.
  • WhoScored blocks plain requests (403). Use the Playwright path; if playwright install chromium was skipped, the script exits with install instructions. --no-browser only works when matchdict.json already exists in the data dir.
  • Coordinate spaces. WhoScored events are 0-100 and scaled to a UEFA 105x68 pitch (x*1.05, y*0.68) — the blueprint convention. Both teams attack toward x=105 in the raw data; the away team's axes are inverted for display and home shots are flipped in the shot map.
  • FotMob match id resolution needs the match date. If the date endpoint returns nothing, pass --fotmob-id explicitly (from the FotMob URL #<id>).
  • Empty shot map = missing FotMob id. Event panels still render; only shot/xG/momentum/GK panels degrade.
  • Player names in passing networks come from WhoScored's playerIdNameDictionary; without matchdict.json only counts are shown.
  • Player-level panels need real names to match. FotMob shot xG/xGOT match on playerName (fallback: shortName); if a player's name differs between sources, xG shows 0. Without shots.csv the individual shot map falls back to WhoScored events (positions but no xG).
  • Only players who touched the ball appear in player_stats.csv and the per-player dashboards — bench/roster players with zero events are skipped by design.
  • Players with <3 touches get a 0 Total_Area_Covered (convex hull guard) instead of crashing the heatmap.
  • Be polite: scrape one match at a time; don't loop over hundreds of URLs.

Verification

  • scrape_match.py prints per-step status lines and a final ✅ Done in Xs. Bundle ready in ....
  • render_report.py prints ✅ <path> for both PNGs.
  • Open match_report_1.png: every panel populated, black background, team colors consistent (home left, away right), shirt numbers legible inside nodes, xT momentum in the center row.
  • Open match_report_2.png: all 12 zone panels populated with data.
  • uv run pytest passes (offline, uses synthetic match data).

© ricardoherediaj, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files (scripts, references) in skills/football-match-report of ricardoherediaj/football-analytics-tutorials.

  • SKILL.md
  • data/xt_grid.csv
  • references/metrics.md
  • scripts/render_report.py
  • scripts/scrape_match.py

Open the folder on GitHubat commit 7ae8653

Compare with similar skills

Football Match Report next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Football Match Report compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Football Match Report this skillricardoherediaj/football-analytics-tutorials119—~2.7kAutomated safety check: PassMIT
Excel and CSV Data Analysisbytedance/deer-flow84k4 repos~2.2kAutomated safety check: PassMIT
CSV Data Summarizercoffeefuelbump/csv-data-summarizer-claude-skill4682 repos~1.4kAutomated safety check: PassNone
Exploratory Data AnalysisOleafly/Oleafly2122 repos~3.4kAutomated safety check: NotesMIT
Raccoon DataanalysisSenseTime-Copilot/raccoon-dataanalysis-skill137—~1.9kAutomated safety check: PassNone
CSV Data Analysis5zjk5/prompt-engineering127—~2.6kAutomated safety check: PassNone

Similar skills

  • Excel and CSV Data Analysis

    bytedance/deer-flow

    Analyzes uploaded Excel and CSV files with SQL through DuckDB, producing schema inspections, statistical summaries and exports to CSV, JSON or Markdown.

    84k GitHub starsUsed in 4 repos~2.2k tokens
    Data & AnalyticsAuto-check passed
  • CSV Data Summarizer

    coffeefuelbump/csv-data-summarizer-claude-skill

    Analyzes CSV files, generates summary stats, and plots quick visualizations using Python and pandas.

    468 GitHub starsUsed in 2 repos~1.4k tokens
    Data & AnalyticsAuto-check passed
  • Perform bounded, local exploratory analysis of explicitly supported scientific files.

    212 GitHub starsUsed in 2 repos~3.4k tokens
    Data & AnalyticsAuto-check: notes
  • Raccoon Dataanalysis

    SenseTime-Copilot/raccoon-dataanalysis-skill

    Raccoon (小浣熊) Data Analysis - Remote code interpreter and data visualization service powered by SenseTime.

    137 GitHub stars~1.9k tokensUpdated 6 mo ago
    Data & AnalyticsAuto-check passed
  • CSV Data Analysis

    5zjk5/prompt-engineering

    This skill should be used when users need to analyze CSV or Excel files, understand data patterns, generate statistical summaries, or create data visualizations.

    127 GitHub stars~2.6k tokensUpdated 26 days ago
    Data & AnalyticsAuto-check passed
  • Optimize Button Patterns

    duckduckgo/tracker-radar-collector

    Iteratively improves cookie-popup button regex patterns in button-patterns.js against labelled-button-texts.csv.

    169 GitHub stars~1.6k tokensUpdated 3 days ago
    Data & AnalyticsAuto-check passed

Questions about Football Match Report

What does Football Match Report do?

Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL. Football Match Report is an agent skill from ricardoherediaj/football-analytics-tutorials. Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.

When should I use Football Match Report?

Football Match Report fits situations like: tasks that involve CSV and tabular files.

How do I install Football Match Report in Claude Code?

Run `npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a claude-code`. Or copy the skill folder (skills/football-match-report in ricardoherediaj/football-analytics-tutorials) into .claude/skills/football-match-report in your project. Claude Code loads it when a task matches its description.

How do I install Football Match Report in Codex?

Run `npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a codex`. Or copy the skill folder (skills/football-match-report in ricardoherediaj/football-analytics-tutorials) into .agents/skills/football-match-report in your project. Codex loads it when a task matches its description.

Can I use Football Match Report in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/football-match-report, .gemini/skills/football-match-report, .github/skills/football-match-report and .opencode/skills/football-match-report in your project.

What does Football Match Report need to run?

Going by SKILL.md and its folder, Football Match Report needs Python for the scripts in its folder and the command-line tools its instructions call (uv, python, pip and playwright). Our summary lists: Python 3.

Does Football Match Report access the network?

SKILL.md names 1 domain. In commands or code: whoscored.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Football Match Report safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Football Match Report use?

Football Match Report is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Football Match Report use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.2k tokens, read only when the agent opens those files.

What are the alternatives to Football Match Report?

Skills that share tags, products or a category with Football Match Report: Excel and CSV Data Analysis (bytedance/deer-flow, 84k stars), CSV Data Summarizer (coffeefuelbump/csv-data-summarizer-claude-skill, 468 stars), Exploratory Data Analysis (Oleafly/Oleafly, 212 stars) and Raccoon Dataanalysis (SenseTime-Copilot/raccoon-dataanalysis-skill, 137 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Football Match Report?

ricardoherediaj (a GitHub user) maintains it in ricardoherediaj/football-analytics-tutorials, which has 119 GitHub stars. The repository was last updated on August 8, 2026.

Source: ricardoherediaj/football-analytics-tutorials on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.