3 Dispatcharr
Matt-Nexus edited this page 2026-04-30 17:13:35 -04:00

Dispatcharr

IPTV/EPG stream manager. Consolidates M3U playlists and EPG data and exposes channels to Jellyfin via HDHomeRun emulation.

Where it runs

  • Host: PVE LXC 113 (192.168.1.254)
  • UI: http://192.168.1.254:9191
  • Login: dispatch user (password set on first-run wizard)
  • Managed by: Komodo (server dispatcharr, Stack dispatcharr)
  • Compose file: dispatcharr/docker-compose.yml in homelab-docker repo

Docker

Installed via apt (not snap) inside the LXC. Use docker compose (with a space).

Komodo Periphery

Periphery agent runs as a Docker container on the LXC. It connects outbound to Komodo Core (ws://192.168.1.226:9120) — no inbound port needs to be open.

  • Compose file: /opt/komodo/periphery.yml
  • Keys: /opt/komodo/keys/periphery.key (shared from Nexus komodo_keys volume)

Restart Periphery if it disconnects:

ssh root@192.168.1.227 "pct exec 113 -- docker compose -f /opt/komodo/periphery.yml restart"

Komodo Stack Notes

Stack uses files_on_host: true with:

  • run_directory: /opt/homelab-docker/dispatcharr
  • file_paths: ["docker-compose.yml"]

The file_paths must be set explicitly — Komodo defaults to compose.yaml.

Repo on LXC

homelab-docker is cloned at /opt/homelab-docker. Komodo pulls it when the webhook procedure runs (Repo: homelab-docker-dispatcharr). Manual pull:

ssh root@192.168.1.227 "pct exec 113 -- git -C /opt/homelab-docker pull"

M3U Sources

Sources are added via Settings → M3U Accounts. Currently configured:

Name URL
US Channels https://iptv-org.github.io/iptv/countries/us.m3u
News https://iptv-org.github.io/iptv/categories/news.m3u
Kids https://iptv-org.github.io/iptv/categories/kids.m3u
Documentary https://iptv-org.github.io/iptv/categories/documentary.m3u
Movies https://iptv-org.github.io/iptv/categories/movies.m3u
Animation https://iptv-org.github.io/iptv/categories/animation.m3u
Sports https://iptv-org.github.io/iptv/categories/sports.m3u

These are free, community-maintained streams (iptv-org). Individual streams go down occasionally — expect some dead channels at any given time.

Output Endpoints

All endpoints are unauthenticated (public within the LAN):

Endpoint Purpose
http://192.168.1.254:9191/hdhr HDHomeRun emulation (Jellyfin tuner URL)
http://192.168.1.254:9191/hdhr/lineup.json Channel lineup JSON
http://192.168.1.254:9191/output/m3u/ M3U playlist of your channels
http://192.168.1.254:9191/output/epg XMLTV guide data for your channels

Jellyfin Integration

Jellyfin (LXC 101, 192.168.1.250:8096) is configured to use Dispatcharr as its Live TV source. Config lives in /etc/jellyfin/livetv.xml on LXC 101.

  • Tuner type: HD HomeRun → http://192.168.1.254:9191/hdhr
  • EPG type: XMLTV → http://192.168.1.254:9191/output/epg
  • Tuner count: 10 simultaneous streams

The config in /etc/jellyfin/livetv.xml uses <Path> (not <Url>) for the XMLTV listing provider — this is a Jellyfin quirk. Using <Url> causes a NullReferenceException on every guide refresh with no EPG data loaded.

Relevant snippet from livetv.xml:

<ListingsProviderInfo>
  <Id>dispatcharr-epg</Id>
  <Type>xmltv</Type>
  <Path>http://192.168.1.254:9191/output/epg</Path>
  <EnableAllTuners>true</EnableAllTuners>
</ListingsProviderInfo>

When you add new channels in Dispatcharr, refresh the guide in Jellyfin: Dashboard → Scheduled Tasks → Refresh Guide → Run Now

Or via API:

curl -s -X POST "http://192.168.1.250:8096/ScheduledTasks/Running/bea9b218c97bbf98c5dc1303bdb9a0ca" \
  -H "Authorization: MediaBrowser Token=\"YOUR_API_KEY\""

Channel Logos in Jellyfin

Jellyfin pulls channel logos from the XMLTV EPG <icon> tags. Dispatcharr proxies logos through http://192.168.1.254:9191/api/channels/logos/{id}/cache/. After a guide refresh, logos appear automatically if the channel has one set in Dispatcharr. Set or override logos via Dispatcharr → Channels → edit channel → Logo field.

EPG / Guide Data

The iptv-org free streams carry minimal EPG data. Most channels will show "No program information" in the guide. Options to improve this:

  1. Leave it as-is — channels still play fine without guide data.
  2. Add a dedicated EPG source in Dispatcharr — Settings → EPG Sources → Add. Some providers publish XMLTV URLs alongside their M3U feeds.

Renovate Note

ghcr.io/dispatcharr/dispatcharr only publishes latest — no semver tags. Renovate will not open auto-update PRs. Check the GHCR page or GitHub releases periodically and pull the image manually when a new version drops:

ssh root@192.168.1.227 "pct exec 113 -- docker compose -f /opt/homelab-docker/dispatcharr/docker-compose.yml pull && docker compose -f /opt/homelab-docker/dispatcharr/docker-compose.yml up -d"

Troubleshooting

# Dispatcharr container logs
ssh root@192.168.1.227 "pct exec 113 -- docker logs dispatcharr --tail 50"

# Periphery connection to Komodo
ssh root@192.168.1.227 "pct exec 113 -- docker logs komodo-periphery --tail 20"

# Stream count in DB
ssh root@192.168.1.227 "pct exec 113 -- docker exec dispatcharr python manage.py shell -c \
  'from apps.channels.models import Stream, Channel; print(Stream.objects.count(), \"streams,\", Channel.objects.count(), \"channels\")'"