Weekly Indie Log #21

Weekly Indie Log #21

Topics: February Revenue Recap and Android Home Screen Widgets

Check out my apps: HabitKit, WinDiary and Liftbear

February is over, let's take a look at the numbers:
💰 $26,432 revenue (-20%)
💸 $6,536 MRR (+17%)
👥 7801 subscribers (+19%)

This month has been outstanding in terms of revenue for my app business and I'm really happy with the current trajectory. Although I entered the month with modest expectations, completely aware that the totals wouldn't match the peak of January, the numbers did not disappoint.

The revenue for February marks a 20% dip from January's high, which was anticipated, but when I compare it to the revenue from the same month last year, it's an impressive increase of 1524%. MRR and active subscriber count are up by ~20% and I couldn't be happier with this number.

It's probably completely normal in business to experience a decline after a peak, but the I hope that I reached a new "base level". A consistent revenue range above $25,000 would be a crazy milestone for the business. I have great things planned for March, so I hope to keep up the good times!


The end of February is always a little bit magical: You get a ton of renewals (combined for the missing 3 or 4 days) but (of course) you'll also experience a lot of churn. In the last two days my app dropped roughly $100 worth of MRR. On the flip side, over 300 subscribers renewed their subscriptions to my apps in this time frame.


Android Widget Progress

This week, I made a ton of progress on rewriting the home screen widgets of my app HabitKit. After I already finished the iOS part, I switched to the Android side-of-things for the past two weeks and I have to admit, that it was a pretty tough challenge (even for a more-or-less experienced software engineer like me). Learning two new programming languages (Swift + Kotlin) and their UI frameworks (SwiftUI + Jetpack Glance) at the same time wasn't as easy as I would have thought.

Especially Jetpack Glance gave me a hard time. Learning Kotlin and Jetpack Glance is a combination of thinking "Yes, that’s a nice API" and "Oh god, what a weird limitation". There are so many weird quirks that you have to keep in mind while building a more complex UI. Examples: 10 children limit for Columns/Rows , no nested lists, no custom fonts, no border modifier...

Here is a preview screenshot how the widgets will look like on Android:


I even posted a video highlighting the interactivity of the widget and check off habits right from the home screen:

Here are the most important tasks I've completed this week:

  • Interactivity: Added a click event to the completion indicator which calls my Flutter code and adds a completion to the database for this habit.

  • Backwards Compatibility: I made sure that the widgets don't break after updating the app. Because I changed the way the habits use the apps' data, that was a little bit challenging.

  • Automatic Updates: Made sure that the widget refreshes automatically once a new day began.

  • Timezone Bug: Of course, Flutter/Kotlin/Swift have different Date types which all behave in a different way. I had to fix a bug where the timezone offset wasn't taken into account on Android.

  • Small Widget: I rewrote the small widget to also use Jetpack Glance. That was a quick task because I could reuse all my previously written Composables.

The next week will mostly be about testing the new widgets, cleaning up code and planning what the next steps are. I got so many great ideas for HabitKit and I'm finally able to implement them!

That's it for this week, see you in the next one 👋

Did you find this article valuable?

Support Sebastian Röhl by becoming a sponsor. Any amount is appreciated!