Two friends, one phone, no camera: who has more airtime today? Hold it to your chest, jump, land — the app times your flight from the accelerometer alone. But the real trick is what it tells you every morning: go hard, go easy, or rest.
What it does
Hold your phone to your chest and jump three times. Airtime times each flight with the accelerometer (take-off = free fall, landing = impact), converts it to height, and compares today with your own 3–7-day baseline. If the drop is larger than your normal day-to-day wobble, you get EASY or REST; otherwise GO.
Free: unlimited single jumps and Jump-Off, a pass-the-phone leaderboard for teams and parties.
Airtime Pro unlocks the daily call, noise-aware thresholds, and the baseline trend — the paywall appears the moment your 3-day baseline completes, when the value is real and the locked call is one tap away.
How we built it
Expo SDK 57 + React Native 0.86 + TypeScript, Expo Router, expo-sensors at 100 Hz, expo-haptics for the "JUMP!" buzz.
The core is pure TypeScript, unit-tested (32 tests): a streaming, orientation-independent detector state machine that requires a push-off before free fall (a dropped phone doesn't count), uses symmetric interpolated take-off/landing edges, and rejects sensor gaps and a phone sliding mid-air. Around it: flight-time physics, and a readiness model whose threshold is the athlete's own coefficient of variation.
RevenueCat (react-native-purchases 10.10): a pro entitlement and a default Offering whose packages drive the paywall — product names and prices render from the dashboard, and Offering metadata (headline/subhead) is supported so paywall copy can change without a release. Purchase goes through purchasePackage, a CustomerInfo listener unlocks Pro live, and restore works. An in-app RevenueCat panel shows the live entitlement state and an SDK event log for judges.
What is real, and what is simulated
- Real: Airtime completed a genuine RevenueCat Test Store sandbox purchase of
airtime_pro_annualin a debuggable Android build. The app showedentitlements.active.pro = ACTIVEandisSandbox = true, and the RevenueCat dashboard recorded the matching transaction. This is a test purchase: no money moved and the app is not published to a store. - Simulated (and labelled as such): the jumps in the video are emulator-safe. "Sim · fresh / tired" buttons stream a synthetic accelerometer trace through the same production detector, always tagged SIMULATED in-app and captioned in the video.
- With no API key configured, the app falls back to a clearly labelled DEMO adapter that charges and records nothing.
Challenges
Phone-sensor jump height has real absolute error. We credit My Jump / My Jump Lab, the validated video-based app, and chose not to compete on centimetres: Airtime's call is relative to you, and only changes larger than your own noise count.
Accomplishments
A working, unit-tested detector; an honest readiness model; and a monetization moment that follows the product's value instead of an arbitrary limit — verified end-to-end against a real RevenueCat project, not a mock.
What we learned
The hard part wasn't measuring a jump — it was deciding when not to trust one. Most of the detector code is rejection logic. And building the paywall around a real SDK moment (entitlement flipping the locked call live) beats a static paywall screen.
What's next
Our own validation study (repeatability ICC, Bland–Altman against 240 fps video), team dashboards for coaches (a RevenueCat web purchase), and Apple Watch/Wear OS capture.
Built with
expo, react-native, typescript, expo-router, expo-sensors, revenuecat, react-native-purchases, jest
AI use
Airtime was designed and implemented with AI coding agents (Cognition Devin sessions): one agent session wrote the app, and independent sessions reviewed, tested, packaged, and verified the store integration. All validation claims in the repo are limited to what the code actually does — unit tests, emulator runs, and one verified sandbox purchase; no on-human accuracy claims are made.
Known limitations
- Flight-time height is an estimate, not a lab measurement; the app acts on relative change vs your own noise only.
- All jump tests are synthetic traces; no real-phone sensor recordings yet (real-device test on a Pixel 6a is the next step).
- The verified purchase is a RevenueCat Test Store transaction: sandbox, no real revenue, no store listing.
- The verified Test Store run used a debuggable build.
Video status
The embedded 60-second walkthrough shows the verified RevenueCat Test Store sandbox purchase and Pro entitlement unlock. No money moved, and the app is not published to a store. All jump traces in the video are explicitly labelled simulated; real-phone accuracy and readiness efficacy have not been validated. The same walkthrough is also playable at https://video-nfhqrqwx.devinapps.com/index.html.
Log in or sign up for Devpost to join the conversation.