
I made AlcoLog, a privacy-first iOS drink tracker. Feature packed, no account, no subscription gate, no community wall. SwiftUI, solo build over 6 months.
Hey guys,
The story: Most drink trackers want you to sign up, join their community, pay a subscription before they'll do anything useful, and treat your data as the product. I wanted something that just worked, locally, with no friction and no gatekeeping. As a heavy drinker I have come to realize that drinking is a serious habit-tracking problem and the tooling should treat it that way. It launched this past Monday.
The stack:
- SwiftUI end-to-end, iOS 17+ target. No UIKit fallback except where the system forces it.
- SwiftData for persistence. Migrated off Core Data mid-build, which was painful but worth it.
- CloudKit private database for optional iCloud sync between a user's own devices. Zero server I run.
- HealthKit one-way write only. App writes drinks to Health, reads nothing back.
- WidgetKit for 22 home-screen widgets and 6 Lock Screen variants. Shared App Group container, TimelineProvider with smart refresh windows so battery doesn't tank.
- ActivityKit for Live Activity and Dynamic Island during an active session.
- WatchKit + SwiftUI for a standalone Watch app with 15 complications across all families.
- Vision + CoreML for on-device drink recognition (custom-trained classifier on bottles and cans).
- AVFoundation barcode scanner that I wired up to five separate product databases. Each one has a different response shape, different rate limits, different reliability. Lookup falls through them in order until one returns a match. This took longer than the rest of the camera stack combined.
- AppIntents for 10 Siri Shortcuts.
- StoreKit 2 for the Premium IAP layer. On-device receipt validation, no server.
The interesting bits:
The AlcoScore animation was a proper rabbit hole. The score is a six-pillar composite over a rolling 28-day window, with a breathing dial in the centre and a chase highlight that travels around the card border. First pass used standard SwiftUI withAnimation(.repeatForever) for both. Looked fine in isolation, felt subtly wrong in practice. The two animations would drift out of phase over time, and any unrelated state change on the screen would cause both to stutter mid-cycle as SwiftUI re-rendered the view tree. The fix was switching to TimelineView(.animation), which is still pure SwiftUI but driven by the system's display link. Both the breathing opacity and the chase angle are now computed directly from the same timestamp, so they're mathematically locked to the same phase by construction. Buttery on 60Hz, silky on 120Hz ProMotion, no jank when the rest of the screen re-renders.
The Tower easter egg is a fully playable balance game hidden inside the app. Two days solid to build, just for the people who find it. Worth it? Maybe not, lol.
The onboarding scramble:
Two days before launch I looked at my onboarding flow and realised it was hopeless. A few skip-able screens that asked nothing meaningful and dumped you into the app with no context. For an app with five different goal types and a six-pillar habit score, that's a recipe for new users bouncing in 30 seconds. I tore the whole thing out and rebuilt it from scratch with 48 hours to go. Proper goal selection, real explainers, anonymous opt-in option. Forgot to shower for a day 😷. Got it shipped.
What it does:
🍺 273-drink branded library across 9 regions, plus 60 alcohol-free options for swaps. ABV, calories, units, cost calculated automatically. Log a Guinness or a White Claw with one tap.
🎯 Five goal types: cut back, weekly limit, dry days per week, full quit with sober streak, or just track. Goals change without resetting your data.
📊 AlcoScore: six-pillar habit score (frequency, intensity, trend, control, behavior, recovery) over a rolling 28-day window. The "intensity" pillar catches binge nights even when your weekly total looks fine.
🤝 Sober support built in. Live streak counter, calendar view, 60 alcohol-free swaps.
⌚ Full Apple Watch app, 15 complications.
📱 22 home-screen widgets, 6 Lock Screen widgets, Dynamic Island, Live Activity, 10 Siri Shortcuts, 7 alternate icons.
👁️ Vision-based drink recognition plus a 5-source barcode scanner for exact can and bottle matches.
🔒 No account. No signup. No subscription gate. No analytics. Nothing leaves the device by default. CSV and PDF export when you want your data out.
The build:
Solo over six months, roughly 300 hours of actual coding (the rest was planning, App Store assets, and writing the SEO content site). I'm a marketer by trade, not a trained developer. Apple App Review rejected me four times in five days before approving on day seven with moments to spare before launch, which is its own story.
Free, with optional Pro/Premium tiers. Core tracker is free forever, no nags.
App Store: https://apps.apple.com/app/id6762422391
Site: https://alcolog.app
YouTube 30 second promo video: https://www.youtube.com/shorts/e5mdVLo4LQI
Happy to dig into any of the technical decisions, the TimelineView(.animation) work, the barcode multi-source fallback, the SwiftData migration, the 48-hour onboarding rebuild, or the App Review saga.
Thank you for reading 😄