Files
FamilyMealPlanner/CLAUDE.md
T
alexandrev-tibco 89b35dc4ae 1.1.1 (46): subscription IAP, export compliance, metadata
- Switch premium to AutoRenewable subscription (com.mealmood.premium.monthly.sub);
  legacy one-time purchasers retain lifetime access via StoreManager fallback
- Add ITSAppUsesNonExemptEncryption=false to Info.plist (no custom encryption)
- Update storekit config with both legacy NonConsumable and new subscription
- Bump version 1.1.1 build 46; update fastlane metadata and release notes (6 langs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 11:28:14 +02:00

2.5 KiB

MealMood — Project Context for Claude Code

App

  • Name: MealMood: Family Meal Planner
  • Bundle ID: com.alexandrevazquez.mealmood
  • Platform: iOS/iPadOS (also runs as iOS app on Mac)
  • Current version: 1.1.0
  • Main branch: 1.0.1 (production), feature branches named after versions

Credentials — all managed via pass (GPG-encrypted, syncs to Gitea)

Never hardcode credentials. Always read from pass:

# Apple
pass show apple/mealmood/apple-id                          # alexandre.vazquez@gmail.com
pass show apple/mealmood/developer-team-id                 # 2825Q76T7H
pass show apple/mealmood/appstore-connect-team-id          # 128443966
pass show apple/mealmood/app-store-app-id                  # 6759255553
pass show apple/mealmood/app-specific-password-fastlane    # for fastlane uploads

# Firebase
pass show firebase/mealmood/api-key
pass show firebase/mealmood/project-id
pass show firebase/mealmood/google-app-id

# AdMob
pass show admob/mealmood/app-id
pass show admob/mealmood/banner-home-unit-id

TestFlight upload

export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=$(pass show apple/mealmood/app-specific-password-fastlane)
fastlane beta

Stack

  • SwiftUI + SwiftData (iOS 17+)
  • Firebase Analytics (AnalyticsService.swift)
  • Google AdMob (banner, free tier only, hidden on Mac)
  • StoreKit 2 (subscription com.mealmood.premium.monthly)
  • iCloud KV sync (ICloudSyncService.swift) — does NOT sync isPremium
  • Widget extension (MealMoodWidget/) — requires App Group group.com.alexandrevazquez.mealmood
  • Fastlane for CI/CD

Premium logic

  • PremiumSyncService is the source of truth for premium state transitions
  • isPremium is determined only by StoreKit — never by iCloud sync
  • Transaction.updates listener in ContentView catches purchases in real-time
  • Tests: MealMoodTests/PremiumSyncServiceTests.swift

Key files

File Purpose
MealMood/ContentView.swift App root, premium sync, Transaction.updates listener
MealMood/Services/PremiumSyncService.swift Premium state machine (testable)
MealMood/Services/StoreManager.swift StoreKit 2 purchase/restore
MealMood/Services/ICloudSyncService.swift Cross-device sync (dishes, tags, plans — NOT isPremium)
MealMood/Views/Home/WeekPlanShareView.swift Export styles (default, school, vertical A4)
MealMoodWidget/MealMoodWidget.swift Home screen widget
fastlane/Fastfile beta and release lanes
fastlane/metadata/ App Store metadata in 6 languages