Case study 02
Aevri / Challenge tracker
An app for people who finish what they start.
- Client
- Aevri
- Engagement
- My own product, myaevri.com (opens in a new tab)
- Discipline
- Product, React Native, Mobile Architecture
- Stack
- React Native, Expo, TypeScript, Zustand, Firebase, HealthKit / Health Connect
01
Overview
Aevri is an iOS app for people who want to commit to a structured challenge and see it through. You pick a length from 7 to 90 days, choose your daily pillars (training, hydration, eating, reading, a progress photo) and set how strict the rules are. Every pillar has to be done before midnight.
It is my own product. I own the product direction, the architecture and the build, end to end. It is live on the App Store.
02
Challenge
The rules are simple to explain and fiddly to implement. A challenge can fail on the share of days missed or on a run of consecutive misses, depending on the commitment level. Grace days can be earned and spent. Challenges can be extended mid-run. Streaks for each habit outlive any single challenge.
All of that has to be right on a phone with no signal, and stay right when the data reaches the cloud later. Workouts should count without the user typing them in twice.
03
Responsibilities
- Product direction: the challenge model, commitment levels and pillars.
- Architecture and build of the app in React Native and Expo, with TypeScript throughout.
- An offline-first data layer, with a sync queue to Firebase that replays on reconnect.
- AevriHealthKit, a custom Expo native module that reads HealthKit on iOS and Health Connect on Android.
- Expo config plugins for the native project changes, and releases through EAS.
04
Architecture
Every user action writes to daily progress first. That is the source of truth for what happened each day. The challenge tracker then recalculates streaks, segments and failure status from it. Syncing to Firestore happens afterwards, without blocking the screen: changes go into a queue that is replayed when the device is back online.
Screens never touch storage directly. They go through a small set of services, with one facade the dashboard uses to load everything it needs.
05
Decisions
Offline first
The app works fully without a connection. Local storage is the source of truth and the cloud is a copy that catches up.
Rules as configuration
The three commitment levels are defined as configuration (allowed miss percentage, allowed consecutive misses), not as separate code paths.
A native module of my own
Health data comes through AevriHealthKit, a custom Expo module covering HealthKit and Health Connect.
06
Trade-offs
07
Results
Aevri is available on the App Store for iOS.
08