BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
Lineup Card turns force plate, GPS and wellness exports into one page each morning: which players to talk to before they train, and why. Working demo with invented data.
翻譯準備中
運動與健身Python · HTMLGitHub @maurocastillomd上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Morning readiness brief for a performance staff: wellness, HRV and jump tests in one report. Code computes every number; the AI never writes one. Synthetic data.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗A multi-domain morning readiness brief for a performance department.
It reads the streams a staff already collects — subjective wellness, HRV, neuromuscular (CMJ), plus training load and GPS — and posts one short message before the athletes walk in: who to review, who to watch, and why. Thirty seconds to read. The staff gets their morning back.
Built by Mauro Castillo, MD, MS, CSCS, RSCC, CPSS. Concept walkthrough: maurocastillomd.com/readiness.
The AI does not write numbers. And it surfaces availability — it never predicts injury.
Code reads the data and computes every baseline, z-score, and flag. The model
only takes a fact that is already true and says it in plain English. Every
number in the model's output is checked against the numbers the engine actually
computed (narrate.py); one invented number and the
output is discarded for a deterministic template. And nothing here forecasts
injury — no screening test predicts individual injuries with useful accuracy
(see SCIENCE.md). It surfaces individual change so a human acts
earlier.
Three response domains, each measured against the athlete's own 28-day baseline, sign-normalized so a decline is always a negative z:
Status escalates on convergence: any domain past −2.0 z is REVIEW, and so is agreement across domains (two response domains at or under −1.2 z). One domain down is MONITOR. Flagging on domains that agree beats flagging on any single number.
Load is context, never a flag. Internal load (sRPE), external load (GPS), and the acute:chronic workload ratio explain the "why". They never set status — ACWR in particular is a flawed ratio with no evidence for load management. See SCIENCE.md for the citations behind every one of these choices.
adapter -> merge -> engine -> anonymize -> narrate -> verify -> Slack
(data in) (identity (all math, (names off) (one LLM (numbers (names back
resolved) convergence) call) checked) on, out)
adapters.py) — every source returns
the same Reading objects. Ships a synthetic-CSV adapter standing in for real
devices (VALD, Catapult, a wearable, a wellness form).merge.py) — resolves one athlete across
sources that name people differently (the real janitor work of team data).engine.py) — the deterministic core, no
AI. Individual baselines, per-stream freshness, convergence status, load context.anonymize.py) — names come off
before the model. It works on "Athlete 7"; code re-attaches the name after.narrate.py) — the only file that
talks to a model, plus the number guard. No API key? Templates run everything.brief.py) — assembles the message and posts
it to a Slack webhook../run.sh # run the morning brief (creates .venv)
./run.sh --post # also deliver to $SLACK_WEBHOOK_URL
.venv/bin/python scripts/generate_data.py # rebuild the synthetic squad
.venv/bin/python -m pytest # the test suite
ANTHROPIC_API_KEY (in a local .env) enables Claude
phrasing; without it the deterministic templates run.
data/ is synthetic. Invented names, generated numbers.fetch() interface against a vendor API. They are not in
this repo: credentials, data agreements, and CBA governance belong to a team
engagement.See SCIENCE.md for the evidence base and citations.