← All projects

Skate Learning

CNN trick classifier. Upload a clip, get the trick named and timestamped feedback.

  • React
  • TypeScript
  • Python
  • PyTorch
  • MongoDB

Learning a kickflip from YouTube is slow and the feedback is fuzzy. This project tries to make the loop tighter: record a clip, get the trick classified, get feedback rooted in what the model actually saw.

Classifier

A small CNN with 6 trick classes, trained on ~690 hand-labeled clips. Each clip is normalized to a fixed length and 30fps before frames pass through a ResNet-derived backbone. Training is done locally with PyTorch; the trained weights ship in @skate/analysis as a Python package with a CLI entrypoint.

Inference pipeline

Three hops, one direction:

  1. Node API receives an upload, drops the file in S3, enqueues an analysis job.
  2. The job shells out to the @skate/analysis CLI with --clip s3://....
  3. CLI returns JSON: { trick, confidence, frameRanges }. The API stitches that into the user's progression record.

The Python sidecar instead of an in-process model loader keeps the Node runtime stateless and lets the analysis package iterate independently — including being trained on a laptop without touching the API.

Feedback

Classification alone isn't useful for learning. The model also exposes intermediate activations on a small set of "feature" frames — body position, board orientation, foot placement. The feedback layer reads those, attaches a measurement and a timestamp, and surfaces lines like "at 0:0.4 your back foot was off the bolts". Sometimes wrong. Usually better than try again.

Three clients

Web (React + Vite), mobile (React Native), and the analysis CLI all talk to the same Express API. Schemas and React Query hooks live in @skate/shared. Adding an endpoint touches one place.

Stack

TypeScript monorepo with a Python sidecar for the model. PyTorch, MongoDB for clip metadata and progression.