TheTrades
Movies, TV, and the people who make them
TheTrades browses movies, TV shows, and the people who make them, built on TMDB — universal for iPhone and iPad, and on Android too.
It exists for one feature. Every cast member's age when the title came out, shown inline on the cast row — the thing you always want to know halfway through a film and never want to leave the app to find out. Everything else is in service of getting you to that row quickly.
Features
- Discover — Trending This Week, Popular Movies, and Popular TV carousels fetched concurrently, plus recently viewed titles and recent searches.
- Search — debounced multi-search across movies, TV, and people, with scope filtering and infinite scroll.
- Detail views — movies, shows, seasons, episodes, and people, with backdrops, genres, cast, and trailers.
- Spoiler mode — blurs episode titles, stills, and overviews until you tap. On by default, because a season list is a minefield.
- Watchlist — save anything, browse it as a list or a poster grid.
- Adaptive layout — a tab bar in compact width, a sidebar split view in regular, with per-tab navigation history preserved across the switch.
No account, no tracking, no analytics
Saved data lives in UserDefaults on device, and the bundled privacy manifest declares no data collection. There is nothing to sign into, so there is nothing to leak.
Testing without the network
Twenty-nine tests across five suites, written with Swift Testing, and none of them touch the network. A MediaFetching protocol is the seam; the test support layer injects a stub client and an isolated UserDefaults suite. The app builds, runs in the simulator, and passes its tests on a fresh clone with no TMDB token and no Apple Developer account — without a token it simply shows an error card where the data would be.
On Android
TheTrades is on Android as well, written in Kotlin with the interface in Jetpack Compose. Same TMDB endpoints, same one reason to exist — every cast member’s age when the title came out, inline on the cast row — and the adaptive layout rebuilt in Compose so a tablet gets the wide arrangement rather than a stretched phone screen.
Stack
| UI | SwiftUI, @Observable state, NavigationStack with typed destinations |
|---|---|
| Android | Kotlin with Jetpack Compose, adaptive for phone and tablet |
| Concurrency | Swift 6 with SWIFT_STRICT_CONCURRENCY: complete; the TMDB client is an actor |
| Networking | URLSession + Codable — no networking dependency |
| Images | Nuke / NukeUI |
| Persistence | UserDefaults |
| Project | XcodeGen; roughly 3,100 lines of app code |
| Release | One script archives and uploads to TestFlight, defaulting the build number to the commit count |