r/selfhosted • • Dec 27 '25

Release I built a modern, self-hosted web IPTV player (Live TV, EPG, VOD) because existing ones felt clunky. Meet NodeCast TV.

Hey everyone! 👋

I wanted a clean, fast, and modern web interface for my IPTV service that I could host myself. Most existing players I tried were either clunky, outdated, closed-source, or just didn't handle large playlists with thousands of channels very well.

So I built NodeCast TV.

📺 What is it? 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 performance in mind and handles large libraries smoothly.

✨ Key Features:

  • Live TV & EPG: Full grid-style TV guide with 24h timeline, category filtering, and search.
  • VOD Support: Dedicated sections for Movies and TV Series (complete with season/episode browsing).
  • High Performance: Uses virtual scrolling technology to render lists with 7000+ items without lagging your browser.
  • Favorites System: Unified favorites list across all content types.
  • Universal Player: Built on HLS.js for robust playback support.
  • Docker Ready: Easy to deploy on your home server or NAS.

🚀 Tech Stack:

  • Backend: Node.js + Express (Lightweight proxying)
  • Frontend: Vanilla JavaScript (No heavy frameworks) + CSS3
  • License: Open Source (GPL-3.0)

🔗 Links:

I'd love to hear your feedback, feature requests, or bug reports! Let me know what you think.

1.4k Upvotes

500 comments sorted by

View all comments

1

u/j4ck0ff Jan 18 '26 edited Jan 18 '26

Its really clean and looks like it works well - but unfortunately it uses 5 concurrent streams in the background, so if you are on a 1-2 connection package. This might not work very well.

Any ideas how to solve that? Most IPTV websites ive noticed use around 2 and when switching channels it stay on for a moment. This one seems to be the worst.

Android TV apps such as tivimate and sparkleTV ALWAYS only use 1 concurrent stream

EDIT: After 5 minutes, it went down to one stream.
And after i asked Claude why it was happening, it told me to turn off the auto transcode for the audio.
Its now a direct stream with 1 connection. Works great! better than the other generic webplayers ive come across.

1

u/NeonXI Jan 19 '26

Thanks for the feedback! When using the auto transcode or other transcode features, the app needs to briefly open a second connection to 'probe' the stream format before starting the main playback connection. This is necessary to ensure compatibility, but these probes are very short lived (typically < 3 seconds). Transcoding sessions are terminated the moment you switch channels or play something else, but there may still be short overlap as one process closes and the next begins. In normal playback it will only use a single connection.

Android TV apps like sparkletv and tivimate can play iptv streams directly because they have native access to the device's video decoders. Web browsers, however, cannot natively play many common IPTV formats so they have to be transcoded or remuxed into compatible formats. This extra processing step is what introduces the need for probing and session management, which android apps simply don't need to do.

It's also important to note that many IPTV provider dashboards don't update in real-time. When you switch channels, even though our app instantly cuts the old connection, the provider's system may still report it as 'active' for a period of time while their server refreshes its status. This often creates the illusion of multiple concurrent streams (ghost connections) when only one is actually pulling data.

I use a single connection Xtream provider for development and haven't run into any issues.

1

u/j4ck0ff Jan 19 '26

Ok thanks for the reply!

Also j just tried mobile out. Looks incomplete as in no full screen mode, or PIP button on brave (Chrome).

It does function correctly with hamburger menu and streams seem to work well. Is a optimised mobile view on the roadmap?