ErsatzTV Legacy is a .NET 10 web application that runs on Linux, Windows, and macOS. The recommended and easiest installation method is Docker, which bundles FFmpeg and all native dependencies in a single container image. For bare-metal or VM installs, you can download a self-contained binary release and run it directly, provided FFmpeg is available on your system.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ErsatzTV/legacy/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
- Docker (Recommended)
- Binary (Linux / Windows / macOS)
- Docker Engine 20.10 or newer (or Docker Desktop on Windows/macOS)
- Docker Compose v2 plugin (usually bundled with Docker Desktop or the
docker-compose-pluginpackage) - No separate .NET or FFmpeg installation required — the official image is built on top of
ghcr.io/ersatztv/ersatztv-ffmpegand includes a custom FFmpeg 7.1.1 build along with the .NET 10 ASP.NET Core runtime.
Installation
- Docker
- Binary
The official Docker image is published at
ghcr.io/ersatztv/ersatztv and is rebuilt for each release. It targets linux/amd64 and includes FFmpeg, Python 3, and the etv_client Python package for scripted schedules.Create a docker-compose.yml file
Create a directory for your ErsatzTV Legacy configuration and save the following
docker-compose.yml inside it:Set
TZ to your local timezone (e.g. Europe/London, Asia/Tokyo) so that schedule times and EPG data are displayed correctly. A full list of valid timezone strings can be found in the IANA Time Zone Database.Mount your media (optional but recommended)
Add your media paths as read-only bind mounts inside the The paths inside the container (e.g.
volumes: section of your docker-compose.yml:/media/movies) are what you will enter when configuring a Local library in the ErsatzTV Legacy UI.Start the container
From the directory containing your Docker will pull the
docker-compose.yml, run:ghcr.io/ersatztv/ersatztv:latest image on the first run. This may take a minute or two depending on your connection speed.Configuration
Default Port
ErsatzTV Legacy binds to port 8409 for both the web UI and the IPTV/streaming endpoints. This port is used for all HTTP access: the management UI, the REST API, and the M3U, XMLTV, and HDHomeRun streaming endpoints.Config Directory
| Installation | Config Location |
|---|---|
| Docker | /config (inside the container, backed by a named volume or bind mount) |
| Binary | Same directory as the ErsatzTV executable |
ersatztv.sqlite3), logs, extracted artwork cache, and the next/ folder for Next engine channel configs. Override the path with the ETV_CONFIG_FOLDER environment variable.
Transcode Directory
Temporary HLS segment files are written to a transcode directory. In Docker, this is mapped to atmpfs mount at /transcode for performance. Override with ETV_TRANSCODE_FOLDER.
Environment Variables Reference
| Variable | Default | Description |
|---|---|---|
TZ | System TZ | Container timezone (e.g. America/New_York) |
ETV_CONFIG_FOLDER | /config (Docker) | Override for the config/database folder |
ETV_TRANSCODE_FOLDER | /transcode (Docker) | Override for HLS segment scratch space |
ETV_INSTANCE_ID | (unset) | Disambiguates EPG data from multiple ErsatzTV instances |
TRAKT__CLIENTID | (unset) | Your Trakt API Client ID for Trakt list integration |
Single-Instance Enforcement
ErsatzTV Legacy uses a named system mutex (ErsatzTV.Singleton.74360cd8985c4d1fb6bc9e81887206fe) to ensure only one instance runs per host. If you attempt to start a second instance, the process will print Another instance of ErsatztTV is already running. and exit immediately. Run multiple channels through a single server instance rather than multiple processes.
Hardware Acceleration (Docker)
GPU transcoding requires additional Docker flags beyond the basedocker-compose.yml. ErsatzTV Legacy supports NVENC (NVIDIA), VAAPI (Intel/AMD), QSV (Intel), AMF (AMD on Windows), VideoToolbox (macOS), and RKMPP (Rockchip).
Use the appropriate Compose file as a starting point:
- NVIDIA — requires the NVIDIA Container Toolkit on the host. Use the
docker-compose.nvidia.ymlvariant shown in the Docker tab above, which setsNVIDIA_VISIBLE_DEVICES,NVIDIA_DRIVER_CAPABILITIES, and thedeploy.resources.reservations.devicesblock. - VAAPI (Intel / AMD) — pass the render device into the container. Use the
docker-compose.vaapi.ymlvariant, which maps/dev/dri/renderD128from host to container. Adjust the device path if your system uses a different render node.
Hardware transcoding profiles must be explicitly assigned to channels. A channel configured with a software-only FFmpeg profile will not use GPU acceleration even if the Docker container has GPU access.
Upgrading
To upgrade to a newer release using Docker, pull the latest image and recreate the container:/config volume before upgrading major versions.