Productivity2015 to now

Ten years on the App Store

Habite has been shipping for a decade with thousands of active users, across every iOS version, two backends, and one full data migration.

ProductHabite
RoleDesigner and engineer
Habite running on iPhone
10 yrsOn the App Store
5,000+Users
4Major versions
The challenge

Habite started as a habits app and grew into the place people keep their tasks and notes as well. Building the first version was straightforward, and the harder part has been keeping it working for the ten years since.

Apple reworks iOS every September, Firebase deprecates things on its own schedule, and devices change shape. All of that has to be absorbed without users noticing anything except that their data is still there.

Keeping it simple

I kept the architecture deliberately plain, with programmatic UIKit and no storyboards, a generic repository layer between the app and its backends, and state flowing through one place rather than several.

Keeping it plain is what made it cheap to change, so whenever the structure needed rethinking, which has happened a few times across four major versions, there was not much clever code to work around.

What is in it
  • Habits, tasks, notes, and profile as one connected product
  • A generic repository layer over two different Firebase backends
  • Real-time sync through a single cached user state
  • Subscriptions and a lifetime purchase through StoreKit 2
  • A widgets extension
  • A migration off the original Core Data storage
Under the hood

How it survived ten years

01

A decade of continuous shipping

Ten years of iOS releases, device sizes, SDK deprecations, and App Store policy changes have gone by without anyone losing their data, and it is the part of my work I would most want a client to look at because keeping an app healthy for that long is something you can only show by having done it.

LongevityiOS
02

Rebuilt when there was a good reason to

Habite is on its fourth major version. I have restructured it more than once, not because the code had gone bad but because a better structure became obvious or the platform moved somewhere worth following. Each time the app came out better and people carried on using it without noticing anything had changed underneath.

ArchitectureMaintenance
03

Two backends the app never has to think about

User records live in Realtime Database and everything else lives in Firestore, for reasons that made sense at the time and were never worth undoing. A generic repository layer means the app code never has to know which is which.

FirebaseArchitecture
04

Migrated off Core Data without losing anyone

The original storage was Core Data. Moving to a cloud backend meant carrying years of existing users across without data loss and without asking anyone to reinstall.

MigrationCore Data
05

Paid for with StoreKit 2

Monthly and yearly subscriptions alongside a lifetime purchase, handled through StoreKit 2, with restore and entitlement checks that still behave correctly when the network does not.

StoreKit 2Payments
Ten years later

Habite has thousands of people relying on it, some of them since the first version, and I still update it and run it myself as a profitable app.

When a client asks whether I will still be around in two years, this is what I show them.

Built with
Platform
SwiftUIKitWidgetKitStoreKit 2
Infrastructure
Firebase FirestoreRealtime Database