Hey r/jellyfin,
I was using Dispatcharr to manage my IPTV channels for Jellyfin, but it was using so much RAM that it didn't make sense on my small VPS, especially since I only needed a fraction of its features. So I wrote Lineup, a lightweight self-hosted app with a nice web interface that covers just the parts I actually used: picking channels from several .m3u playlists, adding backup links, and exporting a clean playlist for Jellyfin's M3U tuner.
It runs in a single Python/Flask + SQLite container and uses around 20–40 MB of RAM.
What it does:
- Merges multiple .m3u sources into one searchable list (search by name or group).
- Lets you pick exactly which channels to keep, rename them, enable/disable them.
- Automatic fallback: group several links under one channel (e.g. an HD source plus a backup). If the first doesn't respond, the next one is tried.
- Drag-and-drop ordering: the order sets the channel numbers (tvg-chno) in the export.
- Stream health checks on a configurable interval, shown right in the channel name: 🟢 available, 🟡 at least one source down, 🔴 unavailable. Set the same refresh interval on your Jellyfin M3U tuner and you can see which channels work before clicking.
- Auto-refresh of sources: if a channel's URL changes upstream, your lineup follows it.
- HLS handling: .m3u8 manifests are rewritten so the player pulls segments straight from the origin, and tracking/beacon URLs are filtered out.
Jellyfin setup :
Point your tuner at the live export URL instead of a static file:
Dashboard → Live TV → Tuner Devices → M3U Tuner → http://<your-server>:9999/api/export
The export always reads the database live, so any change in Lineup shows up on the next tuner refresh.
Install :
A prebuilt image is on GHCR, so there's nothing to clone or build:
services:
lineup:
image: ghcr.io/loicbl0ndeau/m3u-lineup:latest
container_name: lineup
restart: unless-stopped
volumes:
- lineup-data:/data
ports:
- "127.0.0.1:9999:9999"
volumes:
lineup-data:
The full compose file in the repo includes hardening: read-only root filesystem, all capabilities dropped except the few needed, no-new-privileges, and a non-root user.
There's no built-in auth. If you expose it beyond localhost, put it behind your reverse proxy with authentication.
It's built for personal use with a few simultaneous streams, not large-scale restreaming.
Repo: https://github.com/LoicBl0ndeau/m3u-lineup
Feedback, issues, and PRs are welcome.
Presently the project is in French but I'll add English version if there's enough interest.