The Making Of Climateer

Climateer is an app that I recently released in the iOS App Store. As the tag line says, it’s an attempt at making climate change something you can see, something you can monitor to make up your own mind about what’s happening. Whether that will prove to be successful is still up for grabs, but I thought it would be interesting to explain the story behind it.

I started working on bits of code that eventually turned into Climateer about 3 years ago. I was tinkering with a much smarter form of social media where each post could be programmed to be interactive and to perform actions. That is itself an idea that merits its own post, but for now let me just say that one of the ideas was that a post could fetch data and display it graphically.

I had done a proof of concept of a post that, given:

  • A URL to a source of scientific data.
  • A regular expression describing the data format.

Would download the data and display it in a graph. That was all good and exciting but the smarter social media idea itself required more resources to pull off than I could put together and that effort just sat there unused.

A little while later, I was preparing for an upcoming climate march. Increasingly feeling like something has to be done to communicate the importance of what is happening, I was trying to think what I could do. And I thought of the smart post proof of concept in which I had used the CO₂ data from the NASA Vital Signs site.

I just wanted people to see the CO₂ level. I thought I’d just make a quick app that displayed the creeping CO₂ level in a Twitter-like timeline. So I wrote code that downloaded the historical data, extracted the data points, and displayed each one as a “post”. Reusing the graphing code from my proof of concept, I even made it possible to tap on each one to view the full CO₂ level graph.

I went to the climate march with this app in my pocket. I don’t know what I was expecting. I had put it together at the last minute so there had been no time to make it a shippable product, let alone submit it to the App Store for review. I also chickened out from showing it to anyone there because it seemed silly to show it to people who obviously already understood the urgency of the situation.

So I came home and continued working on it.

I added support for the global sea level data. I also did some UI work like adding pull to refresh to update the timeline.

And that was nice so of course I didn’t ship it. I added support for RSS feeds, not because it was super important, but just because parsing RSS feeds in Swift using XMLCoder is so much fun and displaying an RSS article in a WKWebView is so easy.

And then I realized it didn’t make sense for all these data sources to be built into the application. Oh the horror of having to ship an update each time I wanted to display something from a new source. So of course I created a JSON file on my web site that listed all the data sources, and modified the app to dynamically update its internal list from there.

I was happy with that. Did I ship it? Of course not. Greta linked to the Global Footprint Network and off I was adding overshoot days as my next pet feature. However this one was not a simple x/y data set, so I had to devise a new mechanism to describe it in my JSON source file in a way that the app could display.

That totally worked. My app was now able to handle different types of data sources while having minimal knowledge of them built-in. The next logical step then was to not ship it and implement the ability to extrapolate the data for cases where the available data did not extend all the way to today.

Obviously I could have polished what I had built up to that point and submitted it to the App Store. But there is so much climate information out there, each one more tantalizing than the previous one. This time I set my sight on the MCC carbon clock. Because displaying how much time we have left until doom was obviously a hard requirement to make this a shipping product. And at this point the app is agnostic, so I had to invent yet another way to describe this to the app without hardcoding it in.

This rigmarole of adding features went on for over two years. These episodes were interspersed with periods of polishing work that consisted partly of me repeating that if I can just finish x then I can ship it. But then I another possible feature caught my attention. This process is of course a very important part of software engineering that many developers out there who work on personal projects will handily recognize.

Over time I added support for entering personal notes, iCloud syncing, displaying country flags, showing temperature data, running the app on iPads, running the app on macOS, properly attributing data to their original sources, exposing customization settings, navigating the timeline with a scrub bar, displaying explanations of the data, and accepting donations. I also made countless iterations on the user interface. Not mentioning the making of an app icon that I thought I could stand looking at every day.

As time went on, the added complexity was not helping my case. Implementing features and moving to others without completely finishing the previous ones is rarely a recipe for success. The more features you have to polish, the more daunting the shipping effort seems to be. There was also the added anxiety that while I was doing this, climate change was continuing to get worse.

All that to say you sometimes have to just go for it. There is a ton of polish I feel is still missing in Climateer version 1.0. Better onboarding. Better UI. Better graphs. You name it. But at the end of the day, I’m happy it’s out there and I really hope some people find it useful.