ErsatzTV

IPTV streaming server that creates custom TV channels

Media Servers ★ 3k stars Medium setup GPL-3.0

ErsatzTV is software for configuring and streaming custom live channels using your media collection. It emulates an HDHomeRun tuner and outputs M3U playlists for use with Plex, Jellyfin, and other clients.

Key features

  • Custom live TV channels
  • HDHomeRun emulation
  • Scheduling and filler
  • FFmpeg transcoding

Pros & cons

Strengths

  • Powerful scheduling options
  • Works with major media servers

Trade-offs

  • Complex configuration
  • FFmpeg knowledge helps

ErsatzTV replaces

Last reviewed Sep 13, 2026 · 833 words

ErsatzTV takes the media you already have and plays it out as numbered, scheduled, always-on TV channels that Jellyfin, Plex and Emby treat as a real HDHomeRun tuner. The setup is one container on port 8409. The cost is the evening you will spend learning its scheduling model, and the reason people abandon it is transcoding: pick the wrong image tag or the wrong FFmpeg profile and a 512 MB box will fall over on the first two channels.

It is a scheduler, not a media server

ErsatzTV does not replace Jellyfin. It reads libraries from Jellyfin, Plex, Emby or plain folders, then builds channels from collections, schedules and filler, and exposes two things: an M3U playlist plus XMLTV guide, and an HDHomeRun emulation on the network. Your media server's Live TV feature does the rest, including the guide grid and DVR. The mental model that helps: your library is the tape archive, ErsatzTV is the broadcast control room, and Jellyfin is the television.

That also tells you who actually runs this. It is people who want a "90s cartoons" channel on in the background, a shuffled sitcom channel that never asks what to watch next, or a Halloween channel in October. If you only want to browse and pick episodes, you do not need it.

One container, one port, pick the hardware tag deliberately

The image is jasongdove/ersatztv, and the tag matters more than usual. The plain latest is software-only; latest-vaapi and latest-nvidia bundle the drivers for Intel/AMD and NVIDIA transcoding, and there is an ARM64 tag for Pi-class boxes. A minimal compose:

services:
  ersatztv:
    image: jasongdove/ersatztv:latest-vaapi
    ports:
      - "8409:8409"
    volumes:
      - ./ersatztv-config:/root/.local/share/ersatztv
      - /mnt/media:/mnt/media:ro
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped

Mount media at the same path the source server sees it, or set path replacements in the ErsatzTV settings; otherwise the library scan succeeds and playback fails, which is the most common first-day bug report. The config directory holds the SQLite database, so back that up along with your compose file.

The schedule model rewards an evening of reading

Channels are built from schedules, and schedules are lists of items: a collection, an order (chronological, shuffled, season/episode), and a playout mode (one, multiple, duration, flood). Add filler presets for pre-roll, mid-roll and fallback content, and ErsatzTV pads programmes to the half-hour like a real network. Block scheduling and templates exist for people who want "news at 6, movie at 8" structure across the week.

Start with one channel using one collection in flood mode. Get that playing in Jellyfin before touching filler or block schedules, because every layer above that multiplies the places a broken FFmpeg profile can hide. The ErsatzTV documentation is thorough and worth reading in order.

Plex wants a Plex Pass for live TV; Jellyfin does not

Plex's Live TV and DVR features are behind Plex Pass, so pairing ErsatzTV with Plex means paying for the privilege of watching your own files. Jellyfin's Live TV is free: add the M3U tuner and the XMLTV URL from the ErsatzTV settings page, refresh the guide, and channels appear alongside any real tuners. If you are choosing a media server partly for this, that settles it.

Transcoding is where the 512 MB goes

Every running channel is an FFmpeg process. With hardware acceleration and an FFmpeg profile whose resolution and codec match the source, a channel is light; without it, two channels of 1080p H.264 on a small CPU will stutter. The guide's "FFmpeg knowledge helps" warning is real: you will read FFmpeg logs at least once. The safe order is: set a profile at 1080p H.264 with hardware decode and encode, confirm one channel plays cleanly for an hour, then add channels. Only the channels someone is watching (or that use the always-on "HLS Segmenter" mode) consume CPU, so idle channels cost nothing.

Tunarr is the simpler sibling

Tunarr covers the same "fake TV from my library" idea with a friendlier drag-and-drop lineup builder and less scheduling depth. If your goal is a shuffled channel or two, Tunarr gets you there in 20 minutes. ErsatzTV wins when you want real broadcast structure: filler, block schedules, multi-collection programming, and precise control of the encoder.

What I'd do

Run jasongdove/ersatztv:latest-vaapi on an Intel box with /dev/dri passed through, media mounted read-only at the same path Jellyfin uses, and one flood-mode channel from a single collection as the first test. Add it to Jellyfin's Live TV, watch it for an evening, then build the filler and block schedules that make it feel like broadcast. Skip Plex for this unless you already pay for Plex Pass. If a shuffle channel is all you wanted, install Tunarr instead and keep the evening.

Compare ErsatzTV

4 head-to-head comparisons.

Similar media servers apps