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:
- Node API receives an upload, drops the file in S3, enqueues an analysis job.
- The job shells out to the
@skate/analysisCLI with--clip s3://.... - 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.