Adrian Rollett

Words about things I’m interested in every sometimes

15 Dec 2024

Creating a WatchOS app in a morning

Ever since I started running more slowly, I’ve wanted a very specific running app. This app would be very minimal, letting me focus on the act of running rather than staring at a display to maintain a certain heartrate zone. It’s possible that something like this exists, but I couldn’t find it. I noodled on the idea of building that app, but it felt like it would take more effort than I wanted to expend. (This was based on bitter experience with abortive past side projects)

So, I decided to timebox the project. On a day off in October, I decided to see if I could start coding that morning and use the app on a run that afternoon. The basic structure was designed by ChatGPT1, starting from this prompt:

I want to create a WatchOS workout app. It should have a very simple UI and minimalist design.
It will be focused on running within a certain heartrate zone. When opened, the app should
prompt the user to start a workout and allow selecting a zone, defaulting to the previous selection,
or zone 2 if there is no previous selection. While working out, the app should only display the
elapsed time, current zone and current heartrate. Haptics should be used to alert the user when
above or below zone.

With some back and forth including clarifications and requests for additional features I didn’t think of initially, I quickly had a functional prototype. This turned out to be a good way to flesh out and improve the idea while keeping the whole project in context. ChatGPT’s output was very good overall.2 The only glaring mistake was hallucinating a non-existent Swift API for heart rate zones.3 I then used aider with Claude Sonnet to continue iterating. Long story short, the app was functional enough to use that afternoon after about 4 hours of work.4

I’ve been using the app for most of my runs since then. After a few sessions of bug fixes and functional + UI improvements, I decided to release ZoneFlow on the app store. I don’t have any illusions that it will be used by more than a few people, but it gives me extra motivation to maintain the app.

Learnings


  1. o1-preview ↩︎

  2. You can see the chat transcript here ↩︎

  3. A fairly classic case of an LLM providing a seemingly plausible answer rather than saying “I can’t do that, Dave” ↩︎

  4. About 2 of those hours were spent futzing with XCode! ↩︎