Lightweight IPTV streaming web app | 16,000+ channels | NAS-ready | Browser-based
3.9K
Lightweight IPTV streaming web interface with 16,000+ channels. Perfect for NAS devices, home servers, and self-hosted media setups.
π Project Homepageβ | π¦ Source Codeβ | π Changelogβ
TV Viewer is a self-hosted web application that aggregates free-to-air IPTV streams from around the world into a beautiful, modern interface. Deploy it on your NAS or any Docker host and watch live TV from any browser β no app installs, no subscriptions, no VLC required.
Why use TV Viewer?
docker run -d --name tv-viewer -p 8765:8765 -v tv-viewer-data:/data --restart unless-stopped asummoner/tvviewerapp
Then open http://your-server-ip:8765β in any browser. That's it!
| Resource | Minimum | Recommended |
|---|---|---|
| RAM | 48 MB | 128 MB |
| CPU | 0.1 core | 0.5 core |
| Disk | 80 MB | 100 MB |
| Network | 1 Mbps | 10 Mbps |
| Architecture | Tag |
|---|---|
| x86-64 | amd64 |
| ARM64 | arm64 |
Multi-arch manifest: asummoner/tvviewerapp:latest auto-selects the correct platform.
services:
tv-viewer:
image: asummoner/tvviewerapp:latest
container_name: tv-viewer
ports:
- "8765:8765"
volumes:
- tv-viewer-data:/data
environment:
- TZ=Asia/Jerusalem
- SUPABASE_URL=${SUPABASE_URL:-}
- SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY:-}
deploy:
resources:
limits:
memory: 128M
cpus: '0.5'
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8765/api/status')"]
interval: 60s
timeout: 5s
start_period: 30s
retries: 3
volumes:
tv-viewer-data:
Favorites, channel cache, and health data are stored in /data inside the container. Mount a volume to preserve data across container upgrades:
# Named volume (recommended)
docker run -d --name tv-viewer -p 8765:8765 -v tv-viewer-data:/data asummoner/tvviewerapp
# Or bind mount to host directory
docker run -d --name tv-viewer -p 8765:8765 -v /path/to/data:/data asummoner/tvviewerapp
What's persisted in /data:
| File | Purpose |
|---|---|
channels.json | Channel cache (avoids re-fetching on restart) |
favorites.json | Your saved favorite channels |
asummoner/tvviewerapplatest taghttp://synology-ip:8765asummoner/tvviewerappasummoner/tvviewerappasummoner/tvviewerapp:latest| Variable | Default | Description |
|---|---|---|
TV_VIEWER_WEB_PORT | 8765 | Server listen port |
TZ | UTC | Timezone for EPG schedule |
DATA_DIR | /data | Persistent data directory |
TELEMETRY_ENABLED | true | Anonymous usage analytics (channel health) |
SUPABASE_URL | (empty) | Supabase project URL for shared analytics |
SUPABASE_ANON_KEY | (empty) | Supabase anon key (public, RLS-protected) |
| Endpoint | Description |
|---|---|
GET /api/status | Server health + channel count |
GET /api/channels?country=US&category=News&limit=50 | Channel list with filters |
GET /api/countries | Available countries |
GET /api/categories | Available categories |
GET /api/sources/{channel_name} | Alternative stream URLs |
GET /api/proxy?url=... | CORS proxy for HLS streams |
GET /api/epg/{channel_name} | EPG program guide |
POST /api/health/report | Report channel status |
Your favorites and channel data persist in the /data volume across upgrades:
# Docker Compose (recommended β keeps /data volume intact)
docker compose pull && docker compose up -d
# Manual Docker
docker pull asummoner/tvviewerapp:latest
docker stop tv-viewer && docker rm tv-viewer
docker run -d --name tv-viewer -p 8765:8765 -v tv-viewer-data:/data --restart unless-stopped asummoner/tvviewerapp
| Resource | Link |
|---|---|
| π Homepage | tv-viewer-app.github.io/tv_viewerβ |
| π¦ GitHub | tv-viewer-app/tv_viewerβ |
| π Changelog | CHANGELOG.mdβ |
| π Issues | Report a bugβ |
MIT
Content type
Image
Digest
sha256:45cd8b111β¦
Size
29.6 MB
Last updated
4 days ago
docker pull asummoner/tvviewerapp