fantasy-edge · every league you play, on one board

Every league
you play.
One board.

One of your leagues is on Sleeper, one is on ESPN, and nothing you own shows you both at once. This does — and it sizes every matchup by how much it can still change your week.

See a real board first Your Sleeper username is the whole sign-up. No login, no password, no account to create.
—

Three things it does

None of them is “more stats”.

Every league on one screen

A Sleeper league and an ESPN league are two apps that will never speak to each other, so on a Sunday you tab between them and compare from memory. Here they are rows on the same board — one place to answer the only question that actually matters: out of everything happening right now, what should I be watching?

Sized by what is still in doubt

Not by what is big. A back with a half still to play in a one-score game fills the screen; a matchup already decided shrinks away on its own. That is arithmetic, recomputed as the games move, not a layout somebody chose — and it is a couple of hundred lines you can read all of.

Where you actually watch football

This browser. Your phone, laid out for a thumb. The television across the room. And a native Vision Pro app that puts the game itself in the middle of your line-up. One model, ported by hand to each surface and checked against itself, so no screen waits on a server to be told how big to draw a cell.

01

Start with a league

Sleeper takes about ten seconds.

Already connected once? It comes back automatically — the connection is stored in this browser's localStorage and nowhere else.

—

See one before you connect anything

Nothing to type. One click, a whole season on the board.

The fastest way to understand what “sized by what is still in doubt” means is to look at a board where it has already happened.

The demo board is one real person's real season, with the people removed: NFL players are public figures and keep their names, but every manager and league name has been replaced with a generic label before the page was built. It is not your data, it is not sample data, and nothing on it will ever become yours — it is there to show what a connected league looks like.

Open the demo board

—

Questions

Including the two nobody asks out loud.

How do I find my Sleeper username? It's public

It is the display name your leaguemates see — the one on your avatar in the Sleeper app — not the email address you sign in with. That name is all this page asks for, and it is all Sleeper's public read API needs to list the leagues you are in.

Where do I find my ESPN league id? In the URL

Open your league on ESPN and read the address bar. It contains leagueId= followed by a run of digits, and those digits are the whole of it.

Paste them here with the season and this page asks ESPN directly, with no credential attached. If the league's visibility is public, ESPN answers. If it is private it returns 401, and you get the next question rather than an error code.

Do I need an account, a login or a password? No

No, and there is nothing to sign up to. This page is a file on a static host: no backend, no database, no session. Everything on it is fetched by your browser, directly from the provider.

Sleeper needs your username. A public ESPN league needs a league id. That is the entire list.

Will this page ever ask for my password, espn_s2 or SWID? Never

No — not now, and not once the extension below ships. espn_s2 and SWID are your live ESPN session: anyone holding those two cookies can read and change your whole ESPN account, not just look at your league.

A public web page that asks a stranger to paste a session cookie is indistinguishable from a page built to steal one, and it teaches exactly the habit phishing depends on. This project's own rules forbid a credential ever touching the repository, and a page served from the repository is not an exception.

So there is no input for one on this page, and there never will be. If you ever meet a page wearing this one's name and asking for those two cookies, it is not this one.

My ESPN league is private. What now? Coming soon

Coming soon: a browser extension. ESPN gives third parties no way to sign you in — no OAuth, no read-only key, nothing to apply for. The one legitimate route left is an extension that reads your own, already-signed-in session on ESPN's own domain and never carries it anywhere else. That is how FantasyPros reaches a private league, and it is the route this is taking.

Today, a private league already works on your own machine, where the cookie stays in your own environment and never leaves it: python3 -m fantasyedge api. See the quickstart. That is not a lesser option — it is the whole app, with history, analytics and the draft board.

Why is there no Yahoo button? Coming soon

Yahoo is coming; it is waiting on Yahoo. Their Fantasy Sports API now goes through a manual review before an application is approved, and this one is in that queue. The OAuth client is written and covered by tests; the review is the only thing left. No date is promised here, because nobody has one to promise.

There is a second reason the card is not clickable yet. OAuth needs a client secret, and a static page has nowhere to keep one: every byte shipped to your browser is readable by everyone who loads it. Publishing it would let anyone impersonate this application, and Yahoo would revoke it inside a day. So when Yahoo does arrive here, it arrives with the token exchange running somewhere a secret can actually live — not with a secret baked into this file.

Already have Yahoo API credentials of your own? The app on your own machine can use them today, where a secret can live in your environment: python3 -m fantasyedge auth --provider yahoo --url.

Whose projections are these? Two, and it says which

Two sources, both free, both named on every number. ESPN's own weekly projection rides along on the roster rows the app already pulls. Sleeper's comes from their public projections endpoint — no key, no cookie, no account — and is Rotowire's work published through Sleeper. The console lets you pick which one drives the board, or show them side by side, and the tile always says which one you are reading.

CBS, FantasyPros and Yahoo are not here yet, and they show as exactly that. CBS and FantasyPros sell an API key this project does not hold, and Yahoo is in the same review queue as the button above. They appear in the picker greyed out, saying what each is waiting on. They are never drawn as an empty column: a blank where a number should be reads as "nobody rates him", which is a claim about the player rather than about a licence.

A "consensus" here means the mean of what is actually loaded, and it prints the count. With two sources in, it says consensus of 2 — never "consensus" plain, which everywhere else in this hobby means five or six.

Where does my data go? Nowhere

Nowhere, because there is nowhere to send it. This page has no server behind it. Your username, league id and team choice are written to this browser's localStorage and read by nothing but this page.

No analytics, no cookies, no account. Clearing your browser data, or pressing Forget this browser on the board, erases the connection completely.

Which hosts does my browser contact? Five

These, and nothing else. A test in the repository asserts this list against the page itself, so a stray CDN or tracker added later fails the build rather than quietly appearing here.

api.sleeper.app — your Sleeper leagues, rosters, live points
site.web.api.espn.com — the public NFL slate, scores and box scores
lm-api-reads.fantasy.espn.com — a public ESPN league, unauthenticated
fonts.googleapis.com / fonts.gstatic.com — typefaces