A modern iOS app for browsing and discovering PokΓ©mon, built with SwiftUI and Clean Architecture.
π Educational Project: This code is shared for learning purposes. You're welcome to study the architecture, patterns, and implementation details. However, please do not clone and deploy this app to the App Store, since this project will be released and deployed for others to see it live. See LICENSE for details.
This is an educational project, that demonstrates how to build a modern iOS app with SwiftUI, Clean Architecture + MVVM, and offline-first approach.
It is available and deployed in Appstore: https://apps.apple.com/us/app/whatpokemon/id6757093052
- Browse All PokΓ©mon: Explore the complete PokΓ©dex with infinite scroll pagination
- Detailed View: View stats, types, sprites, and more for each PokΓ©mon
- Favorites: Mark your favorite PokΓ©mon and access them quickly
- Offline-First: Cache-first architecture for instant loading, works completely offline
- Modern UI: Beautiful SwiftUI with the new Glass effects :) (check the bottom nav bar)
- Clean Architecture: MVVM + Clean Architecture for maintainability
- Well Tested: Written tests for all the layers of its architecture(Still it would be nice to add more)
This project follows Clean Architecture principles with MVVM pattern, implementing an offline-first approach for optimal user experience.
WhatMonsterDex/
βββ App/ # Dependency injection container
βββ Core/ # Shared infrastructure
β βββ Networking/ # HTTP client, endpoints, error handling
β βββ Storage/ # SwiftData actors, favorites manager
β βββ Utilities/ # Extensions, helpers, color utilities
βββ Data/ # Data layer (implements Domain interfaces)
β βββ DTOs/ # Network response models (Codable)
β βββ Mappers/ # DTO β Entity β PersistentModel converters
β βββ PersistentModels/ # SwiftData @Model classes
β βββ Repositories/ # Concrete repository implementations
βββ Domain/ # Business logic layer (framework-independent)
β βββ Entities/ # Core domain models (Pokemon, PokemonDetail, etc.)
β βββ Interfaces/ # Repository protocols (dependency inversion)
β βββ UseCases/ # Business use cases (FetchPokemonList, etc.)
βββ Features/ # Presentation layer (SwiftUI + ViewModels)
βββ PokemonList/ # List screen with infinite scroll
βββ PokemonDetail/ # Detail screen with stats and sprites
βββ Favorites/ # Favorites management
βββ Info/ # About and storage management (UI)
- SwiftUI: Modern declarative UI framework
- Swift 6.2: Latest Swift with strict concurrency
- SwiftData: For local persistence with actor isolation
- Async/Await: Modern concurrency
- Actor Isolation: Thread-safe data access
- Kingfisher 8.6.2: Image downloading and caching
- MVVM: Clear separation of concerns
- Dependency Injection: Testable architecture
- Swift Testing: Modern testing framework
- Xcode 26.2 or later
- iOS 26.2 or later
- macOS Tahoe 26.1 or later
Everythig up to date with the latest version of Xcode and Swift as of Dec 2025.
- Open the project:
open whatmonsterdex.xcodeprojThis project uses Swift Package Manager for dependencies, so no additional setup is required.
-
Important: Change the bundle identifier to your own:
- Open project settings
- Select the
WhatMonsterDextarget - Change
Bundle Identifierfromcom.chepedeveloper.whatpokemonto your own - Select your Development Team
-
Build and run (βR)
Run all tests with:
xcodebuild test -scheme WhatMonsterDex -destination 'platform=iOS Simulator,name=iPhone 17'Or use Xcode's test navigator (βU)
- Kingfisher (8.6.2) - Image downloading and caching
This app uses the free PokΓ©API - no API key required!
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the project
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the Educational Source License (ESL) - see the LICENSE file for details.
TL;DR:
- β Study and learn from the code
- β Use patterns and snippets in your own projects
- β Fork for personal learning
- β Do NOT deploy to App Store
- β Do NOT rebrand and republish
This projects consumes an open API to fetch Pokemon data, and they state a fair use: https://pokeapi.co/docs/v2, reason why I am not monetizing the app at all, again this is for EDUCATIONAL purposes only.
Jose Chirinos
- Website: codewithjose.com
- Mobile Developer & Motorcycle Enthusiast ποΈ
- PokΓ©API for the amazing free API
- Kingfisher for excellent image handling and caching
Made with βοΈ and SwiftUI