Charlie has found two new favorite games on his iPad (my old third gen), both of which are by Sago Mini: Sago Mini Farm and Sago Mini Puppy Preschool. In the latter, he especially loves putting all the doggies in the bathtub. 🐶🛁💕


I know, I know. I said I was going to take a break from programming in February. But then Snapthread got featured and I got all jazzed about it and well…here I am. Here’s a peek at my work-in-progress:

Early version of Snapthread for iPad


Snapthread received 8,194,268 impressions over the last 3 days, in case any of you are interested in that data. That’s basically the number of people who opened the “Apps” tab in the store, since AFAIK you didn’t have to scroll at all to see it. It only translated to a few hundred downloads, but I’m still extremely pleased!


Is there any way I can detect when a UISplitViewController has changed display mode? I need to refresh my collection view after it finishes changing from primaryOverlay to allVisible. There’s no delegate method for that that I can see.


📈 In the week since I posted about Snapthread’s download numbers, it’s actually done quite a bit better than I expected. I thought it would drop off to 1-2 downloads/day, but instead it’s been more like 8-9 (and one day had 22!). I still think moving to freemium is the best way forward, though.


Pro-tip: if you’re localizing your app yourself and you need to know what Apple calls a certain thing in that language (i.e. “Smart Albums”), just find a support article that mentions it and change your locale at the bottom of the page.


I’ve been having quite a lot of fun localizing Snapthread with the help of some very generous translators. I’m copy & pasting the translations manually and it’s definitely hitting the “mindless data entry” sweet spot for me. Very relaxing.


As I ponder App Store business models, my mind keeps coming back to this: making Snapthread free with a tasteful watermark in the corner, with an in-app purchase to permanently remove it. People who already paid for the app would be grandfathered in. Thoughts?


The Falcon Heavy launch 🚀 was one of the most incredible things I’ve ever witnessed and I was able to watch in on my phone, in HD, through my AirPods, while snuggling my son to sleep. 😍


iMovie hasn’t been updated for iPhone X. Also, I’m pretty sure it has to be using separate storyboards for iPhone and iPad, if it uses them at all. 🤔


It’s been six days since I launched Snapthread 1.5, so I thought I’d share how it went in terms of downloads and revenue.

What I did differently

When I first launched Snapthread back in September, I did so with a blog post and a couple of tweets. Unsurprisingly, it did pretty poorly, with only a download or two per day. Right before Thanksgiving I decided to put it on sale for 99 cents which caused a modest bump in downloads for 4-5 days, but nothing spectacular.

Of course, Snapthread itself wasn’t particularly compelling at that point, since it only supported portrait photos and videos.

For version 1.5, I upped my game a little bit. I put together a new website, created new, more professional-looking screenshots, put together a press kit, set up a Search Ads Advanced campaign, tweeted about it, published a blog post, and e-mailed six media contacts. I also submitted the App Store Editorial form.

How it went

On Monday and Tuesday, several of my awesome Twitter acquaintances tweeted about Snapthread (some of whom have > 10,000 followers). On Wednesday, MacStories published a review. I was confused and excited when it continued to climb the charts in the Photo/Video category on Thursday, not realizing that another article had been published on iMore that morning. Snapthread’s ranking peaked at #108 before falling rapidly off the chart.

Snapthread was also posted to Product Hunt, but didn’t receive enough upvotes to trend.

Honestly, I still feel like a “nobody” in the iOS development world, so getting as much attention as I did for something I created was great fun. But did any of it translate into big downloads and revenue? Not really.

On the day the MacStories article was published, I made about $140. The next day, $103. Yesterday, $36.

What went wrong?

My gut feeling is that it’s just really, really hard to get noticed. Here are a few other guesses:

  • The app just isn’t good enough.
  • People don’t want to spend $2, or it doesn’t provide $2 worth of value.
  • Some folks don’t like Live Photos, or don’t see any use for them.
  • I didn’t e-mail enough people.
  • I didn’t have any videos showing how the app works.

I also didn’t advertise on Facebook or anywhere else because I honestly can’t afford it. I threw a few bucks into a Search Ads campaign which has so far resulted in 1,319 impressions, 22 taps and 1 conversion.

What’s next?

Next, I keep working to make Snapthread so darn good that it can’t be ignored. I chose this life for fun, not profit, so I’m going to keep on having fun and hope that someday I’ll make a profit.


I honestly long for the days I can open up my Xcode projects on my iPad and edit them. A toddler won’t let you hide behind a laptop for long. It’s way easier to carry an iPad around the house and make a little progress whenever I can.


TIL that requesting an AVAsset for a video in a user’s library returns an AVURLAsset unless the video is slow motion, in which case it returns an AVComposition. Guess I should have done more testing with slo-mo videos!

Assumptions vs. Complexity

At one point in episode 112 of Under the Radar (Ideal vs. Pragmatic), Marco and David talk about a dilemma that developers sometimes face: the choice between making an assumption, and exploding complexity. I thought I’d write about some of the times I encountered that fork in the road while building Snapthread, and how I decided to handle it.

My first opportunity to explode complexity reared its head the moment I selected File —> New Project in Xcode. I was immediately presented with the option to use Core Data. I stared at the empty checkbox. Did I want to persist data in Snapthread? Should my users be able to save their projects in order to return to them later?

Data persistence adds a huge layer of complexity to even the simplest apps. If I had decided to let users save their projects, I would have had to save an enormous amount of information in order to later reconstruct a video. And what would happen when I made the app universal? People would expect their projects to sync. I’m writing this post in Writemator 1.0, which doesn’t yet sync via iCloud, and I already wish it did.

In the end, I assumed that Snapthread’s users could complete their work in a single, short app session. They would open Snapthread, throw together a quick video in a matter of minutes, save or share it, and move on. Of course with this approach, Snapthread will never be a pro-level video editor, but that’s fine with me. It saves me a lot of work, and further emphasizes that Snapthread is meant to be fast and casual.

I made two more assumptions later on in Snapthread’s development: 1) that once I positioned the app as a visual studio for Live Photos, people would primarily use it for Live Photos, and 2) that if users did merge standard videos, those videos would be taken with Apple devices. Scaling and translating videos to work in any of 5 possible aspect ratios requires a lot of conditional branching statements. Each possible orientation (portrait, upside down portrait, landscape home button right, landscape home button left, and then all of those options again for the front camera…) ends up needing different translation values in order to position the video correctly. By assuming that a video’s original aspect ratio and pixel dimensions fall within a narrow range of choices, I prevented that tangle of if-elses from becoming completely unmanageable.

Honestly, I think one of the only safe assumptions you can make in software development is that at some point, someone is going to use your product in a way you didn’t anticipate. You can then choose to either address those edge cases, or say “sorry, you’re out of luck.” For instance, apparently you can’t add a soundtrack from your music library in Snapthread if your phone is jailbroken. There’s nothing I can do about that, and if there was, I probably wouldn’t do it.

I also think that if faced with the choice between making an assumption and exploding complexity, you should almost always choose the former. Incorrect assumptions can often be remedied, but it’s hard to dial back complexity. Just look at all the extra crap Facebook has added to Messenger in the past few years. Even if they wanted to simplify the app again, it can’t be easy to tear all that stuff out.

Anyway, it’s something to think about. What are some assumptions you’ve made while developing your apps?