I spent a lot of last year telling myself I drank enough water. I did not. I knew this because every afternoon around 3pm my head would start to feel like someone had parked a small van on it, and the only cure was a glass of water and the quiet humiliation of realising I had drunk exactly one coffee and half a Coke Zero since breakfast.
So one Saturday I decided to build a water tracking app. Not a productivity opus. Not a subscription empire. Just something that would nag me gently, let me tap a button, and get out of the way. I called it WaterDrop and shipped it on the App Store two days later. This post is about how the weekend actually went — the parts that worked, the parts I threw away, and the stuff I wish someone had told me before I opened Xcode.
Why every water app I tried annoyed me
Before I wrote a single line of code I downloaded the top ten hydration trackers on the App Store. I wanted to see what the category looked like. Here is what I found, in roughly descending order of how much it bothered me:
- Onboarding flows that asked for my height, weight, activity level, climate zone, and astrological sign before I could log a single glass.
- A paywall on day three. Sometimes day one.
- Gamification so aggressive that logging water felt like being yelled at by a cartoon fish.
- Reminders that fired at 11pm, because apparently the app thought I should chug a litre before bed.
- Widgets that were just ads for the premium tier.
I wanted the opposite of all of this. Open app. Tap once. Done. No login. No fish.
The architecture, such as it is
WaterDrop is embarrassingly simple and I am not apologising for it.
- SwiftUI for everything. No UIKit bridges.
- A single
@AppStoragekey for today's count. A small Core Data store for history, because I wanted streaks. - Local notifications scheduled via
UNUserNotificationCenter, no server. -
WidgetKitfor the home screen widget.AppIntentsso you can log a glass from Siri or a shortcut. - Zero network calls. Zero analytics SDKs. Zero accounts.
The whole thing is maybe 1,400 lines of Swift. The hardest part was not the code. The hardest part was resisting the urge to add things.
The features I cut
Here is a partial list of things I designed, half-built, or sketched and then deleted:
- A "hydration score" that factored in caffeine and alcohol. Fun, but it needed a whole second data model and nobody asked for it.
- Social sharing of streaks. Why would you share this with anyone. Cut.
- Apple Health two-way sync. I still want this but doing it properly takes more than a weekend.
- A plant that grows as you drink. Cute. Not me. Cut.
- Custom drink types (tea, sparkling, etc). I may add this later. For launch it was friction.
Every time I cut something the app felt lighter. That is the actual lesson of the weekend.
Reminder logic is harder than it looks
The part I underestimated was reminders. You would think "ping the user every 90 minutes during waking hours" is a three-line function. It is not. You have to think about:
- Quiet hours. Nobody wants a 2am water ping.
- The user's actual sleep schedule, which you do not know.
- Not reminding them if they just logged a glass (otherwise the app feels robotic).
- Weekends vs weekdays.
- What happens after the device restarts and your pending notifications were reset.
I ended up with a simple rule: the user picks a start hour and end hour. Inside that window, reminders fire every N hours, and any reminder within 30 minutes of a logged glass gets cancelled. That was version one. Turns out version one was also version final, because it just works.
Shipping on a Sunday night
I hit upload in Xcode around 9pm Sunday. Apple approved it in about 18 hours, which is faster than I expected for a brand new developer account doing anything health-adjacent. The only feedback from review was a request to clarify that the app does not replace medical advice, which is fair.
If you want to see what I ended up with, it is here:
- Landing page with screenshots: https://thedolceway.com/apps/waterdrop
- Free on the App Store: https://apps.apple.com/us/app/id6760830381?pt=126940293&ct=devto&mt=8
It is free, there is no subscription, and there is no account. If you try it and something feels wrong I would genuinely like to hear about it.
What I would do differently
A few honest regrets.
- Screenshots. I rushed them. App Store screenshots are the single biggest conversion lever for a free app and I spent maybe 40 minutes on them. I am redoing them this week.
- Keyword research. I picked "hydration tracker" as my main keyword on vibes. I should have used an actual ASO tool. I am fixing this in the next metadata update.
- Icon iteration. I made one icon and shipped it. It is fine. It is not memorable. Icons deserve their own afternoon.
- Not timing the build. I wish I had logged how long each part took. Would have been great data for the next one.
The point of the weekend
I have shipped maybe a dozen things this year, most of which nobody will ever use, and a few I genuinely like. WaterDrop is in the second category because it solved an actual problem for me personally. I stopped getting the afternoon headache about a week after I started using it, which is either the app working or a placebo, and honestly I do not care which.
If you are sitting on a small idea and telling yourself it is too small to ship — it is not. Two days. One screen. One problem you personally have. That is the whole formula. Go build the thing.
And drink some water while you are at it.
Top comments (0)