Stream TV
A self-hosted television system that turns IPTV subscriptions, DRM channels, and live streams into a clean, Netflix-like experience — kept in sync across every device you own. One central brain and native apps for every screen.
Three parts, one system
The golden rule: the server owns the content, the apps just display it. Edit a channel once and every device picks it up — instantly if it's watching, otherwise on its next refresh.
The Server
The brain. Master channel list, self-healing stream resolver, catalog crawler, IPTV relay, and accounts. Runs 24/7 on a home NAS.
Node.js · DockerDesktop App
The living-room player. Single channel or a 2×2 grid, recording, DRM, movies & series, universal codec support.
Electron · WindowsAndroid App
A native phone / tablet / TV client with the same content, Picture-in-Picture, background playback, and TV-launcher support.
Kotlin · Media3The Server
Runs as a Docker container on an always-on home server. It holds the content, fixes dead streams, crawls catalogs, relays IPTV feeds, and manages who can see what.
🗂️Central channel store & sync
One master list for every device. Add, rename, delete, reorder, or re-group a channel once and every app reflects it. A fresh server auto-seeds from your existing library — no re-typing.
🎛️Admin control room
A full browser panel: channel CRUD, grouping, bulk import, accounts & profiles, restriction toggles, and a one-click "Diagnose all" sweep that auto-hides dead channels.
🔧Self-healing resolver
When a link dies, the server finds a fresh one automatically — and shares the fix with every device. It knows token-scraped, RTÉ DRM, IPTV-org, master-playlist, and Stalker channels apart.
⚡Browserless token resolver
Channels that hide their real stream behind a rotating token are cracked in pure HTTP + AES — no headless browser — resolving in about a second instead of thirty.
🔐RTÉ live DRM proxy
Logs in from the server, mints the token, fetches the current programme's manifest, and proxies the Widevine license. Your credentials never leave the server.
🩺Channel diagnosis
Instead of "it's broken," a staged probe reports the real reason — origin refused, 403 geo-blocked, 401 max-connections, dead host, wrong codec — and reads a panel's exact response codes correctly.
🔁Xtream TS relay
A one-connection IPTV account is fanned out to all your devices from a single shared upstream, byte-exactly spliced across the panel's constant reconnects, so the account never fights itself.
⏪Catch-up / timeshift
Rewind live TV: for panels that support archive, the server serves a past broadcast on demand — absorbing all the token-host and pacing quirks so the apps just play.
🎫Stalker slot-holder
Supports MAC/Ministra portals, and can hold your one connection slot perpetually — politely stepping aside the moment you start watching, then reclaiming it when you stop.
🎬Movies & Series catalog
Crawls your IPTV account's VOD library into a proper poster catalog — categories, titles, seasons, episodes — with lazy detail loading and full per-profile gating.
📰EPG / TV guide
Serves the current programme per channel (refreshed every minute), with groundwork for a full multi-source XMLTV now/next grid.
👤Accounts, profiles & safe mode
Per-user logins with signed tokens. Each profile only sees the groups & content it's granted — restricted content is never even sent to a device that shouldn't have it. Safe mode is on every launch.
📥Master playlists & bulk import
Register M3U playlists, browse their groups before importing, and pull channels by country from IPTV-org — with scheduled auto-refresh and deletion-respecting re-imports.
💾Backup & snapshots
One-click export/import of the whole configuration, plus automatic gzip snapshots (keeps the last 20) so you can roll back to any recent state.
📡Live-reload push
When a channel you're watching changes, the server pushes a live event and the app restarts just that stream in place — no full reload.
🛰️Resilience & edge relay
Apps cache the last-good list for when the server blinks. A tiny Cloudflare edge proxy lets the server reach IPTV panels an ISP actively blocks — with no rate-limiting.
The Desktop App
An Electron player for Windows. A TV-like interface for live channels and on-demand movies & series — with the hard parts of streaming quietly engineered away.
📚Grouped library
A two-tab sidebar splits Live TV from Movies & Series. Collapsible groups, search-as-you-type, drag-to-reorder, and it resumes your last channel on launch.
🔲Single & 2×2 multi-view
Click to play; press 1–9 to jump to a channel, Esc to stop. Or watch four channels at once in a grid and click a tile to give it the audio.
🎚️Honest quality picker
Lists the true rendition ladder of an HLS/DASH stream — pin a resolution or go Auto. It stays hidden on single-resolution feeds, so you're never shown a fake "4K" that doesn't exist.
🔊Audio & subtitle tracks
Switch alternate audio tracks, and toggle subtitles — including embedded VOD subtitle tracks streamed in as WebVTT.
🍿Movies & Series
A rich poster-grid catalog with title / season / episode detail, favourites, native seeking with a real scrub bar, and per-title resume / continue-watching.
🩹Health gate & watchdogs
An ffprobe check runs alongside startup and tears down truly-dead streams with a human reason, then re-resolves. Silent freezes are caught and refreshed in escalating, cooldown-guarded tiers.
⏺️Recording
Record any channel to disk (ffmpeg stream-copy, no quality loss). Recording survives token expiry, has a dedicated browser window, scheduled recordings, and custom filename templates.
🧩Universal codec support
Channels in MPEG-2 / VC-1 / MPEG-1 that browsers refuse are transparently re-encoded to H.264 by a local ffmpeg — hardware-accelerated (NVENC → QSV → AMF → software). The H.264 fast path is untouched.
🔐DRM playback
Widevine DASH via Shaka, ClearKey channels, and RTÉ live — whose manifest and rotating per-programme license resolve through the server's proxy, so it plays from anywhere.
🎙️IPTV & Stalker playback
Raw Xtream MPEG-TS plays through the server relay; MAC portals resolve per-connect; multi-audio TS streams get a track picker backed by an on-the-fly ffmpeg audio remap.
🌐CORS-neutral & hotlink-friendly
Strips restrictive CORS headers and injects the per-channel Referer/Origin gated CDNs expect — on the playlist, the AES keys, and the segments alike.
🔒Accounts & safe mode
Optional per-user login scopes the library to your profile; restricted content stays server-side invisible, and safe mode starts on every launch.
The Android App
A native Kotlin / Compose / Media3 client of the same server. Built for phones, tablets, and Android TV, with true feature parity.
📋Same content, native UI
Grouped channel list with search and now-playing subtitles, plus the full Movies & Series poster catalog with season/episode detail, favourites, and resume.
🖼️PiP & background playback
Keep watching in a floating Picture-in-Picture window or with the screen off.
📺Android TV launcher
Behaves like a real TV app with full D-pad navigation and remote-friendly quality / audio / subtitle pickers.
🔲Multi-view
A 2×2 grid with per-tile audio, just like the desktop.
⏱️Preemptive token renewal
A stall watchdog plus link refresh that fires before expiry, so playback doesn't hiccup on rotating tokens.
🧩libVLC fallback
Channels in MPEG-2 / VC-1 that Media3 can't decode are played by a bundled libVLC engine instead.
📶On-device token minting
Mints tokens for IP-locked streams on the device — so they play on mobile data (5G), not just home Wi-Fi. RTÉ Widevine works via the server proxy.
📦Auto-updating APK pipeline
Builds carry the git version + short commit hash and can auto-upload to a home archive server.
Why it's more than a playlist
Every hard part of "just watching a stream" has been engineered away.
A personal-use system for streams you have the right to watch. DRM playback uses the platform's official Widevine licensing with your own account credentials — nothing is bypassed.