Put your money where your mouth is. Bet on your workout goals with friends, and only get paid back if you actually show up.

Motivation is cheap; money isn't. SteadyFit turns a fitness goal into a bet you place on yourself and share with friends. You create or join a game, put a dollar amount on the line, and commit to a workout target for the length of the challenge. Hit your workouts and you earn your money back. Miss them and it costs you.
The catch with any bet like this is trust: the app has to know you actually did the workout. That verification problem was my main piece of the project.
Creating a game walks you through it a step at a time: pick the exercise, set the frequency and challenge length, choose whether to enable adaptive goals, then set the bet. The app breaks the wager down into what's on the line per week and per workout, and lets you lock the game with a password so only your friends can join by code.


Your home screen lists the workouts due this week across all of your games, each with its goal, progress, and an Upload & Verify button right there.
We put verification on the home screen after usability testing: only 29% of testers could figure out how to mark a workout complete in the first version, so we pulled it to the front.
A bet only works if you can't cheat it, so this was the part I owned. When a user marks a workout done, the app pulls the actual session from Apple Health through HealthKit and checks it against the game's goal, rather than taking their word for it.
For workouts tied to a place, like swimming or strength training, I added location verification: the game creator sets an address, and the app confirms the user was actually there before the workout counts. I built this across both the SwiftUI client and the Python backend, and wired the verification endpoints into the rest of the app.
Goals should be hard but fair, so the backend runs an adaptive, multi-dimensional ELO system that rates both players and challenges. A running challenge is rated across distance and elevation; a swim across distance and time. When a value falls between known points, the engine interpolates across each dimension to estimate difficulty and then updates the ratings from how the player actually performed.
A new user's starting rating is seeded from their Apple Health data (VO2 max and heart rate) or, if that isn't available, a short lifestyle questionnaire, so the first goals it sets already fit them.
SteadyFit was a semester-long project in Michigan's EECS 441 mobile development course, built by a team of seven working across iOS and backend. I handled the Apple Health and location verification and helped connect the frontend to the backend across the app.