尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Wharton Alum Champions League — Commissioner's Ledger
A web app for running the league: 22 seasons of history, keeper contracts, trade
approvals, and three separate sets of books (auction dollars, FAAB, real cash).
Seeded from FFL Stats and Keepers_2026 PreSeason.xlsx. The derived auction-dollar
ledger is reconciled against that workbook's Trade $$$ tab on every seed run.
There is no server. The repository is the database.
Anyone with the link can read everything. Only a token with push access can write.查看完整 README ↗A web app for running the league: 22 seasons of history, keeper contracts, trade approvals, and three separate sets of books (auction dollars, FAAB, real cash).
Seeded from FFL Stats and Keepers_2026 PreSeason.xlsx. The derived auction-dollar
ledger is reconciled against that workbook's Trade $$$ tab on every seed run.
There is no server. The repository is the database.
| Concern | Mechanism |
|---|---|
| Reads | Static JSON in public/data/, served by GitHub Pages |
| Writes | GitHub Contents API, straight from the browser — every change is a commit |
| Auth | A fine-grained GitHub PAT held in the commissioner's localStorage |
| Audit log | git log public/data/ — who changed what, when, and why |
| Live scores | A scheduled GitHub Action pulls Yahoo and commits live.json |
Anyone with the link can read everything. Only a token with push access can write.
npm install
npm run seed -- "C:/Users/tajar/Downloads/FFL Stats and Keepers_2026 PreSeason.xlsx"
The seed script needs Python with openpyxl. It regenerates every file in
public/data/ except cash.json, faab.json, and trade-queue.json — those
are owned by the app and are never overwritten once they exist.
npm run dev
In the repository: Settings → Pages → Build and deployment → Source: GitHub Actions.
Push to main and the deploy workflow publishes to
https://waclhq.github.io/.
The token stays in that browser. To revoke access, delete the token on GitHub — no redeploy needed. Because writes are commits, GitHub Pages republishes a minute or two later; until it does, the app holds your edits locally so the numbers stay right.
Status: approved, not yet provisioned. The invalid_scope wall this hit all
of last season was Yahoo gating its Fantasy API behind an application. That
application was approved on 10 September 2026; what remains are three steps
on Yahoo's side, listed under Finishing provisioning below. Nothing in this
repo is blocking.
The workflow runs on a schedule already and is safe to leave that way: it checks
for the four YAHOO_* secrets first and, when they are missing, writes a notice
and skips instead of failing, so an unprovisioned repo never mails a red run. A
manual run with no secrets fails on purpose, so pressing the button is never
answered with silence. Every run — provisioned or not — parses the fixture
first, so the payload parsers cannot rot while this waits.
Until the standings land, waiver claims are logged on the Finances page, which applies the same keeper-cost sliding scale automatically.
The action pulls standings and waiver transactions into
public/data/live.json. Until the first successful run the app simply omits the
live panels. FAAB bids that arrive this way are shown read-only on Finances, with
keeper cost already computed from the sliding scale.
These three are on Yahoo's side and cannot be done from this repo. They come from the approval mail (10 Sep 2026, Personal Use — API Access and Use Agreement):
Access is provisioned shortly after both the signature and that form arrive.
Yahoo countersigned the agreement on 21 Sep 2026; the permission had not yet
appeared on the app. Until it does, any token minted is refused with
additional_authorization_required, and the setup script cannot list leagues.
.github/workflows/yahoo-probe.yml asks Yahoo once a day whether the app may
request the Fantasy Sports scope (an unprovisioned app is bounced with
invalid_scope before any login) and says which in its run annotation. Once it
flips, mint a fresh refresh token and replace that secret; the old one does not
gain the permission. Delete the probe once the standings sync is green.
Create an app at https://developer.yahoo.com/apps/create/ with Fantasy Sports → Read permission. Note the Client ID and Client Secret. (If the approved app already exists, use it rather than making a second one — provisioning is tied to the client ID submitted on the confirmation form.)
Run the auth helper. It prints the refresh token and lists your league keys, so there is nothing to look up by hand:
YAHOO_CLIENT_ID=xxx YAHOO_CLIENT_SECRET=yyy node scripts/yahoo-auth.mjs
The league is Wharton Alum Champions League, id 134099, so the key the
helper prints for this season ends .l.134099.
Add four repository secrets:
YAHOO_CLIENT_ID, YAHOO_CLIENT_SECRET, YAHOO_REFRESH_TOKEN, YAHOO_LEAGUE_KEY.
Run Actions → Yahoo standings sync → Run workflow once by hand. Nothing
else needs switching on: the Tuesday and Wednesday runs start working by
themselves, the Ledger's live panel appears as soon as the first
live.json is committed, and the scoreboard appears the first game window
after that.
public/data/yahoo-map.json is pre-seeded with the 2026 team names, so teams
resolve to managers on the first run. If a team was renamed on Yahoo, the run log
and the dashboard both name it; add its Yahoo team key to that file.
Until Yahoo enables the app, .github/workflows/live-points.yml runs
scripts/live-points.mjs through every game window: it reads the week's
scoreboard and each started game's box score from ESPN's public endpoints,
scores every player in scripts/data/lineups.json with the league's Yahoo
scoring (the RULES object, copied from League > Settings: half-PPR, 5-point
passing TDs, -2 interceptions, yardage bonuses at 300 passing / 100 rushing /
100 receiving, and the league's points-allowed ladder), and publishes
points.json to the orphan points branch. The Ledger's Live points
panel reads it. Yahoo's numbers stay official; blocked kicks, returned extra
points and offensive fumble-return TDs are not in ESPN's box score and are
not counted. Each pass pulls the latest scripts, so a rules fix pushed during
the games applies within a couple of minutes.
The same file feeds the Live room (/live): this week's matchups from
scripts/data/matchups.json with win odds (each team's projection is
calibrated to Yahoo's at the moment the matchups page was read, then moves
with the real points), a strip of every NFL game with possession and red-zone
flags, a wire of touchdowns, 20-yard plays, turnovers and sacks with what each
was worth to whom, bonus chases, and a swing chart of each matchup's day.
lineups.json is a snapshot of Yahoo's roster export and must be refreshed
each week (or whenever a lineup changes) until the Yahoo sync can supply it,
and matchups.json each week likewise.
To test against real data, run the workflow by hand with a finished week
number; it scores that week once and publishes it.
A second job, .github/workflows/yahoo-scores.yml, runs scripts/yahoo-scores.mjs
every ten minutes inside the game windows (Thursday night, Saturday and Sunday
from 1pm ET, Sunday and Monday nights) and publishes this week's matchups —
points so far, Yahoo's projection, win probability — as scores.json on the
repo's orphan live branch. Not main: eighty commits a Sunday would bury
the trades and rulings that make main's log the audit trail, and a push to
live triggers no deploy. The branch holds exactly one commit and is rewritten
each time, and nothing is pushed unless a number moved. The site reads it from
raw.githubusercontent.com (src/lib/scores.ts), which caches for five
minutes, so the Ledger's scoreboard runs about a quarter of an hour behind
Yahoo and says so. It uses the same four secrets and the same skip-until-
provisioned guard as the standings sync, and renders nothing until the branch
exists.
node scripts/yahoo-sync.mjs --fixture scripts/fixtures/yahoo-standings.json
node scripts/yahoo-scores.mjs --fixture scripts/fixtures/yahoo-scoreboard.json
Both scripts share scripts/lib/yahoo.mjs (token refresh, one authenticated
GET, the two helpers that make Yahoo's JSON readable, the team → manager map)
and each still runs alone and writes only its own file.
/players/:name) — every roster appearance, salary, and
trade for any player the league has ever rostered.⌘K (or /) searches pages, managers, players, and
trades with subsequence matching, so jgib finds Jahmyr Gibbs.$200 − keeper salaries ± auction dollars traded for that season.
Negative budgets are allowed and flagged (El Morro entered 2026 at −$5).| File | Owner | Contents |
|---|---|---|
league.json | seed | Budgets, keeper slots, FAAB scale |
managers.json | seed | 16 managers; surname ↔ first-name mapping |
seasons.json | seed | 2004–2025 final tables |
keepers.json | seed | Ending rosters + keeper selections, 2015–2026 |
trades.json | seed | 34 structured trades, 2023–2025 |
trade-ledger.json | seed | Derived received/sent/net by year |
waivers.json | seed | 2025 FAAB claims |
legacy-trades.json | seed | Free-text trade log, 2013–2022 |
rules.json | seed | Rule sheet, verbatim |
trade-queue.json | app | Proposals and rulings |
faab.json | app | In-season waiver claims |
cash.json | app | Dues, payouts, side bets |
live.json | action | Yahoo standings |
yahoo-map.json | manual | Yahoo team key → manager id |
The stat sheets record surnames; the trade sheets record first names. The join was derived from the 2025 standings (team → surname) against the 2026 keeper sheet (team → first name):
| Team | Trades | Stats |
|---|---|---|
| Malikety Split | Tajar | Varghese |
| I Must Break You | Stu | Waldman |
| El Morro | Felix | Tollinche |
| SuperBowlJesus | Alex | Buzik |
| no ragrets | Jim | Incognito |
| Bridge N Tunnel | Dave | Konciak |
| Karma's L-Ah-Ma-tize | Anik | Mukheja |
| Whobody Wants It? | Nate | Snyder |
Baugh, Bernstein, Lalwani, and Velamoor use the same name in both. Evans, Banerjee, Kim, and Kurucz are former managers.
| Command | Does |
|---|---|
npm run dev | Local dev server |
npm run build | Production build into dist/ |
npm run typecheck | TypeScript, no emit |
npm run seed -- <xlsx> | Rebuild public/data/ from the workbook |
npm run yahoo:sync | Pull Yahoo standings (needs the env vars) |