It’s been a little while since I last wrote something on the ol’ blog. I’ve been hard at work on a new project over the past few weeks — the subject of this article, as it happens — and much to my everlasting chagrin, there’s only so much time in a day. So, the blog had to be put on hold for a few weeks. The good news is that I’ve now got lots to catch up on here!
So, what have I been up to?
Well, my indie journey took a bit of a turn right around the start of April, when I got a pretty silly idea stuck in my head. My wife and I both work from home now, thanks to COVID-19, and we’re finding that it’s pretty easy to step on each other’s toes, so to speak. If I’m taking a quick break from work to make coffee, for example, I’ll often accidentally make a bunch of noise, or try to strike up a conversation, forgetting that she might be in the middle of a phone call, or just really focused on a difficult task. Of course, with my brain being broken in the particular way that it is, I thought: what if there was an app for that?!
Now, before I go any further, I want to make something abundantly clear. The fact that we even have this “problem” to begin with is a reflection of how extremely fortunate we both are to a) not be living alone, b) have jobs that we can do from home, and c) have jobs that are at once relatively secure and utterly irrelevant, in the grand scheme of things, in this moment. This is a dumb problem, and honestly, I don’t really want to frame this app I’m about to describe as anything other than a fun, trivial little side project.
Nonetheless, a silly problem deserves a silly app to solve it, and so I started thinking about whether this was something I could feasibly build. Of course, as this whole blog has made clear, I’ve already got a significant indie project on the go, and conventional wisdom would suggest that you probably don’t want to make a habit of abandoning ideas-in-progress for whatever shiny new idea pops into your head.
But, I’ll be honest: freelancing work, writing and real life have been taking up a lot of my time, and I haven’t been making progress on the indie app work as quickly as I had hoped. I still think I’ll get the big app done at some point this year, but the idea of shifting gears for a few weeks in order to get a much smaller finished product out the door felt pretty appealing. I haven’t actually released an app independently since 2013, and I figure I can probably learn a lot from going through that process and seeing if I can drum up a bit of interest online. If nothing else, it gives me something recent I can point to and say “look, I’m capable of building cool things!”
So, I’m building this app. I’m not sure the idea itself has any real legs, but I figure the cost of building it is low enough that it’ll be worth doing, regardless of any response it does (or doesn’t) get.
Okay…what is it, exactly?
The app is called Oh Bother. Why? Because it’s all about communicating whether or not you want to be bothered, and because I like Winnie the Pooh.
It’s a rather simple app that helps you and your housemates avoid poorly-timed interruptions when you’re working from home together. You can set your status to either botherable or unbotherable — neither of which are real words. You can put your status on a timer, such that it flips automatically when time is up, and you can get notified when time is up, if you wish. You can also provide context for your status by indicating that you’re on the phone, or taking a nap, or going outside, or what have you.
Meanwhile, you’ll always have up-to-date info on your housemates’ statuses, synced automatically through iCloud. You can also set up notifications to let you know when a housemate’s status changes, which might come in handy if your housemate is busy, but you’re really eager to talk to them about the hilarious tweet you just wrote.
The app will be free, with an option to tip inside the app, and perhaps get a few fun cosmetic options as a thank-you hug. I haven’t quite sorted out that last part yet — that’s one of the things I’ve still got left to do before launch.
My goals in building this thing
My initial commit was on April 2nd, so I’ve been working on this on and off for close to a month. I can see the finish line now, but the process has been a pretty tricky tug-of-war between three goals that are quite at odds with each other: shipping quickly, shipping something that feels complete and polished, and learning some stuff along the way.
On April 10th, I tweeted about this app for the first time , and said I was hoping to launch it “in the next week or two.” It’s now April 28th, and I’ve still got work to do, so…oops.
Despite this very unsurprisingly dragging on a bit longer than I had initially hoped, speed has been a priority throughout. This is intended to be a small side project, and I want to make sure the cost-benefit of building it isn’t skewed too far towards “cost.” To make sure of this, I’m building it largely with tools and frameworks I’m super familiar with — this app is 100% Swift & UIKit, with one small third-party library, Cartography, that I’ve written about before. I’m also leaning heavily on my own UI library, which I’ve built up over time, and that sits on top of UIKit and implements a bunch of reusable controls, custom transitions, etc. that match my aesthetic and coding style. In other words, I’m reusing everything I can!
Seeing as this is a small project I’m releasing for free, the biggest practical benefit I can hope for from a career/indie cred perspective is for this app to showcase some of what I’m good at. And in general, what I’m good at (according to me) is paying attention to detail and building things that are polished and thoughtfully designed.
Here’s the problem: polish takes time — sometimes, absurd amounts of time — and because it’s what I care most about, I am extremely susceptible to falling down nearly endless rabbit holes of tweaking and obsessing over tiny design details that regular users likely could not care less about.
So, building this app has definitely been an exercise in trying to find some balance here. There are lots of fun details in there that I’m proud of, but I’ve taken plenty of shortcuts that I’d love to spend more time on too.
Regardless of any “success metrics” an app release does or doesn’t hit, there’s always some value in building something if you can learn and improve as a developer along the way. Of course, learning takes time, so there was a balance to be struck here too. I would have loved to build a small app like this using SwiftUI, for example — and who knows, maybe that’s a project for another day — but I know that would have taken me a lot longer, and likely resulted in a less polished end-product.
So, I largely stuck with the tools I knew, with one big exception: I’ve never built an app using CloudKit before. Building this with Firebase likely would have taken me less time, but CloudKit is an important framework that represented a big gap in my knowledge, and this seemed like an easy, constrained use case to get started on.
Adding robust CloudKit syncing and sharing was definitely the hardest part of building this app, but I think I’m out of the weeds now, and have a good grasp on a framework I knew very little about just a few weeks ago. I may write a more technical article about my experiences with CloudKit soon, but in the meantime, I will simply say this: Gui Rambo’s CloudKit 101 was an absolutely massive help in getting my implementation off the ground. If you’re at all curious about learning CloudKit, I’d highly recommend starting there.
Cool, when can I get the app?
Update from the future: It’s available now! Check it out and let me know what you think 🎈