Free vs paid
With a key, internet is required to authenticate and meter (
POST /api/sdk/configure, POST /api/sdk/track camera_start). Offline metered sessions refuse key-gated features (offline_metered); keypoints-only keeps running from cache.
Feature flags
Set on the provider:
Not supported (MoveNet Lightning only):
blazepose, poseEngine, mediapipeModel, poseBackend, runInWorker → feature_not_supported.
Plan gating matrix
Plan type from handshake (plan.plan / client.getPlanType()).
When gating runs
- configure / preload —
free+ angles/recommendations/progression →free_plan_feature_blocked(one-shot). Keypoints-only keeps running. startExercise()— re-check; onfree,features.keypointsalso blocks. Throws with the same message.
Emission filtering (during exercise)
Form grades & minGrade
Authoritative counted-rep grade: nested on
onCounter → formScore (classic counter.form_score). Standalone form_score is convenience only.
minGrade: 'B' counts A and B only; below-bar reps emit neither counter nor form_score.
Watermark
Override:
WebViewPoseView showWatermark. Off for coldStart: 'basic' warmers.