尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证On-device AI workout analysis. MediaPipe pose detection, seek-based frame extraction, rep counting, form scoring, biomechanics. React 19 PWA, zero backend.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
On-device AI workout analysis. Upload a video of your exercise, get rep counts, form scores, and biomechanical feedback. Everything runs locally in the browser — no server, no uploads, no account.查看完整 README ↗Film one set on your phone. The phone counts the reps, shows what it saw, and asks you to confirm. The video is analysed on the phone; the app sends it nowhere.
Live app (test version): david-dabert.github.io/workout-vision
Every number on this page comes from the scoreboard files in the repository, with their date (CLAUDE.md, R13).
Other sections (sports, equine, coaches, chat, nutrition, workplace ergonomics) were added on 12-14 October 2026. None of them is measured by the scoreboards below; read their numbers as demonstrations unless the screen says they come from your own data.
These hold for the rep counter, its result screen, its report, its PDF, its JSON file and the history. The other sections listed above are not covered here.
Labelled sets are counted by the same code the app runs, in CI on every push and pull request (npm run scoreboard, .github/workflows/ci.yml). Labels come from David or from human-annotated public datasets (R1).
David's sets (test/real-phone/accuracy/scoreboard.txt, 25 October 2026):
Public build half (test/real-phone/accuracy/public-scoreboard.txt, 25 October 2026): 1064 sets, 517 exact (49 %). Per dataset: Countix cut to its labelled window 203 of 447 exact (45 %), Countix whole 189 of 447 (42 %), CFRep 8 of 12, MM-Fit 117 of 158 (74 %). 44 of the 946 counted sets are off by 3 or more. Countix's two readings of a clip are not independent; by distinct clip, both readings are exact on 172 of 447 (38 %), either reading on 220 (49 %). Since 18 October a last rep the video stops at its working end counts (David's convention): Countix, whose labels count it, gained; MM-Fit, whose labels count whole reps only, lost 10. Since 20 October that rule reads the set's depth from one earlier rep instead of two, so a clip of two or three reps cut at its last working end counts that rep: Countix gained 12, no dataset lost a set. Since 25 October overlong reps in two-cycle sets (shorter cycle at least 0.8 s) and on the first sample are split, and the head return compares against one accepted rep: Countix gained 3 exact, off by 3 or more fell by 1.
Synthetic sets (test/real-phone/synth/synth.txt, last written 6 October 2026): two rendered bodies read by the app's pose detection, 96 sets: 74 exact (77 %), 13 off by 3 or more. Ranges of motion read on average 29 degrees (30 %) below the skeleton's truth, and phase times about 0.6 s short. Synthetic bodies are not people: these figures bound what the pipeline can do in clean conditions.
The video is decoded on the phone at 15 samples per second (src/lib/extractionConfig.js), and MediaPipe Pose Landmarker (full model, @mediapipe/tasks-vision 0.10.35) runs in a Web Worker on each sample. One joint angle per lift is taken from the 3D landmarks, smoothed with a Savitzky-Golay filter over 0.333 s (about 5 samples), and counted as full cycles away from the rest position and back, with thresholds from the set's own range (src/lib/counting/core.ts). A set is refused when the counted joint is seen on fewer than half the samples (src/lib/coreAnalysis.js). See ARCHITECTURE.md for the modules and data flow.
Pose detection, counting, storage and the PDF run in the browser on the phone. The app never uploads the video, its frames or the landmarks. What leaves the phone leaves by a tap: a shared report, a shared or downloaded file, a report of a wrong count by e-mail or GitHub issue.
The data-protection position of the app (GDPR and others) has not been reviewed; this README makes no compliance claim.
npm ci
npm run dev # dev server, this computer only
npm test # unit tests (Vitest)
npm run lint # oxlint
npm run typecheck # tsc --noEmit
npm run scoreboard # count every labelled set; fails on a lost exact count or a new error of 3 or more
npm run build # production build
Built with React 19, Vite 5, Vitest, Playwright and oxlint. Rules: CLAUDE.md; steps and current state: PLAN.md, STATE.md.
MIT: see LICENSE. The bundled fonts and the MediaPipe pose model keep their own licences.
Public benchmark data. Only landmark files derived through the app's own pose path are kept (test/real-phone/public/); no video or frame is in the repository or redistributed. RepCount-A (Hu et al., TransRAC, CVPR 2022), read from its Hugging Face mirror lmms-lab-eval/repcounta-lance, licence "other": the videos are YouTube's and the counts and rep marks TransRAC's; used as a research benchmark only (test/real-phone/public/repcount/, scripts/public/fetch-repcount-lance.sh), it decides no gate. Countix and MM-Fit: see scripts/public/countix.mjs and test/real-phone/public/mmfit/ATTRIBUTION.txt.
EquiVision cites Dyson & Greve (2016), J Equine Vet Sci 38:1-7: subjective gait assessment of 57 sports horses in hand, on the lunge and ridden (EquiVision cites it for one point: a horse that moves evenly in a straight line can be lame on the lunge or ridden. The paper defines no asymmetry index or threshold).