-
-
Fight screen - user can choose the workout type here
-
Different enemy types/workputs
-
Progress screen with user stats
-
Enemy/workout card
-
Custom workout creation screen
-
User performing a push-up workout
-
User performing a squat workout
-
User performing a sit-up workout
-
User performing a pull-up workout
-
Under Siege app icon
Under Siege
What inspired me
I saw similar apps that gamify workouts and capture your movement with the camera, but most of them only tracked push-ups.
I wanted a full home workout app that could hit the major muscle groups, not just one exercise. So I built Under Siege around push-ups plus squats, sit-ups, and pull-ups: a fantasy RPG where you defend a mountain outpost from various enemies by doing real bodyweight workouts in front of your phone’s camera.
What I built
Under Siege is an iOS app built with Expo / React Native. You pick a workout, face a monster, and fight with the front camera on. Pose tracking counts your reps; each rep damages the enemy. Win and you earn XP, gold, and levels. Lose or flee, and the enemy captures your outpost.
Core pieces:
- Camera-based rep counting with QuickPose for push-ups, squats, pull-ups, and sit-ups
- Battle loop with HP, sets, rest timers, potions, and progression
- Custom workouts so players can fight their own enemies
- Onboarding and tips for phone setup and form (lighting, framing, clear background)
- Victory sharing via a shareable “enemy slain” card
Everything runs on-device. The camera is used for pose tracking only; workouts and progress stay local.
What I learned
- The hardest part was making sure the rep counter works as intended. One missed pull-up or a false count can ruin the entire workout. The detector also has to handle real rooms.
- Native bridges matter. Some features needed extending the QuickPose React Native bridge (landmarks for hips/knees) and rebuilding the app. JS alone wasn’t enough.
- Scope discipline helps. Changing pull-up logic must not silently break push-ups or sit-ups; shared pose code is dangerous if you treat it as one blob.
Challenges
Pull-ups from a floor camera. Elbow-angle rules that look fine in docs failed for back-to-camera hangs. Walking toward the bar and moving the phone also looked like “reps.” I reworked pull-ups around hips and knees rising together, with gates so camera bob and squats don’t count.
Sit-ups cutting off at the bottom. After the first rep, shoulders often leave the frame when the player lies flat. The counter used to freeze mid-rep. Treating sustained missing pose data as “back on the floor” (after arming) fixed multi-rep sets.
Closing
Under Siege is what happens when you take “just do ten more reps” and turn it into “the outpost falls if you don’t.” Personally, as a gamer who also likes to stay active, this works really well. As you get fitter, your character levels up in the game too.
Built With
- asyncstorage
- eas-build
- expo-router
- expo.io
- quickpose
- react
- react-native
- revenuecat
- swift
- typescript
- zustand



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