-
-
Skills makes calisthenics progress visible.
-
Skills is designed for supported movements such as handstands, pull-ups, push-ups, dips, and muscle-ups.
-
Skills organizes videos by skill so you can revisit your latest and best attempts and achievements, and keep a clear record of your training
-
Analyze supported attempts on-device, confirm the skills shown, measure reps or holds, and build private skill history.
Skills — Private, on-device calisthenics video analysis
Inspiration
Calisthenics athletes often record their training, but reviewing those videos manually makes it difficult to measure progress consistently. I wanted to build an app that could turn an ordinary workout video into useful feedback without requiring users to upload highly personal workout or body data to a remote service.
That idea became Skills: a privacy-first calisthenics video analysis app for iOS and Android. The app analyzes user-selected videos locally, helps identify and measure movements, and produces annotated videos that users can export and share.
What it does
With Skills, users can:
- Select a calisthenics training video from their device.
- Run pose estimation and movement analysis locally.
- Review detected exercises, repetitions, holds, and analysis results.
- Correct the selected skills when necessary and run the analysis again.
- Export an annotated version of the video.
- Use the core analysis features without creating an account or uploading workout data.
Skills is designed to remain useful offline. Videos, pose data, workout results, and analysis history remain on the user’s device.
How I built it
I built Skills as a React Native application with TypeScript, supported by platform-specific native components for iOS and Android.
MediaPipe Tasks Vision provides on-device pose estimation. The surrounding analysis pipeline interprets pose observations over time and turns them into calisthenics-specific results. Native media pipelines based on AVFoundation on iOS and Android media APIs handle video decoding, processing, and export.
The shared application layer manages the user experience, local history, analysis workflow, export options, and persistent state. This architecture lets the computationally intensive and platform-specific work remain native while most product logic stays shared between iOS and Android.
RevenueCat integration
I added a lifetime purchase called Skills Founding Member. It unlocks Skills Pro and allows users to export videos without the getskillsapp.com branding that Skills would otherwise add during export. Free users also receive one complimentary export without Skills branding.
The purchase experience uses a custom Skills paywall. RevenueCat supplies the store-specific product, localized price, purchase lifecycle, restore handling, and verified Skills Pro entitlement.
The integration uses only an anonymous, app-scoped customer identifier. Skills does not share user names, email addresses, advertising identifiers, workout information, videos, pose data, or body data outside the app sandbox. Only the minimal information necessary to process purchases, refunds, restores, and entitlements is shared with Apple, Google Play, and RevenueCat.
Challenges
The largest challenge was adding cloud-assisted commerce without compromising an otherwise local-first product.
Purchases involve much more than displaying a checkout screen. I had to account for store-localized pricing, cancellation, restoration, refunds, anonymous users, reinstall behavior, offline launches, and differences between Apple’s and Google Play’s billing environments.
Testing also required several different environments: RevenueCat’s Test Store, Apple Sandbox, Google Play Internal Testing, physical devices, emulators, offline operation, and Android devices without Google Play services.
What I learned
I learned that a reliable entitlement system should be treated as application infrastructure rather than a paywall component. Purchase state has to remain correct across restarts, offline periods, restores, and incomplete store responses.
I also learned how valuable a narrow integration boundary can be. RevenueCat handles the difficult store-facing lifecycle, while Skills retains ownership of its product rules, custom interface, offline behavior, and privacy guarantees.
Most importantly, monetization did not require changing the app’s core promise: workout and body data remain on the device. RevenueCat receives only the minimal purchase information needed to provide the lifetime entitlement.
What’s next
Skills Founding Member currently focuses on branding-free exports, but the same entitlement architecture can support additional optional Pro features later. My goal is to expand those benefits carefully while keeping the core analysis experience useful, private, and available without an account.
Built With
- ai
- android
- codex
- ios
- kotlin
- maestro
- mediapipe
- offline-first
- privacy
- react-native
- revenuecat
- swift
- typescript

Log in or sign up for Devpost to join the conversation.