Self-hosted IPTV web player: live TV with EPG, movies, series, recordings. Player only, no content.
5.6K
StyleIPTV is a media player that runs on a computer of your home network (PC, mini PC, NAS, Raspberry Pi 4/5) and is used from the browser of any device: PC, phone, tablet, Smart TV — with the TV remote too (arrows, OK, Back).
StyleIPTV is only a player. It does not include, sell or provide any channel, film, series or other content: it plays the playlists (M3U / Xtream Codes), TV guides and other sources that you add, and you are responsible for using only sources you are entitled to watch. The terms of use are shown, and must be accepted, at the first start.
amd64 or arm64You need two files in a folder of their own: docker-compose.yml and .env.
mkdir styleiptv && cd styleiptv
docker-compose.ymlCopy the whole block into a terminal (Linux / macOS), or save the part between the EOF
lines as docker-compose.yml with any text editor (Windows: Notepad, "All files").
cat > docker-compose.yml <<'EOF'
services:
styleiptv:
image: sustuso/styleiptv-web:latest
container_name: styleiptv
restart: unless-stopped
ports:
- "${STYLEIPTV_BIND:-0.0.0.0}:${STYLEIPTV_PORT:-8080}:8080"
environment:
- TZ=${TZ:-Europe/Rome}
- STYLEIPTV_PASSWORD=${STYLEIPTV_PASSWORD:-}
- STYLEIPTV_DASHBOARD_API_KEY=${STYLEIPTV_DASHBOARD_API_KEY:-}
# Recordings / downloads on another disk: mount it below and set these, e.g.
# - STYLEIPTV_RECORDINGS_DIR=/recordings
# - STYLEIPTV_DOWNLOADS_DIR=/downloads
volumes:
- ./data:/data # database, settings, cache, recordings, downloads
# - /mnt/disk2/recordings:/recordings
# - /mnt/disk2/downloads:/downloads
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
EOF
.env (your settings)Same as above: paste it in a terminal, or save the part between the EOF lines as .env.
Then change the values you need (port, password, time zone).
cat > .env <<'EOF'
# Port to open in the browser: http://<computer-address>:<port>
STYLEIPTV_PORT=8080
# Listen only on this computer's address (e.g. the LAN one, 192.168.1.10). 0.0.0.0 = all.
STYLEIPTV_BIND=0.0.0.0
# Access password (asked once per device, remembered for 90 days). Empty = no password.
# Recommended.
STYLEIPTV_PASSWORD=
# Read-only monitoring API (/api/dashboard, sent in the X-API-Key header), for an external
# dashboard. Set a long random key to enable it. Empty = disabled.
STYLEIPTV_DASHBOARD_API_KEY=
# Time zone for the TV guide and recordings
TZ=Europe/Rome
EOF
nano .env
docker compose up -d
Open http://COMPUTER-ADDRESS:PORT (e.g. http://192.168.1.10:8080). At the first
start, read and accept the terms of use; then in Settings add your playlist and press
Save and download playlist.
Setting in .env | What it does |
|---|---|
STYLEIPTV_PORT | Port to open in the browser (default 8080). |
STYLEIPTV_BIND | Listen only on one address of the computer (default: all). |
STYLEIPTV_PASSWORD | Access password, asked once per device. Recommended. Empty = none. |
STYLEIPTV_DASHBOARD_API_KEY | Enables the read-only monitoring API (/api/dashboard). Empty = off. |
TZ | Time zone for the TV guide and recordings. |
Your data (database, settings, recordings, downloads) is in the data folder next to
docker-compose.yml.
Use StyleIPTV on your home network, or from outside through your own VPN. Don't forward its port on the router: it relays streams for the devices that use it. Set a password.
A read-only JSON API for an external dashboard. Set STYLEIPTV_DASHBOARD_API_KEY to a long
random value to enable it, and send that key in the X-API-Key header (never in the URL).
It only reads — it can't start, stop or delete anything — and never exposes stream URLs,
playlist credentials or file paths. Keep it on your LAN / VPN like the rest of the server.
| Endpoint | Returns |
|---|---|
GET /api/dashboard/summary | Channel, favorite and EPG counts, EPG last update, and scheduled / active / completed / failed recording counts. |
GET /api/dashboard/recordings/upcoming?limit=5 | The next recordings (next real occurrence for repeating ones), soonest first. |
GET /api/dashboard/recordings/recent?limit=5 | The latest recordings, newest first. |
Times are ISO 8601 UTC. Responses: 401 without a valid key, 429 if polled too hard,
503 if the key isn't set.
docker compose pull && docker compose up -d && docker image prune -f
The image includes .NET / ASP.NET Core (MIT), sqlite-net (MIT), SQLitePCLRaw (Apache 2.0), SQLite (public domain), mpegts.js and hls.js (Apache 2.0) and FFmpeg from the Ubuntu packages (LGPL / GPL — source code at ffmpeg.org and in the Ubuntu archive). This product uses the TMDB API but is not endorsed or certified by TMDB.
Content type
Image
Digest
sha256:ea9a0281a…
Size
278.5 MB
Last updated
4 days ago
docker pull sustuso/styleiptv-web