Clean Architecture · ModelActor · Actor-based caching · Protocol-Oriented
A modern iOS app for exploring Studio Ghibli's filmography — but really, an excuse to put Clean Architecture, ModelActor, actor-based image caching and protocol-oriented networking on display in something visual and fun.
Data comes from the open Ghibli API: films, characters, species, locations and vehicles. Everything is cached locally with SwiftData so the app works offline once you've browsed something.
| Films | Browse all Studio Ghibli films with a "Top Rated" carousel. View director, producer, runtime, Rotten Tomatoes score. Mark as Watched or Favourite. Pull-to-refresh syncs the API. |
| Search | Real-time, case-insensitive search across film titles, original Japanese titles, directors and release dates. |
| Wiki | Cross-referenced universe: characters, species, locations and vehicles — each entry shows which films it appears in. Film details show their related entities. |
| Saved | Watched + Favourites lists with filtering. Persisted with SwiftData via a thread-safe ModelActor. |
| Profile | Choose from 50+ emoji avatars, set username and favourite film, pick one of 8 gradient themes (Sunset, Ocean, Forest, Lavender, Fire, Mint, Rose, Galaxy). |
The app follows Clean Architecture: presentation, domain and data layers communicate through protocols. The database layer is fully isolated behind a ModelActor, and image loading runs on a dedicated Actor with memory + disk tiers.
Ghibli films/
System/ App entry point and shared services
Views/ SwiftUI screens
Components/ Reusable cards, rows, modifiers
ViewModels/ @Observable state holders
Model/ SwiftData entities + domain models
DTOs/ API response objects
Persistance/ DataContainer (ModelActor) with upsert logic
Interface/ URLSession networking layer
Repository/ Protocol-based API abstraction
Extensions/ ViewModifier system for consistent styling
| Component | Role |
|---|---|
| DataContainer | ModelActor wrapping SwiftData operations with upsert logic |
| ImageDownloader | Actor-based image caching — memory tier + disk tier |
| NetworkRepository | Protocol-fronted API client, mockable for tests |
| ViewModifier system | Centralised theming and styling primitives |
Requirements: Xcode 16+ · iOS 18+ · Swift Concurrency on a Mac with Apple Silicon recommended
git clone https://github.com/jlcl11/Ghibli-films.git
cd Ghibli-films
open "Ghibli films.xcodeproj"Build and run on a simulator or device.
| Technology | Role |
|---|---|
| Swift Concurrency | async/await, actors and Sendable correctness throughout |
| SwiftUI + @Observable | Declarative UI with modern reactive state |
| SwiftData + ModelActor | Thread-safe local persistence with upsert logic |
| Repository pattern | Network and database abstracted behind protocols |
| Actor-based ImageDownloader | Memory + disk image cache with isolation guarantees |
| DTOs | Clean separation between API responses and domain models |
Films, characters, species, locations and vehicles fetched from the Ghibli API. Imagery and titles are property of Studio Ghibli Inc. and used for educational portfolio purposes only.
Built by Jose Luis Corral Lopez · Clean Architecture portfolio sample
