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 long game

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. Keeping it working for the ten years afterward was the actual problem.

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. Programmatic UIKit, 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. When the structure needed rethinking, and it has a few times across four major versions, there was never much cleverness in the way.

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, absorbed without anyone losing their data. It is the part of my work I would most want a client to look at, because it is the hardest to fake.

LongevityiOS
02

Rebuilt when it earned it

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. It is still updated, still profitable, and still mine.

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