ZenPlay
A quieter home for your YouTube library.
A reference for building authenticated web products where the interface and backend have clear responsibilities.
The problem
Saved videos are useful only when they are easy to find again. ZenPlay brings a private YouTube collection, playlist organization, favorites, and playback into one focused workspace.
The approach
The React application handles navigation and playback. A separate Rust service owns identity, library operations, and persistence. HTTP-only cookies connect the authenticated browser session to the API.
- Sign up, sign in, and retrieve the current session
- Save and normalize YouTube URLs with custom titles
- Group, rename, and move items between playlist labels
- Browse favorites and play individual items or the current list
Follow the flow.
Select a stage to explore its role. This diagram explains the documented design; it is not live infrastructure.
React application
The browser renders the library, checks the current session, and sends credentialed HTTP requests.
The decisions behind it.
Keep authentication on the backend
The service issues JWT sessions in an HTTP-only cookie. The frontend consumes session state rather than issuing or validating tokens.
Derive playlists from item labels
A playlist is a grouping of saved items, not a separate table. That keeps the model compact, but empty playlists do not persist.
Separate interface and service deployment
The frontend and API have independent configuration. Frontend origin, CORS, and secure-cookie settings must agree in a hosted environment.
What the evidence supports.
The repositories describe frontend build/lint scripts, backend startup migrations, and the authentication/library API. The portfolio does not claim an independent end-to-end security audit or a measured capacity result.
Current boundaries
- Libraries are private; collaborative or public playlists are outside the documented scope.
- An empty playlist has no separate database representation.
- A public frontend URL does not establish the current health of its database or authentication service.
What comes next.
- Add integration coverage for session expiry and label rename behavior.
- Measure database query behavior with representative library sizes before making scaling claims.