Skip to content
Maximus Fernandez.
Back to Habit Hearth

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

Habit Hearth product tour showing its story, village progression, and habit reward loop

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.