Setup
Connect the league, then print the paper
The official Yahoo Fantasy developer app can take weeks. Until it shows up, The UnAthletic reads the same league feed the Yahoo website uses. You do not give it your password.
1. Copy your league id
Open the league and look at the URL. The number after /f1/ is the id. Several leagues can be comma-separated.
https://football.fantasysports.yahoo.com/f1/1234567
2. Copy a browser cookie if the league is private
Log in, open the league, then press F12. Open Network, refresh, and click any request to fantasysports.yahoo.com. Copy the request header named Cookie. Paste it into .env as YAHOO_COOKIE.
That cookie is a logged-in session. Treat it like a password, keep it out of git, and grab a new one when a sync says Yahoo refused the league. Public leagues can skip this step.
3. Sync
copy .env.example .env npm run sync
On PowerShell, copy .env.example .env works. The snapshot lands in data/leagues and the site reads it on refresh.
4. Free writing, if you want it
With no key, npm run newsroom still publishes a full edition. The desk writers use the real standings, scores, and transactions, in their own voices.
For looser columns, Groq and Google Gemini both have free API keys and do not ask for a credit card on the free plan. Limits change, so check the signup page. One column an hour stays on the free plan. If the model is out of tokens for a minute, that hour is skipped and the next hour tries again.
Groq: console.groq.com/keys. Put the key in GROQ_API_KEY.
Gemini: aistudio.google.com/apikey. Put the key in GEMINI_API_KEY. If both are set, Groq goes first.
5. The hosted paper updates itself
On the live site, one new column files each hour from 7:00am to 10:00pm ET. Quiet overnight hours stay quiet. Locally, npm run desk does the same job, and it also stays quiet outside those hours.
On Thursdays, Sundays, and Mondays, the scoreboard refreshes about once a minute while games are usually on: Sunday morning through the late window, and Thursday and Monday night. That refresh is read straight from Yahoo while the page is open. It does not save a new copy of the league every minute.
When Yahoo approves the official app, the sync can be swapped for OAuth without changing the site. The pages already read a saved league file, not a live password.











Christian McCaffreyRuntime Ravens30.7
Malik NabersTiger Wish-He-Could28.5
Trevor LawrenceNull Pointers28.3
Kenneth Walker IIITiger Wish-He-Could27.9
Tyler ShoughNull Pointers27.0
Tre TuckerBotnet Blitz26.7
Germie BernardDallas Cowsay25.7
Jaxon Smith-NjigbaPacker Capture25.4
Bhayshul TutenDallas Cowsay24.7
James Cook IIINull Pointers24.3
Isaiah LikelyGridiron Garrison23.9
Drake MayePhishing for Touchdowns23.8
D'Andre SwiftNull Pointers23.0
Matthew GoldenPacker Capture22.4
Jordan LovePacker Capture21.2