Manager Score, aggregated across every dynasty league we have been able to index — so a good drafter in one league can be compared with a good drafter in another. Scores come from the same draft / trade / waiver maths as the per-league Manager Score section.
The Manager Score section ranks managers inside one league: mean 100, one standard deviation 15. That is useful, but it cannot compare leagues — the best manager in every league scores about 115 by construction. This page aggregates that same metric across every league we have indexed.
score = 100 + 15 × (wdraft·Zdraft +
wtrade·Ztrade + wwaiver·Zwaiver)
For each component, Z is built in two steps:
N/(N+k) on your
total transaction count, with the same constants the per-league
scorer uses (k = 6 picks, 3 trades, 5 adds).Shrinkage is applied at both levels on purpose. The per-league stage asks "how much evidence inside this league?"; this stage asks "how much evidence across the whole corpus?". They are different questions, and someone with one draft in one league should be pulled toward the middle by both. Neither stage can flip a sign or overshoot, so volume still cannot manufacture a good score.
The score is not re-centred on the corpus. If it were, everyone's number would move whenever an unrelated league was indexed, which makes a score impossible to quote. The score is stable; the rank is what carries the "against N managers" meaning.
A manager needs a minimum number of scored picks before appearing on the draft-specific board. Shrinkage alone would still leave a one-pick manager rankable, and "best drafter" computed off one pick is not an answer to the question.
Sleeper cannot be enumerated. There is no API endpoint that lists leagues, and league ids are 19-digit numbers, so there is no id space to sweep. The only way to find a league is to already know its id, or to find it through a person: a league tells you its members, and a member tells you their other leagues.
So the corpus is built by walking outward from a set of known leagues, a bounded number of hops per run, under hard caps on API calls, on leagues scored, and on wall-clock time. Every run reports the budget it used. This is a sample. It is never a census of Sleeper, and this page never claims otherwise.
It is not a random sample either, and that matters more than its size. A social-graph crawl reaches leagues that are socially near the leagues it started from — friends of friends, and people who play in several leagues with the same crowd. Whatever is true of that neighbourhood is over-represented here, and a league with no connection to it is not merely under-sampled but unreachable. More crawling does not fix that; only new, unrelated seeds do, which is what the submission path below is for.
The crawl compounds instead of repeating. The frontier, the leagues already examined and the scoring ledger are all committed to the repository, so each daily run resumes the walk rather than re-running it. Completed seasons are cached permanently — a 2023 transaction log is final — so re-scoring a league already in the corpus costs only its live season, and the daily budget goes to leagues we have never seen. Discovery is cheap (hundreds of leagues for about a hundred calls); scoring is the expensive half, which is why far more leagues are queued than indexed at any moment.
What we read. Only Sleeper's public, read-only, unauthenticated API — the same data any visitor to a league page can see: league settings, members' handles, draft picks, trades and waiver claims. No login, no private league data, nothing that required a credential.
What we store about a person. Their Sleeper
display_name — the pseudonymous handle they chose, like
pjstiehl — and their opaque Sleeper user id. That is all. We do
not collect, infer, look up or store real names, emails, avatars or any other
identifying detail, and no attempt is made to connect a handle to a real
person.
Only dynasty leagues. Filtered on Sleeper's own league type, not on the league's name. A league called "Deke Dynasty" that is configured as a keeper league is not indexed, because the platform does not call it dynasty and we are not going to invent a definition.
There is no "worst managers" board, and there will not be one. The boards are ranked best-first and the tail is simply the tail. These are real people playing a game with their friends.
Sleeper's API is free for non-commercial use; commercial use requires a
licence from Sleeper. This project is non-commercial, and that constraint is
recorded in docs/CROSS-LEAGUE-CORPUS.md so it survives any
future change of plan.
Submit your league id → That link opens a pre-filled GitHub issue. A daily job reads it, checks the id against Sleeper, adds it to the crawl's seed registry if it is a real NFL dynasty league, and closes the issue saying what happened. Your league is then scored on one of the following runs.
Why a GitHub issue and not a box on this page. This site
is a static GitHub Pages build. There is no server and no database behind it
— every page here is a file, and your browser cannot write to a file. A
text box that accepted your league id would have nowhere to send it, so it
would be a form that quietly threw your input away. A GitHub issue is the only
inbox a static site can offer that actually reaches us, and it has the side
benefit of being a public, revertible audit trail: every accepted league is one
line in data/cross_league/seeds.json carrying the issue number
that introduced it.
What is still not possible. Typing a league id into the Manager Score section does not add it here, and cannot. That page reads Sleeper live in your browser and shows you your own league; nothing it does can reach this corpus, because the only thing that can write to the corpus is a job running in CI. Getting indexed therefore takes the deliberate step above — it does not happen as a side effect of using the site.
Only submit a league you are in. Everyone in it will appear on a public leaderboard under their Sleeper handle. If a league is submitted that should not have been, say so on the issue and it will be removed.