Ski Recorder

Sensor-based ski analytics aligned with PSIA instruction

Ski instruction is almost entirely visual and verbal, with little objective data. Ski Recorder is an early-preview platform that turns iPhone IMU and GPS into biomechanical feedback that complements coaching rather than replacing it. A skier records a run in the iOS app (Expo React Native); the app captures accelerometer, gyroscope, barometer, and GPS at up to 100 Hz. The session uploads to a FastAPI backend, is processed by a Python worker (RQ + Redis), and returns seven movement scores in [0, 1] with per-metric confidence weighting in about 60 seconds. The public web demo at ski-instructor.vercel.app includes a sample session so you can run the full pipeline end to end. Source code: github.com/maggiebrooks/ski-ai.

Key Contributions

  • Body-frame alignment: rotate raw accelerometer and gyroscope into a gravity-aligned frame (Rodrigues rotation from a low-motion gravity estimate, typically chairlift) so yaw and loading metrics match the skier regardless of phone orientation in a pocket.
  • Signal pipeline: Butterworth low-pass (4th-order, 5 Hz, zero-phase), optional barometric run segmentation, turn detection on body-frame gyro yaw, and per-turn feature modules (pelvis turn metrics and carving-phase analysis).
  • Seven PSIA-aligned scores: rotary stability, edge consistency, pressure management, turn symmetry, turn shape consistency, turn rhythm, and turn efficiency—normalized where possible (e.g. radius vs. sidecut, centripetal ratio for g-force) for comparability across skiers and equipment.
  • Confidence weighting: each score is weighted by data-quality signals (GPS accuracy, sampling stability, gyro SNR, completeness) so noisy sessions surface with lower confidence.
  • Stack and deployment: React 19 + Vite + TypeScript frontend on Vercel; FastAPI API and RQ worker on Render; SQLite today with a PostgreSQL migration planned before beta. 229 pytest tests cover the processing and scoring pipeline.

Technologies & Tools

ExpoReactViteTypeScriptFastAPIPythonNumPySciPyPandasRQRedisVercelRenderpytest
Visit Website