This is the way - television you remember feeling: present, unhurried, analog.
- β€οΈβπ₯ TVx brings back the ritual of watchingβnot scrolling, not seeking, just being with what's on.
- ποΈ Like the grain of 35mm film or the crackle before a record drops, it trades sterile perfection for something alive.
- π Curved glass. Gentle flicker. Scanlines that breathe.
- π₯ The soft bokeh of vintage anamorphic lenses βedges that blur like looking through aged glass, chromatic fringing that feels organic, not digital.
- β±οΈ The glow of a neon clock counting Saturday mornings long past.
An IPTV + EPG viewer for Tunarr (Plex/Jellyfin) playlists and XMLTV guides. Built for channel surfing, not catalog anxiety. Antiβalgorithm. Proβmoment. Vibing.
Architecture: TVx is a client-side web frontend that interfaces with your Tunarr backend alongside your Plex library. It consumes M3U playlists and XMLTV EPG data generated by Tunarr, while displaying rich metadata and artwork from your Plex media server.
π³ Docker
Before running TVx, you MUST set your M3U playlist and XMLTV EPG URLs using environment variables:
VITE_M3U_URL- Your IPTV M3U playlist URLVITE_XMLTV_URL- Your XMLTV EPG guide URL
Example:
docker run -d \
--name tvx \
-p 8777:80 \
--restart unless-stopped \
-e VITE_M3U_URL="http://your-tunarr-ip-address:8000/api/channels.m3u" \
-e VITE_XMLTV_URL="http://your-tunarr-ip-address:8000/api/xmltv.xml" \
ghcr.io/dopeytree/tvx:latestIf you change URLs later, clear your browser cache (Ctrl+Shift+R) to see the updates.
docker run -d \
--name tvx \
-p 8777:80 \
--restart unless-stopped \
-e VITE_M3U_URL="http://your-tunarr-ip-address:8000/api/channels.m3u" \
-e VITE_XMLTV_URL="http://your-tunarr-ip-address:8000/api/xmltv.xml" \
ghcr.io/dopeytree/tvx:latestThen open http://localhost:8777
services:
tvx:
image: ghcr.io/dopeytree/tvx:latest
ports:
- "8777:80"
restart: unless-stopped
environment:
- TZ=UTC
- VITE_M3U_URL=http://your-tunarr-ip-address:8000/api/channels.m3u
- VITE_XMLTV_URL=http://your-tunarr-ip-address:8000/api/xmltv.xml
volumes:
- ./config:/configSave as docker-compose.yml and run:
docker-compose up -d# Build the image
docker build -t tvx .
# Run it
docker run -d \
-p 8777:80 \
--name tvx \
-e VITE_M3U_URL="http://your-tunarr-ip-address:8000/api/channels.m3u" \
-e VITE_XMLTV_URL="http://your-tunarr-ip-address:8000/api/xmltv.xml" \
tvxTiny Alpine-based image β Production-ready with nginx, gzip compression, and health checks built in.
π₯οΈ Unraid
Before installing, you MUST add environment variables for your M3U playlist and XMLTV EPG URLs:
| Variable | Value |
|---|---|
VITE_M3U_URL |
http://your-tunarr-ip-address:8000/api/channels.m3u |
VITE_XMLTV_URL |
http://your-tunarr-ip-address:8000/api/xmltv.xml |
If you change URLs later, clear your browser cache (Ctrl+Shift+R) to see the updates.
- Open Docker tab in Unraid
- Click Add Container
- Fill in the following:
| Field | Value |
|---|---|
| Name | tvx |
| Repository | ghcr.io/dopeytree/tvx:latest |
| Registry URL | https://github.com/dopeytree/TVx/pkgs/container/tvx |
| Icon URL | https://raw.githubusercontent.com/dopeytree/TVx/main/public/logo.png |
| WebUI | http://[IP]:[PORT:8777] |
| Port | Container: 80, Host: 8777 (or your preferred port) |
| Network Type | Bridge |
-
Add the following environment variables:
VITE_M3U_URL=http://your-tunarr-ip-address:8000/api/channels.m3uVITE_XMLTV_URL=http://your-tunarr-ip-address:8000/api/xmltv.xmlTZ=America/New_York(or your timezone)
-
Click Apply
-
Access at:
http://YOUR-UNRAID-IP:8777
Persistent Configuration β Mount a volume to /config and place a settings.json file there for persistent settings across container restarts.
Note: An official Unraid Community Apps template is coming soon for one-click installation!
π Documentation
Full Documentation - Complete documentation index
- β‘ Instant channel surfing β hold β/β to skim; land when something catches your eye
- π CRT warmth β curvature, chromatic aberration, scanlines, vignette
- π Full TV guide β press G for a 12βhour timeline across all channels with poster artwork
- π¬ Theater modes β click the player to cycle views (guide β normal β immersive)
- π Comprehensive logging β All user interactions logged to Docker container for monitoring and debugging
- π·οΈ Smart channel names β strips filler words, adds icons:
- Pulp Fiction Movies β Pulp Fiction [π¬]
- The Hitchhiker's Guide to the Galaxy Shows β The Hitchhiker's Guide to the Galaxy [πΊ]
- Extreme Ironing Sports β Extreme Ironing [π]
- The Tesla Files History β The Tesla Files [π]
- Cosmos Documentaries β Cosmos [π]
- You need to have set up Plex/Jellyfin media server
- Tunarr or Dizquetv for channel streaming
- Configure your M3U and XMLTV URLs via Docker environment variables (see Docker section below)
- Open -
http://localhost:8777 - That's it
- Use the up/down arrow keys to browse your personal media
- Full Documentation - Complete documentation index
| Key | Action |
|---|---|
β β |
Channel surf (hold to skim) |
G |
Toggle full TV guide |
F |
Fullscreen |
M |
Mute/Unmute |
Esc |
Close modals/Exit theater |
TVx provides comprehensive logging of all user interactions directly to your Docker container logs, making it easy to monitor usage and troubleshoot issues in Unraid or other container environments.
Docker Compose Logs:
docker-compose logs -f tvx2025-01-15 10:30:15 INFO: Opened: Program Popup for "Breaking Bad" on AMC
2025-01-15 10:30:20 INFO: Opened: Google Search for "Breaking Bad (2008)"
2025-01-15 10:30:25 INFO: Selected: Channel "HBO" in Sidebar
2025-01-15 10:30:30 INFO: Opened: Full TV Guide
2025-01-15 10:30:45 INFO: Closed: Program Popup
- βοΈ React 18 + TypeScript β Modern, type-safe UI
- β‘ Vite β Lightning-fast build tool
- π¨ WebGL Fragment Shaders β Custom CRT effects and visual processing
- π‘ HLS.js β Adaptive HTTP Live Streaming
- π Radix UI + Tailwind CSS β Accessible components, utility-first styling
- π― Lucide Icons β Beautiful, consistent iconography
Works best in modern browsers with WebGL support:
- π’ Chrome/Edge 90+
- π Firefox 88+
- π΅ Safari 14+
PolyForm Noncommercial 1.0.0
This project is licensed under the PolyForm Noncommercial License 1.0.0. You are free to use, modify, and share this software for any noncommercial purpose. Commercial use requires a separate license.
In brief: Use it for joy, learn from it, fork it, improve it - just don't sell it or use it to make money without permission.
This is a personal passion project, but contributions, suggestions, and feedback are welcome! Feel free to open issues or submit pull requests.




