# ErsatzTV/legacy: Turning a Media Library into Live TV Channels

> ErsatzTV's legacy branch builds custom IPTV channels with EPG output from Plex, Jellyfin and Emby libraries. Here is what the repository documents, what it leaves unsaid, and who should install it.

**ErsatzTV/legacy** — Open-source platform that transforms your personal media library into live, custom TV channels.

- Repository: https://github.com/ErsatzTV/legacy
- Website: https://ersatztv.org/
- Stars: 2,978 · Forks: 220
- Language: C#
- License: Zlib
- Published: 2026-09-24 · Updated: 2026-09-24 · Language: en
- Canonical page: https://hysenlabs.com/projects/ersatztv-legacy

## The problem ErsatzTV/legacy addresses

A media server is a catalogue. You open it, you browse, you pick something, and the choice is yours every time. ErsatzTV/legacy inverts that: it takes the same library and turns it into channels that play on a schedule, so watching becomes tuning in rather than selecting. The README describes the goal as transforming a media library into "a personalized, live TV experience" with EPG and channel scheduling. That is a different product category from a streaming server, and it is the reason this project exists rather than being a Plex plugin.

The audience is narrow and specific. You need an existing library, a machine to run the server on, and a client that speaks IPTV and can read an Electronic Program Guide. Someone with a folder of files and no media server gets less out of it, because the README lists Plex, Jellyfin and Emby integration as the way libraries are connected. Someone who wants to watch one film tonight is also not the target. The fit is the person who misses channel-surfing, or who wants a background stream of music videos, or who wants a themed channel assembled from material already sitting on a disk.

## How channels, scheduling and streaming fit together

The README gives four steps: install the server, add media, create channels, stream anywhere with IPTV and EPG support. The repository layout fills in more of the shape. ErsatzTV.Application, ErsatzTV.Core, ErsatzTV.FFmpeg, ErsatzTV.Scanner and ErsatzTV.Infrastructure are separate projects, with two infrastructure variants: ErsatzTV.Infrastructure.Sqlite and ErsatzTV.Infrastructure.MySql. That tells you the server persists state in a relational database and that you choose the backend at deployment time.

FFmpeg sits in its own project with its own test suite, which matches the README's claim of hardware transcoding through NVENC, QSV, VAAPI, AMF and VideoToolbox. In practice this means the server is not just building a playlist and handing files to a client; it is transcoding, and the encoder available on your host determines what the stream looks like. The Scanner project is the piece that reads your libraries and collections, the Application project holds the channel and scheduling logic, and the API surface is exposed through the api/ directory alongside the main ErsatzTV project.

The data flow is therefore: scanner indexes media from a connected server, core and application schedule that media into channels, FFmpeg produces the stream, and the client consumes IPTV plus EPG. The repository also carries an hdhr.md file at the top level, which indicates HDHomeRun-related documentation exists separately from the README.

## Installing ErsatzTV/legacy and creating a first channel

The README does not include install commands. It says to download and set up the server, and it points to ersatztv.org/docs/ for documentation. A docker/ directory exists in the repository, so container deployment is part of the project's own tooling, but the README does not print a docker run line, an image name or a port. Treat the docs site as the authority for the exact invocation rather than copying a command from a blog post.

The workflow the README describes is short enough to state as a sequence. First the server is running and reachable. Second, you connect a media library: Plex, Jellyfin, Emby or another source the docs cover. Third, you create a channel and give it a schedule. Fourth, you point an IPTV client at the server and load the EPG.

```bash
# No install command is given in the README.
# The repository provides a docker/ directory and the docs live at:
# https://ersatztv.org/docs/
```

What you should see after a correct setup is an EPG populated with your channel's programming, and a stream that plays in a client which supports IPTV. If the EPG is empty, the scheduling step did not produce guide data, and that is the first thing to check rather than the transcoder. If the stream fails to start while the guide looks correct, the encoder is the more likely culprit, which is why the README's hardware acceleration list matters: NVENC, QSV, VAAPI, AMF and VideoToolbox are not interchangeable, and the one your host exposes constrains the configuration.

## Where ErsatzTV/legacy is the wrong tool

The README makes no claim about rollback, upgrade paths or database migration between releases. The CHANGELOG.md file exists, and releases are frequent (v26.10.0 on 2026-09-21, v26.9.0 on 2026-09-06, v26.8.1 on 2026-08-29), but the README itself does not describe how to move from one to the next, and it does not say whether the SQLite and MySQL backends are interchangeable after data has been written. Anyone running this in front of a household should read the changelog before each upgrade rather than assuming a drop-in replacement.

The second limitation is transcoding cost. Hardware acceleration is listed as a feature, not a guarantee, and the encoders named are vendor-specific. A host without a supported GPU falls back to software encoding, which the README does not discuss at all. If you are planning several simultaneous channels, the number of streams your machine can produce is a real constraint and the README gives no figures.

The third case is simpler: if you want on-demand playback with resume points and per-user watch state, a media server already does that better. ErsatzTV/legacy is for linear, scheduled viewing. Using it as a replacement for Plex or Jellyfin browsing is using it against its design.

## How it compares with dizquetv and pseudotv-plex

The README states that ErsatzTV is inspired by pseudotv-plex and the dizquetv fork. That lineage is worth understanding because the approach differs. dizquetv is a Node.js project that generates channels and an EPG largely by handing clients direct play URLs, leaving transcoding to the client or to the media server. ErsatzTV/legacy instead carries its own FFmpeg project with a test suite and advertises hardware transcoding, so the server takes on the job of producing the stream in the format the client needs.

That difference has consequences. A transcoding server needs more CPU or a supported GPU, and it needs FFmpeg present and configured, but it can serve clients that cannot play the original files. A URL-generating approach is lighter and easier to run on modest hardware, but it depends on the client's codec support and on the media server's own streaming decisions. The README's mention of music video mixing and subtitle support sits on the ErsatzTV side of that line, since both are easier when the server controls the output.

The other difference is integration breadth. The README lists Plex, Jellyfin and Emby, while the projects it credits were built around Plex. If your library lives in Jellyfin or Emby, that is the concrete reason to look at ErsatzTV/legacy rather than the older tools.

## Maintenance, licensing and what it costs to keep running

The repository is not archived, and the last push was on 2026-09-23, one day before this writing, with three releases in September 2026 alone. That is a fast cadence, and it cuts both ways: fixes arrive quickly, and the surface you have to track changes quickly too. Budget time for reading CHANGELOG.md before upgrading, because the README does not describe a migration procedure.

The licence is the zlib licence, stated in the README and present as LICENSE in the repository. It is a permissive licence, which in practical terms means you can run, modify and redistribute the software with few conditions, but it is not the same as the GPL and it is not the same as a public domain dedication. If you plan to bundle ErsatzTV/legacy into something you distribute, read the LICENSE file rather than relying on a summary, and note that the README credits pseudotv-plex and dizquetv as inspiration, which is an attribution statement rather than a licence inheritance. This is a description of what the repository says, not legal advice.

Operationally, the cost is a running server, a database (SQLite or MySQL, per the infrastructure projects), FFmpeg, and enough compute for the streams you schedule. The macOS directory in the tree suggests a macOS build path exists, and the docker/ directory suggests container deployment, but the README does not state supported platforms explicitly.

## Conclusion

Adopt ErsatzTV/legacy if you already run Plex, Jellyfin or Emby and want scheduled, channel-based playback with an EPG rather than on-demand browsing, and if you can run a container or service that holds FFmpeg and a database. Skip it if you want a single-file binary with no server, or if you need vendor support and a published compatibility matrix, since the README points only to ersatztv.org/docs and the repository does not document rollback or upgrade procedure. Before committing, verify that your media server integration works with your library layout, check which hardware encoder your host exposes (NVENC, QSV, VAAPI, AMF, VideoToolbox), and confirm whether you want the SQLite or MySQL infrastructure project, since both exist in the tree.

## FAQ

### What is ErsatzTV/legacy and what does it do?

It is an open-source platform that turns a personal media library into live, custom TV channels, with EPG and channel scheduling, and streams them to devices that support IPTV. The README lists Plex, Jellyfin and Emby integration as the way libraries are connected.

### How do I install ErsatzTV/legacy?

The README does not give install commands; it says to download and set up the server and points to ersatztv.org/docs/ for documentation. The repository does contain a docker/ directory, so container deployment is part of the project's own tooling.

### Which hardware encoders does ErsatzTV/legacy support?

The README lists NVENC, QSV, VAAPI, AMF and VideoToolbox under hardware transcoding. These are vendor-specific, so which one you can use depends on the hardware in the machine running the server.

### Does ErsatzTV/legacy work with Jellyfin and Emby, or only Plex?

The README lists Plex, Jellyfin, Emby and more under media server integration. That breadth is one of the differences from the projects it credits, pseudotv-plex and the dizquetv fork, which the README describes as its inspiration.

### What database does ErsatzTV/legacy use?

The repository contains both ErsatzTV.Infrastructure.Sqlite and ErsatzTV.Infrastructure.MySql, so there are two persistence backends. The README does not explain how to choose between them or whether data can be moved from one to the other.

## Sources

- [ErsatzTV/legacy on GitHub](https://github.com/ErsatzTV/legacy)
- [License: Zlib](https://github.com/ErsatzTV/legacy/blob/main/LICENSE)
- [Project website](https://ersatztv.org/)
- [README](https://github.com/ErsatzTV/legacy/blob/main/README.md)
- [Releases](https://github.com/ErsatzTV/legacy/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/ersatztv-legacy
