I've been mulling on an idea for an iOS app for a while now. It's something I wanted to build simply to fill a need I couldn't otherwise fill. I've trawled the App Store many times and come up empty, but I've never found the time to start a new side project and build it myself, either.
A recent discussion with someone else who'd just built a workout app as a side project inspired me to finally set aside some time and build the app I wished existed.
I spent several days thinking about the idea, planning how I'd put together the first few pieces, and designing a rough UI concept. Then I set aside a day (actually a morning, but it turned into all day) to put together an MVP—a rough, tiny, but usable prototype.
This is a quick recap of the idea I wanted to build, and what I did on the first day.
Around 12-18 months ago I was struggling to build a consistent habit of working out. I was doing bodyweight routines at home, but I was bereft of motivation to exercise most days. I was lucky to stumble upon /r/bodyweightfitness, a community that's developed a bodyweight workout that can be easily scaled up or down depending on your difficulty. It kind of has levels built-in, because each exercise is based on progressions—varying forms of the exercise that change its difficulty. So you can level up in a sense, as an exercise gets easier. There's even a section to be "unlocked", as it's recommended that you can do a couple of prerequisite progressions before you attempt this extra section.
I liked this approach, because I always had a new progression to work towards, and when I was able to level up I got tangible feedback of my progress, which motivated me to keep going.
So here's the problem: this workout is made up of two kinds of exercises. Timed exercises, like breaks, some stretches, or static holds (L-sit, support hold on bars or rings—basically hold yourself still in a position that's difficult) need an audible timer so I know when I'm done. Untimed exercises, like push-ups or pull-ups, need to give me unlimited time to complete the exercise at my own pace. This workout is all about building strength, so it's very much about pushing your muscles and taking breaks rather than exercising quickly and keeping your heart rate high.
Anyway, I was lucky to find an app on Android that let me input my own custom workout using a mixture of timed and untimed exercises. I've been using it for a year or so, and it works a treat.
But when I recently switched back to iOS, I couldn't find a single app that let me mix timed and untimed exercises in the same workout. (Tell me if you've found one!)
So that's the one special thing my app will do. It lets you input your own custom workout (no pre-set exercises, workouts, or instructions here) and for each exercise you can choose to run a timer or just tap a button when you're ready to move on.
Some other basic features it needs to have are beeps and text to speech so I don't have to look at the screen to know what's coming up or when to move on to a new exercise, an easy way to see the next couple of exercises coming up, as well as viewing the entire list of exercises in a workout if I want to, and syncing my workout data to HealthKit, so I don't have to track it separately on my Apple Watch.
What I built on day one
I've spent just a day on this app so far, and here's what I worked on:
I'm going to use Realm to store the user's workouts on their device. For now I've hard-coded my own workout so I could get straight into building and testing the code to actually run a workout rather than worrying about CRUD features to input and save a new workout. But it's better to start with Realm than to add it later on, so I set that up first thing, and created Realm models for exercises and workouts (a list of exercises).
Basic UI to run a workout
I'd like to have a circle animation showing the timer ticking down for timed exercises, but since day one was all about getting the app working as quickly as possible, I started with just a label showing the seconds left on the timer. I made it count down as the timer counted down, and obviously created a timer in the process. I also added a label to tell you the exercise's name, so you know what to do while the timer's counting. And for untimed exercises I added a button you can tap when you're done, which progresses to the next exercise.
This is the first time I've played with audio, and I was grateful that it was mostly super simple. I set up text-to-speech to say the name of the next exercise when the current on is nearly done, and to say "halfway" at the mid-point of timed exercises.
Next I added a ticking sound on the second for the last five seconds, and a celebratory sound for when you complete a workout.
After all but the audio mentioned above was done, I started playing with the design. I'm not very good at making design decisions, so I wasn't getting very far when Josh came to see how I was doing and offered to help. I also hate naming things, so Josh very kindly took on the task of coming up with a name.
The app is called Woo Cow Time. Josh made me a bonza icon and mocked up the screens I was working on with a rippa colour scheme that I could copy. He also found me a sweet "woo" sound to use at the end of a workout, which goes well with the app's name.
Because I was aiming for getting the app up-and-running for myself to test as quickly as possible, I opted for an Australian voice in the text-to-speech. Although I probably would have thought about matching the voice to the user's locale later, I've decided to opt for a very Australian flavour to this app (you may have noticed in the previous paragraph), just for fun. (I might still make a setting for the user to change the locale of the voice, but leave the Australian one on by default.) Cows aren't particularly Australian, but that's okay. It's a cow-themed-Australian-tinged-workout-app that lets you combine timed and untimed exercises into the same workout.
This is just a side project, so I'm not aiming to release it this week or anything. But I tested it in-situ today and found a few tweaks I want to make ASAP:
- Make the app's timer keep running when the app is in the background
- Make app keep the phone's screen on during a workout
- Add a beep when a new exercise starts
- Make the ticks for the last 5 seconds way louder, because I couldn't hear them at all
- Fix ducking other audio (e.g. music) while the app is speaking, because right now it pauses the music and doesn't un-pause it
I think these tweaks will be enough for me to start using it for real, and then I can look at adding some non-urgent features like animating the timer, adding HealthKit sync, and showing upcoming exercises.