API-first full-stack application to manage and stream movies and TV shows from local storage. Backend and frontend code generated from an OpenAPI contract, deployed on a Kubernetes cluster.
NewFlix is a personal streaming application for managing and playing movies, TV shows and episodes stored locally. The interface resembles a classic streaming service: category browsing, detailed metadata pages, and an integrated video player.
Metadata (titles, posters, synopsis, genres) is automatically fetched from TheMovieDB API when adding media.

Main dashboard: two separate carousels for TV shows and movies, with posters fetched from TheMovieDB.

Movie list view with genre filter. Each entry displays the poster, title, year and associated genres.

Movie detail page: title, genres, synopsis, a scene photo and a direct play button.

TV show page with season selector and list of available episodes, each playable with one click.

Full-frame video player with progress bar, volume control and duration display. Files are streamed directly from local storage via the backend. Autoplay - at the end of the current episode, the next one launches automatically.
The application consists of three services:
The openapi.yaml file at the root is the single source of truth for all API contracts. Java entities and Spring interfaces on the backend, as well as TypeScript models and Angular services on the frontend, are automatically generated from this file.
api/ → generated Spring interfaces (do not edit)
models/ → generated JPA entities + FromApi records
controllers/ → implement the generated interfaces
services/ → business logic and file management
repositories/ → data access via Spring Data JPA
The storage service (FileStorageService) handles uploading and referencing video files from a configured directory. OpenAPI documentation is available at /swagger-ui.html.
components/
├── main/ → landing / dashboard
├── list/ → movie and TV show lists
├── details/ → detail pages
├── api-add/ → add content from TheMovieDB
├── video-player/ → integrated video player
└── carousel/ → visual browsing
The application is packaged via Docker Compose (dev/local) and deployed on the homelab K3s cluster via a custom Helm chart.
The Kubernetes deployment requires specific Traefik configuration for large file uploads: extended timeouts to 3600s and removal of request body size limits.
Docker images are published to the private registry hosted on the cluster (registry.cluster).