Skip to content
DON LOKUGE.

Selected work

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

ON DEVICEScreensExpo RouterDaily progressSource of truth, stored locallyChallenge trackerStreaks, grace days, failure rulesSync queueReplayed on reconnectHEALTH DATAAevriHealthKitCustom native moduleBackfills workouts from HealthKit and Health ConnectCLOUDFirebaseFirestore, Storage, AuthasyncCOMMITMENT LEVELSForgiving15% missable, 3 in a rowBalanced10% missable, 2 in a rowUnforgivingOne miss ends it
The device is the source of truth. Daily progress drives streaks and failure rules, health data backfills workouts, and a queue syncs to Firebase when it can.

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

Lessons