Inspiration
I saw an app that forces users to make pushups to turn off an alarm. So that gave me the idea to instead of solving not wake up at the morning that it could help end Tiktok or Instagram addiction.
What it does
You pick the apps that eat your time or brain and give them a daily limit. Apps can be grouped so they share one limit (for example, TikTok and Instagram get 30 minutes combined).
When the time runs out, those apps get blocked. To unlock more time, you prop up your phone and do squats in front of the camera. The app counts your reps live and tells you if you're going deep enough or losing your form.
After each session you get a quick recap: clean reps, how steady your form was, how many minutes you earned, and how it compares to your earlier sessions.
Also:
- Works on iOS (Apple Screen Time) and Android (an Accessibility service you turn on yourself)
- Everything stays on your phone: camera frames, pose data, the apps you picked, and your usage
- Available in English, Spanish and French
The form tips are there to help you do the challenge right. They're not medical advice.
How I built it
The app is built with Expo, React Native and TypeScript, plus Expo Router for navigation, Zustand for state and AsyncStorage for local data.
The camera part is native: Swift/AVFoundation on iOS and Kotlin/CameraX on Android. Frames go through ML Kit pose detection, and both platforms feed the same rep-counting logic, a small state machine that decides when a squat counts.
App blocking is native too, and separate for each platform: Apple's Screen Time APIs on iOS, and an Accessibility service on Android that detects which app is open.
How I use RevenueCat
RevenueCat handles everything around payments: the squatstok_pro entitlement, offerings with localized prices, purchases, restores, and checking if you still have Pro.
There are subscriptions (weekly and annual) and a lifetime option. A free trial only shows up when the store says the product actually has one, so the paywall never promises a trial you can't get.
RevenueCat also sends purchase data to AppsFlyer server-to-server, so revenue doesn't get counted twice.
Challenges I ran into
The hardest part was making app limits and squat counting work together on two platforms that do things very differently. iOS and Android block apps in completely different ways, with different permission rules, and app groups had to behave the same on both.
Squat counting was its own problem. It has to ignore half squats and random movement, but still give feedback that actually helps instead of just "rep not counted".
What I'm proud of
- The limit asks something of you, but it's something anyone can do in a minute
- All pose tracking runs on the phone, nothing is uploaded
- The recap shows how well you did, not just how many reps
- Native app blocking that works on both iOS and Android
- The name
- Be aproved despite the name
What I learned
- People need to see exactly which apps share a limit, or it gets confusing fast
- The UI should follow what the phone and the store actually report (permissions, products, trials), not what I assume is there
Where it's at
SquatsTok has been live on Google Play since August 11, 2026. To try it properly, use the store build on a real phone: blocking, camera tracking, purchases and restores need a physical device.
What's next
- Finish release testing on real devices
- Make the squat feedback smarter
- Learn which limits and movement breaks people actually stick with
- Add a "Dance your way out of the app block"
Built With
- appsflyer
- expo.io
- kotlin
- ml-kit
- react-native
- revenuecat
- swift
- typescript

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