100k Downloads in 1 Weekend!

Loose-Leaf-DownloadsAsk anyone, and they’ll tell you that launch day is the most important day of an app’s life, and if you miss it then you’ve lost.

I wrote earlier about the lackluster launch day for Loose Leaf, and over the past 3 months I’ve continued to push through a marketing strategy. This is a marathon, not a sprint. Today is an important mile marker: 3 days bringing nearly 100k downloads!

“So how do you get 100k downloads for your app?” you may ask. If you’d asked me three months ago, I’d have no idea. Arguably I still have no idea since we got just under 100k downloads this past weekend, but let’s round up for today – I’m celebrating!

The short story: do new things constantly.

Three Months

These past 3 days couldn’t have happened without the three months before them. After last November’s launch, I started reading Traction. The book outlines 19 different marketing channels that could work for any company, and it encourages brainstorming and prioritizing how every one of them could be used.

I took it to heart and started working my way through my own spreadsheet of ideas. At the time of writing, I still have 50+ ideas in the spreadsheet – it’s a system not a goal.

A few of the ideas that I’ve worked through:

  1. Regular bloggingThere have been quite a few posts that brought significant traffic
  2. Open sourcePerformanceBezier in particular has brought significant visibility to the app
  3. Coding Livestreams: It’s a fun way to open source some code, and has also resulted in some press mentioning Loose Leaf
  4. Lots more app videos: I started using Vine for frequent developer updates, and hand shadows for better demo videos
  5. Started working with Madalyn Sklar and then Steve Young: both of whom have been instrumental in teaching and helping me
  6. Interviewed on app podcasts
  7. Joined #startup to learn from other startup makers
  8. Start regularly attending and occasionally presenting at local meetups
  9. and many more ideas I won’t bother listing…

I discovered that these ideas are more than their sum. It’s a make-your-own-luck game, where the more places you push, the more often they push together. This podcast interview helped get Loose Leaf seen and posted to Product Hunt late last month, which ultimately helped our pitch this past weekend.

Three Days

When I started working with Steve in late February, one of the ideas he brought was to make Loose Leaf free for just 1 weekend. The goal for the weekend would be 20k to 40k free downloads tohelp prove traction for the app,  validate our target market, and jump start a community of users.

Steve’s strategy here is simple:

  1. It only makes sense for paid apps, the higher priced apps work even better
  2. It requires at least some traction already
  3. Plan to go free for just 1 weekend
  4. Pitch specific sites about the high price app going free

Dropping a paid app with some validation to free for a very limited time can be an effective pitch to high traffic app deal sites. For the free weekend, we pitched three different sites, and on Friday we got picked up by just one of them.

On Saturday morning, 1 day into the free weekend, Loose Leaf had barely over 4k downloads. Traffic grew throughout Saturday, and the related tweets got it picked up by AppAdvice, which brought even more traffic. We also started to rank in the App Store’s top free productivity apps, and all of the combined traffic brought in over 58k downloads that day! This continued into Sunday for an additional 33k downloads, totaling over 96k for the weekend!

It’s very safe to say this has been a wild success! We were able to get Loose Leaf in front of a large audience, measure conversion rates, A/B test the website, and jump start a strong community of users and start hearing their valuable feedback. The biggest take away was connecting with lots of new users and validating and tuning our target market.

Three Lessons

1. Small problems become big problems with lots of users

Before the weekend, I only knew of very rare and difficult to reproduce bugs in the app. With this many people using the app, even rare bugs becomes immediately obvious. Crashlytics has been invaluable for reporting problems in real time, and thankfully shows problems hit a small % of users.

2. Measure. Measure. Measure.

Going into the weekend, I was prepared to measure as much as I possible. Mix panel and Google Analytics were setup on the site to track demographics and conversions and A/B test different site layouts. Mixpanel was also integrated into the app to anonymously track average session duration, tool usage, and which tutorials pages were effective. This is a huge help both for which features to work on and where to focus our marketing energy.

3. Brainstorm and keep trying new things

This weekend happened because of the three months of brainstorming and work that led up to it. Today was that validation to keep pushing, keep moving, and keep running the marathon. I still have 50 ideas to push through on my Traction spreadsheet, and by the time I’m done I’m sure I’ll have thought of 50 more.

Let the next mile begin.

Programming Without a Computer

I think of this quote almost every day:

I was trying to understand why rockets were so expensive. Obviously the lowest cost you can make anything for is the spot value of the material constituents. And that’s if you had a magic wand and could rearrange the atoms. So there’s just a question of how efficient you can be about getting the atoms from raw material state to rocket shape.

– Elon Musk


Which I reworded and condensed to:

There exists an order of bits that’ll make the iPad do what I want, and my job as a programmer is to find that list of bits.

This fought against my competing idea:

Either what I’m trying to do is impossible, or I’m too dumb to figure out how to do it.

Every day was an exercise in motivation, and a balance between these two thoughts. A few features that gave me particular grief: scissors, gesturesperformance, OpenGL rendering, among others. Each took me weeks to figure out, and often a few weeks into their development I felt no closer than day one.

But then something fantastic happened: about halfway through Loose Leaf‘s development, I had some health problems that required me to dramatically change my diet and to start exercising. Health problems generally aren’t great news, but this one changed more than my diet.

As I walked about four miles each afternoon,  a wonderful thing happened that I didn’t expect: being away from my computer gave me time to think more completely about the problem I was working on. Since I obviously didn’t have my computer with my on my walk, I couldn’t dive straight into coding each half baked idea, which forced me to think deeper through each potential solution to prove that it’d work. When I finally got back to my computer later that afternoon, I’d have a well thought out plan of attack. This made the last half of the afternoon many times more productive than the entire afternoon ever would have been.

I honestly don’t think I could have built the scissors feature without taking that walk every afternoon. More than I could say has already been said about Deep Work and thinking without distractions, but this was it for me. Taking time away from technology – no computer, no phone, no iPod, no music – it let me find the solutions to difficult problems.

Using Augmented Reality Code for a Better Stretch Gesture

Loose Leaf is more about photos and imports than it is about drawing or sketching, and I wanted to make sure it was easy not only to cut and create new scraps, but also to manipulate and duplicate existing scraps. To make a copy of a photo or scrap, I thought through numerous gesture options, menus, long press popups, buttons, and more, and in the end I settled on a simple pull-it-apart-gesture.

So how’d it turn out? Here’s what it looks like to duplicate any photo scrap in Loose Leaf, just pull it apart into two identical pieces.

It’s a simple gesture to pull a photo into two copies. The stretch animation as you pull makes it obvious what’s happening, and then — snap! — It’s two copies!

The difficult piece of this gesture isn’t the copy itself, it’s the stretch animation as you pull the image apart. For a number of reasons, I needed to do this without additional OpenGL rendering, I needed to keep the code solidly in the normal UIKit stuff. To make it work, I borrowed some technology that’s fairly common in Augmented Reality apps: it’s called homography.

The short description is that any convex quadrilateral can appear to be any other convex quadrilateral by just rotating and translating it- It basically lets me turn any four sided shape into any other four sided shape. Perfect! scraps, even non-rectangle one’s cut by scissors, are still modeled as simple rectangle UIViews. As I stretch, I can transform that rectangle into a parallelogram for that stretched effect.

Here’s the simple test application I used to fine-tune the animation with the above strategy:

The algorithm visible above goes through the following steps:

  1. create a 4 sided quadrilateral from the four touch points on the scrap
  2. as the fingers move, create a 2nd quadrilateral from the new locations of those same touches
  3. compute the homography between those two quadrilaterals to find the transform between them
  4. apply that transform to the scrap itself

Note that I’m not trying to calculate the transform from the UIView’s bounds to its new parallelogram – instead i’m transforming the quad of finger positions to thew new quad of finger positions, then using that transform on the view.

The red lines in the above image is the quadrilateral between the touch points. The green line is an “average” quadrilateral, which averages the red quad into a parallelogram. You can see the stretch is very dramatic, and it causes a problem if the touch points form ever form a concave instead of convex polygon. You can see an example of what goes wrong below:

But if I use the average quad instead, and treat those points as transforms between parallelograms, then the same gesture gives smoother results:

My last experiment for the stretch gesture was how to keep the orientation of the image as it stretched. I thought about trying to maintain the “up”ness of the image regardless of the stretch vs. having the gesture also rotate the image during the stretch. You can see what I mean with the two videos below.


In the end, I decided to rotate the image during the gesture, and not try to maintain “up” orientation. It gave a cool effect, especially when stretching, but felt just a bit off since it also caused the fingers to slide more over the image.

To try it for yourself, download Loose Leaf on the app store.

You can also find all of the code on GitHub for each one of the versions talked about here, and be sure to check out the rest of Loose Leaf’s open source contributions as well.

Google Author link
Page 1 of 4612345...102030...Last »