Periscope is a simple movie search app built in SwiftUI. This project is a personal learning playground to explore:
- Swift Concurrency (
async/await, structured concurrency) - Modular architecture with Swift Package Manager
- SwiftUI-based UI patterns and design systems
⚠️ Note: This project is not production ready.
Periscope.mov
-
Clone the Repository
git clone git@github.com:RoshanNindrai/Periscope.git cd Periscope -
Open in Xcode
open Periscope.xcodeproj
-
Set Up API Key
Create a new file named
Secrets.swiftin the project and add the following:enum Secrets { static let TMDB_API_KEY = "<Your_TMDB_API_Key_Here>" }
⚠️ Important: Do not commit this file. AddSecrets.swiftto your.gitignore. -
Build and Run
Select the
Periscopetarget and run it on a simulator or device.
-
Create a TMDB Account
Sign up at themoviedb.org and verify your email. -
Request an API Key
- Go to your profile → Settings → API
- Choose Developer, agree to terms, fill in app details
- Submit your request
-
Copy the Key
Once approved, your key will appear in the API section.
📖 See the full guide: TMDB Getting Started Docs
graph TD
%% App Root
subgraph App
Periscope
end
%% Features
subgraph Features
SignInFeature
DetailFeature
HomeFeature
SearchFeature
end
%% UI Layer
subgraph UI
PeriscopeUI
Routes
Lego
end
%% Data Layer
subgraph Data
DataModel
TMDBRepository
TMDBRepositoryFactory
TMDBRepositoryImpl
TMDBService
end
%% Networking Layer
subgraph Network
Networking
NetworkingFactory
NetworkingImpl
end
%% Utilities
subgraph Utility
Utils
end
%% App Dependencies
Periscope --> SignInFeature
Periscope --> DetailFeature
Periscope --> HomeFeature
Periscope --> SearchFeature
Periscope --> PeriscopeUI
Periscope --> TMDBRepository
Periscope --> Networking
Periscope --> Utils
Periscope --> AppSetup
Periscope --> DataModel
Periscope --> Routes
Periscope --> Lego
%% AppSetup Dependencies
AppSetup --> TMDBRepository
AppSetup --> Networking
AppSetup --> Utils
%% TMDBRepository Dependencies
TMDBRepository --> TMDBRepositoryFactory
TMDBRepository --> TMDBRepositoryImpl
TMDBRepository --> TMDBService
TMDBRepository --> DataModel
TMDBRepository --> Networking
TMDBRepository --> Utils
%% Networking Composition
Networking --> NetworkingImpl
Networking --> NetworkingFactory
%% PeriscopeUI Dependencies
PeriscopeUI --> DataModel
PeriscopeUI --> Lego
PeriscopeUI --> Routes
PeriscopeUI --> TMDBRepository
%% DetailFeature Dependencies
DetailFeature --> DataModel
DetailFeature --> Lego
DetailFeature --> PeriscopeUI
DetailFeature --> Routes
DetailFeature --> TMDBRepository
%% HomeFeature Dependencies
HomeFeature --> Lego
HomeFeature --> PeriscopeUI
HomeFeature --> Routes
HomeFeature --> TMDBRepository
%% SearchFeature Dependencies
SearchFeature --> DataModel
SearchFeature --> Lego
SearchFeature --> PeriscopeUI
SearchFeature --> TMDBRepository
%% SignInFeature Dependencies
SignInFeature --> Lego
SignInFeature --> Routes
SignInFeature --> TMDBRepository
SignInFeature --> Utils
%% Routes Dependency
Routes --> DataModel
Contains all data models for movies, people, genres, collections, and related entities.
Provides the core domain model types used throughout the app.
Handles the home screen feature logic and parallel data fetching of trending, popular, upcoming, and top-rated categories.
Hosts reusable SwiftUI views and UI components for media displays.
Includes environment-based theming and image URL logic.
A minimal SwiftUI-based design system.
Includes typography, spacing, colors, and layout primitives.
Manages the sign-in flow and localization for multi-language support.
The main data access layer for TMDB APIs.
Uses async/await with dependency injection via factories and protocol abstraction.
Composes and abstracts HTTP networking layer to power repository and service calls.
Centralized app bootstrapping and dependency configuration module.
- SwiftUI: Learn modern declarative UI building blocks.
- Swift Concurrency: Use structured concurrency and async/await for clean async code.
- Modular Architecture: Explore a scalable modular project layout.
This project is licensed for educational use only. See LICENSE for details.