105 lines
4.1 KiB
Markdown
105 lines
4.1 KiB
Markdown
# 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.
|