OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A fantasy football decision dashboard for your ESPN league — lineup building, free-agent scouting, trade analysis, and a heuristic AI Coach. Built with Vite + React + TypeScript.
Default setup: Ten Idiots League (ESPN #973201555, 2026), managing Tush Pushers. Read-mostly companion — it does not submit lineups, waivers, or trades back to ESPN.
Requires Node.js 18+ and an OpenAI key in a local .env (see .env.example).
• Web — http://localhost:5173 (proxies /api → the API)
• API — http://localhost:8787 (OpenAI tool loop; key stays server-side)查看完整 README ↗A fantasy football decision dashboard for your ESPN league — lineup building, free-agent scouting, trade analysis, and a heuristic AI Coach. Built with Vite + React + TypeScript.
Default setup: Ten Idiots League (ESPN #973201555, 2026), managing Tush Pushers. Read-mostly companion — it does not submit lineups, waivers, or trades back to ESPN.
Requires Node.js 18+ and an OpenAI key in a local .env (see .env.example).
cp .env.example .env # then set OPENAI_API_KEY
npm install
npm run dev # Vite (:5173) + Roster Sensei API (:8787)
npm run dev starts both:
http://localhost:5173 (proxies /api → the API)http://localhost:8787 (OpenAI tool loop; key stays server-side)On Vercel, the same /api/chat route is a serverless function (api/[[...route]].ts) — no second process. Set OPENAI_API_KEY in the Vercel project env (see docs/vercel-redeploy-sensei.md).
Useful scripts:
npm run dev:web # Vite only
npm run dev:api # API only
npm run build # type-check + production bundle → dist/
npm run preview # serve the production build
| Tab | What it does |
|---|---|
| Build roster | Fill starting slots from your team (and FAs); drag-and-drop; lineup edits persist in localStorage |
| Free agents | Need-aware pickup recommendations + browse/search the FA pool |
| Lineup | Starters + projected total; optional auto-optimize sandbox |
| Trade analyzer | Build give/get packages; week vs rest-of-season fairness (VOR / rank-based) |
| AI Coach | Position outlook vs league average + suggested trades (heuristic math, not an LLM) |
| League | Scout all 12 teams; jump into the trade analyzer |
| Chat with Roster Sensei | Agentic fantasy Q&A (OpenAI + tools); uses the header's selected team by default |
Use the header team picker to manage or scout any squad in the league.
The Refresh from ESPN button updates, live from ESPN’s public APIs:
It does not rebuild who owns whom. Roster membership and the FA pool still come from the bundled snapshot under src/data/. A scheduled GitHub Action (.github/workflows/sync-snapshot.yml) runs npm run sync:snapshot every 6 hours and auto-commits + pushes to main when it changes, which triggers the normal Vercel deploy — so this should stay in sync on its own. Run npm run sync:snapshot by hand if you need it sooner than that, or if the Action's push access is disabled (see below).
Refresh calls ESPN from the browser. ESPN’s CORS headers currently allow this for the configured league; if that changes, the button surfaces an error instead of failing silently.
src/
data/ Bundled ESPN snapshot: your team, league rosters, free agents
config/ Tunable knobs:
league.ts — league identity, ESPN URL, slots/positions, colors
scoring.ts — player-valuation constants
trade.ts — trade fairness + AI Coach suggestion counts
pages.ts — tab bar (add / remove / reorder pages here)
lib/ Pure functions: scoring, roster needs, trade engine, ESPN + news clients
hooks/ State: useFantasyApp, useProjectionRefresh, useNewsFeed, useDragAndDrop
components/ Shared UI (header, nav, badges, news modal, …)
pages/ One file per tab — mostly markup; state comes from the `app` prop
App.tsx Header + active page
src/config/league.ts at your ESPN league/season and rename your team.src/data/.src/config/scoring.ts and src/config/trade.ts.src/config/pages.ts.OPENAI_API_KEY on the server only. See docs/roster-sensei-agent-tools.md.