Files
Reflect/CLAUDE.md
Trey t 810ac2d649 Update signing configuration to use 88oakapps.feels identifiers
- Update App Group IDs from group.com.tt.feels to group.com.88oakapps.feels
- Update iCloud container IDs from iCloud.com.tt.feels to iCloud.com.88oakapps.feels
- Sync code constants with entitlements across all targets (iOS, Watch, Widget)
- Update documentation in CLAUDE.md and PROJECT_OVERVIEW.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 10:01:49 -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.feels
  • Debug: group.com.88oakapps.feels.debug

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