Case study
Apexevo
A habit tracker built as a role-playing game. Daily consistency earns experience, tracks level up over months, and a contribution heatmap makes a broken streak visible.
Overview
A habit tracker that borrows its mechanics from role-playing games. Logging a session earns experience, each area of life is a track that levels independently, and a contribution heatmap in the style of a commit graph makes a broken streak impossible to ignore.
The design deliberately rewards consistency over intensity. Early levels arrive quickly so the habit forms; later ones take months of unbroken discipline, so the reward curve matches the behaviour it is trying to produce rather than the behaviour that feels good to ship.
What I own
The concept, the design document, three staged implementation plans, and the Flutter application itself.
Complexities tackled
Deciding what not to build into an existing product. This started as a feature idea for Sortive and was deliberately split out. Sortive is a frictionless productivity tool; a gamified system is the opposite of frictionless. Merging them would have made one app that was worse at both jobs. Separating them cost a second codebase and was still the right call.
Designing a reward curve rather than a reward. Points that arrive at a constant rate stop meaning anything within a fortnight. The progression is exponential, so the early levels hook and the later ones take real time, and side missions carry small awards so that a partial day still counts for something. Getting that curve wrong is the difference between an app someone opens for a week and one they open for a year.
Local first, then synced. State lives in Hive on the device so the app is instant and works with no connection, with Firebase behind it for accounts, cross-device state and the social comparison features. A tracker that stalls on a spinner when you have thirty seconds to log a session does not get used.
Serverless functions for anything the client must not be trusted with. Social comparison means one user’s progress is visible to another, and a client that computes its own score is a client that can lie about it. The work that decides what a number actually is runs in cloud functions rather than on the device, which is also where anything fan-out shaped belongs.
The heatmap is a chart, and charts are a rendering problem. A year of daily activity is several hundred cells that have to stay legible on a phone, respond to a tap, and redraw when a day changes, which is a plotting library’s job rather than a grid of widgets.
Stack
Flutter and Dart, Riverpod for state, Hive for local persistence, Firebase Authentication, Cloud Firestore and Cloud Functions, go_router for navigation, flex_color_scheme for theming, a charting library for the heatmap and progression views, and code generation for the providers.
Working on something similar?
Tell me what you are building and what is in the way. I will tell you honestly whether I am the right person for it.