# GitFut caps raw stats at 88 and lets logarithms decide the trophies

> GitFut is a Next.js site that reads a GitHub profile through the GraphQL API and renders it as a football player card, with six signals mapped to six stats and a trophy cabinet judged year by year. The scoring rules are written down in public, which makes the interesting parts the thresholds rather than the styling.

**Younesfdj/gitfut** — Your GitHub stats, turned into a World-Cup-style player card 

- Repository: https://github.com/Younesfdj/gitfut
- Website: https://gitfut.com/
- Stars: 2,637 · Forks: 138
- Language: TypeScript
- License: MIT
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/younesfdj-gitfut

## Six GitHub numbers become six football stats

The whole product is one mapping table. Pace is commits in the last year, Shooting is stars earned across repos, Passing is pull requests plus followers, Dribbling is language diversity, Defending is reviews plus issues, and Physical is lifetime contributions. All six are read straight from GitHub's GraphQL API against a live profile, and the page is pointed about the sourcing rule: no surveys, no self-reporting, just the commits. What you get back is an overall, a position and an archetype, and the latter two are read from the shape of the stat spread rather than from a lookup, so a shooting spike scouts a poacher up top while a lean towards defending and passing scouts a deep playmaker. The overall has a ceiling worth knowing about, because raw stats cap at 88 and the 90s are described as a legacy gate earned with years and influence, so a single extraordinary year cannot crown anyone an Icon.

## One score per year, with logarithms as the anti-spam

The trophy cabinet is computed from per-year totals rather than from career totals. Every scout fetches the profile's full history as commits, pull requests, reviews, issues and private contributions for every calendar year since the account existed, and each year is judged on a single number:

```
yearScore = 4·log(commits) + 3·log(PRs) + 3·log(reviews) + 2·log(issues) + 2·log(private)
```
The logarithms are named in the page as the anti-spam mechanism, and the published arithmetic shows why. Twenty thousand commits score 17.2, barely ahead of the 13.2 that two thousand earn, so ten times the volume on one axis buys very little. A year with 800 commits, 80 pull requests, 80 reviews and 40 issues scores 26, because every term contributes. The honest caveat is printed in the same paragraph: there is no balance requirement, so a commits-only kernel maintainer still scores on the volume terms alone.

## The Ballon d'Or needs two years and one of two paths

This award is judged against your own career, so it needs at least two years of history before it can be won at all. A year qualifies only by clearing three gates: 2,000 or more raw contributions, a score of 16 or more, and one of two paths. The spike is 1.2 times your career-median year, which catches the undeniable season in a modest career. The elite is a score of 19.5 or more with the ratio waived, and the reasoning is that a sustained-great career has a median so high that no single year can tower over it, which is exactly the case the award exists for. Repeats climb a ladder keyed to the card's overall: 80 holds one, 87 unlocks a second, 94 a third, and an Icon may take a fourth but only for a monster year scoring 28 or more. The current year competes while still in progress, and it can only under-score, never over-score.

## Five World Cup windows, each with its own bar

The tournament trophy is one per edition, judged inside each tournament window and era-adjusted, because GitHub in 2010 was a different sport. The five windows and their bars are explicit: South Africa 2010 from 11 June to 11 July needed mere presence, since shipping on GitHub at all was the distinction; Brazil 2014 from 12 June to 13 July needed a handful of contributions; Russia 2018 from 14 June to 15 July needed a real window at 1.2 times your usual pace; Qatar 2022 from 20 November to 18 December needed a strong window of roughly ten contributions a day at 1.3 times; and North America 2026 from 11 June to 19 July repeats that Qatar bar. The pace test compares your daily rate inside the window against your daily rate across that same year, so the test is relative to you. The current year is paced over its elapsed days rather than 365, which stops a routine mid-year from looking like tournament form against a diluted average.

## Two of the four trophies are not really earned

The Golden Boot is the only trophy held on current form rather than kept for life. It has no year attached and is re-judged on every scout, and it needs a scoring position, listed as ST, RW or CAM, plus Shooting of 80 or more. Star power is the shooting stat itself, so the award goes to a finisher whose repositories keep scoring, and the page puts it plainly: lose the form, lose the boot. The World Cup Trophy is not a performance award at all. Spain won WC26, and every profile whose GitHub location reads Spain lifts the trophy with it, bronze cards included, with no floors and no other conditions. It keys off the country GitHub reports, decided before the flag picker exists, which is why switching your flag with the country override mints nothing. Every other trophy needs an overall of 80 or more, a floor rather than a driver.

## A duel shows the cabinet, it never adds to it

Two mechanics are worth separating because they are easy to conflate. Duels are a display feature: a duel showcases what each player brings, carrying trophies into the comparison like a boxer's belts, and it never awards anything itself. The cabinet is computed server-side at scout time and cached with the card, so what you see on a card is the result of one computation, and every trophy attached to it carries the year or World Cup edition it was won in plus the reason it was given. The trophy art is deliberately static: the sprites are pre-baked rotating images with no 3D runtime, baked by scripts/bake-award-sprites.ts. The practical consequence is that a card is a snapshot with an explanation attached, and re-scoping is what changes it, not any interaction inside the page.

## A card is a URL, and three forms of it

The card lives at a URL, which is why embedding it is one line of Markdown in a profile README, a portfolio, or anywhere else:

```md
[](https://gitfut.com/YOUR_USERNAME)
```
Three forms of that URL do different jobs. The .png form, gitfut.com/<username>.png, is the live image that a README will actually display. The bare form, gitfut.com/<username>, is the full scout report where the trophies are explained. And a country query, ?country=XX, overrides the flag shown on the card, with ?country=DZ given as the example. The dependencies explain how the image form is produced: sharp for server-side image work and html-to-image for the client side, with ioredis for the caching layer that holds the computed cabinet between scouts.

## The container is unprivileged, and holds no Redis

The Dockerfile is a four stage build on node:22-alpine. A deps stage installs the compatibility library libc6-compat, copies the manifest and the lockfile, and runs npm ci, so the install is reproducible from the lockfile rather than resolved fresh. A builder stage copies node_modules, copies the tree, disables Next.js telemetry and runs the build. The runner stage then creates a system group and a system user, both at 1001, copies the public directory and the standalone output with .next/static beside it, switches to that user, exposes port 3000 and starts node server.js with the hostname pinned to 0.0.0.0. Two things are absent from that image: no Redis service, since ioredis expects one to be provided outside the container, and no release tags, since the repository has none and the manifest version is still 0.1.0 with the package marked private.

## Conclusion

GitFut fits anyone who wants a shareable profile card and does not mind the metaphor dictating the emphasis: the six signals weight commits, pull requests and reviews heavily, and breadth across all five activity terms beats raw volume on one. It does not fit a profile whose work is mostly private contributions, because those are weighted last alongside issues, and it does not fit anyone treating the card as a leaderboard, since the top band is closed: raw stats stop at 88 and the 90s are reserved for accounts with years and influence behind them. Before embedding a card, check three things: whether the .png URL or the full report suits you, because the image is what you embed and the report is where the trophies are explained; that you leave the country override alone if you are not actually in Spain, since the trophy keys off the country GitHub reports and overriding the flag mints nothing; and that the cache is per scout, because the cabinet is computed server-side and a Gold Boot is re-judged every time the page is regenerated, so losing form loses the boot. Licence is MIT, the package version is 0.1.0, the repository has no releases, and the last push was 5 August 2026.

## FAQ

### What is GitFut?

It is a site that turns a GitHub profile into a football player card, reading six signals straight from GitHub's GraphQL API: commits in the last year for Pace, stars for Shooting, pull requests and followers for Passing, language diversity for Dribbling, reviews and issues for Defending, and lifetime contributions for Physical. The result is an overall, a position and an archetype, with raw stats capped at 88.

### How do I embed a GitFut card in my GitHub profile?

Put the Markdown image link in your README: `[](https://gitfut.com/YOUR_USERNAME)`. The .png form of that URL is the live image, the bare form is the full scout report with the trophy explanations, and a `?country=XX` query overrides the flag shown on the card.

### How does GitFut decide who wins the Ballon d'Or?

Each calendar year is scored on its own, on a log-scaled formula over commits, pull requests, reviews, issues and private contributions, and a year has to clear three gates: 2,000 or more raw contributions, a yearScore of 16 or more, and either 1.2 times your career-median year or a yearScore of 19.5 or more with the ratio waived. Repeats need an overall of 80, then 87, then 94, and a fourth only for an Icon with a yearScore of 28 or more.

### Can I get the World Cup Trophy by changing my country flag?

No. The trophy is a gift carried by every profile whose GitHub location reads Spain, with no floors and no other conditions, and it keys off the country GitHub reports, decided before the flag picker exists. The `?country=` override changes the flag on the card and mints nothing.

## Sources

- [Issues](https://github.com/Younesfdj/gitfut/issues)
- [License: MIT](https://github.com/Younesfdj/gitfut/blob/master/LICENSE)
- [Project website](https://gitfut.com/)
- [README](https://github.com/Younesfdj/gitfut/blob/master/README.md)
- [Younesfdj/gitfut on GitHub](https://github.com/Younesfdj/gitfut)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/younesfdj-gitfut
