Indie App Dev Log: Week 2

Intro: This is a (hopefully) weekly series I'll be writing reflecting on what has worked for me as an indie app dev. Although in the spirit of building in public, I'm keeping this non-technical, instead focusing on the motivation behind features and what’s working when it comes to growing a user base.

App Store Search Optimization

I started the process of optimizing Boost Blue for better ranking on the App Store this week, something I don't have a ton of experience with. I landed on using App Follow to help me out here. I'm using the free tier and don't see any reason to upgrade at the moment.

For not having spent any time on ASO, I was actually doing pretty well. I have 42 reviews, averaging 4.6 stars, which gives me a good starting point. However, the keywords I was using weren't effective at all.

I exclusively want to rank on terms directly related to Bluesky. App Follow will show you, for any app (yours or a competitor’s), which terms drive the most impressions and downloads. Seeing which of my terms were actually driving impressions and downloads was super helpful. I had several competitor names in my keywords, which weren't even showing up (App Follow’s free plan only shows your top 10 terms).

Even more useful was checking which terms were driving traffic for competitors that I wasn’t ranking for at all: blusky, bsky, and bsky app. After optimizing my keywords based on mine and competitor's traffic drivers, I improved to the following:

Bluesky: 7 -> 6

bsky: Unlisted -> 8

bsky app: Unlisted -> 9

blusky: Unlisted -> 4

Bluesky for iPad: 8 -> 1!!!

I'm happy about the improvement, but the only change that's measurably making a difference is the addition of blusky. The terms bluesky and blusky are making up 53% and 38% of my downloads respectively, with no other term above 1%. Interestingly, top impressions are more evenly distributed.

Apple Search Ads Results

I ended my experiment with Apple Search Ads this week. After dialing in the correct setup, I landed on a CPA of $1.92. I'm really happy with that result, but even at that cost, I don’t think I can justify continued spend—at the moment.

I'm planning to build out an onboarding flow at the start of the new year, and in addition to The Refactor, I’m hoping my conversion and retention rates will improve enough to justify a consistent ad spend.

I am starting a new ads experiment specifically targeting other Bluesky clients such as Skeets and Graysky. I included both of those in my keyword targeting, but the volume was so low relative to Bluesky that neither ever received any spend.

The Refactor

When I built the initial Boost Blue app's timeline preservation, it was meant as a proof of concept. It's hacky, inefficient, and very slow at startup. If I had known how far this project was going to go, I probably would have taken the time to figure out a better solution.

Over the last two weeks, I've completely rewritten the Fso when you open it, instead of pulling posts from the Bluesky API until I find your last read post, I can immediately show whatever you were looking at before and fetch the newer posts in the background.

In addition to caching posts, I also switched from using an out-of-the-box PagedListView to a CustomScrollView. To keep this non-technical: PagedListView only allows pagination in one direction, and inserting posts early in the list would always result in pushing the whole list down. So if I had cached posts, and then loaded posts in the background as I am now doing, the list would jump when the new posts were inserted.

I just submitted this update to both stores for review! I'm extremely nervous about the potential for bugs in this release. To mitigate that I have the release configured for a staged rollout on the App Store, and also included a Firebase Remote Config flag to toggle between the new and old following page, so that I can disable it altogether if there are critical bugs.