HDHomeRun Emulation
Presents itself as an HDHomeRun network tuner via SSDP, /discover.json, and /lineup.json. Plex, Emby, and Jellyfin auto-discover xTeVe on the LAN — no manual configuration needed.
xTeVe 2 bridges your IPTV subscription with your media server. It emulates an HDHomeRun network tuner, merges M3U playlists with XMLTV EPG data, and proxies live channels through a configurable buffer — no Plex Pass tricks needed.
Overview
xTeVe 2 is an open-source IPTV proxy server written in Go. It sits between your IPTV provider and your media server, solving a fundamental incompatibility: Plex, Emby, and Jellyfin want a standard cable tuner, but your IPTV provider gives you an M3U playlist. xTeVe bridges that gap.
When Plex, Emby, or Jellyfin scan your local network for tuners, they speak the HDHomeRun protocol — a standard used by physical network tuner hardware. xTeVe speaks that same protocol, so your media server discovers it automatically via SSDP broadcast, just as it would discover a real hardware tuner. From the media server's perspective, xTeVe is the tuner. Behind the scenes, xTeVe fetches your M3U playlist, merges it with XMLTV programme guide data, and proxies each channel stream through one of three buffer backends.
Capabilities
A complete IPTV management layer — from playlist ingestion to EPG mapping and stream delivery.
Presents itself as an HDHomeRun network tuner via SSDP, /discover.json, and /lineup.json. Plex, Emby, and Jellyfin auto-discover xTeVe on the LAN — no manual configuration needed.
Fetches your M3U playlist from any URL and refreshes it on a configurable interval. Enable or disable individual channels, assign custom names and logos, and set channel numbers — all from the web UI.
Imports XMLTV programme guide data and maps it to your channels automatically via tvg-id, display name, or manual mapping. The merged guide is served at /xmltv/ for direct consumption by your media server.
Three stream delivery modes: HLS pass-through for low latency, FFmpeg re-encode for format conversion and compatibility, or VLC transcoding for maximum flexibility.
Configurable tuner count prevents more simultaneous streams than your IPTV provider allows. Additional stream requests receive a clean 503 response, keeping your subscription and bandwidth within limits.
A full admin dashboard built with React 19 and TypeScript. Manage channels, configure EPG mappings, set M3U and XMLTV sources, adjust settings, and watch live server logs — all in the browser at port 34400.
WebSocket-based live log feed pushes server events to the Logs page in real time. No page refresh, no polling — events appear the moment they happen, making debugging effortless.
Enable password protection for the admin API and web UI. Sessions are managed with bcrypt-hashed passwords and secure HTTP-only cookies. The HDHomeRun and stream endpoints remain public for media server compatibility.
Official multi-arch Docker image at ghcr.io/jskoetsier/xteve2:latest. Single environment variable configuration — point XTEVE_M3U_URL and XTEVE_XMLTV_URL at your sources and you're running.
Architecture
xTeVe sits in the middle of your IPTV stack, translating between the M3U world of IPTV providers and the HDHomeRun world of media servers.
xTeVe fetches your M3U URL and parses every channel entry — name, tvg-id, logo, group, and stream URL. It refreshes automatically on a configurable interval so channel changes are always picked up.
xTeVe fetches your XMLTV EPG source and maps programme schedules to channels using tvg-id matching, display name matching, or manual channel mapping you configure in the UI.
xTeVe broadcasts its presence on the LAN via SSDP and answers HDHomeRun discovery requests at /discover.json, /lineup.json, and /device.xml. Media servers find it automatically.
When your media server requests a channel, xTeVe checks the tuner limit, opens the upstream stream from your IPTV provider, and proxies it through to the client via HLS, FFmpeg, or VLC.
Your IPTV Provider ├── M3U Playlist URL ──────────────────────┐ └── XMLTV EPG URL ─────────────────────────┤ ▼ xTeVe 2 (:34400) ├── /discover.json ← HDHomeRun protocol ├── /lineup.json ← channel list + stream URLs ├── /device.xml ← device description ├── /m3u/ ← merged M3U playlist ├── /xmltv/ ← merged EPG ├── /stream/:id ← proxied stream ├── /api/v1/* ← REST API ├── /ws ← live log feed └── / ← React admin UI │ ┌──────────────────────────────┴──────────────────────────┐ │ │ │ Plex DVR Emby Live TV Jellyfin (auto-discovers (auto-discovers (M3U or HDHomeRun via SSDP) via SSDP) source)
Installation
xTeVe runs as a single binary with no external dependencies. Download, run, open the UI, and connect your M3U source.
# Download the binary
curl -L https://github.com/jskoetsier/xteve2/releases/latest/download/xteve_linux_amd64 -o xteve
chmod +x xteve
# Run (config stored in ~/.xteve by default)
./xteve
# Open the admin UI
# http://localhost:34400
./xteve -port 34400 # HTTP listen port (default: 34400)
./xteve -config ~/.xteve # Config directory (default: ~/.xteve)
Go to Settings and paste your IPTV provider's M3U playlist URL. xTeVe fetches it immediately.
Paste your XMLTV EPG URL in Settings. xTeVe maps programme schedules to channels automatically.
Add a Live TV tuner. Your media server discovers xTeVe via SSDP or you can enter the URL manually.
Deployment
Official multi-arch images at ghcr.io/jskoetsier/xteve2:latest.
docker run -d \
--name xteve \
-p 34400:34400 \
-v ~/.xteve:/config \
-e XTEVE_BASE_URL=http://YOUR_SERVER_IP:34400 \
-e XTEVE_M3U_URL=http://your-iptv-provider/playlist.m3u \
-e XTEVE_XMLTV_URL=http://your-iptv-provider/epg.xml \
ghcr.io/jskoetsier/xteve2:latest
services:
xteve:
image: ghcr.io/jskoetsier/xteve2:latest
container_name: xteve
restart: unless-stopped
ports:
- "34400:34400"
volumes:
- ~/.xteve:/config
environment:
- XTEVE_BASE_URL=http://YOUR_SERVER_IP:34400
- XTEVE_M3U_URL=http://your-iptv-provider/playlist.m3u
- XTEVE_XMLTV_URL=http://your-iptv-provider/epg.xml
XTEVE_BASE_URL Public URL xTeVe uses to build stream URLs
XTEVE_M3U_URL URL to your M3U playlist
XTEVE_XMLTV_URL URL to your XMLTV EPG file
XTEVE_M3U_REFRESH_MINS Playlist refresh interval (default: 15)
Compatibility
Full support for any server consuming HDHomeRun or M3U/XMLTV.
xTeVe appears as an HDHomeRun tuner in Plex. Add it under Live TV & DVR → Add Tuner Device.
Add xTeVe as an HDHomeRun tuner or as an M3U tuner under Live TV → Add Tuner Device.
Jellyfin supports both M3U and HDHomeRun sources. Add xTeVe's stream URL as an M3U playlist.
The /m3u/ endpoint serves a standard M3U playlist compatible with VLC, Kodi, and TiviMate.
x86-64 · ARM64
Intel · Silicon
x86-64
amd64 · arm64
via Helm/Manifest
x86-64
Release
Pre-built binaries are attached to every GitHub Release. Current version: 2.3.0. No runtime dependencies — just download and run.
| Platform | Architecture | Filename |
|---|---|---|
| Linux | x86-64 | xteve_linux_amd64 |
| Linux | ARM64 | xteve_linux_arm64 |
| macOS | x86-64 (Intel) | xteve_darwin_amd64 |
| macOS | Apple Silicon | xteve_darwin_arm64 |
| Windows | x86-64 | xteve_windows_amd64.exe |
| FreeBSD | x86-64 | xteve_freebsd_amd64 |
QUERY
Common questions about setting up xTeVe with Plex, Emby, and Jellyfin.
/discover.json and /lineup.json endpoints to list channels and stream URLs. You add it the same way you'd add a real HDHomeRun device under Live TV & DVR settings.
/m3u/ and /xmltv/ endpoints that xTeVe exposes.
http://localhost:34400, go to Settings, and paste your M3U URL in the "M3U URL" field. Save settings and xTeVe will fetch the playlist immediately. Channels appear in the channel list where you can enable or disable them, set custom names, and map EPG data.
/xmltv/ for Plex, Emby, and Jellyfin to consume.
tuner_count in settings to match what your provider allows.
ghcr.io/jskoetsier/xteve2:latest supporting amd64 and arm64. It runs on any Docker host including Synology NAS, QNAP, Unraid, TrueNAS, and Raspberry Pi. Mount a config directory for persistence and set your M3U URL as an environment variable.