The Images We Refuse to Generate
By PlayFutbol Data Team · · 7 min read
This site is missing 50 player photos and 5 club crests. The photos get filled with a generated avatar. The crests do not get filled with anything — they fall back to one grey default that every one of them shares. That asymmetry was a decision, and it is a more interesting one than it looks.
Where the holes actually are
Coverage across the two asset types, plus the badge game’s pool, which is built from clubs with a verified crest by construction.
716 of 766 players have a photo (93.5%) and 198 of 203 clubs have a crest (97.5%). This is not a story about a site full of holes. It is a story about the last two per cent, which is where automated image sourcing stops working and somebody has to decide what goes in the gap.
The five clubs no search could resolve
Getting from 111 crests to 198 was mostly mechanical: look the club up by name, take the logo. Five clubs defeated every attempt, and they did not fail randomly. Each one failed in a way worth writing down, because they are the same few failure modes over and over.
| Club | Country | Careers | What the search returned instead |
|---|---|---|---|
| Aarhus GF | DNK | 1 | Search returned the club’s women’s side, AGF Women. |
| Al-Shabab FC | SAU | 1 | Several unrelated clubs share the name across Saudi Arabia, the UAE, Kuwait and Bahrain. |
| Colo-Colo | CHI | 1 | Matched Colo Colo de Ilhéus, a Brazilian club, instead of the Chilean one. |
| Deportivo La Coruña | ESP | 3 | Matched Deportivo Fabril, the reserve side, rather than the first team. |
| Vitória SC | POR | 1 | Matched EC Vitória in Brazil instead of Vitória SC in Portugal. |
Three failure modes, and none of them is a bug in the search. A name that exists in two countries. A name shared by the men’s team, the women’s team and the reserves. A name several unrelated clubs use at once. In every case the API returned a real crest for a real club with a matching name — just not the club we asked about.
That is the important part. These were not low-confidence results that a threshold would have caught. They came back as confident hits, and the only thing that caught them was a person looking at a montage of a hundred crests and noticing that thirteen of them were wrong.
Between them these five clubs account for 7 careers
Which is the reason they are still empty. The cost of getting one wrong is a crest that says Brazil on a Portuguese club’s page, indexed and served for months before anyone spots it. The cost of leaving it blank is 7 career rows showing a grey placeholder. The second is obviously cheaper, so they stay blank until somebody sources them by hand.
So why generate the player photos?
The fork on the cover chart is real code, not a diagram of intentions. The photo fallback lives in playerPhotos.ts and it is unambiguous: no local file, so build a DiceBear avatar from the player’s name and serve that. Deterministic, free, and it means a squad list never has a hole in it. 50 players are served that way right now.
A placeholder portrait reads as a placeholder. It holds the layout and nobody mistakes it for the person. Nobody looks at a flat cartoon avatar and believes they are seeing a photograph of Deco. It occupies the slot, keeps the row heights honest, and says “no photo” more gracefully than an empty box would.
A crest cannot work that way, and the reason has nothing to do with image quality. A crest is an identity mark. A plausible invented one would be a forgery, and in a badge game it would be the question itself. A generated crest would not read as a placeholder — it would read as the club’s badge, because that is what a badge-shaped image in a badge-shaped slot reads as. The failure mode is not “this looks a bit off”. It is a reader coming away believing a false thing about a real organisation.
In one of our games that stops being abstract. Guess the Badge shows a crest under heavy blur and asks which club it belongs to. Its pool is 67 clubs, and every one of them has a crest that a human has checked. Drop an invented crest into that pool and the puzzle does not get harder, it gets unanswerable — while still looking perfectly answerable, which is worse.
The line that actually matters
It is tempting to read this as an argument against generated imagery, and it is not. We generate 50 images on this site today and would generate more. The distinction is not between real and synthetic pictures. It is between an image that stands for something and an image that identifies something.
A hero background, an illustration for an article, a decorative texture, a placeholder portrait, an icon set — nothing about those depends on being a record of a particular real thing, and a good AI image generator will produce them faster and more consistently than stock hunting ever did. That is a real gain and we use it.
A crest, a photograph of a named person, a screenshot presented as evidence, a logo — those slots carry a claim about the world. The moment a generated image lands in one, it is not filling a gap, it is asserting something false with a straight face. The test is simple, and it is not about the picture: if a reader would draw a conclusion about a real person or organisation from the image, it has to be sourced.
How this was built
Coverage figures are counted at build time from the same data the site serves, so they cannot drift from what is actually on disk. The five crestless clubs are recorded by hand with the specific mismatch each search produced; the tests assert that the list stays in step with the club data, so a club quietly gaining or losing a crest fails the build rather than making this page stale.
One caveat: the mismatch column is what we observed from the sources we tried, not a verdict on those services. A different provider, or the same one a year from now, may well resolve all five. The failure modes are the durable part — a name in two countries, a women’s side, a reserve team — not the specific misses.
Play with the same data
If you want to find out how much of a club you actually recognise from its crest, Guess the Badge reveals one through five levels of blur. Guess the Club comes at it from the squad instead, and Emoji Quiz replaces the imagery with something even less helpful.
About this article
Written by the PlayFutbol Data Team. Figures are computed at build time from our player database, which is reconciled against Wikidata and cross-checked with Transfermarkt and club pages. When a claim is not supported by the data, we say so in the text rather than leaving it out.