Zonara Trainer
Zonara Trainer – 피트니스 코치, 지원·개인정보 보호 정책·안전 약관
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Power rankings, a live waiver-wire feed and data-nerd stats for the NFL Fantasy Championship Sleeper league.
#lab/team) puts one team's season on eight animated paper widgets: playoff odds, key players, lineup efficiency, weekly scores, position groups, the schedule left, an all-play luck switch and a face off against any rival. Trades (#lab/trades) finds every 1-for-1, 2-for-1 and 1-for-2 swap that improves both starting lineups at a fair consensus value. League (#lab/league): rank flow, luck index, points for vs against, weekly finishes heatmap, position-group ranks, playoff odds, lineup efficiency, biggest games, players the experts disagree on, and waiver/trade ROI.| Data | Where it comes from | How fresh |
|---|---|---|
| Rosters, scores, matchups, transactions | Sleeper API, via /api/league | Once each morning (6am Central), cached on the CDN for everyone |
| ROS rankings (FantasyPros, DraftSharks, LeagueLogs) | api/ros.js, a Vercel serverless function | Pulled once per day (first visitor each day, Central time), then cached at Vercel's edge |
| This week's player projections (FantasyPros API and Sleeper, averaged) | api/ros.js, alongside the rankings | Once per day, with the rankings; they drive the Games tab |
No cron job: the page requests /api/ros?d=YYYY-MM-DD, so each new day is a new cache key. If one ranking source fails, the others are still used and that response is only cached for an hour so it retries soon.
vercel.json sets the build (npm ci, npm run build, output dist), so the other settings can stay at their defaults. The build needs Node 20.19+ or 22.12+ (Project Settings → Build and Deployment → Node.js Version).https://<project>.vercel.app; share that link with the league.The site is built with Vite and is moving to React a page at a time (the Team dashboard is the first). To work on it locally: npm install once, then npx vercel dev and open http://localhost:3000 (or npm run dev for the page alone, without the API). Add ?demo=1 to the URL to see the saved Week 7 snapshot without calling any APIs.
The Games tab projects each matchup from this week's player projections: FantasyPros' and Sleeper's, averaged. Sleeper needs no setup. For FantasyPros, add an environment variable FANTASYPROS_API_KEY (your key from https://secure.fantasypros.com/api-keys/request/) in the Vercel project's Settings → Environment Variables, then redeploy. Without it the Games tab runs on Sleeper's projections alone.
The league desk is the discussion panel beside the headlines. Anyone can read it; only managers who have opened their personal link can post, and only Dan can delete. It uses the same Upstash store as fan picks, so set that up first.
TALK_ADMIN_KEY: any random string of 16 or more letters, numbers, - or _ that only you know. Redeploy.https://<your site>/#join=<that key> once on each of your devices. That signs you in as Dan.A new link for someone replaces their old one and signs out every device that used it, so a leaked link is one click to fix. Authors can edit a comment for a minute after posting.
Fan votes on the Games page need somewhere shared to live. Everything else works without it; until it's connected the voting box just doesn't appear.
KV_REST_API_URL and KV_REST_API_TOKEN variables.Optional: add an environment variable VOTE_SALT with any random string; it's mixed into the hashed IP addresses used for the per-network vote cap.
How it works: each phone keeps a random voter id, so voting again from the same phone switches the pick instead of adding one. One network can cast at most 3 votes per matchup (so a few friends on the same Wi-Fi still can), voting closes as soon as the week's first points are scored, and tallies stay visible to everyone. It's built for fun among friends, not to stop a determined cheater.
| What | Where |
|---|---|
| League ID, time zone | top of app.js (LEAGUE_ID, TZ) |
| Power-score weights | WEIGHTS in lib/engine.js |
| Source weights (LeagueLogs counts half by default) | SOURCE_WEIGHTS in lib/consensus.js |
| Rank-to-value curve | VALUE_DECAY in lib/consensus.js |
| Tier labels and explanation wording | tierFor and explain in lib/engine.js |
| Name mismatches between sites and Sleeper | NICKNAMES in lib/consensus.js |
Check /api/ros in the browser to see how many players each source matched (sources.*.matched).
index.html, styles.css, app.js the site: the frame, the data and the headlines
src/ the pages, in React (one folder each), the charts and the shared bits
lib/engine.js power score, explanations, playoff simulation, transaction grading
lib/consensus.js matches ranking rows to Sleeper IDs and blends the three sources
lib/sources.js parsers for each ranking site
lib/weekly.js this week's projections: FantasyPros + Sleeper, averaged
api/talk.js the league desk: one discussion thread a week, personal sign-in links
api/ros.js daily rankings endpoint (Vercel function)
demo/demo.json saved Week 7 snapshot for ?demo=1
fixtures/, scripts/ saved source data and tests (node scripts/test-engine.mjs)
The parsers read specific page structures: FantasyPros' embedded ecrData, DraftSharks' /ros-rankings/load-rows table rows, and LeagueLogs' rankings table. If a site redesigns, that source shows as offline on the Rankings page and the other two carry the score until the parser in lib/sources.js is updated.
Rankings data belongs to FantasyPros, DraftSharks and LeagueLogs; league data comes from the Sleeper API. This is a personal, non-commercial league site.