Case study
Habit Hearth
A working offline-first Android prototype with task, reward, village, story, and reminder systems.
- Role:
- Android developer
- Timeline:
- Mar - Apr 2026
- Stack:
- Kotlin, Jetpack Compose, MVVM, DataStore
The problem
Checkboxes and streaks can make habit tracking feel like another chore. Habit Hearth gives each completion a visible consequence: the player earns resources, restores buildings, and pushes back the fog and vines covering the village.
Tasks belong to Strength, Wisdom, Vitality, or Spirit. Their difficulty sets the gem reward, while experience unlocks later story sections and gems pay for category-specific choices.
Constraints and tradeoffs
Constraint
The core experience must work without an account or network connection.
Decision
All progress uses typed local DataStore repositories. This protects privacy and keeps setup simple, but progress does not sync across devices.
Constraint
Game systems must stay consistent across several Compose screens.
Decision
Shared StateFlow state coordinates rewards, levels, buildings, and story gates. The extra state modeling keeps task completion and village progress from drifting apart.
How it works
Jetpack Compose screens observe ViewModels backed by typed DataStore repositories. Completing a task updates its stored state, credits gems and experience, and recalculates which buildings and story sections the player can open.
Product screens

Results and takeaways
- Category-specific gems tie each kind of habit to a different part of the village instead of reducing every task to the same streak count.
- Persisting one source of truth for total experience prevents levels and story gates from falling out of sync.
- Story choices spend the same gems that habits award, so the narrative and task systems share one progression loop.