Project Summary · iOS · v1.0
TikTok, but for finding tonight's movie.
A native SwiftUI iOS app for full-screen, swipe-up movie discovery. Ships with a local catalog and a recommendation engine that learns from the genres you pick and the movies you like, save, and pass — no backend required.
A vertical, full-screen feed that ranks movies to you — and gets sharper as you react.
One observable store, a pure ranking function, no network.
Single source of truth
A @MainActor @Observable class holding the catalog + the user profile. Exposes a computed feed, savedMovies, and the like / save / pass / onboarding mutations. Every change persists.
Pure logic
A stateless enum of static functions. Scores and sorts movies from a profile, filters out passed ones, and generates human-readable "why you're seeing this" reasons. No side effects — trivially testable.
Persistence
A Codable struct of preferences and ID sets, saved to UserDefaults as JSON under kino.user-profile.v1. Load is failure-tolerant — a decode error just returns a fresh profile.
The layering is clean: Data (catalog) → Models (Movie, Genre, UserProfile) → Services (engine, TMDB stub) → Store → Views. Views only read the store from the SwiftUI environment and call its methods.
Score = the movie's rating, nudged by everything you've told it.
Each movie starts at its critic rating, then collects points for matching your taste. Passed movies are removed entirely; ties break toward the higher-rated film.
Reason chips on each card are generated the same way — "More Sci-Fi" from a genre match, "Critic favorite" (≥ 8.2) or "Highly rated" (≥ 7.8) from the score, plus a couple of the movie's mood tags.
hasCompletedOnboarding and opens the app.12 hand-picked films across 11 genres.
Each Movie carries a title, year, tagline, overview, genres, rating, runtime, maturity rating, TMDB poster + backdrop URLs, mood tags, and a color palette. The seed catalog spans Arrival, Dune: Part Two, Spider-Verse, and nine more.
The Xcode project is generated from a declarative project.yml via XcodeGen — no .xcodeproj to merge-conflict. Three targets: the Kino app, KinoTests (unit), and KinoUITests. Build and test from the terminal with xcodebuild.
The recommendation logic is pure, so it's covered directly by RecommendationEngineTests:
KinoUITests drives the app via accessibility identifiers.