Skip to main content

Architecture overview

Responsibilities​

ConcernOwner
Accounts, sessions, passkeys, API keysflixer
Library and share definitions, media metadata, watch historyflixer (Postgres)
Which folders exist (STREAM_MEDIA_ROOT / MEDIA_PATH)flixer configuration; the streamer and indexer ask flixer
Scanning, probing, metadata, artwork, subtitle downloadflixer-indexer
Serving video, audio, HLS, subtitles, lyricsflixer-streamer
UI and playersflixer-web

Communication​

  • Browser to API: REST under /api plus WebSockets at /api/live and /api/logs/stream.
  • Browser to streamer: direct HTTP to /stream, /info, /hls, /lyrics, /subtitles using a stream token issued by the API. Bytes never pass through the API.
  • Streamer to API: fetches library roots and paths, signing the request with STREAM_TOKEN_SECRET.
  • Indexer and API: both directions are signed with STREAM_TOKEN_SECRET. The API controls scans and queues; the indexer reads libraries from the API and writes items back, with flixer applying backpressure (INDEXER_MAX_WRITES).
  • Redis: only the indexer's task queue.

Design principles​

  1. One source of truth. Libraries, shares and settings are in the database; services fetch them rather than duplicating configuration.
  2. Admins define libraries. Roots are exposed; names and types are chosen in the UI.
  3. Stateless streaming. The streamer holds no user data; it verifies tokens and serves files.
  4. Push over poll in the UI. Admin panels subscribe to topics on one WebSocket. See Real-time updates.

See also Playback flow, Indexing flow and Security model.