A live TV tuner you'll forget is running.

Tellyard shows up in Plex and Jellyfin as a network TV tuner. Add the live streams broadcasters publish for free, and they play in the Live TV guide like any other channel, on every TV, phone and browser your server reaches.

Why Tellyard

How heavy is it? Featherweight.

One small container with no database, no web app and no background workers. It barely registers on a home server.

Does anything run while nobody watches? Nothing.

No stream and no download. Tellyard only wakes to refresh the guide, every 6 hours by default.

Where do the streams come from? From the source.

Each channel is one link the broadcaster publishes for its free live stream. No M3U playlist to find or keep up to date, and a fresh connection every time you tune in.

What about picture quality? Full quality.

Tellyard plays the best resolution the broadcaster offers and passes it on untouched, with no re-encoding.

Where do channels live? One file.

A few lines per channel. Edit it and the change is live within a minute.

Does every channel get a guide? Always.

Real listings where a schedule exists. Where one doesn't, each hour shows the channel's name instead of an empty row.

Get started

Free and self-hosted. Needs Docker on a 64-bit Intel, AMD or ARM machine, and Plex or Jellyfin.

  1. Write your channel list

    Create a config folder with a channels.toml. Each channel needs a number, a name, a logo and one source. Every option.

    config/channels.toml
    [[channel]]
    number = 101
    name = "Example News"
    logo = "https://example.com/logos/example-news.png"
    hls = "https://example.com/live/news/master.m3u8"
    [channel.guide]
    category = "News"

    Only add streams you are allowed to watch.

  2. Create the compose file

    Save this as compose.yml next to the config folder.

    compose.yml
    services:
      tellyard:
        image: ghcr.io/sandobserver/tellyard:beta
        container_name: tellyard
        restart: unless-stopped
        init: true
        read_only: true
        tmpfs:
          - /tmp
        cap_drop:
          - ALL
        security_opt:
          - no-new-privileges:true
        mem_limit: 512m
        environment:
          # Time zone for log timestamps
          - TZ=America/New_York
          # Streams that may play at the same time
          - TUNERS=4
          # Lowest resolution `tellyard check` accepts: off, or a height such as 1080
          - MIN_HEIGHT=off
        volumes:
          - ./config:/config:ro
          - ./data:/data
        ports:
          - "5004:5004"
  3. Start it and check your channels

    Terminal, in the folder with compose.yml
    mkdir -p ./data && sudo chown 1000:1000 ./data
    docker compose up -d
    docker exec tellyard tellyard check

    tellyard check tunes each channel once and reports the resolution it really sends.

  4. Add it to your media server

    Tellyard's address is your server's address with port 5004, such as 192.168.1.10:5004, and its guide is http://192.168.1.10:5004/guide.xml.

    Plex: open Settings > Live TV & DVR > Set up Plex DVR, enter the address by hand, and choose the XMLTV option for the guide. On an iPhone, iPad or Apple TV, turn on Force Direct Play in the Plex app. More about Plex.

    Jellyfin: open Dashboard > Live TV, add a tuner device of type HDHomeRun with the address, and add an XMLTV guide provider with the guide address.