Production
24Goals
iOS App · Productivity
Goal-tracking app that reached Top-8 in Productivity and Top-100 overall on launch.
- iOS App
- Productivity
- UIKit
- RxSwift
- StoreKit
- Firebase

Summary
24 Goals (GOALSTER) is a personal task and goal app built around repeating 30-day cycles. Users select three life spheres, plan goals, execute daily tasks in a calendar workflow, and review end-of-period results. The product included optional social and premium features, plus a content library for retention. Key highlights:
- Reached #8 in Productivity (Free) and Top 100 Free Apps in the first week
- Built with programmatic UIKit + reactive MVVM and a typed networking layer
- Replaced unstable deep-link auth with reliable email OTP verification
Quick facts
- Role: Solo iOS developer (built and maintained end-to-end)
- Timeframe: Built from scratch; 3 major updates shipped
- Platform: iOS 13+
- Status: Discontinued (removed from the App Store)
- Team: 1
Problem
- Most goal apps stop at to-do lists and don’t create a repeatable 30-day loop with planning, execution, and reflection.
- Deep-link based email confirmation was unreliable on iOS (links sometimes opened the App Store even when installed).
- The app needed premium gating and social/accountability features without bloating the core daily workflow.
Solution
24 Goals structured behavior change into a simple loop: pick three spheres for a 30-day period, plan measurable goals, execute daily tasks via calendar time blocks, and reflect at period end. Accountability was optional (public goals, mentors/observers, comments). Premium unlocked higher limits and reflection tools.
Architecture
- Programmatic UIKit + SnapKit; no storyboards
- Reactive MVVM with RxSwift/RxCocoa; ViewModels orchestrate API calls and UI state
- Typed networking layer (endpoint enum + headers) to a Django REST backend with JWT auth
- SceneDelegate routing for Firebase Dynamic Links (auth and premium flows)
- Modular feature areas: Auth, Calendar/Goals, Emotions, Feed, Profile, Premium
- Local persistence via UserDefaults wrapper; some domain objects persisted via NSCoding
- Firebase used for analytics/messaging/crash reporting (and dynamic links)
Tech stack
- iOS: Swift, UIKit, RxSwift/RxCocoa, StoreKit, Firebase (Analytics/Messaging/Dynamic Links/Crashlytics)
- Architecture: MVVM, typed API client (endpoints + DTOs), modular feature structure
- Backend/Infra: Django, Django REST Framework, JWT, Celery, Firebase Admin (push)
- Tooling: CocoaPods, SnapKit, Kingfisher, JTAppleCalendar, Lottie
Hard problems solved
- Replaced dynamic-link login after detecting an Apple deep-link edge case that redirected users to the App Store despite installation
- Designed a typed API surface covering a large domain (auth, spheres, goals, observers, feed, premium) while keeping headers consistent (language/timezone/FCM)
- Built a calendar UX that supports month/week modes and daily goal grouping (morning/day/evening) without UI stutter
- Implemented premium gating end-to-end: client UI states + backend constraints (e.g., visualization limits and premium-only creation)
- Implemented observer flows with confirmation states and goal-linked comments, keeping permissions scoped to the right users
- Backend period lifecycle: scheduled sphere resets and results snapshots at period end, plus inactivity/rating prompts via Celery
Impact / Results
- Hit #8 in Productivity (Free) and entered the top 100 overall during the first week
- Delivered 3 major updates and maintained the product through multiple iterations
- Improved login reliability by replacing the original dynamic-link authorization path