1ae9c884c85c7d25c9aa2a0431c38b1e90e4d985
Replace brittle localized-string selectors and broken wait helpers with a robust, identifier-first UI test infrastructure. All 41 UI tests pass on iOS 26.2 simulator (iPhone 17). Foundation: - BaseUITestCase with deterministic launch helpers (launchClean, launchOffline) - WaitHelpers (waitUntilHittable, waitUntilGone, tapWhenReady) replacing sleep() - UITestID enum mirroring AccessibilityIdentifiers from the app target - Screen objects: TabBarScreen, CameraScreen, CollectionScreen, TodayScreen, SettingsScreen, PlantDetailScreen Key fixes: - Tab navigation uses waitForExistence+tap instead of isHittable (unreliable in iOS 26 simulator) - Tests handle real app state (empty collection, no camera permission) - Increased timeouts for parallel clone execution - Added NetworkMonitorProtocol and protocol-typed DI for testability - Fixed actor-isolation issues in unit test mocks Co-Authored-By: Claude Opus 4.6 <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%