top of page
Banner Apps.jpg

24Goals

Goal-tracking app that reached Top-8 in Productivity and Top-100 overall on launch.

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

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

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)

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

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

bottom of page