Native Birds is an iOS app that discovers nearby birds using the device’s current GPS location, displays them in a SwiftUI experience, and lets users listen to bird recordings. The project follows Clean Architecture / Clean Code with a clear separation of UI, Presentation, Domain, Data, and External Systems.
| Design Proposal | UI Animation |
|---|---|
|
|
The app is structured in layers:
-
UI Layer (SwiftUI)
- Navigation:
AppRouter,AppRouterView - Views:
SplashView,BirdsListView,BirdDetailView - Animations: SpriteKit (see “Animations” below)
- Design System: spacing, typography, theme, reusable UI components
- Navigation:
-
Presentation Layer
- ViewModels (
SplashViewModel,BirdsListViewModel,BirdDetailViewModel)
- ViewModels (
-
Domain Layer
- Use Cases:
FetchNearbyBirdsUseCaseFetchBirdRecordingUseCase:contentReference[oaicite:3]{index=3}
- Entities:
Bird,BirdRecording,PagedResult,BirdsPage
- Interfaces (Protocols):
BirdsRepositoryProtocol,XenoCantoRepositoryProtocol,RemoteConfigProtocol,LocationServiceProtocol,cache protocols
- Use Cases:
-
Data Layer
- Repositories:
- iNaturalist:
BirdsRepository - Xeno-canto:
XenoCantoRepository - Remote Config:
RemoteConfigRepository
- iNaturalist:
- Infrastructure:
- Network:
URLSessionNetworkClient - Cache:
DiskTTLCache,BirdImageCache,BirdAudioCache - Audio download:
AudioDownloadService
- Network:
- Repositories:
-
External Systems
- iNaturalist API for nearby observations (birds + photos)
- Xeno-canto API for top bird recordings
-
API Keys
- Firebase Remote Config to securely fetch API keys at runtime
The app requests location permission and retrieves the current coordinates using CoreLocation via LocationService.
API keys are not hardcoded. They are fetched from Firebase Remote Config and cached in memory inside RemoteConfigRepository.
Remote Config keys used:
inat_bearer_tokenxeno_canto_key
The app caches both images and audio on disk with a TTL of 15 days:
BirdImageCacheBirdAudioCache
For rich loading / placeholder experiences, the app uses SpriteKit with a sprite sheet:
BirdFlightScene+BirdFlightView- Loaded via
SpriteViewin SwiftUI
Centralized tokens for:
- Colors (
BirdTheme) - Typography (
BirdTypography) - Spacing (
BirdSpacing) - Reusable components (
BirdButton,BirdLabel, etc.)
-
Splash
- Firebase is configured at app start (
FirebaseApp.configure()). - Remote Config activates to fetch keys.
- Firebase is configured at app start (
-
Bird List
- Location permission is requested; current coordinates are retrieved.
FetchNearbyBirdsUseCasecallsBirdsRepository(iNaturalist).
-
Bird Detail
FetchBirdRecordingUseCasenormalizes scientific name to genus + species and calls Xeno-canto.- Audio is downloaded (if needed) and cached; playback uses
AVPlayer.
- Xcode
- iOS 16+
- Location Permissions
- Firebase (Core + Remote Config)
- Architecture: Clean Architecture with protocol-driven boundaries (testable use cases / repositories).
- Coverage: 70% (project target / current status to be maintained and improved).


