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 dark-mode sports betting intelligence dashboard with an HUD / sci-fi aesthetic.
Pick a sport → browse today's slate → drill into a game for deep analysis across
matchup, form, roster, and sport-specific modeling tabs.檢視完整 README ↗A dark-mode sports betting intelligence dashboard with an HUD / sci-fi aesthetic. Pick a sport → browse today's slate → drill into a game for deep analysis across matchup, form, roster, and sport-specific modeling tabs.
MLB · NBA · WNBA · NFL · NHL · NCAAB
The only machine-learned component is the MLB first-5-innings money line model
(XGBoost, trained offline in CI). Every other "model" in the app is transparent,
inspectable arithmetic — Log5 matchups, Binomial/Poisson distributions, additive
scoring — and each score carries a why string or a methodology entry naming its
source, endpoint, inputs and formula.
Frontend — no build step, by design.
React 18 + Babel Standalone from a CDN; .jsx files are transpiled in the browser.
No bundler, no TypeScript, no npm-installed React. Fonts are Orbitron (display) and
Space Mono (everything else).
Backend — zero dependencies.
Pure Node http + https on port 3001. No npm packages at all, in-memory caching
(10-second minimum for the live game feed, 2 min for other MLB data,
15 min for historical BvP). Live updates use SSE with a polling fallback.
Data sources. ESPN's public API (no key), the MLB Stats API, and Baseball Savant. Claude (Haiku) is called directly from the browser with a user-supplied key.
# 1. Backend (port 3001, no install step — there are no dependencies)
./server/start.sh # daemonizes, logs to server/server.log
# or: node server/index.js # foreground
# 2. Frontend — any static server from the repo root
python3 -m http.server 8000
Open http://localhost:8000. The frontend auto-detects localhost and points at
http://localhost:3001, ignoring the production backend URL, so local dev works
without editing anything.
Check the backend is up:
curl http://localhost:3001/api/health
To use AI Plays, paste an sk-ant-… key into the input in the top nav. It is stored
in localStorage and sent only to Anthropic.
index.html Shell: CDN scripts, nav, API-key input, global CSS
frontend/
data/ Fetchers + models, split shared/ + per-sport
shared/ui-atoms.jsx Primitive UI components (HudCard, Sparkline, …)
shared/tabs/ Sport-agnostic tabs
shared/screens/ Home / Games / GameDetail
sports/{mlb,nba,nfl}/ Sport-specific tabs
server/
index.js Node HTTP server (port 3001)
mlb/ nba/ Per-sport services and endpoints
data/f5_model.json Committed XGBoost model (CI writes this)
ml/ Offline Python training pipeline (runs in CI, not the app)
Note:
data-layer.js,tabs.jsx,screens-v2.jsxandui-atoms.jsxin the repo root are dead legacy files left over from a reorg.index.htmldoes not load them. Always edit underfrontend/.
Scripts communicate through window. With no bundler, each file ends with an
Object.assign(window, { … }) export and later scripts read from there. The load
order in index.html is load-bearing: data layer → atoms → tabs → screens → app.
Backend URL resolution (frontend/data/shared/core.js), in order:
window.PIQ_API_BASE → localhost shortcut → the <meta name="piq-api-base"> tag →
localhost fallback.
The F5 model's train/serve parity is a contract. Features are defined once in
ml/f5_common.py and server/data/f5_feature_spec.json, and must be computed
identically by the Python collector and the live buildF5Features(). Training
embeds parity samples so the Node scorer self-checks to ~1e-7. Change a feature on
both sides, then retrain.
render.yaml blueprint. On the free tier
the service sleeps after ~15 min idle, so the first request after a nap takes
~30s. After deploying, point <meta name="piq-api-base"> in index.html at the
service URL..github/workflows/train-f5.yml retrains weekly, commits the model
JSON, and Render auto-deploys it.:root in index.html; wrap card-shaped content in HudCard.Object.assign(window, …) export at the bottom
of their file, or the next script won't find them.CLAUDE.md holds the full blueprint: file-by-file responsibilities, per-sport
gotchas, and how to add a tab, data source, or sport.
PlayIQ is an analysis and research tool. Nothing it outputs is betting advice, and no model here predicts outcomes reliably. Bet responsibly, or don't.