Sleeper League Dashboard
I play in multiple dynasty fantasy football leagues. Between standings, roster ages, trade activity, and playoff positioning, there’s a lot to keep track of — and none of it lives in one place.
The Sleeper app is great for managing a roster. It’s not great for stepping back and asking: is my league healthy? Who’s actually contending? Who’s rebuilding? Who hasn’t made a move in six weeks?
So I built something that answers those questions.
What it does
The Sleeper League Health Dashboard is a single-page web app that pulls your league data from the Sleeper API and surfaces it in one view. You enter your Sleeper username — or paste a league ID directly — and it loads:
- Standings and playoff picture with current streak, points for/against, and clinch/bubble/elimination indicators
- Roster age and dynasty health with per-team average age bars color-coded by contention window, plus a league-wide age distribution chart
- Trade and waiver activity with a recent transaction feed, week-by-week volume chart, and a per-manager activity score
- Manager spotlight — click any team to expand their full roster, age breakdown, and recent transaction history
It supports multiple leagues. Enter your username and it shows all your leagues for the current season.
How it’s built
The whole thing is a single HTML file. No framework, no build step, no backend. The Sleeper API is public and CORS-friendly, so everything runs directly in the browser.
I used vanilla JavaScript for the data layer and most of the UI, and brought in Chart.js via CDN for two places where a real chart earned its keep — the age distribution histogram and the transaction volume timeline. Everything else (age bands, activity bars, playoff indicators) is pure CSS.
The player database is the heaviest fetch, so I cache it in localStorage after the first load. Subsequent loads are noticeably faster.
One thing worth noting: the Sleeper API doesn’t expose a current week endpoint in the obvious place. It’s buried in /state/nfl, which returns the full NFL calendar state. Once I found that, I could drive all the matchup and transaction fetches off of it automatically.
What I learned
The most useful tools solve a specific, annoying problem for a real audience. Every dynasty manager I know has felt the friction of piecing together league context from multiple places. This removes that friction.
It also reinforced the value of getting the data architecture right before touching the UI. Parallel fetches, sensible caching, clean separation between data and rendering — all of that made the build much smoother than it would have been otherwise.
What’s next
- Dynasty value integration (KeepTradeCut or similar) so the roster age view has market context
- Shareable per-manager links
- Historical season comparison
The code is on GitHub if you want to run it against your own league.