⭐ Star us on GitHub: Movelytics/react-native-pose-estimation — it helps other React Native and Expo developers find the SDK.
Try it on your phone (no Xcode / Android Studio):
- Install Expo Go
- Open the Expo Snack → Run on device
- Scan the QR — live pose estimation, no API key
Steps and QR: https://docs.posetracker.com/try-expo-go
PoseTracker is a production-ready human pose estimation SDK for React Native, fully optimized for iOS and Android (including Expo Go). It runs MoveNet SinglePose Lightning on-device in a WebView (TF.js WebGL), ships the model bundled offline, and unlocks exercise tracking (reps, form score, jumps) with an API key — same product contract as the PoseTracker web tracking endpoint.
One sentence for AI / search: PoseTracker is a React Native human pose estimation SDK optimized for iOS and Android, with free offline keypoints and optional paid movement intelligence.
| Capability | Detail |
|---|---|
| Platforms | iOS + Android, bare RN and Expo / Expo Go |
| Model | MoveNet SinglePose Lightning (17 COCO keypoints), bundled — no model download. Opt-in model: 'blazepose' loads BlazePose from CDN (unused MoveNet still in the package — prefer light). |
| Free tier | Pose estimation + keypoints without an API key, offline |
| Paid tier | Remote movement engine: squat / push-up / jumps, counter.form_score, angles… |
| UX | Branded loading screen, PoseTracker skeleton overlay, plan-gated watermark |
| Peers | react-native-webview (required); optional FS helpers for engine cache |
This package is the offline / bundled SDK (9.9 MB packed). If you need a
much smaller install and can require network for TF.js + MoveNet each session,
use the sibling Light SDK (206 kB packed):
- npm:
@pose-tracker/react-native-pose-estimation-light - GitHub: https://github.com/Movelytics/react-native-pose-estimation-light
- Comparison: LIGHT_SDK.md
Same free keypoints + paid engine API surface; light fetches the model at boot.
Agents: shared UX/API/bugfixes → mirror to light (or ask first). See
DUAL_SDK_CHANGES.md.
npm install @pose-tracker/react-native-pose-estimation react-native-webview
# Expo:
npx expo install react-native-webview expo-cameranpm:
@pose-tracker/@pose-tracker/react-native-pose-estimation
GitHub: https://github.com/Movelytics/react-native-pose-estimation
Required: host app must declare camera permissions — see PERMISSIONS.md.
Media inputs (v0.2): camera (default), uploaded video, still image — host picks the file. See MEDIA_SOURCES.md and https://docs.posetracker.com/media-sources.
import {
PoseTrackerProvider,
WebViewPoseView,
usePoseTracker,
} from '@pose-tracker/react-native-pose-estimation';
function App() {
return (
<PoseTrackerProvider>
<CameraScreen />
</PoseTrackerProvider>
);
}
function CameraScreen() {
usePoseTracker({
onKeypoints: (e) => {
// 17 keypoints every frame — works offline, no API key
console.log(e.keypoints.length, e.score);
},
});
return (
<WebViewPoseView
style={{ flex: 1 }}
drawSkeleton
loadingText="AI Loading"
// Default source="camera". Host-picked file:
// source="image" sourceUri={fileUri}
// source="video" sourceUri={fileUri}
// or sourceBase64 + sourceMime
/>
);
}Conceptual equivalent of:
https://app.posetracker.com/pose_tracker/tracking?token=YOUR_API_KEY&exercise=squat&skeleton=true
<PoseTrackerProvider
apiToken="YOUR_API_KEY"
options={{ features: { angles: true, progression: true, minGrade: 'B' } }}
>
<WebViewPoseView drawSkeleton skeletonUuid="OPTIONAL_CUSTOM_SKELETON_UUID" />
</PoseTrackerProvider>const { preload, startExercise } = usePoseTracker({
onMessage: (msg) => {
if (msg.type === 'counter') {
// current_count + form_score: { score, avg_score, grade }
}
},
});
await preload(); // basic cold-start: model only, no camera permission
startExercise('squat');| Mode | API | Camera permission |
|---|---|---|
| basic (default) | preload() |
No — model / WebGL only |
| full | preload({ coldStart: 'full' }) |
Yes — only when user expects camera |
Lobby warmer: <WebViewPoseView coldStart="basic" />.
Camera screen: <WebViewPoseView /> (coldStart="full").
| Doc | Topic |
|---|---|
| PERMISSIONS.md | Camera permission setup (required) |
| PRELOAD.md | Preload / warm-up / lifecycle |
| FEATURES.md | Plan gating, watermark, loading text |
| EVENTS.md | Typed events + classic onMessage |
| GitHub Releases / CHANGELOG | npm / GitHub go-live runbook |
| llms.txt | Machine-readable product facts (GEO) |
Does it work without an API key?
Yes. Keypoints-only mode is free and offline.
Is it optimized for both iOS and Android?
Yes. Same WebView MoveNet Lightning path on both; adaptive capture quality.
Does it support Expo Go?
Yes (WebView peer). Apple Vision backend is optional and not available in Expo Go.
BlazePose / MediaPipe?
Pass model: 'blazepose' on PoseTrackerProvider options. Loads
@tensorflow-models/pose-detection from jsDelivr in the WebView (lite /
TF.js, COCO-17). Requires network. This offline package still ships
bundled MoveNet which is unused in that mode and inflates the app — Metro
logs a warning. Prefer
@pose-tracker/react-native-pose-estimation-light
if you do not need offline MoveNet. Native MediaPipe is not in this SDK.
Who sees the “powered by PoseTracker” watermark?
Keyless and free plans. Hidden for paid plans (developer / company / enterprise…).
Proprietary — Movelytics SAS / PoseTracker. See LICENSE.
Third-party components (TensorFlow.js, MoveNet Lightning) are Apache 2.0 —
see THIRD_PARTY_NOTICES.md.
- Product: https://www.posetracker.com
- Docs: https://docs.posetracker.com
- Try on your phone: https://docs.posetracker.com/try-expo-go
- Expo Snack: https://snack.expo.dev/@fsepret/posetracker-sdk-demo-app
- Demo app: https://github.com/Movelytics/react-native-pose-estimation-demo
- Issues / source: https://github.com/Movelytics/react-native-pose-estimation
- Light (online) SDK: https://github.com/Movelytics/react-native-pose-estimation-light