尚未偵測到更新。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).