All notable changes to @quickpose/react-native will be documented in this file.
onUpdateevent now exposes results and feedback as feature-keyed maps, matching the native iOS/Android SDK shape.nativeEvent.results:Record<featureKey, number>(wasArray<{feature, value}>).nativeEvent.feedbacks:Record<featureKey, string>(new — replaces the flattenedfeedback: string). Only non-empty feedback entries are included.
example-counternow subscribes toinside.wholeBody(red/green bounding box) and demonstrates selective gating: counting is blocked only byfeedbacks['fitness.pushUps'], whileinside.wholeBodyfeedback is informational. Before this change, any feedback source (includinginside) paused counting, which caused rep resets as the user drifted near the frame edge.
- Removed:
QuickPoseResult(array-element type). - Added:
QuickPoseResults,QuickPoseFeedbacks(keyed record types).
fpsfield on theQuickPoseViewonUpdate event (iOS + Android).- iOS
captureFrame()— on-demand composite of latest camera + skeleton overlay, rendered once per call viaUIGraphicsImageRenderer. No per-frame compositing pressure on the live pipeline. example-counter: FPS HUD + Snapshot button + preview modal.
- iOS: live view no longer flipped sides when a body entered frame. Bridge no longer appends
.overlayHasCameraAsBackgroundto the live feature list; the composite was mirrored while the underlying live camera layer is not, so the overlay appearing over the camera produced a visible flip. RequiresQuickPoseCore≥1.2.14.
- Android
captureFrame()usesQuickPoseCameraSwitchView.captureFrame()from core 0.21. No companion statics or view tags — resolves the switch view from the view hierarchy and calls it directly. - Bumped
ai.quickpose:quickpose-corefrom 0.20 to 0.21.
- Android
captureFrame()now usesQuickPose.captureFrame()from core 0.20 — composites camera + overlay SurfaceViews via PixelCopy + Canvas. Fixes orientation, stretching, and missing overlay issues from 0.3.x. - Android output format changed from PNG to JPEG.
- Bumped
ai.quickpose:quickpose-corefrom 0.19 to 0.20. - Removed
androidx.exifinterfacedependency (no longer needed).
- Android
captureFrame()now forces a landscape dest bitmap matching the camera's native buffer aspect, preventing the PixelCopy stretch that distorted 0.3.4/0.3.5 captures. Result is then rotated to display orientation.
- Android
captureFrame()stretching when the Surface buffer aspect differed from the view. Now uses Window-basedPixelCopyto capture the composited displayed content, which handles rotation and scaling consistently.
- Android
captureFrame()orientation — camera buffer is now rotated to match the display orientation (portrait apps no longer get sideways captures).
- Android
captureFrame()cropping — bitmap now sized to the Surface's buffer, not the view bounds.
- Android autolinking in Expo projects. Previously caused "Can't find view manager QuickPoseView" at runtime; no manual
MainApplication.ktregistration needed anymore.
captureFrame()andshareFrame(title?)imperative methods onQuickPoseViewvia ref.captureFrame()returns a platform-local URI (file://iOS,content://Android) to a PNG of the current camera + overlay composite.shareFrame()opens the native share sheet in one call. Theexample/app now includes a "Share Screenshot" button.QuickPoseViewReftype exported foruseRef<QuickPoseViewRef>(null).
- Android camera preview is composited with the overlay on a single
SurfaceView, soreact-native-view-shotcan't capture it. The new native path usesPixelCopy+ a plugin-scopedFileProvider, so apps on Expo / bare RN can share screenshots without a third-party dep.
QuickPoseThresholdCounterandFixedSizeRingBuffer— JS utilities ported 1:1 from the iOS / Android SDKs so sample code reads the same across platforms.- New
example-counter/sample app demonstrating pose-gated rep counting: counting is paused while the SDK emits pose-check feedback (user not yet in position), so false reps during setup are avoided. Includes a live horizontal progress bar of the fitness measure.
insidefeature (camera-edge limb containment detection) andoverlayHasCameraAsBackgroundfeatureheadandwholeBodyAndHeadlandmark groups (matches iOS/Android SDK)hiddenandedgeInsetsstyle keys- Exported helper types:
ParsedFeature,Side,LandmarksGroup,ROMJoint,FitnessExercise,QuickPoseEdgeInsets - Exported
parseFeatureStringfor consumers who want to pre-parse features
- Feature parsing moved from native code to JS — native modules now receive structured
ParsedFeatureobjects instead of strings + separatestylesJson. Simplifies adding new feature types. - Android: bumped
ai.quickpose:quickpose-coreto0.19 - Breaking:
QuickPoseConditionalColor.min/maxare now optional (?: number) instead ofnumber | null. Consumers passingnullshould switch to omitting the field or passingundefined.
QuickPoseBasicView(iOS) — folded into the mainQuickPoseViewstylesJsonprop — styles are now embedded in the feature object
featureStylesprop for per-feature styling with color, line width, font size, arc size, corner radius, and conditional colors- New exported types:
QuickPoseStyle,QuickPoseConditionalColor
- Removed
example-pickerapp
- Version bump for npm publish
- Podspec: read repository URL from object instead of string
- Publish workflow: upgrade npm for OIDC trusted publishing support
- Publish workflow: remove registry-url to enable OIDC trusted publishing
- Full React Native plugin with iOS and Android native modules
QuickPoseViewcomponent withsdkKey,features,useFrontCamera, andonUpdateprops- Feature string parsing for overlays, range of motion, fitness, and input features
- Example app with feature picker UI
- GitHub Actions publish workflow with OIDC provenance
- TypeScript types for
QuickPoseViewProps,QuickPoseUpdateEvent,QuickPoseResult
- Initial React Native demo app with QuickPose pose estimation running on iOS
- Android native view manager support (2023-11-05)