-
-
No controllers. A real band in your hands, with targets showing where each rep starts and ends.
-
Mid-rep with Upright Row in passthrough. The orbs lock onto your hands when you reach the target.
-
Your own bands, your own space. Every menu is pressed with a fingertip.
-
Each exercise has a demo video, a band picker and a training mirror that shows your position.
-
Squats are counted from your head height, and the app tells you so.
-
Online: my wife's Meta avatar stands in her spot, with my targets waiting for me in mine.
-
Same room: two headsets share one space and battle side by side.
-
Weekly goals, streaks and distance pulled keep you coming back.
Inspiration
I'm in my 40s and I love working out in VR, but most fitness apps on Quest are focused on cardio: punching, dancing, slicing blocks. They're great for getting a sweat on, but very little VR fitness is built around progressive resistance training, and maintaining strength becomes increasingly important as we get older.
Resistance bands are cheap, light and already in a lot of people's homes, so I wanted to see if a Quest could coach a real resistance-band workout.
There was an immediate problem - you can't safely hold a controller and a resistance band at the same time.
So PullFit had to be hands-only from day one.
What it does
You stand in your own room in passthrough with a real resistance band in your hands. Glowing targets show where your hands need to start and finish each rep, or a grid shows where your head needs to be for exercises such as squats and lunges.
PullFit counts reps, scores your movement and tracks your progress. There are 28 exercises, 13 workout programs, progressive monthly plans and 12 fitness tests.
Since launch I've added three ways to train with other people:
- Same room: two headsets share one physical space. Battle side by side or work out together, with each player seeing the other's targets and progress in the room.
- Online: train with a friend anywhere using Meta Avatars, voice chat and invites from your Meta friends list.
- Pass and Play: multiple people can compete using a single headset, taking turns.
Battles take both resistance-band strength and rep count into account. A stronger band earns more points per rep, but somebody using a lighter band can still win by completing more reps. Players can also add handicaps before a match to make uneven match-ups more competitive.
How I built it
PullFit is built in Unity 6 using OpenXR and XR Hands. It uses Meta passthrough and shared spatial anchors for co-located multiplayer, Netcode for GameObjects and Unity Relay for online play, Vivox for voice, and Meta's Avatars and Platform SDKs for avatars, friends and invites.
I built the exercise system around data rather than individual scenes or scripts. Exercises define their targets, instructions and tracking behaviour, while programs and plans combine those exercises in different ways. That means adding or changing a workout doesn't require changing application code.
Each player calibrates their height and reach, and exercise targets are generated relative to that calibration rather than being placed at fixed positions in the room. Players can also adjust individual exercises to suit their own range of movement.
The same principle became important for multiplayer. Two people can be different heights, have different reach and use different strength bands, so each player still gets targets generated for their own body while sharing the same workout and game state.
Challenges I ran into
Being honest about what can be tracked. Hand tracking sees your hands and headset, not your whole body. I decided early that PullFit shouldn't pretend otherwise. Upper-body exercises can be checked using hand movement. Squats and lunges use headset height, and the app is upfront about the limits of what it can verify.
Hands close to the body. Tracking becomes harder when hands cross or move close to the chest, which happens constantly with resistance bands. Each rep is armed by briefly holding its starting position, helping prevent a tracking glitch from becoming a rep. The Training Mirror also lets players see what PullFit currently believes their tracked position to be.
Designing menus around hands that are already busy. PullFit's hands aren't just an input method - they're also holding and moving a resistance band. I originally used pinch interactions, but gripping and adjusting the band regularly creates hand poses that can be interpreted as a pinch, causing accidental selections. I therefore disabled pinch-to-select during exercises and moved those controls to direct poke interactions. That created another problem. Poke buttons need to be within reach, but during an exercise the player is deliberately moving their hands through that same space. I had to position the controls for each exercise so they remained reachable without sitting in the path of the movement. Some of those safe positions weren't immediately obvious to the player. When an exercise begins, I briefly place its controls and targets in front of the player and then animate them into their actual positions. The player sees where everything has gone without needing another instruction or tutorial.
Different bodies and ranges of movement. Calibration turned out to be much harder than simply asking somebody to stand in a particular pose. Hands have to remain visible long enough to measure them reliably, and not everybody can or should move through exactly the same range. I added Tweak, which lets a player adjust the start and end positions of an individual exercise to suit their own movement. PullFit remembers those adjustments for that exercise.
Putting two people in the same mixed-reality space. Co-location introduced another problem - two headsets have their own idea of where the room is. Shared spatial anchors let both players agree on a common coordinate system, while each player's exercise targets still have to account for their own calibration. I also quickly learned that other people are far less willing than I am to test, tweak, reset and test the same multiplayer interaction over and over again! I needed two headsets and two players to test almost every change, so I built a simulated test player that mirrors my movements and behaves like a second person in the session. That let me get about 90% of the way there on my own before asking friends and family to put another headset on for the final testing.
Accomplishments that I'm proud of
PullFit started as a small test project to answer one question - could resistance bands actually work well with hand tracking in VR? I built it on my own from that experiment into a fully fledged fitness app with plans, progression, fitness tests and multiplayer, and took it all the way through approval and release on the Meta Horizon Store. That's probably what I'm most proud of.
Not long after launch I added multiplayer in all three forms - same-room co-location, online multiplayer and Pass and Play.
It's hands-only from beginning to end. That includes menus, creating profiles with an on-screen keyboard, calibration, workouts, and accepting and joining a friend's game from a Meta invite.
One of the strangest and best moments after launch was seeing sales appear from Japan and Mexico. People I'd never met, thousands of miles away, had found something I built and decided to spend their money on it.
What I learned
Watching other people use PullFit taught me more than anything I tested myself.
Some of the most useful testing sessions involved giving somebody the headset and deliberately saying nothing. I'd watch them struggle with something I thought was obvious, resist the urge to tell them what to do, and then change the application instead.
I also learned that hand tracking isn't just a replacement for controllers. Once I stopped designing around controllers entirely, it changed how I thought about interaction, calibration and even which exercises made sense.
What's next for PullFit
I want to keep making PullFit easier for more people to use, starting with more languages and a simpler way to set up and orient a shared room for co-location. I also want to add Meta achievements and keep expanding the exercises and workouts available.
Longer term, I want to keep exploring the same idea that started the project - using mixed reality to add guidance, feedback and motivation to exercise equipment people already have in the real world, rather than trying to replace that equipment with something virtual.
Log in or sign up for Devpost to join the conversation.