A photo-first iOS app for capturing, browsing, and planning meals — built with SwiftUI, Core Data + CloudKit, and the Claude API.
People don't need more recipes. They need to remember the ones they already love. Tastebook is a visual meal catalogue where every photo is something you've already cooked or ordered. Snap a photo, tag it, and it goes into your personal collection.
The app has four core loops:
- Capture — Photograph a meal and save it in under 10 seconds. Title is required, everything else (tags, notes, source) is optional.
- Browse — Full-screen vertical scroll through randomized past meals (think TikTok, but it's your own food). Also browse by category with tag-based filtering.
- Plan — Assign meals to your week across dinner, lunch, and breakfast slots. Mark meals as "made" to track what you've cooked.
- Shop — A grocery list tied to your weekly plan. Add items manually per meal, or use AI to generate a grocery list from a meal's title and tags. Smart Tidy uses AI to deduplicate and group items by shopping aisle.
Supports iCloud sync across devices and household sharing (2 users via invite code). Monetized with a $1.99 one-time purchase after a 30-day free trial.
| Layer | Technology |
|---|---|
| UI | SwiftUI (iOS 17+), @Observable ViewModels, progressive image loading with HEIC compression |
| Data | Core Data with NSPersistentCloudKitContainer — dual-store architecture (private + shared) for household sync |
| Auth | Sign in with Apple, Keychain + UserDefaults hybrid for credential persistence |
| Purchases | StoreKit 2 with transaction listener, entitlement state machine (trial / expired / purchased) |
| AI | Anthropic Claude API (Haiku 4.5) via Messages API — grocery generation and smart list tidying |
| Build | XcodeGen for conflict-free project configuration |
The app follows a service-oriented architecture with three layers:
Services are singletons (@unchecked Sendable) that own business logic and Core Data access. Each service uses context.perform for thread-safe operations and posts NotificationCenter notifications on state changes. Services include: MealService, GroceryService, WeekPlanService, PurchaseService, AuthenticationService, SharingService, ImageService, and AIService.
ViewModels are @Observable classes marked @MainActor. They hold view-specific state, call into services, and handle async task cancellation to prevent stale data races. They subscribe to service notifications for cross-domain reactivity (e.g., the grocery list refreshes when the week plan changes).
Views are pure SwiftUI. No UIKit except a single UIViewControllerRepresentable bridge for camera capture (SwiftUI has no native camera API). Reusable components include EmptyStateView and ErrorView with static factory presets for consistent messaging.
The AI integration uses a three-layer pattern: a generic AIService HTTP client, centralized AIPrompts for prompt templates, and a domain-specific GroceryAIService that bridges the API with Core Data objects. All AI-generated content goes through a review sheet before persisting — the user always approves or rejects suggestions.
Requires Xcode 16+ and iOS 17+.
# Generate the Xcode project
brew install xcodegen # if not installed
xcodegen generate
# Configure API key for AI features (optional)
cp Tastebook/Configuration/Secrets.xcconfig.template Tastebook/Configuration/Secrets.xcconfig
# Edit Secrets.xcconfig with your Anthropic API key
# Open and run
open Tastebook.xcodeprojThe app works fully without an API key — AI features (Generate Groceries, Smart Tidy) will show an error prompting configuration. All other features work independently.
This is a shipped MVP, built and iterated over multiple development cycles. Core features (capture, browse, plan, grocery list, household sharing, purchases) are complete. The AI grocery features are implemented and functional. Currently in pre-launch polish — not yet on the App Store.