Files
xTeVe/README.md
T
nathan ddc70e170a
continuous-integration/drone/push Build encountered an error
Phase 3: embed web UI with go:embed, pinned TypeScript toolchain, drop i18n, add /healthz
- html/embed.go embeds html/ (pages, css, img, js, video); src/assets.go
  serves it, with os.DirFS("html") under -dev. Static assets get an ETag
  and Cache-Control: no-cache; HTML pages are still templated (only the
  login error message is substituted now).
- Delete the generated src/webUI.go (783 KB base64), src/html-build.go and
  cmd/webui-gen; Dockerfile no longer runs a generator.
- Language layer removed: 254 {{.x}} placeholders inlined as English
  strings in ts/*.ts and the two auth pages; html/lang/en.json, the
  LanguageUI struct and the 'language' setting are gone.
- ts/tsconfig.json + package.json pin typescript 5.9.3; the seven sources
  compile (ES2020, global scripts) into one committed html/js/app.js.
  Ten unreferenced legacy scripts under html/js/ deleted; all pages load
  js/app.js.
- Fix the six type errors that blocked a clean compile, including a real
  bug: a missing semicolon in the search shortcut handler made the code
  call the result of preventDefault(), so the shortcut threw instead of
  focusing the search box.
- /healthz liveness endpoint; Dockerfile healthcheck and README use it.
- Drone: go vet, and a webui-check step that rebuilds the bundle and fails
  if the committed app.js is stale.
- README-DEV.md documents build, UI toolchain, -dev, versioning, CI.
2026-09-26 12:46:45 +10:00

6.1 KiB

xTeVe

xTeVe

M3U Proxy for Plex DVR and Emby Live TV.

Documentation for setup and configuration is here.

Donation

  • Bitcoin: 1c1iCe4CJPfNUXtqxKBbW2Qd2EtqRPWme
    Bitcoin

Requirements

Plex

  • Plex Media Server (1.11.1.4730 or newer)
  • Plex Client with DVR support
  • Plex Pass

Emby

  • Emby Server (3.5.3.0 or newer)
  • Emby Client with Live-TV support
  • Emby Premiere

Features

Files

  • Merge external M3U files
  • Merge external XMLTV files
  • Automatic M3U and XMLTV update
  • M3U and XMLTV export

Channel management

  • Filtering streams
  • Channel mapping
  • Channel order
  • Channel logos
  • Channel categories

Streaming

  • Buffer with HLS / M3U8 support
  • Re-streaming
  • Number of tuners adjustable
  • Compatible with Plex / Emby EPG

Project Analysis (UI + Operations)

The core architecture is strong: a Go backend with websocket-driven UI updates, filesystem-based state, and very low runtime overhead. The weakest points are mostly operational and UX-focused:

  • UI was historically utility-first and desktop-biased, with limited responsive behavior and visual hierarchy.
  • Container usage was documented externally but there was no first-party Dockerfile/compose setup in this repository.
  • Static web assets are generated into src/webUI.go, which works, but creates large diffs and a heavier edit/build cycle.
  1. Replace generated src/webUI.go with Go embed for simpler static asset management and cleaner PR diffs.
  2. Add CI checks (go test ./..., build on Linux/arm64/amd64, docker build smoke test).
  3. Add a dedicated health endpoint (for example /healthz) to decouple health checks from HDHomeRun endpoints.
  4. Add integration tests around websocket commands that mutate settings/files to reduce regression risk.

Container-First Run (Included In This Repo)

Build image

docker build -t xteve:local .

Run with Docker Compose (bridge mode)

docker compose up -d

Compose file: docker-compose.yml
Persistent config volume: ./docker-data/config:/xteve/config

docker compose -f docker-compose.host.yml up -d

Host networking improves LAN discovery behavior (SSDP/DLNA) for Plex/Emby in many setups.

Container environment variables

  • XTEVE_CONFIG (default: /xteve/config)
  • XTEVE_PORT (default: 34400)

Image details

  • Multi-stage build (Go builder + minimal Alpine runtime)
  • Runs as non-root user (xteve)
  • Built-in healthcheck against http://127.0.0.1:${XTEVE_PORT}/healthz

Downloads v2 | 64 Bit only

64 Bit Intel / AMD

64 Bit ARM

Thanks to @alturismo and @LeeD for creating the Docker Images.

Created by alturismo:
xTeVe
xTeVe / Guide2go
xTeVe / Guide2go / owi2plex

Including:

  • Guide2go: XMLTV grabber for Schedules Direct
  • owi2plex: XMLTV file grabber for Enigma receivers

Created by LeeD:
xTeVe / Guide2go / Zap2XML

Including:

  • Guide2go: XMLTV grabber for Schedules Direct
  • Zap2XML: Perl based zap2it XMLTV grabber
  • Bash: A Unix / Linux shell
  • Crond: Daemon to execute scheduled commands
  • Perl: Programming language

xTeVe Beta branch

New features and bug fixes are only available in beta branch. Only after successful testing are they are merged into the master branch.

It is not recommended to use the beta version in a production system.

With the command line argument branch the Git Branch can be changed. xTeVe must be started via the terminal.

Switch from master to beta branch:

xteve -branch beta

...
[xTeVe] GitHub:                https://github.com/xteve-project
[xTeVe] Git Branch:            beta [xteve-project]
...

Switch from beta to master branch:

xteve -branch master

...
[xTeVe] GitHub:                https://github.com/xteve-project
[xTeVe] Git Branch:            master [xteve-project]
...

When the branch is changed, an update is only performed if there is a new version and the update function is activated in the settings.


Build from source code [Go / Golang]

Requirements

  • Go (go1.16.2 or newer)

Dependencies

Build

  1. Download source code
  2. Install dependencies
go get github.com/koron/go-ssdp
go get github.com/gorilla/websocket
go get github.com/kardianos/osext
  1. Build xTeVe
go build xteve.go

Fork without pull request 📣

When creating a fork, the xTeVe GitHub account must be changed from the source code or the update function disabled. Future updates of the xteve-project would update your fork. 😉

xteve.go - Line: 29

var GitHub = GitHubStruct{Branch: "master", User: "xteve-project", Repo: "xTeVe-Downloads", Update: true}

/*
  Branch: GitHub Branch
  User:   GitHub Username
  Repo:   GitHub Repository
  Update: Automatic updates from the GitHub repository [true|false]
*/