Files
Reflect/CLAUDE.md
Trey t bf2555f360 Add Remotion promo video project with 7-scene App Store flow
- Create feels-promo Remotion project for promotional videos
- Implement FeelsPromoV1 with scenes matching App Store screenshots:
  - Hero scene with mood tracking
  - Widget + Apple Watch scene
  - Journal notes with photos
  - AI-powered insights with badge
  - Privacy & security features
  - Theme customization
  - Notification styles
- Add screens folder with source assets and flow reference
- Include phone frames, widget, and watch frame assets

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 12:47:06 -06:00

1.9 KiB

Feels - Claude Code Context

Project Summary

Feels is an iOS mood tracking app. Users rate their day on a 5-point scale (Horrible → Great) and view patterns via Day, Month, and Year views.

Architecture

  • Pattern: MVVM with SwiftUI
  • Data: Core Data with CloudKit sync
  • Monetization: StoreKit 2 subscriptions (30-day trial, monthly/yearly plans)

Key Directories

Shared/           # Core app code (Models, Views, Persistence)
FeelsWidget2/     # Widget extension
Feels Watch App/  # watchOS companion
docs/             # ASO and competitive analysis

Data Layer

Core Data operations are split across files in Shared/Persistence/:

  • Persistence.swift - Core Data stack setup
  • PersistenceGET.swift - Fetch operations
  • PersistenceADD.swift - Create entries
  • PersistenceUPDATE.swift - Update operations
  • PersistenceDELETE.swift - Delete operations

App Groups

  • Production: group.com.88oakapps.ifeel
  • Debug: group.com.88oakapps.ifeelDebug

Build & Run

# Build the app
xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build

# Run tests
xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test

Mood Values

enum Mood: Int {
    case horrible = 0
    case bad = 1
    case average = 2
    case good = 3
    case great = 4
    case missing = 5      // Unfilled day
    case placeholder = 6  // System-generated
}

Localization

  • English: en.lproj/Localizable.strings
  • Spanish: es.lproj/Localizable.strings

Important Patterns

  1. Widgets update via WidgetCenter.shared.reloadAllTimelines()
  2. Missing dates are auto-filled by background task (BGTask.swift)
  3. Entry types distinguish user entries from system-generated ones
  4. Customization uses protocols: Themeable, MoodTintable, MoodImagable, PersonalityPackable