When a user marked a care task as complete, the task would disappear from the upcoming tasks section. However, upon navigating away and returning to the plant detail, the task would reappear as incomplete and overdue. The root cause was that PlantDetailView only used .task to load schedule data, which runs once on first appearance. When the view was recreated (e.g., after navigating back from the collection list), the Core Data fetch could return stale data due to context isolation in NSPersistentCloudKitContainer. Added .onAppear to reload the care schedule from Core Data every time the view appears, matching the pattern already used in TodayView. Also exposed a refreshSchedule() method on the ViewModel for this purpose. Fixes #2 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PlantTime
A plant identification and care management iOS app built with SwiftUI.
Features
- Plant Identification - Identify plants using on-device ML (Core ML) with PlantNet API fallback
- Plant Collection - Save and organize your identified plants
- Room Organization - Group plants by room (Kitchen, Living Room, Bedroom, etc.)
- Care Scheduling - Track watering, fertilizing, repotting, pruning, and pest control
- Today View - Dashboard showing overdue and today's care tasks
- Progress Photos - Capture growth photos with time-lapse playback
- Photo Reminders - Scheduled reminders for progress photos (weekly, bi-weekly, monthly)
- CloudKit Sync - Sync plants and care data across devices via iCloud
- Dark Mode - Full dark mode support with semantic color tokens
Screenshots
Coming soon
Requirements
- iOS 17.0+
- Xcode 15.0+
- Swift 5.9+
Architecture
Clean Architecture + MVVM with three layers:
Presentation (SwiftUI Views + ViewModels)
↓
Domain (Use Cases + Entities + Repository Protocols)
↓
Data (Repository Implementations + Data Sources)
Key patterns:
- Dependency Injection via
DIContainer - Actor-based concurrency for thread safety
- Core Data + CloudKit for persistence and sync
Setup
- Clone the repository
- Open
PlantGuide.xcodeprojin Xcode - Configure your API keys in
App/Configuration/APIKeys.swift:- PlantNet API key (get one at my.plantnet.org)
- Trefle API key (get one at trefle.io)
- Set up CloudKit:
- Enable iCloud capability in Signing & Capabilities
- Create CloudKit container:
iCloud.com.yourteam.PlantGuide
- Build and run
ML Model
Uses PlantNet-300K ResNet50 for on-device plant classification:
- Input: 224x224 RGB image
- Output: 1,081 plant species probabilities
License
MIT
Description
Languages
Swift
84.4%
Cython
15.6%