A frontend-only React + TypeScript rowing-motion research workspace for Netlify static hosting. Pose estimation, angles, stroke detection and scoring run in the visitor's browser. No Python server, API endpoint, Netlify Function, database or API key is required.
Research prototype only: not a medical or validated technique-assessment product.
Use Node 22 LTS (also configured for Netlify):
npm ci
npm run devOpen Vite's local URL. The first start/build downloads and verifies the notebook's Heavy model if not cached. This is a build-time asset download, not cloud inference. Source files remain unchanged.
The included netlify.toml sets:
- Build command:
npm run build - Publish directory:
dist - Node version:
22 - No backend, functions, API proxy or secrets
Connect your Git repository to Netlify using the project root as the base directory. Include package-lock.json, scripts/, src/, netlify.toml and the original source/ files. Generated static assets are ignored and recreated during build.
For manual deployment:
npm ci
npm run buildUpload the complete dist folder to Netlify—not the source folder or just index.html. The generated site is about 54 MB, mostly model/WASM. Keep its media, vendor, models, manifest and worker files.
Before publishing: bundled coach/candidate recordings become publicly accessible site assets. Obtain permission to distribute both. Selected user files are processed locally, not uploaded.
See Netlify's Vite guide. This single-page app uses tab state, not history routes, so it needs no catch-all rewrite.
npm test
npm run build
npm run previewOpen the preview URL, normally http://127.0.0.1:4173. No Python process is needed. Tests compare TypeScript against reproducible Python-generated synthetic fixtures, with absolute Float64 tolerance 1e-9. That is numerical software equivalence, not pose accuracy. See optional reference instructions.
- Review the reference and Method & limits.
- Select/drop one supported fixed full-body side-view video, and confirm capture suitability.
- Choose pixel-corrected or original notebook coordinates and the candidate's facing direction.
- Click Analyze & compare. Actual sampled-frame progress appears; first analysis also processes the reference. Allow several minutes on slower devices. Cancel analysis stops the worker.
- Inspect overlays, RMSE, raw/interpolated/smoothed signals, catches and timing. View catch seeks to a sampled boundary.
- Export JSON/CSV with permission: reports contain landmarks and file hashes.
RMSE is a difference in degrees, not a 0–100 grade, safety rating or injury prediction. Notes identify differences to discuss with a coach.
The supplied Video.mov reference is side-facing; Video_1.mov is front-facing. The latter is previewable but rejected from scoring, including renamed copies. Use another side-view clip for independent evaluation. Selecting the reference itself is an explicitly labeled self-comparison software check.
- Browser-supported MP4/MOV/M4V/WebM: actual codec must decode in the browser. H.264 MP4 is a practical choice.
- Engineering limits: 100 MiB, 120 s, 3,600 sampled frames, 4K, one active run per page—not scientific thresholds.
- Schema v2 sampling: seek at 30 Hz.
fps, frame indices and counts refer to the sample grid, not native encoded frames. Original frames can repeat or be skipped. This is not exact OpenCV frame extraction. - Same Heavy model, pinned MediaPipe Web 0.10.21, CPU worker. Browser/Python inference parity is unproven. Web-SDK presence is unavailable and exported as null.
- App requests only static assets from its origin; it contains no video-upload request. One reference sequence is cached in page memory. Results are not persisted by the app; reload/close clears app state. Public HTTP asset caching is separate.
- HTTPS or localhost, WebAssembly, Workers, OffscreenCanvas and ImageBitmap are required. Real-device mobile performance and cross-browser scientific repeatability remain TODO.
Project · Science · Architecture · Workflow · Decisions · UI · Glossary · Source inventory
Original notebook/videos are unchanged. Former Python code/tests are archived under references/python/ for reproducibility, never built/executed/published by the web app.
Project repository: FastTrack-Academy/SmartRow, branch main.