Tempo 3: The Beginning of a New Tempo

It does not matter how slowly you go as long as you do not stop.
— Confucius
T3LaunchHero.png

This year has been anything but normal, and when I started the work on Tempo 3 earlier this year, I had no idea how far I would get, or when I would be able to ship it.

Tempo 3 is based on following:

  • Feedback and feature requests from many runners already using Tempo

  • My own wishlist as a runner

  • Apple technology updates—code level, UI/UX level, and generally in iOS

I feel a little embarrassed to admit how many different lists I have made to structure this work. There’s just so much to do, but what I can tell you is that this is just the beginning of what you are seeing.

A few weeks ago, when I looked at the roadmap of macro items for Tempo 3, I felt a little defeated because it seemed I had hardly scratched the surface. But that despair feeling slowly faded into joy after I had to spend time with v2.12.1 again for a bit. I have been using Tempo 3 for so long and so much now, that I had stopped noticing how far we have come. The excitement has grown more over the last week as everything came together for the release, and so many beta testers sent their comments on how amazing the app was looking. I must call out here that I feel really fortunate to have a great group of runners as beta testers for Tempo. Their feedback and reporting bugs has made this release possible. 🙏

It’s 8:48 PM ET on October 14 right now. My plan is to do a phased release of Tempo tonight and test everything before releasing it for everyone tomorrow. And I just started writing this post. Add to that the hours of sleepless weekends and weekdays over last couple of weeks while working on brand new App Store screenshots, press kit, Tempo’s homepage, and a lot of other launch items, I feel a little exhausted. So I am going to make this post short by leaving you with some quick highlights about this release.

If you are really curious about the details of this release, you should checkout the following. It’s pretty much a brand new app, and every part describing the app has been redone and helpful to learn from.

  • App Store listing and screenshots

  • Release Notes

  • New FAQ for Tempo (still a work in progress, but hey, we finally have one!)

  • New homepage for Tempo

  • Press Kit

  • What’s New and App Intro screens in the app. You can launch them from the About section of the app settings

  • Oh yeah, and the entire app itself! :)

Here are the highlights:

  • The work-in-progress version for this effort was set to 2.14 over the summer, so Tempo 3 work was appropriately codenamed Project Valentine.

  • We have a brand new UI and the primary change is switching to the standard San Francisco font family. When I initially finished updating the entire app with SF, I felt super guilty for not doing it earlier, and worse that it had to wait longer. I am sorry.

  • I had been procrastinating on switching the font to SF for a while now, but with iOS 14 Widgets it was obvious. There’s no way I was shipping Tempo widgets with custom font for everyone’s Home Screen. And you can’t go from widgets in SF to app in Avenir Next.

  • The primary driver for the new workout details screen was scalability in the structure and layout. There’s a lot more data that’s in the works that will end up here, but it’s already looking so 😍.

  • The new custom date range option for the now new Trends started last winter and has been living on a branch all this time.

  • Adding a workout manually is something that has been finished and ready since last January, but I didn’t ship it because if you added a workout say 5 years before your first workout in the Health app (I did that to add a PR marathon from 2009), it would instantly make the Trends useless. So this feature had to wait until we had custom trends date selection options.

  • I had at least 3 different folks reach out to me asking about how Intensity Calendar’s circles worked. One of them is a founding Tempo customers. He was frustrated, because the calculations didn’t make sense for his data. We did a few e-mail exchanges, and with that feedback it was obvious to me that I needed to do better with this functionality. The updates to Intensity Calendar is a result of the collaboration with him. Very grateful for his patience and help on this.

  • I was bummed to not be able to release Tempo 3 on day one of iOS 14 arrival. Part of me was hoping that iOS 14 won’t come out until the new iPhone 12. (Not bad for that estimate, we are launching just a day before iPhone 12 pre-orders.) But it was a blessing in disguise—I took a step back, assessed what needed to be done, trimmed some scope, without shredding it, and really got to finish some quality work that I wanted done for this launch.

  • My plan was to get the app submitted for review last Friday on Oct 9, but that didn’t happen, and I was still at it on Sunday Oct 11th. This Sunday in October is usually the marathon Sunday for me. In a normal year, I would be running in the streets of Chicago. This year it ended up being “get Tempo to the App Store” marathon. I made it to the finish line in the evening. Thanks to the App Store review team, Tempo was also approved later that night!

My special thanks to Stephanie, who has been a great beta tester and also helped with getting the FAQ going.

I guess this post isn’t as short as I expected. Time to go do some launch testing. :)

WWDC20 General Impressions

First, my thanks to everyone at Apple for making this happen, even more so this year. It has been a great Dub Dub, and I am inspired and excited about the coming year.

TL;DR

Excellent week. I still miss being there with everyone in person, but that’s life right now. Hope we can converge the online and in-person format going forward.

Keynote

Keynote was so well done. The intro instantly made me feel connected with all my virtual participants. The content was well paced and formatted. The video quality was as always very much to Apple standards, but what stood out was how nicely it zoomed through different presenters. Going into this week, I dreaded that the keynote would feel like a lame online conference, where presenters would either just get on a video call, do their parts, or had somehow already done their parts to form a linked up disparate demo. None of that at all, it was a pleasant show, and almost felt interactive in a way. The blending of different sites of Apple Park, Craig running, Julz dancing, and so much more, made it delightful. In a way this keynote felt light and refreshing, the presenters felt smooth, and it went fast.

SOTU

Platforms State of the Union is a must watch if you are a developer and get to watch only 1 session from this week. While I am super interested and can’t wait to be on Apple Silicon, the details about it felt like it could have been a dedicated session in itself. It sort of felt inverted, because the keynote talked about the Apple Silicon at the end, and SOTU started with it, and I was more curious to hear about new software parts first.

Sessions

Sessions have been my favorite part this year. It’s Friday, and I do not feel exhausted from watching hour long sessions in dark. It’s been very easy to stay up-to-date. 

  • The short and to the point sessions help maintain the rhythm for me, even with other distractions while at home.

  • I love the ability to copy code while watching a session.

  • Quick links to forums from each session is convenient.

  • When I originally saw the schedule, I wondered why not just upload all the videos on Monday, but the daily pacing has helped maintain my sanity and not get overwhelmed.

  • The brevity of these sessions will make them great reference for future work too. I usually have to plan around rewatching a WWDC session for reference, or it takes a good 10-15 mins to parse through one to find what I am looking for. This year’s sessions are so compact and to the point that I will be able to just watch the whole thing instead of scrubbing through them. And copying code feature is going to be extremely useful here too.

Labs

Labs have been easy to schedule and really well done. I have been to 2 labs (and 1 scheduled for today), and like every year, each one has been a pleasant and insightful 1-on-1 discussion that quickly helped me figure out what I needed.

I almost missed one of the labs, because I didn’t realize that my request could still be confirmed after an initial decline. It would have been nice if there was a push notification sent to the Developer app about the status change of my lab request.

Daily Recaps

Serenity Caldwell’s daily recaps are blazing fast ongoing summary of Dub Dub. They are fun to watch! I am pointing everyone, who are not actively participating this week, to go watch these as a quick rundown of what’s happening at WWDC this week. I hope these are put together somewhere in a playlist for future reference.

Announcements

I will leave the detailed comprehension and analysis of all the new announcements for the experts. As a developer, my generalized take is that following will make my life so much easier,

  • Xcode Improvements. So much faster!

  • SwiftUI Updates

  • Apple Watch Complications using SwiftUI

  • StoreKit Testing framework

  • SF Symbols 2

Other things to highlight here from the announcements,

  • It’s pretty clear that SwiftUI is the future of UI development on Apple platforms.

  • Apple Silicon is here! With that + Catalyst from last year, it seems that we should all start planning and preparing for our iOS apps running on Mac in some shape or form.

  • Once again, Apple just showed everyone how privacy is an ongoing thing that Apple relentlessly focuses on, and made it so much easier for all of us to have better control over our privacy. These new controls seem very user-friendly, and they will enable everyone to be aware of what we might be sharing, or share in a limited manner. 👏

There is a lot more that will affect both my apps and daily life as a developer, but it’s only the Friday of WWDC week, and I am still processing it.

The Apple Way

I can’t imagine the crazy logistics that went into orchestrating all of this. This was the first year, and I hope the only year with current circumstances, but in no way it felt like a 1.0, with rough edges. You can tell a lot of thought and care went into every detail. The finesse through all of it is something that we take for granted from Apple, but in this case there were no years of behind-the-scenes refinements, time for a thousand no’s, ability to collaborate physically in one place, without any distractions, and Apple did what Apple does best—everything felt right and just worked.

I missed making new friends, seeing folks I admire, catching up with old friends, being together in person with everyone, but there are so many great parts to this, and part of me wants this format going forward. I hope Apple figures out a way to converge the online and physical formats into a new WWDC of the future.

The Indie Sticker Pack

WWDC is next week, and this year it will be an online experience for obvious reasons. That has not stopped our wonderful community to creatively come together and maintain some of the annual traditions. I am really excited that this week has already kicked off with two such efforts that Tempo is part of.

We opened up sign up for WWDC Virtual 5K yesterday, and today the indie community launched the Indie Sticker Pack! ❤️

You can learn all about the virtual 5K here and here. What I want to highlight in this post is the concerted effort that started from a simple tweet and brought the indie community together to create this epic sticker pack.

  • The initial inspiration came from Becky Hansmeyer’s tweet and it instantly caught many indie developers’ attention.

  • Sam Henri Gold and Nathan Lawrence quickly brought us all together on slack.

  • This was less than a month ago, late on May 22, and everyone was quick to get their icons ready within a couple of days for Sam to get going.

  • Sam owned and facilitated all the big moving parts, with so many details,

    • Logistics around what it would take to put 100s of stickers, from 90+ developers, into a package, and ship them around the world. This is challenging at so many different levels — cost of shipping, cost of printing, best color profiles to use for printing vs digital copies, size of icons to fit everything into a reasonable package, accommodate different icons, layout, and on and on.

    • Get a website up and running for everyone to be able to place orders.

    • I am just amazed by everything that was done in such a short span.

  • The same stickers (plus some more 😃) are also available as an iMessage sticker pack. This was made possible with George and Gianpiero’s help.

  • To take the inspiration further, Charlie Chapman made an amazing video that I have watched over a dozen times. 🤩

It’s an epic book of indie delight 😍

These stickers are beautiful. I still haven't ordered mine, because I can't settle on how many 🙃. But they are gorgeous, I love the sheets format. When you order, you won’t get one, two, but 10 sheets of awesomeness!!!

This is rare, and I want to preserve it as the legacy of the indie community during a critical year of our lives. It’s a byproduct of the creative collaboration of a bunch of independent developers. Most of us work solo, on our own, or in very small teams. It was inspiring to witness all the artists go at it together, moving at a blazing pace. And none of it would be possible without Sam!

2 Worthy Causes ❤️

If I may, let me just say one more thing — it is only $12.99 for the entire package, and all your money goes towards two great causes,

I feel really honored and proud to be part of such a creative, compassionate, and wonderful community. And I hope you will join us by buying a few of these sticker packs.

Introducing Activity Stats

Last Wednesday, April 29, 2020, Ian Blackburn tweeted a screenshot of his Total Apple Watch Activity numbers. He calculated the totals on a spreadsheet, by exporting the data from the Health app on his iPhone.

Ian’s data made me curious about my totals and it seemed really easy to put together an app for it. And so I started building Activity Stats. With all the work I have been doing with HealthKit in Tempo, it was really straightforward to get the data out of the Health app. My recent learning/playing with SwiftUI made it extremely fast and easy to put together a nice looking UI.

I shared the app with Ian and few other friends via TestFlight, and everyone found it interesting and thought it looked good. Even my 10 year old wanted it on her iPhone. That seemed adequate amount of validation for me to polish up and launch a quick v1.0 of the app. So today, 7 days after starting it as a brand new project in Xcode, I am excited to be releasing Activity Stats in the App Store! 🚀

Activity Stats is a simple app that displays your lifetime totals of various types of fitness and workout data stored in the Health app on your iPhone. Here's the list of totals it currently supports,

  • Total active calories

  • Total exercise time

  • Total steps count

  • Total walking and running distance

  • Total walking and running distance

  • Total walking distance from workouts

  • Total swimming distance

  • Total cycling distance

  • Total indoor cycling time

  • Total elliptical time

  • Total workout time

  • Total workouts

Activity Stats is available for free in the App Store. If you are curious about your totals, please do check it out.

Introducing Tempo on Apple Watch

It’s finally here — Tempo now works on your Apple Watch!

This is for all of us, who need a little extra motivation to do our runs these days. You can do the following with Tempo on your Apple Watch,

  • Track distance totals for the current week, month, and year.
  • Use a Tempo complication on your favorite watch face to stay motivated towards your week, month, or year's distance goal.

A feature request that could help many runners

For many of us, our goals keep us motivated through our training cycles. In the midst of a global crisis, with races getting cancelled for the current season, that motivation has been a bit lacking. So when Zac, one of Tempo's champion runner and evangelist, reached out with a suggestion about a watch complication to track the current month's total distance, I instantly knew that it was a great time to build and launch Tempo's watch app. It could be a way to participate by enabling runners to maintain some long-term focus during the time of crisis.

From zero to a functional app

The initial app took less than a couple of days to put together. That was followed by fine tuning all the watch face complications, and a lot of field testing to further refine details like the following,

  • How does a Tempo complication update everyday; especially at the beginning of a period — week, month, or year — when the total distance for that period resets. Not tricky in terms of development, but I wouldn't have discovered this scenario without doing adequate real-world testing, over multiple days.
  • How does a Tempo complication update after a run that was tracked using the Workout app on the Apple Watch. I have some hooks implemented to handle this, but don't think it's perfect, and will need more testing and work to fine tune.[1]
  • How to avoid data discrepancy while maintaining bidirectional sync between Tempo on the watch and Tempo on the iPhone. Think transient source of truth and merge conflicts around pre-synced Health data across devices.[2]
  • There are a lot more, behind-the-scenes, dev-level tooling and practices that I identified and put together to be able to do productive development with a tethered watch device. A lot of iterative rewrite/refactoring happened to do things the right way.

Some of the above is challenging to get right because it requires testing on a real watch device with real workout data. Add to that the limitation of the fact that I can only workout (run) once these days. I could have skipped some of it for this initial launch version, but when the data is meant to be available at a quick glance and represents a goal metric, fast data precision and integrity is of utmost importance.

Staying focused during the pandemic

Building this has been a great distraction from all the pandemic news while staying curiously focused through the fragmented workday hours with kids at home. Some key development highlights include,

  • This is my first SwiftUI app in the App Store. SwiftUI is such a great tool for developers (and designers). Thanks to Apple engineers for making UI development so much easier and fun to do. Technically, I really like the immutability and state management mechanism for views in SwiftUI. It also feels a lot faster to prototype and transform into production-ready UI.
  • Developing and testing watchOS app that accesses Health data has it's own peculiarities that were both enjoyable and frustrating to keep me curious and engaged.

Overall, I enjoyed exercising some new development muscles with SwiftUI, WatchKit, WatchConnectivity. I also appreciated how my running while build-testing this transformed from more than the usual fun physical activity to also the need to go get some real-world testing done. It led to a 13-day running streak for me, which might be my longest streak in recent years, and will probably remain that way through 2020.

Sparking inspiration & motivation

The app itself is simple right now, but as Zac put it, "perfect for sparking inspiration and motivation." Having a monthly distance complication on the watch face has been a great motivation to keep running. Seeing it first thing in the morning as I glance for time/date/weather gets me oriented about my day's workout goal. Seeing it later in the day, after a run, is a nice boost to that feeling of accomplishment and staying on track towards a long-term goal. I want to say it’s the equivalent of Activity app for running, but that's too early, and more of an aspirational goal. A lot more to come!

My thanks to Zac for sending this feature request that allowed me to do something via Tempo for our community during these crazy times.

I hope you are still able to run safely by following social distancing measures, and this update helps maintain that spark and joy of running.


  1. Accessing HealthKit data in the background via a complication datasource seems to be a hit or miss right now. I need to do more research and see if I could use pedometer data to bridge the inconsistencies. ↩︎

  2. In general, the watch app relies on the phone app to provide all the data. But when we go for a run without a phone, Tempo on the watch takes over to update the data (that was originally generated on the phone) with the latest workout data generated by the Workout app on the watch. Even when the phone to watch sync is active again, the latest workout data from the watch has to first sync with the phone before that data becomes available to Tempo on the phone. So there is a delay for the phone app to refresh with the latest workout data. This results in the phone app to continue sending the older version of the data (before the latest workout) to the watch app, and watch app continues to merge the recent workout data. At some point, the phone app catches-up, and sends most up-to-date data, and the watch app stops doing the merge. ↩︎