jasonellington/r25-app
iOS app for building and running morning routines with an AI voice coach.
Routine 25 — iOS App
Native iOS app for building and running morning routines with an AI coach. Built with SwiftUI + SwiftData, targeting iOS 26+.
What It Does
Routine 25 solves a specific problem: you have a fixed deadline in the morning (catch the train at 8:28, get to your desk by 9:15) and need to work backwards to figure out when to wake up. Build routines from reusable activity blocks, pin activities to fixed times (kid wakes up at 7:00 AM), and auto-calculate your optimal wake-up time. Then run an auto-advancing timer to stay on schedule.
Beyond the core timer, the app includes an AI voice coach, guided meditation, nutrition tracking, HealthKit integration, and more.
Related Repos
Routine 25 is split across three repositories:
| Repo | Description |
|---|---|
| r25-app (this repo) | iOS app — SwiftUI + SwiftData |
| r25-backend | AI coaching backend — FastAPI + Anthropic API (Opus 4.6) + ElevenLabs TTS |
| r25-web | Web app |
Features
- Routine Builder — Create routines from reusable activity blocks with drag-to-reorder
- Smart Scheduling — Pin activities to fixed times, auto-calculate wake-up time working backwards from anchors
- Auto-Advancing Timer — Full-screen countdown timer that moves through your routine block by block
- AI Voice Coach — Conversational coaching powered by Anthropic API (Opus 4.6) with ElevenLabs custom voice TTS
- Guided Meditation — Voice-guided meditation sessions
- Nutrition Tracking — Log meals with food search and nutrition goals
- HealthKit Integration — Syncs sleep, steps, heart rate, and activity data
- Today View — 10-day schedule with routine details and completion logging
- Live Activities — Lock screen timer updates
- Widgets — Home screen widget for your routine schedule
- Dark Mode — Designed for early morning use with a dark-first UI
Architecture
Stack: SwiftUI + SwiftData (iOS 26+) · Swift 6.0 · Local-first with backend sync
| Layer | Details |
|---|---|
| Data | SwiftData models with @Query → View reactivity |
| Navigation | Sheet-based modals |
| Timer | Observable ViewModel with Timer.scheduledTimer auto-advance |
| Networking | APIClient with async/await, Keychain-stored auth tokens |
| Health | HealthKit read access with background sync |
| Voice | ElevenLabs SDK for TTS with custom voices, Anthropic API (Opus 4.6) as the LLM |
Core Models
ActivityBlock— Reusable activity (emoji, name, duration, category, optional anchor time)Routine— Collection of blocks with schedule (name, days of week, timing mode)RoutineBlock— Join table linking routines to blocks with ordering and fixed-time overridesRoutineLog— Routine completion trackingFoodEntry/NutritionGoal— Nutrition data
Project Structure
Routine25/
├── App/ # Entry point, SwiftData container
├── Models/ # SwiftData models
├── Services/ # API client, HealthKit, notifications, auth
├── ViewModels/ # Timer, Coach, Meditation, Nutrition state
├── Views/
│ ├── ActivityBlocks/ # Activity library and editor
│ ├── Auth/ # Sign in with Apple
│ ├── Coach/ # AI voice coach
│ ├── Fitness/ # Fitness tracking
│ ├── Journal/ # Journal entries
│ ├── Meals/ # Meal logging
│ ├── Meditation/ # Guided meditation
│ ├── Nutrition/ # Nutrition tracking
│ ├── Onboarding/ # First-launch onboarding flow
│ ├── Routines/ # Routine builder and list
│ ├── Settings/ # App settings
│ ├── Sleep/ # Sleep tracking
│ ├── Stats/ # Statistics dashboard
│ ├── Timer/ # Running timer UI
│ ├── Today/ # Main schedule view
│ └── Shared/ # Reusable components
├── Utilities/ # TimeCalculator, HapticManager
└── LiveActivity/ # Live Activity attributes
RoutineWidget/ # iOS Widget extension
RoutineMonitor/ # Screen Time Monitor extension
Setup
Requirements
- Xcode 26.3+
- iOS 26.0+ device or simulator
- Swift 6.0
Running
- Clone the repo
- Run
xcodegen generateto generate the Xcode project fromproject.yml - Open
Routine25.xcodeprojin Xcode - Select the Routine25 scheme for production API, or Routine25 Local for local development
- Build and run (Cmd+R)
Backend
The app connects to the r25-backend for AI coaching, routine sync, and health data. See that repo for setup instructions. The app works offline for core timer/routine features.