# Project Plan: Fancyfin A modern, cinematic web frontend for Jellyfin. It talks only to the public Jellyfin API, so the stock server stays untouched and updates never break us. ## Goals 1. **Look and feel first.** Cinematic, fast, smooth. Big artwork, glassy blur surfaces, good typography, focus/hover motion, responsive from phone to desktop. 2. **Core viewing loop done well.** Login, home (continue watching, next up, recently added), library grids, search, detail pages, playback. 3. **Solid playback.** Direct play where possible, HLS transcode fallback, subtitle and audio track switching, resume position, progress reporting. 4. **Stock server, untouched.** Public API only, via `@jellyfin/sdk`. 5. **Admin stays in the stock UI**, with a link out. The one exception is fixing individual titles (see M3b), because that belongs on the page where you notice the problem. ## Non-goals (v1) - Admin dashboard, user management, plugin UI (per-title metadata fixes are in scope, see M3b) - Live TV/DVR, music, books, photos - Chromecast - Native Android TV app (planned later, see Future) ## Audience and release - Personal use (me and a friend) first, public GitHub repo from the start, public release when ready. - License: permissive (MIT or Apache-2.0). Decide before first commit. An API-only client is not bound by the server's GPL. - Name: **Fancyfin**. Avoid "Jellyfin" itself in the product name and logo to stay clear of trademark issues. Describe it as "a client for Jellyfin". ## Stack | Concern | Choice | Why | |---|---|---| | Build | Vite + TypeScript (strict) | Fast, standard | | UI | React | Largest ecosystem, best fit for animation-heavy UI | | Styling | Tailwind CSS + CSS variables for design tokens | Fast iteration, themeable | | Motion | Motion (Framer Motion) | Focus/parallax/page transitions | | Routing | TanStack Router | Typed routes, data loading | | Data | TanStack Query + `@jellyfin/sdk` | Caching, retries, typed API | | Playback | hls.js + native `