Independent product / built solo
Holdfast.
A fasting timer that lives outside the app.
- My role
- Sole engineer
- Working with
- Solo
- When
- 2026
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
My part
in the product.
Built alone — research, design, build and store release.
- 01
A Live Activity and Dynamic Island presentation so the running fast is readable from the lock screen without opening anything.
- 02
Home-screen and lock-screen widgets rendered in SwiftUI through WidgetKit.
- 03
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.
- 04
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.
- 05
Insights over accumulated history, and a paywall gating the widgets and insights while the timer itself stays free.
A closer look
The actual product.
Decisions worth explaining
Why it works
this way.
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.
Tools used on this project
Expo / React Native / SwiftUI / WidgetKit / AlarmKit
Next project
Promote ↗︎
Campaigns for brands. Paid participation for creators.
← Back to this project in selected workSummer 2027 co-op · flexible term length