MESSI ALLGOALS

About the data

Every field on a card is a record read from the archive database. Where there is no record, the field is left out rather than filled in.

The database

928 goals across 611 fixtures, with the club, opponent, competition, season, date, minute, body part and how the goal came about. Alongside them: the 59 players who set them up, the 26 tags the archive keeps (hat-tricks, El Clásico, career milestones) and 10 curated collections. The build reads these straight out of the database and writes src/data/*.json; the app itself never opens a connection.

The clips

927 of the 928 goals have footage, and every one of the 414 assists does. The files are served from the project’s own media bucket and nothing loads until you press play — no third-party player, no preload, no tracking pixel. A card shows a still from its own clip once the bucket has one; until then it shows artwork the app draws from the record itself, so every card in the grid is different.

The assists

The database describes who set up Messi’s goals, but held nothing about the passes he played himself. Those records were recovered from the clips: most carry a caption naming the finisher, the opponent, the competition and the date, which was read off the frame and matched back against the fixtures already in the database. Clips from 2021 on are broadcast footage without a caption, so they carry a number and the footage and claim nothing else.

What is missing

  • A shot position exists for 474 of 928 goals. The rest are absent from the shot map rather than guessed onto it.
  • One goal has no clip in the bucket.
  • Nothing counts views or likes. The database holds a column for each and records 0 in every row, so the archive shows neither rather than showing a zero next to all 1,342 entries.

Rebuilding it

  • npm run data re-reads the database into src/data/*.json.
  • npm run videos:link walks the bucket and re-links the clips to their goals.
  • npm run assists:ocr then npm run assists:import rebuild the assist records from the clips.

Media

A card shows the still from its own clip where the bucket has one, which is nowhere yet. Until it does, each card is drawn from its own record — the shot plotted on a schematic goalmouth, tinted by competition and club — rather than from a photograph shared with every other card. The one bundled frame is the poster a clip shows before it starts.

Club and national-team crests are served from this origin rather than hot-linked. They are the trademarks of the clubs concerned and are used here only to identify the team. Where the archive holds no crest, the app draws a lettered tile instead.