The problem
A fasting timer is an app you deliberately do not want to open. The whole job happens while the phone is in your pocket: knowing how far in you are, and being told the moment you are done. Most fasting apps treat the timer screen as the product, which means the one thing you actually need — the state of your fast at a glance — is the thing that costs you a launch, an unlock and a tap.
What I built
- A Live Activity and Dynamic Island presentation so the running fast is readable from the lock screen without opening anything.
- Home-screen and lock-screen widgets rendered in SwiftUI through WidgetKit.
- A real alarm at the end of a fast using AlarmKit, rather than a notification that a silent switch or a focus mode can swallow.
- Fasting stages, history, and a correction flow for when you forget to start or stop the timer — which is the normal case, not the edge case.
- Insights over accumulated history, and a paywall gating the widgets and insights while the timer itself stays free.
Decisions worth defending
- AlarmKit instead of a local notification. A notification is best-effort and can be silenced; the end of a fast is a commitment the user made and it should behave like an alarm clock, not a suggestion.
- The core timer stays free. The paid tier is the surface area outside the app — widgets, Live Activity extras and insights — so the free version is genuinely usable rather than a trial.
- Correction as a first-class flow rather than an edit dialog buried in settings, because mistimed starts are the most common thing that happens to a fasting timer.
Screens




