Tellyard ghcr.io/sandobserver/tellyard:latest https://github.com/SandObserver/Tellyard/pkgs/container/tellyard bridge false --user=99:100 --restart=unless-stopped --init --read-only --tmpfs=/tmp --cap-drop=ALL --security-opt=no-new-privileges:true --memory=512m https://github.com/SandObserver/Tellyard/issues https://github.com/SandObserver/Tellyard https://github.com/SandObserver/Tellyard/blob/main/README.md https://github.com/SandObserver/Tellyard/blob/main/LICENSE A live TV tuner for Plex and Jellyfin that you'll forget is running.[br][br]Tellyard shows up in Plex and Jellyfin as a network tuner. You list your channels in one file. When someone tunes in, Tellyard finds the channel's live stream on YouTube, Twitch, a broadcaster's page or an HLS address and passes it on without re-encoding. When they stop watching, it stops. The guide merges XMLTV schedules with placeholder blocks, so it is never empty.[br][br]Tellyard ships no channels. It starts with an empty line-up: put your channels.toml in /mnt/user/appdata/tellyard/config and it is loaded within a minute. Then add the tuner in Plex at UNRAID-IP:5004 and the guide at http://UNRAID-IP:5004/guide.xml. Plex or Jellyfin, and a channels.toml listing the live streams you may watch. Tellyard ships no channels. ### 0.1.0 - 2026-10-17 #### Added - Add an Unraid template, `templates/tellyard.xml`, and Unraid install steps in the README. - Publish the image to Docker Hub as `sandobserver/tellyard` as well as to ghcr.io. - Add the `live` source for channels on YouTube, Twitch, Kick and other sites yt-dlp supports. The `youtube` key still works. - Add `HEARTBEAT_URL`, called once a minute while Tellyard is healthy. - Add `/healthz`, which answers 503 with a reason when the guide has stopped updating. `/health` stays as an alias. #### Changed - Point the install steps at the `latest` image tag. - Start with no channels when `channels.toml` is missing, and load it once it appears. `/healthz` reports the missing file. - Report a channel that is not live without naming YouTube, since `live` covers other sites. - Print a settings summary at start and write log lines as logfmt with UTC times. - Run the landing page guide on the visitor's clock, with shows that start at different times. #### Fixed - Use `info` when `LOG_LEVEL` is set but empty. - Fix screen reader labels on the landing page and send a Content Security Policy with it. - Free the tuner within a second when the viewer leaves while a channel is still tuning, frozen or reconnecting. - Scan broadcaster pages and master playlists in linear time, so a hostile page cannot stall every stream. - Remove credentials, path and query of stream addresses from ffmpeg messages in the log. - Pick the default audio track when it is carried in the video stream. - Accept only http and https addresses from master playlists. - Stop a page, playlist or token request that takes longer than 30 seconds. - Report a `channels.toml` that is not UTF-8 as a channel file error, and keep the guide thread running after an unexpected error. - Answer a tune that fails on an unexpected playlist value with the usual stream error. - Explain that a subchannel number needs quotes in `channels.toml`, and ignore spaces around a page `match`. MediaApp:Video MediaServer:Video https://raw.githubusercontent.com/SandObserver/Tellyard/main/templates/tellyard.xml https://raw.githubusercontent.com/SandObserver/Tellyard/main/site/public/icon-512.png https://raw.githubusercontent.com/SandObserver/Tellyard/main/docs/social-card.png plex jellyfin live tv hdhomerun tuner iptv xmltv epg youtube twitch If Tellyard is useful to you, you can buy me a coffee. https://buymeacoffee.com/sandobserver 5004 /mnt/user/appdata/tellyard/config /mnt/user/appdata/tellyard/data 4 off Tellyard 3 6 info