# Rituals (Andromida) Rituals is a paid, offline-first habit tracker built around 4-week "ritual" arcs. It focuses on steady, daily check-ins with a calm visual language, zero paid backend dependencies, and optional iCloud sync for settings. ## Overview - **Concept**: Habits are grouped into 4-week ritual arcs ("chapters") rather than endless streaks. - **Tech**: SwiftUI + SwiftData, Clean Architecture layering, Bedrock design system. - **Data**: Local persistence with SwiftData; settings sync via Bedrock CloudSyncManager (NSUbiquitousKeyValueStore). - **No paid APIs**: No external services required. ## Feature Set - **Today dashboard**: Focus ritual, progress ring, and tap-to-complete habits. - **Ritual library**: View active and recent rituals. - **Ritual detail**: Full ritual summary + habit check-ins. - **Insights**: Lightweight metrics generated locally. - **Settings**: - Reminders, haptics, sound toggles - Ritual pacing options (focus style + length) - iCloud settings sync - DEBUG tools for icon generation and branding preview - **Branding**: - Bedrock AppLaunchView with custom theme - Native LaunchScreen.storyboard to prevent flash - Centralized branding config (colors, icons, launch) ## Architecture This project follows Clean Architecture and protocol-first design: - **Views**: SwiftUI UI only, no business logic - **State**: @Observable stores with app logic - **Services**: Stateless logic and data seeding - **Models**: SwiftData models and plain structs - **Protocols**: Abstractions for stores/services ## Project Structure ``` Andromida/ ├── Andromida/ # App target │ ├── App/ │ │ ├── Models/ # SwiftData + DTOs │ │ ├── Protocols/ # Interfaces for stores/services │ │ ├── Services/ # Stateless logic │ │ ├── State/ # @Observable stores │ │ └── Views/ # SwiftUI features + components │ ├── Shared/ # Bedrock theme + branding config │ └── Resources/ # LaunchScreen.storyboard ├── AndromidaTests/ # Unit tests └── AndromidaUITests/ # UI tests ``` ## Key Files - **App entry & launch**: `Andromida/Andromida/AndromidaApp.swift` - **Bedrock theme**: `Andromida/Andromida/Shared/Theme/RitualsTheme.swift` - **Branding config**: `Andromida/Andromida/Shared/BrandingConfig.swift` - **Launch screen**: `Andromida/Andromida/Resources/LaunchScreen.storyboard` - **Ritual store**: `Andromida/Andromida/App/State/RitualStore.swift` - **Settings store**: `Andromida/Andromida/App/State/SettingsStore.swift` - **Settings UI**: `Andromida/Andromida/App/Views/Settings/SettingsView.swift` ## Data Model - **Ritual**: Title, theme, start date, duration (days), notes, habits - **Habit**: Title, symbol, goal, completion by day IDs - **Settings**: Stored via Bedrock CloudSyncManager (NSUbiquitousKeyValueStore) ## Bedrock Integration - **Theming**: App-specific color providers + `AppSurface`, `AppAccent`, etc. - **Branding**: AppLaunchView, AppIconConfig, LaunchScreenConfig - **Settings UI**: SettingsToggle, SettingsSlider, SettingsSegmentedPicker, SettingsCard - **Cloud Sync**: iCloud sync for settings using CloudSyncManager ## Localization String catalogs are used for English, Spanish (Mexico), and French (Canada): - `Andromida/Andromida/App/Localization/Localizable.xcstrings` ## Requirements - iOS 18.0+ - Swift 5 (Bedrock requires Swift 6 in package; app builds under Swift 5 with modern concurrency) ## Running 1. Open `Andromida.xcodeproj` in Xcode. 2. Build and run on iOS 18+ simulator or device. ## Tests - Unit tests in `AndromidaTests/` - Run via Xcode Test navigator or: - `xcodebuild test -scheme Andromida -destination 'platform=iOS Simulator,name=iPhone 15'` ## Notes - App is configured with a dark theme; the root view enforces `.preferredColorScheme(.dark)` to ensure semantic text legibility. - The launch storyboard matches the branding primary color to avoid a white flash. - App icon generation is available in DEBUG builds from Settings.