Introduction to Coral
What is Coral?
Section titled “What is Coral?”Coral is an open-source ecosystem of independent, modular interfaces for Jellyfin — a free media system that puts you in control of your entertainment.
Each module runs as its own Docker container, reads Jellyfin over its HTTP API, and does one thing:
| Module | What it does | Status |
|---|---|---|
| Aurora | Cinematic video frontend with playback that syncs back to Jellyfin | Shipping |
| Tide | Torrent client with real queue limits and a memory guard | Shipping |
| KAPOW! | Karaoke queue for bars and parties, with phone-based voting | Shipping |
| Librarian | Imports finished downloads into your media tree by hardlinking | Early |
| Fathom | Cover-first reading room for books, manga, comics and PDFs | Early |
| Marquee | Always-on ambient display for a spare TV or tablet | Early |
| Encore | The module scaffold. Named for a feature that is not built yet | Scaffold |
Status is not decoration. Shipping means feature-complete for its stated purpose. Early means it runs and does something useful, but the surface is small and moving. Scaffold means the published image serves a placeholder. Each module page repeats its status and says exactly what is and is not there.
Why Coral?
Section titled “Why Coral?”Instead of a monolithic media center, Coral provides specialized, best-in-class interfaces for each media type. You can run one module or all of them together, choosing what works best for your needs.
Key features across all modules:
Section titled “Key features across all modules:”- Jellyfin-native - Uses the Jellyfin API, never duplicates data
- Type-safe - Built with TypeScript for better developer experience
- Self-hosted - Run on your own infrastructure
- Modern stack - TanStack Start, React, Tailwind CSS
- Independent - Each module can be deployed separately
How modules relate to each other
Section titled “How modules relate to each other”Jellyfin is the source of truth and modules never share a database. What Jellyfin knows, you read from Jellyfin.
For the few things Jellyfin has no API for — organising a directory, rather than scanning one — a module can expose a small versioned contract another module opts into. Three rules keep that narrow:
- No link is required. Every module runs alone and is useful alone.
- No link is implicit. An operator pastes a URL and a token. Nothing is discovered or scanned; two modules on the same network that have not been introduced stay strangers.
- Nothing Jellyfin can already answer gets a contract.
See Module contracts for the manifest format, tokens, and the capability list.
Getting Started
Section titled “Getting Started”If you want to build a new Coral module, start with the official CLI:
pnpm create coral@latestnpm create coral@latestbun create coral@latestThat bootstraps the current Coral template with TypeScript, Biome, and release automation already wired in. For the full flow, see create-coral CLI.
If you want to run Coral rather than build on it, start here instead:
- Running a stack with Docker Compose — Jellyfin, Aurora, Tide and Librarian together, with the mount layout that makes hardlinked imports work. This is the page most people want.
- Aurora — the single most useful module to add to an existing Jellyfin server
Development
Section titled “Development”All Coral modules are built with:
- TanStack Start - React SSR framework
- TanStack Router - Type-safe routing
- TanStack Query - Server state management
- Tailwind CSS v4 - Styling
- TypeScript - Type safety
Learn More
Section titled “Learn More”- getcoral.dev — what each module is for, and how it compares to the alternatives. These docs cover how to run them
- Explore the Jellyfin API Client for building with the API
- Use the create-coral CLI guide to scaffold a new module
- See Contributing to build your own module