No description
  • Rust 99.6%
  • Dockerfile 0.4%
Find a file
masterdot 6a2932df14 docs: add roadmap for feature parity with legacy ErsatzTV
Compares this Rust rewrite against the legacy .NET project, documents
the current feature gap (persistence, library scanning, scheduling,
web UI, HDHomeRun are out of upstream scope but planned here), and
lays out a phased plan toward full parity, incorporating relevant
open upstream issues/PRs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 00:23:01 +02:00
.github chore: formatting to get new build (#195) 2026-08-09 22:59:20 -05:00
crates fix: aac surround (#239) 2026-09-15 05:23:35 -05:00
docker feat: filter docker tests (#204) 2026-08-12 06:55:20 -05:00
examples feat: support multiple graphics layers (#209) 2026-08-14 10:31:21 -05:00
schema feat: fallback renderer (#235) 2026-09-11 12:52:06 -05:00
.dockerignore ci: fix docker build by including examples folder (#140) 2026-05-14 15:06:45 -05:00
.gitignore feat: support http inputs in playouts (#25) 2026-04-18 17:45:40 -05:00
AGENTS.md feat: amf capabilities (#236) 2026-09-13 12:40:15 -05:00
Cargo.lock feat: amf capabilities (#236) 2026-09-13 12:40:15 -05:00
Cargo.toml feat: amf capabilities (#236) 2026-09-13 12:40:15 -05:00
CLAUDE.md chore: add AGENTS.md and symlinked CLAUDE.md (#20) 2026-04-17 10:23:00 -05:00
LICENSE use workspace for project organization 2026-03-13 10:16:05 -05:00
README.md docs: update readme with scaffolding and docs links (#142) 2026-05-14 20:50:45 -05:00
ROADMAP.md docs: add roadmap for feature parity with legacy ErsatzTV 2026-09-16 00:23:01 +02:00
rustfmt.toml feat: troubleshoot flag (#188) 2026-08-07 12:23:21 -05:00

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

ErsatzTV is a modular, self-hosted IPTV server that transcodes and streams your media as live TV channels.

Background

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.

Documentation

Platform-specific quickstart guides and reference documentation live at https://ersatztv.org/next-docs/.

Contents

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.

Getting Started

Prerequisites

  • ffmpeg and ffprobe must be in your PATH (or referenced by absolute path in channel.json).

Install

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.

Quick Start

  1. Scaffold a lineup with one channel:

    ersatztv add-lineup config/lineup.json --channels 1
    

    This creates config/lineup.json, config/channels/1/channel.json, and config/channels/1/playout/.

  2. Generate a test playout from a folder of video files:

    ersatztv-playout-generator --lineup config/lineup.json --channel 1 --content-folder /path/to/videos
    
  3. Run the server:

    ersatztv config/lineup.json
    
  4. Watch at http://localhost:8409/channel/1.m3u8 in VLC, mpv, or any HLS player. For a no-install check, open the hls.js demo.

Contributing

We welcome early feedback and contributions!

Early feedback on the playout schema and architecture is especially valuable at this stage.

License

ErsatzTV is licensed under the MIT License.