Cozystream

Overview

A self-hosted media server I designed and built for my household, and my girlfriend's parents who live across the country.

Type

Product Design

Engineering

Year

2026

Why not just use Plex?

When I started looking for a way to share my movie library with my partner and her parents, Plex was the obvious option. I tried it, and pretty quickly realized it wasn't what I wanted.

The home screen was full of things I didn't ask for: recommendations, free ad-supported movies mixed in with my own library, and a layout that felt more like a streaming service than a personal collection. Streaming remotely requires a paid subscription. And the whole thing runs through Plex's cloud, so your account, your metadata, your viewing activity, it's all going through their servers.

I just wanted something simple. A clean way to browse my movies, share them with a few people, and keep everything local. The idea was partially sparked by my time in the Peace Corps, when we'd share movie files on thumb drives and all end up watching the same movies. It was a really fun way to bond and build community. I wanted to recreate that feeling, so I started designing one.

Cozystream browse page showing a poster grid of movies

Just my library. Nothing else.

Three users, three contexts

I'm designing for three people, and they all use the app differently.

Me: I'm the admin. I add movies, organize collections, tweak the metadata, and adjust settings. I want that experience to be fast and not annoying.

My partner: She just wants to find something to watch. She should be able to open the app, scroll through, pick a movie, and play it. Resume where she left off. That's it.

Her parents: They're not technical. They'd use it on their LG TV with a remote. Big text, simple navigation, no error messages about file formats. If it doesn't just work, they'll call us.

Design goals
  1. The library is the UI. Posters front and center, minimal chrome around them.
  2. Zero learning curve. If you've used Netflix, you already know how this works.
  3. Built for a TV remote. If it works with four arrow keys and an OK button, it works for everyone.
  4. Make it feel like yours. Themes, colors, fonts, spacing, the whole look is adjustable. A personal media server should feel personal.
The UI should feel like yours

This is something I care about a lot and plan to keep building on. A media server is something you look at regularly, so it should look the way you want it to.

Right now, Cozystream has six color themes (each with dark and light modes), eight accent colors plus a custom color picker, four independent font controls for different parts of the UI, and layout settings for card size, spacing, corner radius, and row density. Every change applies instantly.

The accent color picker has a built-in contrast checker. If your color doesn't read well against the background, it tells you and suggests alternatives.

Cozystream appearance settings with theme grid, accent picker, and font options

Appearance settings: theme grid, accent picker, font options

Cozystream browse page shown in different color themes

Same view, different themes

Cozystream DVD Case mode with 3D case spines and lifted poster on hover

DVD Case mode

I wanted the design to feel reminiscent of analog movie sharing. Browsing a shelf, picking up a case, reading the back. DVD Case mode leans into that. It swaps the flat poster grid for 3D cases with spines. Hovering lifts the poster to reveal a label underneath. It's not more functional than the default grid, but it gives the library a physical, tactile feel that I like.

How it comes together
Browse

The browse page is a poster grid organized into rows, some manually curated collections ("Studio Ghibli," "Watch with Mom"), some auto-generated by genre, director, or decade.

Cozystream browse page with collection rows and poster grid

Collection rows with the full grid below

Detail page

Three layout options: a full-bleed backdrop image, a contained poster header, or no image at all. All three keep the same information hierarchy: title, genres, metadata, description, play button, then credits below. Backdrop mode has blur and tint controls so you can tune readability depending on the image.

Cozystream detail page with full-bleed backdrop image layout

Backdrop layout

Cozystream detail page with contained poster header layout

Header layout

Quick metadata editing

When Cozystream pulls in metadata for a movie, it doesn't always grab the right one. Rather than making that a tedious fix, I built a quick-edit flow. Search for the correct movie, select it, and the metadata updates instantly.

Searching and swapping to the correct movie

Poster selection

The default poster isn't always the best one. Cozystream pulls a set of poster options from the web so you can pick the one you like best. No manual uploading or file hunting.

Choosing from available poster options

Player

Controls auto-hide during playback and reappear on mouse movement. Progress bar is thin at rest, expands on hover. For files the browser can't play natively, the server transcodes to HLS on the fly with FFmpeg. The user just presses play.

Controls appear on hover, then fade out

Smart TV

The TV app is currently in progress. It's built for remote control navigation with spatial focus management that moves a visible focus ring between elements using arrow keys.

It runs as a web app inside LG's webOS and Samsung's Tizen browsers, which are constrained environments. Screenshots coming soon.

How I built it this fast

I designed Cozystream and I built it, with Claude Code handling a lot of the implementation speed. Having a tool that can work across the full stack (Angular components, Node.js routes, FFmpeg transcoding, SQLite queries) meant I could move from a design idea to a working feature in a single sitting.

The design decisions are mine: the layout system, the customization approach, the TV navigation patterns, the information hierarchy. Claude's role was letting me execute on them quickly. Instead of spending hours debugging a CSS 3D transform for DVD case mode or wiring up HLS transcoding, I could describe what I needed and stay focused on the design problem.

It's a workflow I'd use again. Design the experience, then build it fast enough that you can actually use it and refine it the same day.

Still building
  • Getting it in front of my actual users (my partner and her parents) and redesigning based on their feedback
  • A guided onboarding flow so first-time setup doesn't require technical knowledge
  • A real responsive pass for phone and tablet
  • More customization options
  • An accessibility audit beyond the contrast checker