For app developers
Rep counters
Tag the stages of a rep, export logic your app can run
Scrub to each stage of a movement, tag it, and export a definition that counts reps on any pose engine — no labelled dataset, no model training.
- Built from
- One clip
- Joints available
- Shoulders, elbows, hips, knees
- Exports as
- JSON, plus runtimes in four languages
- Runs on
- Any pose engine, on-device
How a counter gets built
Play the video, stop at the bottom of the movement, and tag it as a stage. The joint angles at that frame are captured as the stage's requirements. Do the same at the top, and at any point in between that matters, and the sequence of stages is the rep.
Only joints that actually move through the movement end up constraining it, so a counter does not fail because an unrelated limb was somewhere unexpected. A tolerance around each angle decides how strict it is.
The eight-joint boundary
A rep counter works from eight joints: both shoulders, elbows, hips and knees. Those are the joints the pose engine measures as named features, and the ones any pose model can reproduce from twelve standard keypoints. The six calculated joints on the measurement side are deliberately kept out of it: not every pose model has the hand and foot points a wrist or ankle angle needs, and a counter should behave the same on every engine it runs on. The boundary is enforced in the code, not just documented.
What you ship
The export is JSON describing the stages, the angle window each one requires, and the exact definition of every angle — which three keypoints make it, and which way it is measured. Any pose engine that gives you the shoulders, elbows, wrists, hips, knees and ankles can run it: MediaPipe, ML Kit, Apple Vision, MoveNet, or a model of your own. The Export tab hands you a ready-made runtime and an adapter for your engine, in Swift, Kotlin, TypeScript or Python.
With the QuickPose SDK, on iOS or Android, the runtime reads the angles straight out of its features, so there is no pose code to write at all. Either way, counting runs on the device against the camera feed — the video never has to leave the phone.