📺 Personal Streaming Platform

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.

Live HLS / DASH Widevine & ClearKey DRM Movies & Series Self-healing streams Recording & multi-view Per-user profiles
Part 1 · The Brain

The 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.

Part 2 · The Living Room

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.

Part 3 · Every Screen

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.

Streams break and move around
→ The server re-resolves them and shares the fix.
IPTV accounts allow one connection
→ The relay makes one connection serve everyone.
Streams die silently
→ Watchdogs catch and heal them with a real reason.
Browsers can't decode half of IPTV
→ Local ffmpeg / libVLC transcodes transparently.
DRM is geo-locked
→ The server proxies the license so it plays anywhere.
Content should be private
→ Profiles gate it server-side, invisibly.
The server might blink
→ Apps cache the last-good list and keep going.

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.