In The Game
  • Home
  • World Cup
  • Blog
  • Games
  • AFL
    • Overview

    • Matches
    • Ladder

    • Player Stats
    • Player Ratings
    • Player Game Logs
    • Player Comparison
    • Card Deck
    • Age Curves

    • Team Stats
    • Team Game Logs
    • Team Ratings

    • Definitions
  • Football
    • Overview

    • Matches
    • Leagues

    • World Cup 2026
    • Simulator
    • Wall Chart
    • Pick Your Bracket
    • Title Race
    • Group Projections
    • Match Predictions
    • Player Stats
    • Player Ratings
    • Venues
    • Team Strength
    • Head to Head

    • Player Stats
    • Player Ratings
    • Player Game Logs
    • Player Comparison
    • Card Deck

    • Team Stats
    • Team Game Logs
    • Team Ratings

    • Definitions
  • About

Photo Credits & Thanks

Skip to content

Football > Photo Credits & Thanks

Photo Credits & Thanks

Every football player headshot on this site comes from Wikimedia Commons under an open licence (CC0, public domain, CC BY, or CC BY-SA). None of it would exist without the photographers who share their work and the open-source projects that knit it all together. Thank you — genuinely.

With thanks to

  • The photographers. Every face below was photographed by someone who chose to license their work openly so others could build on it. The full attribution — author, licence, and a link to the original — is listed for every photo in the table below. If you’re one of them: thank you.
  • Wikimedia Commons and the Wikimedia community, for hosting and stewarding one of the great open media archives.
  • reep (CC0) — the football entity register that maps players across data providers to Wikidata. It’s what lets us connect a player to their photo and bio at all.
  • Wikidata — for the player metadata (nationality, date of birth) and the links to Commons, all freely licensed.
  • The open-source tools this pipeline runs on: hyparquet, sharp, i18n-iso-countries, and flagcdn for the flags.

Headshots are resized and cached on our own storage so we’re not hot-linking anyone’s bandwidth, and each is shown with its photographer’s credit. If any attribution here is wrong or you’d like a photo removed, please get in touch — we’ll fix it straight away.

Show code
statsEsc = window.statsEsc

_credits = {
  try { const r = await fetch(window.DATA_BASE_URL + "football/headshot-credits.json"); return r.ok ? await r.json() : {} }
  catch (e) { console.warn("[photo-credits] load failed:", e); return {} }
}
_ratings = {
  try { return await window.fetchParquet(window.DATA_BASE_URL + "football/ratings.parquet") }
  catch (e) { console.warn("[photo-credits] ratings load failed:", e); return null }
}
Show code
{
  const credits = _credits || {}
  const ids = Object.keys(credits)
  if (ids.length === 0) return html`<p class="text-muted">Photo credits are being compiled — check back soon.</p>`

  // player_id → name from ratings
  const nameById = new Map()
  if (_ratings) for (const r of _ratings) if (r.player_id) nameById.set(r.player_id, r.player_name)

  const rows = ids.map(id => ({
    player: nameById.get(id) || "—",
    author: credits[id].a || "Unknown",
    license: credits[id].l || "",
    url: credits[id].u || ""
  })).sort((a, b) => a.player.localeCompare(b.player))

  const intro = document.createElement("p")
  intro.className = "text-muted"
  intro.style.cssText = "font-size:0.88rem;margin:0.5rem 0 0.8rem"
  intro.innerHTML = `<strong>${rows.length.toLocaleString()}</strong> player photos, every one openly licensed. Search by player or photographer.`

  const wrap = document.createElement("div")
  wrap.appendChild(intro)
  const search = Inputs.search(rows, { placeholder: "Search player or photographer…" })
  wrap.appendChild(search)
  // re-render table on search
  const host = document.createElement("div")
  const draw = (data) => {
    host.innerHTML = ""
    host.appendChild(window.statsTable(data, {
      columns: ["player", "author", "license", "url"],
      header: { player: "Player", author: "Photographer", license: "Licence", url: "Source" },
      render: { url: (v) => v ? `<a href="${statsEsc(v)}" target="_blank" rel="noopener" class="player-link">Commons →</a>` : "" },
      sort: "player", reverse: false, rows: 50
    }))
  }
  draw(rows)
  search.addEventListener("input", () => draw(search.value))
  wrap.appendChild(host)
  return wrap
}
 

Pete Owen · Sydney · © 2026 · Source

My Teams | Settings | Photo Credits | Privacy | Disclaimer