Skip to content

Introduction to 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:

ModuleWhat it doesStatus
AuroraCinematic video frontend with playback that syncs back to JellyfinShipping
TideTorrent client with real queue limits and a memory guardShipping
KAPOW!Karaoke queue for bars and parties, with phone-based votingShipping
LibrarianImports finished downloads into your media tree by hardlinkingEarly
FathomCover-first reading room for books, manga, comics and PDFsEarly
MarqueeAlways-on ambient display for a spare TV or tabletEarly
EncoreThe module scaffold. Named for a feature that is not built yetScaffold

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.

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.

  • 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

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:

  1. No link is required. Every module runs alone and is useful alone.
  2. 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.
  3. Nothing Jellyfin can already answer gets a contract.

See Module contracts for the manifest format, tokens, and the capability list.

If you want to build a new Coral module, start with the official CLI:

Terminal window
pnpm create coral@latest
npm create coral@latest
bun create coral@latest

That 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

All Coral modules are built with: