Caution
VERY EARLY STAGE: This project is a complete rewrite of ErsatzTV in Rust. It is currently in active development, experimental, and not yet ready for production use. Expect breaking changes, missing features, and bugs.
ErsatzTV is a modular, self-hosted IPTV server that transcodes and streams your media as live TV channels.
This rewrite focuses on a "one thing well" philosophy: reliable transcoding and streaming.
Important
Library and metadata management, scheduling and playout creation are not in scope for this project.
Unlike the legacy version, this version is decoupled from library management and scheduling. It consumes playouts (JSON documents describing what to play and when) and handles the heavy lifting of keeping a stream alive and consistent, regardless of source media variations.
Platform-specific quickstart guides and reference documentation live at https://ersatztv.org/next-docs/.
This project contains the following crates:
- ffpipeline: transcoding and normalization logic
- ersatztv-playout: Rust models for the playout JSON schema
- ersatztv-channel: generates a normalized IPTV stream for a single channel from playout JSON
- ersatztv: serves IPTV over HTTP (M3U, M3U8, etc.) and manages channel processes
- ersatztv-playout-generator: generates playout JSON from a folder of video files. Provided for demonstration and reference purposes; scheduling is not in scope and feature requests will not be accepted.
Finally, there are configuration examples under examples:
- playout.json: an example playout JSON file, demonstrating some of the possible fields.
- channel.json: an example channel configuration, linking a channel to its playout JSON files, and describing how to normalize the content.
- lineup.json: an example lineup configuration, linking to all channels, and describing where to write the normalized content and how to serve it over HTTP.
ffmpegandffprobemust be in yourPATH(or referenced by absolute path inchannel.json).
Grab a pre-built binary from the develop release, or build from source with cargo build --release --workspace.
For platform-specific walkthroughs, see the docs site.
-
Scaffold a lineup with one channel:
ersatztv add-lineup config/lineup.json --channels 1
This creates
config/lineup.json,config/channels/1/channel.json, andconfig/channels/1/playout/. -
Generate a test playout from a folder of video files:
ersatztv-playout-generator --lineup config/lineup.json --channel 1 --content-folder /path/to/videos
-
Run the server:
ersatztv config/lineup.json
-
Watch at
http://localhost:8409/channel/1.m3u8in VLC, mpv, or any HLS player. For a no-install check, open the hls.js demo.
We welcome early feedback and contributions!
- Matrix: #ersatztv-dev:matrix.org
- Discord: #developer-chat
Early feedback on the playout schema and architecture is especially valuable at this stage.
ErsatzTV is licensed under the MIT License.