LivePoster

LivePoster

apps.detail.types.app from drgonzo65's Repository

apps.detail.sections.overview

Turns any screen into a movie poster display for your home theatre. LivePoster watches your Kaleidescape, Plex and Jellyfin systems: when something is playing it shows that title's poster, tagline, rating and progress; when nothing is playing it cycles your library as a "Coming Soon" slideshow. Point a wall-mounted TV or tablet at it in kiosk mode. Artwork and metadata come from TheMovieDB, with optional Rotten Tomatoes scores from OMDb. A built-in management UI lets you correct any title that matched the wrong film and exclude titles from the slideshow, and content filters keep chosen ratings off the screen. REQUIRES a free TheMovieDB account - both the API Key and the API Read Access Token - plus at least one media system. The app starts without them and shows a setup screen telling you what is missing. NOTE: LivePoster has no authentication. It is designed for a trusted home network; do not expose it to the internet. Kaleidescape users: set the Player IP to the device that plays movies, and the Movie Server IP to the device that stores them (a Terra). On an all-in-one system such as a Strato V, set only the Player IP. Getting these backwards is the most common setup mistake - the slideshow works but "Now Playing" never appears. The container log says so explicitly if it detects it.

LivePoster

A media poster display server that monitors your home theater systems (Kaleidescape, Plex, Jellyfin, Nvidia Shield) and displays movie/TV posters. When media is playing, it shows the current content. When idle, it cycles through your Kaleidescape library as a slideshow.

Features

  • Real-time monitoring of multiple media systems
  • Automatic detection of currently playing content with progress bar
  • Priority system: Kaleidescape > Plex > Jellyfin
  • Automatic slideshow when idle (can enable/disable per movie)
  • Beautiful web-based display interface
  • Management UI for metadata review and correction
  • Settings UI for easy configuration (no need to edit files)
  • Metadata caching for fast startup times
  • TMDb & OMDb integration for rich movie data and Rotten Tomatoes scores
  • Docker support for easy deployment on Unraid
  • Responsive design for any screen size
  • Smooth transitions and animations

Supported Systems

  • Kaleidescape - TCP/IP control protocol integration
  • Plex - Full API integration
  • Jellyfin - Full API integration
  • Nvidia Shield - Via Plex or Jellyfin client

Installation

New here? Start with SETUP.md — a step-by-step guide covering credentials, working out which Kaleidescape address goes where, and first run.

Option 1: Unraid (Community Applications)

Search for LivePoster in the Apps tab and click Install. All settings are exposed as template fields; see UNRAID-QUICKSTART.md.

Option 2: Docker (Recommended elsewhere)

A prebuilt image is published, so there's nothing to compile:

docker run -d --name liveposter -p 3000:3000 \
  -v ./cache:/app/.cache --env-file .env \
  drgonzo65/liveposter:latest

Or with the included docker-compose.yml:

docker compose up -d

Then open http://localhost:3000, and configure via the settings UI at http://localhost:3000/manage.html

See DOCKER.md for secrets, updating, and building your own image, or UNRAID-QUICKSTART.md for Unraid.

Option 3: Node.js

  1. Install dependencies:
npm install
  1. Copy the environment example file:
cp .env.example .env
  1. Edit .env and configure your systems:
# Server Configuration
PORT=3000

# TheMovieDB - both values are required
TMDB_API_KEY=your_tmdb_api_key_here
TMDB_READ_TOKEN=your_tmdb_read_token_here

# Kaleidescape - PLAYER_HOST reports what's playing; SERVER_HOST holds the movies.
# Leave SERVER_HOST blank on an all-in-one system such as a Strato V.
KALEIDESCAPE_PLAYER_HOST=192.168.1.50
KALEIDESCAPE_PORT=10000
KALEIDESCAPE_SERVER_HOST=

# Plex Configuration
PLEX_URL=http://192.168.1.60:32400
PLEX_TOKEN=your_plex_token_here

# Jellyfin Configuration
JELLYFIN_URL=http://192.168.1.61:8096
JELLYFIN_API_KEY=your_jellyfin_api_key_here

# Polling interval in milliseconds (default: 10000 = 10 seconds)
POLL_INTERVAL=10000

# Idle slideshow interval in milliseconds (default: 30000 = 30 seconds)
SLIDESHOW_INTERVAL=30000

See SETUP.md for how to obtain each credential.

Getting API Keys

Plex Token

  1. Sign in to Plex Web App
  2. Open any media item and click "Get Info" or "..."
  3. Click "View XML"
  4. Look for X-Plex-Token in the URL

Or visit: https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/

Jellyfin API Key

  1. Sign in to Jellyfin Dashboard
  2. Go to Dashboard > API Keys
  3. Click "+" to create a new API key
  4. Name it "LivePoster" and save

Kaleidescape

No authentication is required, but which device you point at matters:

  • KALEIDESCAPE_PLAYER_HOST must be the player — it reports what's playing (port 10000)
  • KALEIDESCAPE_SERVER_HOST must be the device holding your movies — a Terra movie server, or the same player on an all-in-one system such as a Strato V

On an all-in-one system, set KALEIDESCAPE_PLAYER_HOST and leave KALEIDESCAPE_SERVER_HOST blank; it falls back to the same address.

Pointing KALEIDESCAPE_PLAYER_HOST at a movie server is the most common setup mistake — the slideshow works but "Now Playing" never appears. See SETUP.md for commands that identify each device.

Usage

Start the server:

npm start

Or for development with auto-reload:

npm run dev

Then open your browser to:

http://localhost:3000

How It Works

  1. Monitoring: The server polls all configured systems every 10 seconds (configurable)
  2. Priority: If multiple systems are playing, it shows content in this order:
    • Kaleidescape (highest priority)
    • Plex
    • Jellyfin (lowest priority)
  3. Idle Mode: When nothing is playing, it displays random posters from your Kaleidescape library
  4. Display: The web interface automatically updates when playback state changes

Web Interfaces

  • Main Display: http://localhost:3000 - The poster display
  • Management UI: http://localhost:3000/manage.html - Review and fix movie metadata
  • Settings UI: Click "⚙️ Settings" in management UI - Configure all API keys and systems

API Endpoints

Status & Library

  • GET /api/status - Current playback state
  • GET /api/library?source=all - Get library (sources: all, kaleidescape, plex, jellyfin)
  • GET /api/random?source=all - Get random movie from library for slideshow
  • GET /api/config - Server configuration
  • GET /api/health - Health check
  • GET /api/loading - Loading status during startup

Metadata Management

  • GET /api/movies/all?source=all - Get all movies with metadata quality indicators
  • GET /api/movies/search?title=MovieName&year=2020 - Search TMDb for alternative matches
  • POST /api/movies/update - Update movie metadata with correct TMDb match
  • POST /api/movies/toggle-slideshow - Enable/disable movie in slideshow

Settings

  • GET /api/settings - Get current configuration. API keys and tokens are returned masked, never in full
  • POST /api/settings - Save configuration to .cache/settings.json (persists across container updates)

Configuration

Configuration comes from environment variables (or the Settings UI, which overrides them). Any variable can also be supplied as <NAME>_FILE pointing at a file containing the value — see Docker secrets.

Variable Purpose
PORT Server port (default: 3000)
TMDB_API_KEY TMDb API key, v3 auth — required
TMDB_READ_TOKEN TMDb read access token, v4 auth — required
OMDB_API_KEY OMDb key, for Rotten Tomatoes scores (optional)
KALEIDESCAPE_PLAYER_HOST Kaleidescape player IP — reports what's playing
KALEIDESCAPE_SERVER_HOST Device holding the movie library; blank = same as KALEIDESCAPE_PLAYER_HOST
KALEIDESCAPE_PORT Control port (default: 10000)
PLEX_URL / PLEX_TOKEN Plex server and token
JELLYFIN_URL / JELLYFIN_API_KEY Jellyfin server and API key
POLL_INTERVAL How often to check for playback (ms, default 10000)
SLIDESHOW_INTERVAL How often to change slides when idle (ms, default 30000)
DISPLAY_SCALE Text scaling for the display (default 1.0)
KALEIDESCAPE_ENABLED / PLEX_ENABLED / JELLYFIN_ENABLED Set to false to switch a system off without clearing its settings (default on)
KALEIDESCAPE_DEBUG Set to 1 to log every control-protocol message. Off by default — it's two lines per command per poll

Troubleshooting

Kaleidescape not connecting

  • Verify the IP address is correct
  • Check that port 10000 is not blocked by firewall
  • Ensure control protocol is enabled on your Kaleidescape player

Plex not working

  • Verify your Plex token is correct
  • Make sure the Plex server URL is accessible from the machine running LivePoster
  • Check that your Plex server is running

Jellyfin not working

  • Verify your API key is correct
  • Ensure the Jellyfin URL is accessible
  • Check that your Jellyfin server is running

No posters showing

  • Check the server logs for errors
  • Verify at least one system is configured
  • Make sure you have movies in your library

Project Structure

liveposter/
├── lib/
│   ├── kaleidescape.js   # Kaleidescape TCP/IP control client
│   ├── plex.js           # Plex API integration
│   ├── jellyfin.js       # Jellyfin API integration
│   ├── tmdb.js           # TheMovieDB metadata enrichment
│   ├── omdb.js           # OMDb lookups (Rotten Tomatoes scores)
│   ├── cache.js          # Metadata cache manager
│   └── monitor.js        # Media monitoring service
├── public/
│   ├── index.html        # Poster display
│   ├── app.js            # Display logic
│   ├── style.css         # Styles
│   ├── manage.html       # Metadata manager + settings UI
│   └── manage.js         # Manager logic
├── .cache/               # Metadata cache + saved settings (mount this in Docker)
├── server.js             # Express server
├── package.json
├── .env.example
├── SETUP.md              # Full setup guide
├── DOCKER.md             # Docker / Unraid deployment
└── README.md

Credits

Inspired by posterr by petersem.

License

MIT

apps.detail.sections.mediaGallery

apps.marketingCta.appInstallTitle

apps.marketingCta.appInstallDescription

apps.installHelp.stepOpen apps.installHelp.stepSearchApp apps.installHelp.stepReview apps.installHelp.stepInstall

apps.detail.sections.requirements

A free TheMovieDB API key and read token. At least one of: Kaleidescape, Plex, or Jellyfin.

apps.detail.sections.categories

apps.downloadStats.title

1,544
apps.downloadStats.metrics.totalDownloads

apps.detail.sections.related

apps.detail.sections.details

apps.detail.details.repository
drgonzo65/liveposter:latest
apps.detail.details.lastUpdated2026-08-13
apps.detail.details.firstSeen2026-08-14

apps.detail.sections.runtime

apps.detail.details.webui
http://[IP]:[PORT:3000]
apps.detail.details.network
bridge
apps.detail.details.shell
sh
apps.detail.details.privileged
false

apps.detail.sections.configuration

WebUI PortPorttcp

Web interface port

apps.detail.config.target
3000
apps.detail.config.default
3000
apps.detail.config.value
3000
AppdataPathrw

Stores the metadata cache and any settings saved from the web UI. Keep this mapped or you re-scan your library on every update.

apps.detail.config.target
/app/.cache
apps.detail.config.default
/mnt/user/appdata/liveposter/cache
apps.detail.config.value
/mnt/user/appdata/liveposter/cache
TMDb API KeyVariable

TheMovieDB API Key (v3 auth). Free from themoviedb.org - Settings, API.

apps.detail.config.target
TMDB_API_KEY
TMDb Read Access TokenVariable

TheMovieDB API Read Access Token (v4 auth), from the same page as the API key. Both values are required.

apps.detail.config.target
TMDB_READ_TOKEN
Kaleidescape Player IPVariable

IP of your Kaleidescape PLAYER - the device that reports what is playing (e.g. 192.168.1.50). On an all-in-one system such as a Strato V, this is your only Kaleidescape setting.

apps.detail.config.target
KALEIDESCAPE_PLAYER_HOST
Kaleidescape Movie Server IPVariable

IP of the Kaleidescape MOVIE SERVER that stores your library, such as a Terra (e.g. 192.168.1.51). Leave blank if the player and server are the same device.

apps.detail.config.target
KALEIDESCAPE_SERVER_HOST
Kaleidescape Control PortVariable

Kaleidescape control protocol port

apps.detail.config.target
KALEIDESCAPE_PORT
apps.detail.config.default
10000
apps.detail.config.value
10000
Jellyfin URLVariable

Jellyfin server URL including port (e.g. http://192.168.1.61:8096)

apps.detail.config.target
JELLYFIN_URL
Jellyfin API KeyVariable

Jellyfin API key, from Dashboard, API Keys

apps.detail.config.target
JELLYFIN_API_KEY
Plex URLVariable

Plex server URL including port (e.g. http://192.168.1.60:32400)

apps.detail.config.target
PLEX_URL
Plex TokenVariable

Plex authentication token (X-Plex-Token)

apps.detail.config.target
PLEX_TOKEN
OMDb API KeyVariable

Optional. Adds Rotten Tomatoes scores. Free key from omdbapi.com.

apps.detail.config.target
OMDB_API_KEY
Display ScaleVariable

Text scaling for the display, 0.5 to 3.0. Also adjustable live in the settings UI.

apps.detail.config.target
DISPLAY_SCALE
apps.detail.config.default
1.0
apps.detail.config.value
1.0
Poll IntervalVariable

How often to check for playback changes (milliseconds)

apps.detail.config.target
POLL_INTERVAL
apps.detail.config.default
10000
apps.detail.config.value
10000
Slideshow IntervalVariable

How long each poster stays on screen when idle (milliseconds)

apps.detail.config.target
SLIDESHOW_INTERVAL
apps.detail.config.default
30000
apps.detail.config.value
30000