A self-hosted web application that lets you stream Live TV, Movies, and Series from your Xtream Codes or M3U provider directly in your browser. It's built with
A self-hosted web application that lets you stream Live TV, Movies, and Series from your Xtream Codes or M3U provider directly in your browser. It's built with
nodecast-tv is a modern, web-based IPTV player featuring Live TV, EPG, Movies (VOD), and Series support. Built with performance and user experience in mind.
Clone the repository:
git clone https://github.com/technomancer702/nodecast-tv.git
cd nodecast-tvInstall dependencies:
npm installStart the development server:
npm run devOpen your browser at http://localhost:3000.
You can run nodecast-tv easily using Docker.
Create a docker-compose.yml file (or copy the one from this repo):
services:
nodecast-tv:
build: https://github.com/technomancer702/nodecast-tv.git#main
container_name: nodecast-tv
ports:
- "3000:3000" # Host:Container
volumes:
- ./data:/app/data
restart: unless-stopped
environment:
- NODE_ENV=production
- PORT=3000 # Optional: Internal container portRun the container:
docker-compose up -dThe application will be available at http://localhost:3000.
To enable hardware transcoding (NVENC, QSV, VAAPI), you must expose your host's GPU to the container.
1. Intel (QSV) & AMD (VAAPI)
Update your docker-compose.yml to map the DRI devices and add necessary groups (often required for permission):
devices:
- /dev/dri:/dev/dri # Required for VAAPI/QuickSync/AMF (Linux)
# group_add: # Optional: Needed mainly if you run as non-root
# - "video" # Run on host: getent group video
# - "render" # Run on host: getent group render2. NVIDIA (NVENC)
Ensure you have the NVIDIA Container Toolkit installed on your host, then update your docker-compose.yml:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu, utility, video, compute]Verify: After restarting the container, go to Settings -> Transcoding. The Hardware Detection status should list your GPU (e.g., "NVIDIA GPU Detected" or "VAAPI Available").
Enable Single Sign-On (SSO) with your preferred OIDC provider (Authentik, Keycloak, etc.) by configuring these variables in your .env file or Docker environment:
OIDC_ISSUER_URL=https://your-idp.com/application/o/nodecast/
OIDC_CLIENT_ID=your_client_id
OIDC_CLIENT_SECRET=your_client_secret
OIDC_CALLBACK_URL=http://localhost:3000/api/auth/oidc/callback # Adjust for your domainNote: New users signing in via SSO are automatically assigned the Viewer role. You must manually promote them to Admin if desired.
nodecast-tv is a web-based application. By default, video decoding is handled by your browser. However, the built-in smart transcoding system automatically converts incompatible media (e.g., HEVC video, Dolby audio) into browser-friendly formats using FFmpeg.
Codec Compatibility Table:
| Codec | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| H.264 (AVC) | ✅ | ✅ | ✅ | ✅ |
| H.265 (HEVC) | Auto-Transcode | Auto-Transcode | ✅ | ⚠️ |
| AV1 | ✅ | ✅ | Auto-Transcode | ✅ |
| AAC Audio | ✅ | ✅ | ✅ | ✅ |
| AC3/EAC3 (Dolby) | Auto-Transcode | Auto-Transcode | ✅ | Auto-Transcode |
⚠️ Note: Edge requires the HEVC Video Extensions from the Microsoft Store to play H.265 (HEVC) natively. ℹ️ Note: Safari plays AV1 natively on supported hardware (iPhone 15 Pro, M3 Macs). On older devices, Auto-Transcode handles it.
nodecast-tv is optimized for HLS (HTTP Live Streaming).
.m3u8): Fully supported and recommended. Best for adaptive bitrate and network resilience..ts): Supported via Force Remux in settings..m3u8) over raw TS streams to avoid timeouts during buffering.All transcoding and stream processing settings are found in Settings → Transcoding.
| Setting | Options | Description |
|---|---|---|
| Hardware Encoder | Auto, NVENC, AMF, QSV, VAAPI, Software | GPU-accelerated encoding. Auto detects best available. |
| Max Resolution | 4K, 1080p, 720p, 480p | Limit output resolution (lower = faster). |
| Quality Preset | High, Medium, Low | Encoding quality/speed tradeoff. |
| Audio Mix Preset | Auto, ITU, Night Mode, Cinematic, Passthrough | 5.1→Stereo downmix mode (see below). |
| Preset | Description |
|---|---|
| Auto (Smart) | Copies stereo AAC as-is, uses ITU downmix for 5.1+ |
| ITU-R BS.775 | Industry-standard balanced downmix |
| Night Mode | Boosted dialogue, reduced bass for quiet viewing |
| Cinematic | Wide soundstage, immersive surround feel |
| Passthrough | No processing (may cause errors on 5.1/Dolby sources) |
| Setting | What It Does | When to Enable |
|---|---|---|
| Auto Transcode (Smart) | Probes streams and only transcodes/remuxes when needed | Recommended for most users (default ON) |
| Force Audio Transcode | Transcodes audio to AAC (video passes through) | When you have video but no audio (Dolby/AC3/EAC3) |
| Force Video Transcode | Full transcode of both audio and video | For HEVC/VP9 sources on unsupported browsers |
| Force Remux | Remuxes MPEG-TS to MP4 (no re-encoding) | For raw .ts streams from middleware |
| Stream Output Format | HLS or TS for Xtream API requests | Try TS if HLS causes buffering |
| Setting | What It Does | When to Enable |
|---|---|---|
| Force Backend Proxy | Routes streams through the server for CORS headers | When streams fail with CORS errors, or using middleware |
| Symptom | Likely Cause | Solution |
|---|---|---|
Black screen, Access-Control-Allow-Origin error |
CORS blocked | Enable "Force Backend Proxy" in Settings → Transcoding |
Black screen with MEDIA_ERR_DECODE |
Unsupported codec (HEVC/VP9) | Ensure "Auto Transcode" is enabled |
| Loading forever (no error) | Browser decoder stuck | Enable "Force Video Transcode" (overrides Auto detection) |
| Symptom | Likely Cause | Solution |
|---|---|---|
| No audio at all | Dolby/AC3/EAC3 audio | Enable "Force Audio Transcode" (overrides Auto detection) |
| Audio out of sync | Stream encoding issue | Try changing stream format to TS in Settings |
| Symptom | Likely Cause | Solution |
|---|---|---|
| Constant buffering | Slow network or weak GPU | 1. Lower Max Resolution (e.g. to 720p) 2. Try TS format instead of HLS |
If you're running nodecast-tv behind a reverse proxy (Nginx, Caddy, Traefik) with HTTPS:
| Symptom | Likely Cause | Solution |
|---|---|---|
Streams fail with fragLoadError |
Mixed content (HTTPS page loading HTTP streams) | Enable "Force Backend Proxy" in Settings → Transcoding |
| Streams work on HTTP but not HTTPS | Reverse proxy not passing headers correctly | Ensure X-Forwarded-Proto header is set (see examples below) |
Caddy example:
tv.domain.com {
reverse_proxy nodecast:3000 {
flush_interval -1
header_up X-Forwarded-Proto {scheme}
}
}Nginx example:
…If you manage your streams with middleware tools, you may encounter CORS issues or raw MPEG-TS streams that browsers can't play directly.
Recommended Setup:
There is rarely a need to configure specific "Force Remux" settings manually anymore; the system detects stream types automatically.
If you're using TVHeadend as your source, you may need to configure a few settings for streams to play correctly in nodecast-tv:
Option 1: Enable Force Backend Proxy (Easiest)
Option 2: Configure TVHeadend CORS
http://192.168.1.100:3000)http:// or https://)Additional Tips:
?profile=pass or ?profile=matroska) if playback issues persistIf you are using acestream-docker-home or similar tools, it is recommended to use the HLS output format to reduce server load, though NodeCast TV can remux raw streams if needed.
http://proxy:6878/ace/manifest.m3u8?id=... (HLS Playlist - Direct Play)http://proxy:6878/ace/getstream?id=... (MPEG-TS - Requires Server Remuxing)No open issues yet, or sync has not completed.