Help us keep the list up to date and submit new video software here.
Tool
Complete Version history / Release notes / Changelog / What's New for IPTVnator
Release v0.24
IPTVnator 0.24.0 programme guide, fullscreen browsing and stream info
Highlights
Programme guide, rebuilt
The M3U programme guide now follows your playlist's own channels and order, with groups and favorites one click away. Keep the player above the grid while you browse, click a channel to switch, or double-click to switch and close. Open the guide with G, hide channels without EPG and choose compact or comfortable rows. (#1560, closes #171)
Browse channels and episodes without leaving fullscreen
Press C or use the left edge of the video to open a searchable channel list. Series get season tabs and an episode list with artwork and watch progress too. With the default shared controls, switching channels, episodes or alternative movie sources keeps the player fullscreen. (#1519, #1620, #1509, closes #48)
See what is playing while it plays
The stream-info overlay shows resolution, frame rates, bitrates, audio details, buffer and dropped frames when the player can report them. Available in the built-in web players and experimental frame-copy Embedded MPV; unavailable values stay hidden. (#1578)
Nightly channel
Get builds from each merge through Settings About Update channel, or download them from the nightly repository. Stable remains the default.
27 features · 54 fixes · 1 performance improvement including local XMLTV files, Xtream catch-up downloads, automatic reconnects for embedded MPV, season artwork and recovery for sources missing after an older upgrade.
Read the release story on the blog, the full CHANGELOG, or the changes since v0.23.0.
Before updating, back up your playlists and important data. Desktop startup applies database updates and clears outdated metadata matches; allow the preparation screen to finish and avoid downgrading an upgraded profile.
Release v0.23.0
IPTVnator 0.23 offline downloads library, new player controls by default, alternative movie sources and endless catalogs
Highlights
Download manager with offline library
Downloads now separate active transfers from a grouped offline library, move missing files to Needs attention with Download again, and open movies and series in focused offline details with saved metadata. Series show only local episodes; View in portal returns to provider playback when the source can be recovered. Completed-file checks stay responsive on slow or unavailable storage. (#1313)
New player controls by default
The new player controls are now the default for the built-in web players one consistent bar with quality selection, external subtitles, subtitle delay and styling, speed, and picture-in-picture. They are touch-friendly too: tapping the video shows or hides the controls instead of pausing, and narrow players get a two-row layout. Prefer the old look? Switch back in Settings > Playback. (#1485, closes #1408)
Alternative sources for movies
Movies that exist in several of your playlists now show a "Sources" chip on the detail page. Switch playlist mid-film and playback continues from the same timecode, pin a preferred source per movie, and when a stream dies the error screen offers the alternatives instead of a dead end. Optional auto-switching is off by default. (#1286)
Catalogs scroll without pages
Xtream movie, series, and live catalogs now load continuously as you scroll instead of flipping through pages more items appear automatically as you near the bottom, and taller windows fill themselves on open. Opening a title and going back returns you to the exact spot in the list. In-category search and the in-portal search results follow the same continuous style. (#1392)
46 features · 76 fixes · 4 performance wins in this release the full story is in the release notes on the blog and in the CHANGELOG.
All features (46)
dashboard Continue Watching cards on the dashboard now open the detail page on click, just like movie cards no more accidental episode playback. Resuming the saved episode moved to a new menu on each card, next to "Mark as Watched" and "Remove from history". (#1469, closes #1441)
dashboard Dashboard source cards now warn when a portal subscription is about to lapse: an amber "Expires in N d" chip appears within a week of the expiry date, and an "Expired" chip once it has passed. Xtream expirations come from the same cached status check the playlist switcher uses; Stalker portals reuse the account info saved at import. (#1342)
dashboard The dashboard gains a "Because you watched" rail: TMDB recommendations seeded from your recently watched movies and series, showing only titles that actually exist in your imported libraries. It appears once at least five matches are found, can be turned off under Settings Dashboard, and requires the TMDB metadata opt-in (desktop app only). (#1419)
deps Linux desktops with client-side decoration support now show native rounded corners on the IPTVnator window. Desktop builds now run on Electron 43. (#1414)
downloads The download manager got a visual cleanup: "Ready to watch" cards are compact poster cards file actions live in the poster's menu, and clicking any card (episodes included) opens its offline detail. Queue rows show one primary action (pause/resume/retry) with cancel and remove in the menu, and all sections share one heading style with item counts. (#1448)
downloads Live-TV recordings made with the Embedded MPV player now live in the download manager: an in-progress row with elapsed time and Stop, a Recordings library with channel logos and the programs captured from the EPG at recording time, a focused detail page, and Needs attention when a file goes missing. Recordings interrupted by a crash survive as playable partials. (#1452)
downloads Downloads now separate active transfers from a grouped offline library, move missing files to Needs attention with Download again, and open movies and series in focused offline details with saved metadata. Series show only local episodes; View in portal returns to provider playback when the source can be recovered. Completed-file checks stay responsive on slow or unavailable storage. (#1313)
downloads Downloads can be paused and picked up later. A paused transfer keeps what it already fetched and continues from that point instead of starting over, and downloads cut short by a crash or a closed app come back as paused rather than lost. (#1263)
downloads Series downloads now let you queue several episodes in a row or add every available episode from the selected season. Already queued, paused, or downloaded episodes are skipped without duplicates, and the app reports the batch result. (#1357)
embedded-mpv Experimental Embedded MPV can draw video inside the app window instead of into a separate layer pinned on top of it, so menus, dialogs and the player controls stop being swallowed by the picture. Available on macOS (Apple Silicon), Windows and Linux x64; switching it on needs a restart. (#1263)
epg Channels whose guide never matched can be mapped by hand: right-click a channel in any list and pick "Map EPG channel" to attach it to a channel from your uploaded XMLTV guide. The mapping is remembered and used everywhere the guide is read M3U playlists, Xtream and Stalker portals alike. (#1263)
i18n IPTVnator speaks Hungarian, its 19th language contributed by @htibcsike. (#1263, closes #1192)
m3u MPEG-DASH channels play in the built-in player, ClearKey-encrypted ones included the keys are read from the playlist's #KODIPROP lines, whether they sit above or below the channel entry. Streams locked with Widevine or PlayReady still cannot be played, but they now say so instead of failing silently. (#1263, closes #86, closes #614, closes #656, closes #733, closes #752)
playback The shared player controls' subtitle menu now loads external subtitle files (.srt/.vtt in the built-in web players, plus .ass in Embedded MPV), adjusts the subtitle timing offset in ±0.5 s steps, and sets the subtitle text size and color size/color persist across sessions and are shared between engines. (#1471, closes #1408)
playback The built-in web players' shared controls gain a quality menu: multi-bitrate HLS and DASH streams can be pinned to a specific rendition ("1080p", "720p", ) or left on Auto, which keeps the player's adaptive selection. The menu appears only when the stream actually offers more than one quality, and the choice lasts for the current playback session. (#1470)
playback The new player controls are now the default for the built-in web players one consistent bar with quality selection, external subtitles, subtitle delay and styling, speed, and picture-in-picture. They are touch-friendly too: tapping the video shows or hides the controls instead of pausing, and narrow players get a two-row layout. Prefer the old look? Switch back in Settings > Playback. (#1485, closes #1408)
playback An optional new set of player controls that looks and behaves the same in the HTML5, Video.js and ArtPlayer players, with picture-in-picture and, in fullscreen, the name of what you are watching. Enable it in Settings Playback; left off, each of the three keeps its own controls exactly as before. (#1263)
playback The inline player on movie and series pages fills the whole content area like a theater: the video sits centered in black instead of leaving a strip of app background beside it. In the built-in web players, an optional ambient mode fills that space with a blurred, dimmed copy of the poster. (#1263)
playback A series playing inline on a wide window shows an "Up Next" rail beside the video: the rest of the season and the start of the next one, the current episode highlighted, watch progress on every card. Click one to jump straight to it. Built-in web players only; switch the rail off in Settings Playback. (#1263)
playlist The Add playlist dialog has a new "Auto-detect" method: paste whatever your provider sent you links, Xtream credentials, a MAC address with device IDs and IPTVnator recognizes the source type and fills the matching import form for you to review. Detection runs entirely inside the app; nothing you paste is sent anywhere. (#1445)
playlist M3U entries that are movie files now open in the same movie detail view the portals use: playback starts immediately with plot, cast, rating and artwork from TMDB below the player instead of the empty program guide, and closing the player reveals the full poster page. Requires TMDB metadata to be enabled; a toggle in Settings Metadata (TMDB) turns recognition off. (#1420)
portals Year, genre, and country on movie and series detail pages are now clickable (with TMDB metadata enabled): each chip opens a Discover page of popular titles for that facet, marked with what's already in your library matches jump straight to their detail page, the rest open the portal search. Works in Xtream and Stalker, like the existing actor and director chips. (#1453, closes #1449)
portals Movie and series details opened from the dashboard, global favorites, history, or a portal's favorites/recent tabs now offer a "View in portal" button below the main actions. It jumps straight to the title inside its own portal, with the matching category selected in the sidebar. (#1422)
portals Opening a series now lands on the season you'd actually continue: the earliest season with unwatched episodes, or the latest season once everything is watched instead of always starting at season 1. (#1469, closes #1441)
portals Series detail pages can now mark a whole season as watched (or unwatched) in one click the new button next to "Download season" works for both Xtream and Stalker portals. Handy when you start a show mid-way: mark the earlier seasons watched and the Play button jumps straight to your next unwatched episode. (#1447, closes #1442)
portals The series pages' season header now has a menu that marks the WHOLE series as watched (or unwatched) in one click, for both Xtream and Stalker portals. On Ministra portals that load seasons lazily, the app first fetches the remaining seasons and then marks everything so catching up on a show you started mid-way is a single action. (#1451, closes #1442)
portals Movies that exist in several of your playlists now show a "Sources" chip on the detail page. Switch playlist mid-film and playback continues from the same timecode, pin a preferred source per movie, and when a stream dies the error screen offers the alternatives instead of a dead end. Optional auto-switching is off by default. (#1286)
portals The movie page's Sources popup now always fits on screen only the source list scrolls, and it flips below the button in short windows and gains All / Available / HD+ / language filters ("Available" checks every source on first use). Expanded copies show the stream title with only what differs, availability results are remembered, and Favorites/Download became icon buttons with live progress. (#1359)
remote-control The mobile remote now works in live TV favorites and recently viewed per-portal and global for M3U, Xtream and Stalker: channel switching, number select, and now-playing status follow the on-screen list. The remote no longer shows a channel as playing after leaving the player, Stalker radio reports its status, and volume buttons grey out when an external player owns the audio. (#1399)
settings Settings sections are now separate pages with shareable URLs and a floating Save/Discard bar that appears only when you have unsaved changes; leaving settings with pending edits asks whether to save, discard, or keep editing. The EPG panel's "Open EPG settings" button now jumps straight to the EPG settings page. (#1384)
settings A new setting drops the country prefix from live channel names, turning "UK - BBC One" into "BBC One" in lists, the guide and the player. Movie and series titles are left alone, and names that only look like a prefix "Sky - Sports F1" stay intact. (#1263)
stalker Stalker portals now have an Account info dialog subscription status, tariff plan, expiry date with a days-left counter, login, and portal details. Open it from the header playlist menu, the dashboard source card, or the command palette, same as for Xtream. If the portal is unreachable, the data saved when the portal was added is shown instead. (#1330)
stalker Stalker portals that ask for a login and password now work: the import dialog gained username/password fields and the app completes the portal's do_auth step. When a portal refuses access, its own explanation is shown instead of a generic error, saved sessions resume without re-authenticating, and the keep-alive ping follows the portal's cadence. (#1354)
stalker Stalker portals now check the MAC address as you type it and fix hyphens or lowercase for you, with a warning when it sits outside the range most portals accept. Device IDs can optionally be generated from the MAC the way StbEmu does, and a portal that already has a different device ID on file finally says so instead of reporting damaged hardware. (#1370, closes #927, closes #860)
stalker Stalker movie and series catalogs now load continuously as you scroll portal pages append into one seamless list, tall windows fill themselves, and a failed page keeps what's loaded and offers a retry. The Live TV "all channels" grid and portal search follow the same style, and search can page past its first hundred results. Pagination is gone from the app entirely. (#1395)
stalker The Live TV section loads its full channel list up front: search covers every channel instead of only the page you are on, genres show how many channels they hold, and Live TV opens on a grid of all channels. Guide data for the visible rows loads in bulk, so it shows up without playing a channel first. (#1263)
stalker Stalker setup now accepts hosts or /c, discovers the working API endpoint and authentication mode, and rechecks edited connection details. Canceled or failed edits leave saved and active sessions unchanged. Completed edits reject old configuration requests and late responses. Timed-out authentication stays fenced until its transport settles. (#1391)
tmdb Settings Metadata (TMDB) now shows how many entries the metadata cache holds and how much space they take, with a button to empty it. Clearing costs nothing but the next few lookups enrichment refetches on demand. (#1244)
tmdb Series pages show whether a show has ended or is still returning, so you know before committing to it. Directors and creators became clickable avatar chips like the cast they open the person's page, where directing credits now sit alongside acting ones. (#1263)
ui Live channel rows now stack their action buttons vertically favorite on top, programme info below so the extra button costs no horizontal space. The programme-info button is now also available in the Xtream and Stalker channel sidebars, and its slot stays reserved while EPG data loads, so buttons never jump. (#1341, closes #1128)
ui On phone-sized screens the categories and filters panel no longer sits stacked above the content it is now a slide-in drawer, opened from a new button in the header and closed by picking an entry, tapping outside it, or pressing Escape. The content gets the whole screen while browsing. (#1332, closes #1100)
xtream Catch-up is available from Favorites and Recent, not just Live TV, so an archived programme is reachable wherever the channel is. The programme currently on air can also be restarted from the beginning. (#1263, closes #1138)
xtream Live channels with provider catch-up now show a small archive badge in the channel sidebar next to the channel name, on the "all channels" grid cards, and in the favorites and recently-viewed lists (including global favorites). Hovering it shows the catch-up window in days. (#1341, closes #1128)
xtream Xtream movie, series, and live catalogs now load continuously as you scroll instead of flipping through pages more items appear automatically as you near the bottom, and taller windows fill themselves on open. Opening a title and going back returns you to the exact spot in the list. In-category search and the in-portal search results follow the same continuous style. (#1392)
xtream Continue Watching resumes a series where you left it: opening one from the dashboard starts the exact episode at its saved position, and the series page offers "Play episode N" instead of always starting at the first one. Episodes launched in MPV or VLC count towards this too. (#1263)
xtream The movie sources popover now recognizes more language tags: prefixes with Unicode pipes, brackets or dashes ("EN ", "[EN] ", "EN - "), Cyrillic tags (" | ") and MULTI. It also reads the language off category names ("EN | Netflix"), and a tag welded to a title ("EN|Movie") no longer hides that copy from the other playlists' copies of the same movie. (#1417)
All fixes (76)
backup Backups carry hidden Xtream categories correctly. An export used to lose which categories you had hidden, and restoring such a backup then hid every category of that kind. (#1263, closes #1017)
components Confirmation dialogs are wider by default, so their action buttons sit side by side instead of wrapping into a vertical stack with longer translated labels. (#1448)
dashboard The dashboard hero now shows the same backdrop as the detail page. Stalker movies and series reuse the artwork saved when you opened them, and the metadata lookup behind the hero uses the release year and original title instead of the bare title so titles TMDB knows more than once ("") no longer come up empty. (#1362)
dashboard Movies and series you have opened before now show their artwork, rating and genres on the dashboard far more reliably, and seed the recommendations rail. Previously the dashboard searched TMDB by title alone, so common titles like "Inside Out" matched nothing it now reuses what the detail page already found. (#1423)
dashboard Trending cards, the "Similar" rail and actor filmographies no longer show a title as missing from your library when your playlists hold several versions of it. A catalog with both "Dune 1984" and "Dune 2021" used to keep whichever came first, so the other one lost its link even though you had it. (#1425)
database SQLite diagnostics now record only statement types, preventing playlist credentials and other private values from appearing in trace logs. (#1315)
deps Database workers now use updated SQLite bindings that avoid a crash during worker shutdown. (#1415)
downloads Downloads from portals that cut long connections no longer die with "aborted": the app now reconnects automatically and continues from where the transfer stopped. Resume also works on servers that send no ETag/Last-Modified the app re-checks a 256 KiB overlap against the saved partial before appending, and only gives up after repeated reconnects make no progress. (#1446)
downloads Xtream movie and episode downloads now keep their provider-compatible identity from the first request through legacy retries after source removal. Recoverable connection drops retain validated partials and show a credential-safe code; Retry resumes only with ETag or Last-Modified, otherwise it safely restarts. (#1329, closes #897, closes #1289)
electron-backend Cancelling a large Xtream import now stops database work even while it is running at full speed, instead of letting the import finish before processing the cancel request. (#1295)
electron The desktop remote-control server now blocks crafted static paths from escaping bundled web files on Windows. (#1267)
embedded-mpv Opening the volume, audio, subtitle, speed or aspect menu in the Embedded MPV player no longer makes the video jump or leave a black bar above the controls: the menus now unfold inside the control bar instead of floating over the video. (#1339, closes #1139)
embedded-mpv On Windows and Linux displays scaled above 100%, the Embedded MPV video was drawn toward the top-left corner at a fraction of its size, in windowed and fullscreen mode alike. The video now fills the player area correctly at any display scale and page zoom, with no need for a high-DPI compatibility workaround. (#1339, closes #1139, closes #1145)
epg A database error while looking up manual EPG channel mappings no longer breaks the request that triggered it. Searching for a channel in the "Map EPG channel" dialog, or saving and removing a mapping, now degrades gracefully instead of failing outright. (#1291)
epg A database error while reading or saving a manual EPG channel mapping no longer surfaces as a failed request. Looking up, saving, deleting, and searching mappings now fall back quietly, so a transient storage hiccup can no longer take down the EPG panel or the "Map EPG channel" dialog. (#1279)
favorites Favorites stop losing changes. The custom drag-and-drop order of an Xtream playlist's own favorites is saved again, and two favorites or history entries added at almost the same moment no longer quietly overwrite each other. (#1263, closes #1137)
i18n Translations across the app are clearer and more consistent in supported languages. (#1390)
m3u When a channel plays in MPV, VLC or the embedded MPV player, the custom User-Agent, Referer and Origin saved on the M3U playlist now reach the player. Per-channel #EXTVLCOPT headers still win; the playlist values only fill the gaps. VLC now also sends the Origin value as a real HTTP header, as MPV already did. (#1397, closes #1221)
m3u Playlists with very long stream URLs Pluto TV style lists that carry a session token in every link import in full again instead of collapsing into a single channel. (#1263, closes #1189)
matching Movies whose name is a short abbreviation AKA, RRR, IO, VFW, Y2K are no longer mistaken for a language tag and filed under their release year alone. They now match their own copies in your other playlists, so alternative sources, recommendations and pinned sources land on the right film instead of an unrelated one that happens to share that year. (#1426)
packaging Snap packages now launch correctly with the desktop runtime scripts required by their generated startup command. (#1406)
playback Unavailable streams no longer appear as unsupported codecs. When Video.js exposes a server error such as HTTP 404, the player shows that status; otherwise ambiguous source errors remain unidentified instead of guessing. (#1314, closes #1159)
playback The embedded MPV video no longer drifts out of its frame when the layout shifts around it for example when the channel sidebar or the EPG panel finishes loading after playback has started. The player now notices such moves and snaps the video back into place within half a second. (#1476, closes #1428)
playback MPV and VLC recovery actions now stay available, show precise opening, started, playing, and failure feedback, and prevent overlapping launches. The dock keeps Stop available when teardown is still needed and lets terminal errors be dismissed. (#1388)
playback The screen no longer dims or goes to sleep while a built-in player is playing video including on Linux desktops, where the system idle timer used to ignore the app. Pausing or stopping hands control back to the system immediately, and radio playback deliberately leaves the display free to sleep. Works in both the desktop app and the PWA. (#1405, closes #1095)
playback Playback keyboard shortcuts now work with the default player setup: Space/K (play/pause), F (fullscreen), / (seek 5s in VOD), / (volume), and M (mute) act on the built-in HTML5, Video.js, and ArtPlayer players without turning on shared player controls matching what the in-app shortcut list already promised. (#1398)
playback Switching the video player from the command palette or the settings page now takes effect immediately on an already-playing Xtream or Stalker stream instead of waiting for the player to be reopened. Playback also starts with the saved player right away, without briefly mounting the default engine first. (#1437)
playback MPEG-TS playback is now more reliable on newer Safari versions when streams contain audio timestamp gaps. (#1412)
playback External MPV and the embedded MPV frame-copy engine no longer truncate HTTP headers that contain commas most notably the Stalker MAG user agent. Strict portals validated that header and rejected live streams with HTTP 400, so channels that only worked in VLC now also play through MPV. Completes the same fix that landed for the native embedded MPV view. (#1323, closes #910)
playback When playback fails, IPTVnator now ranks useful next steps from the reported error, including another compatible built-in player, MPV/VLC, Retry, or another source. Trying a built-in recommendation affects only the current item and does not change the saved player setting. (#1374, closes #1159)
playback Playback recovery now removes old error actions as soon as a new source or player starts, even while Electron prepares stream headers. Stalker series playing inline now picks up refreshed episode names and navigation, and safely disables episode commands if the playing episode disappears. (#1374)
playback DASH playback now resets a failed media buffer before switching variants, avoiding repeated append failures and crashes on affected platforms. (#1411)
playback Playback recovery no longer crosses into a different selected channel, movie, or exact Stalker episode. Switching content while a stream resolves no longer restores stale playback or shows an error from the previous selection. (#1374, closes #1159)
playback Stalker streams that require the portal session now play in the built-in players (HTML5, Video.js, ArtPlayer), not only in VLC/MPV: the player's requests carry the portal cookie and token, scoped to that stream and dropped when the player closes or the channel changes. VOD, series and radio get the same headers live TV had also from Favorites and Recently Viewed. (#1335, closes #849, closes #910, closes #732)
playback HLS failures now use confirmed player evidence such as the failed stage, timeout, and HTTP status. Recoverable retries stay silent, and technical details no longer include raw provider error payloads. (#1316)
playback MPEG-TS playback errors now show exact engine evidence, including HTTP status, without exposing provider response details. Format, codec, truncated-stream, and MediaSource failures now produce more accurate fallback guidance. (#1327, closes #1159)
playback Shaka playback errors now use exact engine evidence, including subtitle parsing, preserve external-player fallback when browser prerequisites are missing, keep recoverable retries non-terminal, and omit provider URLs, credentials, and response data from technical details. (#1318)
playback The default web player now reports safer, more accurate streaming errors: confirmed network and encrypted-segment failures keep structured details, while ambiguous Video.js errors remain unknown instead of suggesting the wrong cause. (#1317)
playback The "Show subtitles" setting now works in the built-in players: turning it off hides subtitles a stream switched on by itself, and the preference finally applies on Xtream and Stalker pages too. Previously it only reached the M3U player, and even there Video.js and ArtPlayer ignored it. The player's own subtitle menu still overrides the setting for the current stream. (#1269, closes #1155)
playback Video.js now shows its own control bar (play/pause, seek, volume, quality, fullscreen) on Live TV channels. Previously live streams played with no visible controls at all, because switching to a live source rebuilt the video element and the controls never came back. (#1385)
playlist Opening an .m3u/.m3u8 file from the command line or by double-clicking it now actually imports the playlist previously nothing happened at all. Opening a playlist while IPTVnator is already running works too, and on macOS the file arrives through the system "open with" event. (#1299)
playlist IPTVnator now registers itself with the operating system as a handler for .m3u and .m3u8 files, so Finder, Explorer and Linux file managers offer it in "Open with" and a double-click actually opens the playlist. Installing or updating the app is enough no manual file-type setup. (#1301)
playlists One unreachable playlist no longer holds up the rest. Refreshes give up after 30 seconds and run a few at a time, so your other playlists still update, and the message on startup names how many actually failed instead of always claiming success. (#1263, closes #931)
portals Importing an Xtream backup now restores all preferred VOD sources together. If restoration or cleanup fails, the catalog stays retryable and remains blocked until the parked state is safely consumed, preventing stale replay from overwriting newer choices. (#1311)
portals Greek titles now match no matter which sigma the provider typed. A word-final and a medial at the end of a word are treated as the same letter, so finding a film in your other playlists, the "Similar" rail, actor filmographies and TMDB enrichment no longer miss a Greek movie purely because two catalogues spelled its last letter differently. (#1310)
portals In the self-hosted web version, a provider that accepted a connection and then went silent could hang a request until the operating system gave up, with no way to cancel it. Requests now time out on the same schedule as the desktop app, and a host that fails to answer twice is skipped for a short while instead of stalling every following request. (#1424)
portals Going back from a Stalker title you reached with "View in portal" now returns you to exactly where you were the same favorites or history tab, with the title still open instead of dropping you on the Live TV tab. (#1435)
portals Refreshing an Xtream source keeps your favorites, watch history, hidden categories and playback positions. Starting the same refresh twice at once from the header and from the sources page used to wipe them, because the second run saved an already-emptied catalog over the first run's copy. (#1431)
pwa The self-hosted web backend now gives each provider connection attempt enough time to fall back from an unreachable IPv6 route to working IPv4 common behind VPN containers like Gluetun instead of failing with a bare "Bad Gateway". Provider errors now name the underlying network code (for example ETIMEDOUT) in the app and in the container logs. (#1404, closes #1400)
pwa Self-hosted web backends started without CLIENT_URL now allow the documented http://localhost:4333 origin instead of the retired public demo URL, so a manual (non-Docker) deployment no longer fails every provider request with a CORS error. (cb37f62)
pwa The self-hosted web app now talks to Stalker portals exactly like the desktop app: MAG User-Agent, full STB cookie, serial-number header, and the JsHttpRequest marker every real client sends so portals that worked only in the desktop app now work in the PWA too. Portal credentials (MAC and session token) no longer travel in the portal request URL, keeping them out of server logs. (#1348)
search The search box no longer loses what you are typing when the page updates its address at the same moment switching a downloads filter and immediately typing used to wipe the term, and fast typing could snap back to an earlier word. (#1432)
search Searching for names that carry punctuation inside them "A&E", "X-Men", "L'Equipe" finds them anywhere in a title, including channels the provider prefixes, like "US: A&E". (#1263, closes #1161)
search Typing a space in the portal search box and pausing briefly no longer deletes the space continuing to type "Bein Sports" no longer collapses into "BeinSports". (#1474, closes #1338)
settings Launching IPTVnator a second time now brings the running window to the front instead of starting a rival copy that could not save anything a common reason settings appeared to reset on restart. If saving or loading settings does fail, the app now says so instead of silently showing defaults. (#1272, closes #1156, closes #102)
settings Unsaved settings edits no longer vanish silently when you close the window, quit the app, or reload the page. The desktop app now asks whether to save, discard, or keep editing the same dialog in-app navigation shows and only closes once your choice is applied; a failed save keeps the window open. In the browser, the native leave-page warning appears instead. (#1394)
stalker A Stalker portal is no longer re-probed and reclassified because something in front of it a proxy or firewall, not the portal answered with a short "Access denied" page. Only the portal's own authorization replies count now. (#1358)
stalker Stalker portals now receive channel commands exactly as a real set-top box sends them: already-encoded parts of a channel's cmd are no longer double-encoded, so strict portals and reseller panels that compare the command literally work again. Playing Stalker channels from Favorites or global collections now also handles portals that answer with relative stream paths. (#1334)
stalker Series opened from Favorites, Recent or the dashboard show their current episodes. One saved back when a single episode existed used to keep showing that one episode forever; the list is refreshed from the portal in the background instead. (#1263)
stalker Stalker portals are no longer classified by their URL shape: importing probes the real API endpoint (portal.php vs server/load.php) and checks whether the portal actually requires authentication. Canonical Ministra URLs finally load content, /c addresses resolve correctly, and misclassified existing portals repair themselves on first failure keeping favorites and history. (#1344, closes #850, closes #686, closes #755)
stalker Stalker Live TV now shows the currently airing programme even on portals whose bulk EPG only lists upcoming shows: channel rows fall back to a per-channel short-EPG lookup, and the EPG panel merges "what's on now" into the schedule instead of showing future programmes only. (#1386)
playback Stalker live TV plays again in the embedded MPV player. The MAG250 user agent contains a comma (KHTML, like Gecko), which MPV splits in its comma-separated --http-header-fields list, truncating X-User-Agent so strict portals reject the stream with HTTP 400. Commas and backslashes in header values are now escaped on the Windows/Linux and macOS embedded-MPV paths. (#1321)
stalker Stalker portals whose server redirects to https or to another port no longer lose their session mid-request. Since 0.22 such redirects silently dropped the portal's MAC cookie and auth token, so categories failed to load and streams never reached any player. Downgrade redirects from https to plain http still strip credentials, so a secure session is never sent in cleartext. (#1322, closes #1158)
stalker Stalker VOD series now report progress correctly when portals return boolean series flags, keep episode progress separate between shows, and resume positions saved by earlier versions. (#1315)
stalker Stalker channels that the portal serves directly now start without an extra link request to the portal, so they open faster and no longer fail when that request does. Channels the portal does proxy still get their temporary link, and radio stations the portal proxies now get one too instead of playing a URL the portal never meant to serve. (#1364)
tmdb Movies whose provider ships a dead or wrong TMDB id are enriched again. The id is weighed against the title and release year: a dead one falls back to the title search, a stale one that clearly points at another film loses to it, and a working id is no longer thrown away just because the provider spells the title differently. (#1239)
tmdb Series detail pages now list the cast of the whole show instead of only its newest season, so actors who left partway through stop disappearing from long-running shows while people who joined for the current season still show up. (#1242)
tmdb Titles that providers dress up with language or quality tags "|ALB| Fallout", "4K-DE - The Pitt (2025)", "Breaking Bad-eng" now match against TMDB, so they get artwork, plot and cast like the rest of the catalog. Shows split into one entry per season also pull the season that entry really contains. (#1263)
ui IPTVnator is usable on a phone again. The navigation bar no longer sits off screen, category and channel lists take the full width instead of squeezing the content into a sliver, the video keeps a usable share of the screen, and the M3U channel list can be reopened after hiding it. (#1326, closes #1100)
ui Narrow EPG channel rows now keep the current programme, progress, and enabled channel actions visible instead of dropping useful context. (#1312)
window-controls On Windows, the minimize, maximize and close buttons disappeared for good after leaving fullscreen video playback the only way to get them back was to restart the app. They now reappear as soon as you exit fullscreen, and the maximize button no longer gets stuck on the wrong icon afterwards. (#1178)
workspace The playlist dropdown in the header shows a "Playlist info" entry for the active playlist again, next to "Account info" and "Add playlist" it had disappeared when playlist actions moved into the per-row menu. (#1328)
workspace The playlist sync overlay no longer shows a bare "Syncing playlist" card when an Xtream playlist is loaded from the local library. Reading the saved catalog from this device now reports its own phase, so the overlay always shows a source badge and explains what is happening remote fetch or local read. (#1345)
xtream Portals sitting behind Cloudflare or a similar firewall connect again. Those setups answered the app with a challenge page instead of data, so "Test connection" failed on portals that worked fine in every other player; requests now identify themselves the way an ordinary IPTV player does. (#1263)
xtream Series pages no longer show a raw image link under the season tabs when the provider fills the season description with a cover URL. URL-only descriptions are dropped, and with TMDB metadata enabled the missing season description is filled from TMDB instead. (#1382)
xtream Xtream movies remain playable when a portal omits extended VOD metadata, using catalog stream details to build the playback URL. (#1303)
Performance (4)
m3u Importing large M3U playlists is faster because IPTVnator no longer rewrites the entire playlist when loading saved favorites. (#1232)
m3u Cancelling a large M3U refresh now stops its background worker before parsed channels can be copied or saved, keeping the interface responsive and leaving the existing playlist unchanged. (#1268)
portals Unreachable Xtream and Stalker portals no longer cost a 30-second wait per request. After a host fails to answer twice, further requests to it fail immediately for 30 seconds, so browsing a dead portal stops filling the screen with long spinners. Retrying, testing the connection, or editing the portal address contacts it again right away. (#1421)
stalker Detail pages for anything that is not a series a movie, a live channel, a VOD item that only looks like a series no longer fire an episode-list request before they can show anything, so they open faster on every route in, from browsing and search to Favorites, Recent and the dashboard. (#1263)
What's Changed merged pull requests (232)
fix(tmdb): fall back to original language for missing trailers too by @4gray in #1136
feat(portals): back button on the in-portal search page by @4gray in #1142
fix(xtream): send player-style User-Agent to avoid WAF challenge by @sh3rencr in #1170
fix(favorites): persist custom drag-and-drop order for Xtream favorites by @4gray in #1143
fix(theme): make scrollbars follow the app theme instead of the OS color scheme by @4gray in #1179
fix(lint): quote eslint globs so Linux CI lints the full web-backend and database trees by @4gray in #1177
fix(e2e): stop saveSettings hanging on a spurious form-submit navigation wait by @4gray in #1180
feat(embedded-mpv): frame-copy rendering engine (experimental, macOS Apple Silicon) by @4gray in #1169
feat(embedded-mpv): Linux port of the frame-copy rendering engine (headless EGL) by @4gray in #1171
feat(embedded-mpv): Windows frame-copy port (WGL + named shm) by @4gray in #1175
feat(player-controls): shared engine-agnostic controls layer (flag off) [1/7] by @larsemig in #1148
refactor(embedded-mpv): split session controller into focused collaborators [2/7] by @larsemig in #1149
feat(embedded-mpv): use shared controls for frame-copy by @4gray in #1193
feat(html-player): add feature-flagged shared controls by @4gray in #1194
feat(videojs): add feature-flagged shared controls by @4gray in #1195
feat(artplayer): add feature-flagged shared controls by @4gray in #1196
feat(settings): add shared web player controls toggle by @4gray in #1198
feat(playback): add shared picture-in-picture controls by @4gray in #1199
feat: add strip country prefix setting by @Alanon202 in #1162
feat(xtream): resume the latest series episode by @MahdiHrm in #1187
feat(packaging): ship Linux embedded MPV frame-copy runtime by @4gray in #1200
fix(packaging): preserve Flatpak Electron ELF for Zypak by @4gray in #1205
feat: add catch-up functionality from global favourites & catch-up of currently live programme by @Alanon202 in #1166
fix(playback): position embedded MPV native view correctly on scaled displays by @4gray in #1206
ci(release): make test draft releases traceable and self-cleaning by @4gray in #1202
fix: redact sensitive log data by @4gray in #1182
fix(m3u): parse playlists with URLs longer than 2084 characters by @4gray in #1204
feat: manual EPG-to-channel mapping with mapping fallback by @Alanon202 in #1165
feat(about): show build commit next to the app version by @4gray in #1208
refactor(database): split EPG mapping schema out of oversized schema.ts by @SalemOurabi in #1213
fix(playback): route MKV sources as Matroska by @4gray in #1210
feat(epg): manual EPG mapping for Stalker portals by @4gray in #1173
fix(embedded-mpv): stop native-view video jump by moving control menus into the dock by @4gray in #1207
feat(matching): strip appended language/quality tags in title normalization by @4gray in #1211
fix(epg): harden three latent edges from the #1165 manual-mapping review by @4gray in #1214
fix(portal): remove redundant catalog type badges by @4gray in #1217
fix(stalker): preserve is_series episode metadata by @4gray in #1218
fix(catchup): parse negative sub-hour XMLTV offsets correctly by @SalemOurabi in #1216
feat(stalker): full Live TV channel list complete search, count badges, all-channels grid by @4gray in #1209
feat(playback): theater stage and opt-in ambient fill for the inline portal player by @4gray in #1223
feat(tmdb): clickable director/creator chips and directing credits on person pages by @4gray in #1227
fix(search): find punctuation-joined words like "A&E" anywhere in titles by @4gray in #1172
fix(tmdb): resolve season number from title markers for per-season series slices by @4gray in #1229
Add download pause and resume support by @genrichh93-ui in #1147
feat(playback): show media title overlay in fullscreen shared controls by @4gray in #1228
feat(m3u): DASH + ClearKey playback via Shaka Player by @4gray in #1225
fix(backup): export and restore hidden Xtream categories by real xtream IDs by @4gray in #1224
fix(playlist): bound playlist downloads and isolate startup auto-update by @4gray in #1233
fix(playlists): report failed playlists in the startup auto-refresh toast by @4gray in #1235
feat(m3u): support #KODIPROP lines placed before #EXTINF by @4gray in #1234
feat(i18n): add Hungarian translation (hu) by @4gray in #1236
feat(playback): Up Next episode rail for the inline series player by @4gray in #1231
fix(ci): restore green master pipeline (hu locale drift, CodeQL upload) by @4gray in #1237
ci: cancel superseded PR runs, skip docs-only builds, lint affected on PRs by @4gray in #1226
feat(tmdb): series production-status chip and person death dates by @4gray in #1240
docs(tmdb): record the TMDB capability roadmap by @4gray in #1238
perf(stalker): skip wasted series-seasons request for non-series items by @4gray in #1241
fix(stalker): refresh stale embedded-series snapshots from favorites and dashboard by @4gray in #1253
chore(release): author release notes in .changes instead of reconstructing them by @4gray in #1256
fix(playlists): serialize per-playlist collection writes to prevent lost updates by @4gray in #1255
fix(ci): classify release-tools in the coverage policy by @4gray in #1260
ci(release): gate PRs on an authored release note by @4gray in #1257
feat(release): manifest-driven screenshot capture with fail-closed mock-data guards by @4gray in #1261
fix(tmdb): stop a broken provider tmdb_id from suppressing enrichment by @4gray in #1239
feat(tmdb): metadata cache panel with a clear button in settings by @4gray in #1244
chore(release): drop the superseded v0.20 screenshot script by @4gray in #1262
fix(window-controls): derive window-state pushes from events so controls reappear after fullscreen by @4gray in #1178
fix(tmdb): series cast was the latest season only, not the show by @4gray in #1242
fix(m3u): avoid persisting hydrated favorites by @4gray in #1232
fix(deps): patch transitive runtime CVEs via pnpm overrides by @4gray in #1258
chore(deps): bump actions/upload-pages-artifact from 3 to 5 by @dependabot[bot] in #1248
chore(deps): bump codecov/codecov-action from 6 to 7 by @dependabot[bot] in #1246
perf(m3u): stop cancelled refresh workers by @4gray in #1268
fix(playback): make the "Show subtitles" setting reach the web players by @4gray in #1269
chore(deps): bump the npm minor/patch group across 44 packages by @4gray in #1270
ci(deps): bump checkout/upload-artifact/download-artifact majors by @4gray in #1264
build(docker): move image to node 24 and install pnpm without corepack by @4gray in #1265
refactor(deps): drop uuid for a shared crypto-based id helper by @4gray in #1266
test(electron): harden runtime boundary coverage by @4gray in #1267
refactor(settings): split the settings page into per-section facades by @4gray in #1274
test(perf): add request-scoped M3U benchmark profiling by @4gray in #1275
docs(release): backfill curated 0.23.0 release notes, fix the notes CLI -- trap by @4gray in #1263
refactor(electron-backend): split four files under the max-lines limit by @4gray in #1278
fix(perf): make process memory captures comparison-safe by @4gray in #1280
feat(mock-data): add shared screenshot-safe poster catalog by @4gray in #1271
test(settings): split the settings spec along the facade seams by @4gray in #1277
fix(epg): await mapping queries so lookups fail soft by @4gray in #1279
test(performance): add formal M3U import benchmark by @4gray in #1287
refactor(electron-backend): split the last four files over the max-lines cap by @4gray in #1288
test(performance): deflake the real-timer event-loop delay spec by @4gray in #1293
fix(packaging): stop the Linux frame-copy probe timing out on cold sandboxes by @4gray in #1294
fix(electron-backend): process zero-delay database cancellation by @4gray in #1295
fix(epg): make manual EPG mapping lookups actually fail soft by @4gray in #1291
fix(electron-backend): make test suite and lint host-agnostic on Windows checkouts by @4gray in #1176
fix(settings): stop settings silently reverting on restart by @4gray in #1272
chore(deps): bump github/codeql-action from 3 to 4 by @dependabot[bot] in #1282
chore(deps): bump actions/deploy-pages from 4 to 5 by @dependabot[bot] in #1283
test(performance): add end-to-end Xtream benchmark harness by @4gray in #1300
chore(deps): bump actions/cache from 4 to 6 by @dependabot[bot] in #1281
chore(deps): bump actions/setup-node from 4 to 7 by @dependabot[bot] in #1285
chore(deps): bump softprops/action-gh-release from 2 to 3 by @dependabot[bot] in #1284
fix(e2e): reap data directories abandoned by earlier runs by @4gray in #1296
refactor(portals): share external-button and position-writer logic by @4gray in #1298
fix(playlist): open playlists handed over by the OS by @4gray in #1299
test(performance): bound worker sampling finalization by @4gray in #1302
feat(packaging): register IPTVnator as the .m3u/.m3u8 handler by @4gray in #1301
test(performance): stabilize Xtream benchmark startup by @4gray in #1304
test(performance): preserve delayed worker ELD samples by @4gray in #1305
test(performance): harden Xtream startup retry by @4gray in #1307
chore(lint): hold tests to their own max-lines ceiling by @4gray in #1306
fix(xtream): keep sparse VOD details playable by @4gray in #1303
test(performance): prevent renderer heartbeat omission by @4gray in #1308
feat(portals): find the same movie in your other playlists by @4gray in #1286
fix(portals): reach a word-final sigma from either case by @4gray in #1310
fix(portals): restore fresh-import pins atomically by @4gray in #1311
fix(playback): avoid false codec diagnostics by @4gray in #1314
fix(playback): structure HLS diagnostics by @4gray in #1316
fix(skills): align repository guidance with implementation by @4gray in #1315
fix(ui): preserve EPG in narrow channel rows by @4gray in #1312
fix(playback): structure Video.js diagnostics by @4gray in #1317
fix(playback): structure Shaka diagnostics by @4gray in #1318
fix(packaging): add verified source mirror fallback by @4gray in #1325
fix(playback): escape commas in mpv http header fields by @wretchwatson in #1321
fix(playback): escape commas in mpv header fields on the TS paths by @4gray in #1323
fix(playback): structure MPEG-TS diagnostics by @4gray in #1327
fix(stalker): keep session headers on same-host redirects by @4gray in #1322
feat(downloads): redesign download manager by @4gray in #1313
fix(ui): make the workspace usable on phone-sized screens by @4gray in #1326
fix(workspace): restore playlist info entry in header playlist dropdown by @4gray in #1328
test(stalker): enforce portal auth in the mock and cover the full-portal flow by @4gray in #1324
test(playlist): fix flaky refresh-preparation worker-event spec by @4gray in #1331
fix(downloads): resume interrupted Xtream VOD transfers by @4gray in #1329
test(e2e): pin the phone-layout invariants from #1326 by @4gray in #1333
fix(stalker): send cmd in the reference MAG wire format by @4gray in #1334
feat(ui): turn the phone context panel into an off-canvas drawer by @4gray in #1332
docs(release): backfill 0.23 notes for embedded MPV scaling and dock-menu fixes by @4gray in #1339
feat(stalker): add account info dialog for Stalker portals by @4gray in #1330
feat(playback): forward portal Cookie/Authorization to built-in players by @4gray in #1335
ci(nx): enforce synchronized dependency updates by @4gray in #1343
fix(workspace): report a local phase while reading the cached Xtream catalog by @4gray in #1345
feat(dashboard): subscription-expiry warning badge on source cards by @4gray in #1342
fix(pwa): bring the Stalker transport to parity with Electron by @4gray in #1348
feat(stalker): endpoint probing + behavior-based portal mode with lazy repair by @4gray in #1344
fix(dashboard): give the hero the identity the detail view matched with by @4gray in #1362
feat(portals): rework the VOD sources popup and action row by @4gray in #1359
fix(build): include shared UI stylesheets in Nx cache inputs by @4gray in #1360
fix(stalker): anchor auth-failure body detection and share it across transports by @4gray in #1358
feat(downloads): queue season episode downloads by @4gray in #1357
chore(deps): bump angularx-qrcode from 21.0.4 to 21.0.5 by @dependabot[bot] in #1351
fix(stalker): only mint a temporary link when the row asks for one by @4gray in #1364
feat(stalker): protocol-correct auth lifecycle by @4gray in #1354
chore(deps): update Nx to 22.7.2 by @4gray in #1365
feat(stalker): identity hardening by @4gray in #1370
chore(deps-dev): bump angular-eslint from 21.3.1 to 21.4.0 by @dependabot[bot] in #1350
chore(deps): bump github/codeql-action from 4 to 4.37.4 in the actions-minor-patch group by @dependabot[bot] in #1371
chore(deps): bump axios from 1.18.1 to 1.19.0 by @dependabot[bot] in #1367
docs(stalker): reconcile the Stalker docs after the API-compatibility series by @4gray in #1375
feat(playback): recommend recovery actions by @4gray in #1374
test(stalker): isolate auth e2e state by worker by @4gray in #1378
fix(build): prevent Vite dev transform overflow by @4gray in #1379
chore(deps-dev): bump electron from 41.7.2 to 41.10.3 by @dependabot[bot] in #1377
chore(deps): bump pnpm/action-setup from 4 to 6.0.9 by @dependabot[bot] in #1372
fix(xtream): drop URL-only season overviews and fall back to TMDB by @4gray in #1382
fix(stalker): fall back to short EPG when bulk EPG misses the current programme by @4gray in #1386
fix(playback): keep Video.js controls on the live MPEG-TS path by @4gray in #1385
feat(settings): per-section pages with unsaved-changes bar by @4gray in #1384
chore(deps): align Angular packages on 21.2.19 by @4gray in #1383
feat(xtream): catch-up badge for live channels with archive by @4gray in #1341
feat(xtream): replace catalog pagination with infinite scroll (1/2) by @4gray in #1392
fix(playback): clarify external player launch feedback by @4gray in #1388
feat(stalker): append portal pages on scroll and drop pagination everywhere (2/2) by @4gray in #1395
fix(settings): protect unsaved edits on window close, quit, and reload by @4gray in #1394
feat(stalker): discover portal endpoints on add and edit by @4gray in #1391
fix(playback): make playback keyboard shortcuts work without shared controls by @4gray in #1398
fix(m3u): forward playlist-level custom headers to external players by @4gray in #1397
feat(remote-control): cover live collections, honest volume, status resets by @4gray in #1399
chore(deps): align Nx packages on 22.7.7 by @4gray in #1396
refactor(stalker): drop unused limit state from selection feature by @4gray in #1402
fix(pwa): tolerate broken IPv6 routes and surface provider error codes by @4gray in #1404
chore(deps-dev): bump the nx-version-updates group across 1 directory with 11 updates by @dependabot[bot] in #1401
fix(packaging): restore Snap desktop runtime by @4gray in #1406
chore(deps): bump the actions-minor-patch group with 2 updates by @dependabot[bot] in #1403
ci(deps): split sensitive dependency updates by @4gray in #1409
fix(playback): update Shaka Player to 5.2.4 by @4gray in #1411
fix(playback): update mpegts.js to 1.8.1 by @4gray in #1412
chore(deps): update epg-parser to 0.5.0 by @4gray in #1413
chore(deps): bump the npm-minor-patch group across 1 directory with 11 updates by @dependabot[bot] in #1416
chore(deps): bump better-sqlite3 from 12.9.0 to 13.0.3 by @dependabot[bot] in #1415
chore(deps-dev): bump electron from 41.10.3 to 43.3.0 by @dependabot[bot] in #1414
fix(playback): keep the display awake while built-in players play video by @4gray in #1405
feat(dashboard): add TMDB "Because you watched" recommendations rail by @4gray in #1419
feat(xtream): recognize more language tags in VOD multi-source by @4gray in #1417
refactor(portals): compact credential-free logging for failed Stalker requests by @4gray in #1418
ci(embedded-mpv): add pinned mirrors to the Linux runtime source download by @4gray in #1427
feat(portals): add "View in portal" action to inline collection details by @4gray in #1422
perf(portals): fast-fail requests to portal hosts that stopped answering by @4gray in #1421
fix(dashboard): keep every catalog row per title key when matching by @4gray in #1425
fix(search): keep in-flight typing when the page rewrites its query params by @4gray in #1432
fix(matching): keep abbreviation titles out of bare-year keys by @4gray in #1426
feat(playlist): open recognized M3U movies in the VOD detail view by @4gray in #1420
refactor(portals): extract the destructive Xtream refresh into one flow by @4gray in #1431
refactor(portals): split the Stalker collection detail component by @4gray in #1433
fix(portals): return from a portal handoff without losing the collection view by @4gray in #1435
fix(dashboard): reuse the detail view's TMDB identity for activity rows by @4gray in #1423
fix(playback): apply saved player changes to mounted web players by @4gray in #1437
fix(portals): time out and fast-fail PWA proxy requests to dead hosts by @4gray in #1424
test(playback): stub the inline player in the VOD details spec by @4gray in #1440
test(playback): drive embedded MPV controller specs on a fake clock by @4gray in #1434
refactor(playback): extract web player diagnostic/recovery controller by @4gray in #1444
feat(downloads): align manager cards, queue rows, and headings with the rail design language by @4gray in #1448
feat(portals): mark a full season as watched in one click by @4gray in #1447
feat(portals): mark a whole series as watched in one click by @4gray in #1451
fix(downloads): reconnect interrupted transfers and resume without validators by @4gray in #1446
fix(i18n): fix translation with ChatGPT 5.6 Sol by @aiddroid in #1390
feat(playlist): auto-detect import method that parses pasted provider messages by @4gray in #1445
feat(portals): make year, genre and country metadata clickable (#1449) by @4gray in #1453
chore(deps): bump the npm-minor-patch group with 8 updates by @dependabot[bot] in #1459
chore(deps): bump github/codeql-action from 4.37.6 to 4.37.7 in the actions-minor-patch group by @dependabot[bot] in #1463
chore(deps-dev): bump @angular-devkit/schematics from 21.2.19 to 21.2.21 by @dependabot[bot] in #1460
chore(deps-dev): bump @angular/cli from 21.2.19 to 21.2.21 by @dependabot[bot] in #1462
chore(deps): bump ngx-indexed-db from 21.0.0 to 22.0.0 by @4gray in #1472
feat(playback): add quality selection to shared player controls by @4gray in #1470
feat(downloads): track live-TV recordings in the download manager by @4gray in #1452
feat(dashboard): detail-first Continue Watching cards with quick actions by @4gray in #1469
docs(agents): re-run pnpm install after the checkout moves by @4gray in #1473
fix(search): keep a trailing space when the trimmed q echo lands after the debounce by @4gray in #1474
chore(deps): coordinated security sweep for open Dependabot alerts by @4gray in #1475
feat(playback): advanced subtitle support in shared player controls by @4gray in #1471
fix(playback): re-sync embedded MPV bounds on position-only layout shifts by @4gray in #1476
feat(release): announcement formats, highlight cards, and draft verification by @4gray in #1480
ci(embedded-mpv): keep Windows runtime pin available by @4gray in #1495
feat(playback): make the shared player controls the default (#1408) by @4gray in #1485
Release v0.22.0
v0.22 is one of the biggest IPTVnator releases so far. The embedded MPV player expands from macOS to Windows and Linux, detail pages for movies and series got a full redesign, and the app can now enrich your VOD & series content with TMDB metadata posters, cast, trailers and more. On top of that: a built-in desktop updater, global search across all your sources, and a reworked live EPG timeline.
Highlights
Embedded MPV player now available on Windows and Linux (experimental)
TMDB metadata enrichment (opt-in): plots, cast, trailers, similar titles, actor pages
Redesigned VOD & series detail pages with a browse watch layout and season tabs
Desktop auto-updater the app now updates itself from GitHub releases
Global search across all sources, including M3U playlists
Live EPG panel reworked into a timeline with an optional vertical list view
Catch-up/archive playback improvements for Xtream
Custom title bar with window controls on Windows and Linux
Extensive Electron security hardening
Embedded MPV Player now on Windows & Linux (Experimental)
The embedded MPV player introduced for macOS in v0.21 is now available on all three platforms:
Windows: libmpv rendering directly inside the app window (bundled, no extra install)
Linux: playback via the system mpv player embedded into the app window (X11/XWayland; requires mpv on PATH)
Series navigation (next/previous episode) inside the embedded player
Switch to embedded MPV directly from the command palette
Stability hardening across the board: EOF detection, safer polling, better error visibility, and the display no longer goes to sleep during playback
The macOS embedded player also received a round of fixes and polish based on v0.21 feedback.
TMDB Metadata Enrichment (opt-in)
Movie and series detail pages for Xtream and Stalker portals can now be enriched with TMDB data:
Plot, genres, ratings, director and cast with photos, artwork and YouTube trailers
"Similar" rail: TMDB recommendations matched against your catalog across all your portals
Trending on the dashboard: a TMDB-powered trending rail with enriched hero artwork
Real episode names, descriptions and stills for each season
Actor pages: click any cast member to see their bio and filmography, linked back to your catalog or portal search
Localized to your app language (falls back to the original language when a translation is missing), cached locally
Enrichment is off by default and requires a personal TMDB API key (free registration at themoviedb.org). Enter your key and enable the feature under Settings Metadata (TMDB) titles are sent to TMDB for matching.
Redesigned Movie & Series Detail Pages
Detail pages now have two states:
Browse: hero section with poster, metadata and actions, episodes below
Watch: the hero collapses, the inline player takes the full content width, and details move below the episodes
Season tabs with smart auto-selection (jumps to the season you're watching or resuming)
Grid/list toggle for episodes, remembered across sessions
Esc or "Close player" returns to browse without losing your place
Desktop Auto-Updater
IPTVnator now checks GitHub releases and can update itself no more manual downloads
Release notes for the current version are shown in the settings
Fixed a crash in the packaged updater (#1103)
Global Search
New workspace-wide search across all your sources Xtream, Stalker and M3U playlists
Fixed live search (Ctrl+F) opening the wrong channel or category
EPG & Catch-up
Live EPG panel reworked into a horizontal timeline under the player
New optional vertical list view for the live EPG panel
EPG sources can now be scoped per playlist
Compressed XMLTV responses are now decoded correctly
Catch-up (Xtream): active archive playback state shown in the EPG, timeshift URL variants resolved automatically, stream output format auto-selected, active archive program highlighted
Catch-up "Watch" button now works from the unified live tab, with clear errors when a stream can't be resolved
Dashboard
Configurable dashboard rails choose what you want to see
New "Recently added" live channels rail
New "Trending" rail powered by TMDB (when metadata enrichment is enabled)
Faster startup and rail loading
Xtream & Stalker
Sort and filter the VOD/series catalog by IMDb rating
New "all channels" grid for Live TV
Improved compatibility with more portal variants
Stalker: full playlist loading for authenticated routes
PWA: Xtream connection details are now saved properly
UI & Desktop
Custom title bar with window controls on Windows and Linux
Live channels sidebar no longer shares its width with the navigation panel
Sources page visual polish
Security
Extensive Electron hardening: stricter renderer isolation and navigation rules
Scoped trust controls for EPG sources
Blocked private-network redirects for portal probes
Under the Hood
Large test-coverage push (unit + E2E) and CI now enforces lint and file-size limits on every PR
Major internal refactorings: typed Electron bridge contract, split EPG/player services, dead code cleanup
Dependency updates: Angular 21.2.17, axios 1.16.0
Remote control: volume now applies to built-in M3U players
Release v0.21.0
v0.21 focuses on quality-of-life improvements, performance, and playback experience improvements across the app.
This release also introduces one of the most requested features for macOS users: an experimental embedded MPV player built directly into the app no additional installation required.
iptvnator-v0 21-wide-changelog
Highlights
Experimental embedded MPV player for macOS
Toggleable Live TV sidebar and EPG panel
Improved command palette
Better Recently Viewed & Favorites experience
Performance and loading time improvements
Multiple Xtream, Stalker, and M3U fixes
macOS Embedded MPV Player (Experimental)
[macOS only]
IPTVnator now includes an experimental embedded MPV player directly inside the app.
No additional software required just install and use IPTVnator.
This is an early experimental version and feedback is very welcome.
Layout & Navigation
Toggleable sidebar panel for Live TV channels for a more focused viewing experience
Toggle/collapse EPG panel
Command Palette Improvements
Change player directly from command palette
Added section with 5 recently used actions
Favorites & Recently Viewed
Fixed issue where Live TV items appeared favorited by default
Channels can now be favorited directly from Recently Viewed
Remove individual channels from Recently Viewed via context menu
Renamed "GLOBAL Favorites" to simply "Favorites"
Playback & Playlist Management
Fixed MPV/VLC custom path fallback handling
Added manual refresh for playlists added from filesystem
Fixed playlist refresh handling for file-based playlists
Module Improvements
M3U
Cover size setting (XL / L / M)
Sorting for All Channels:
by name
by original playlist order
Improved channel drag & drop ghost styling
Xtream
Better unavailable portal handling
Added clear button to playlist form
Fixed search when no category is selected
Stalker
Fixed 14 items issue
UI & UX Improvements
Improved category count badge styling
Improved No results found screen styling
Performance & Internal Improvements
Performance improvements to reduce loading times
Database WAL improvements
Favorites lookup optimizations
Refactored settings component
Additional facade/internal refactors
Localization
Added missing translation strings for all supported languages
Other Fixes & Improvements
Fixed loading screen issues in download manager
Fixed reset Recently Viewed for M3U module
Release v0.20.0
v0.20 brings a major UI overhaul and improves the overall experience across all modules.
The app now features a unified design for M3U, Xtream, and Stalker, along with a new dashboard that shifts the focus from playlists to content. Navigation, favorites, and search have been reworked to be more consistent and intuitive.
Support the project
If you like IPTVnator and want to support further development:
GitHub Sponsors: https://github.com/sponsors/4gray
Ko-fi: https://ko-fi.com/4gray
Highlights
Unified UI across all modules (M3U, Xtream, Stalker)
New Dashboard as a content-first starting point
Reworked Favorites & Recently Viewed
New Command Palette (Cmd/Ctrl + K)
Dashboard & Navigation
New dashboard screen with basic widgets
Content-oriented start instead of playlist-first approach
Configurable:
Can be disabled
Choose startup view (default vs last opened)
Consistent look & feel across all playlists
Scope-aware search depending on current view
UI & Settings
Reworked settings page
App follows system theme by default
New UI customization options:
Toggle dashboard visibility
Toggle external player bar
External player bar:
Control player directly from the app
Can be hidden in settings
Favorites & History
Reworked Favorites and Recently Viewed:
Channel sorting
Drag & drop support
Integrated EPG view
Fully integrated across all modules
Playlist Management
Reworked Add Playlist dialog:
Unified dialog with tabs (M3U / Xtream / Stalker)
Xtream: option to clear form
Fixed drag & drop import for M3U files
Search & Discovery
Consistent category search across all modules
Xtream:
Category search
Preserve hidden categories after refresh
Module Improvements
M3U
Fully redesigned layout:
Two-column layout for categories & channels
Groups view replaces accordions
Improved consistency:
Sorting
Category management
Channel info dialog available via context menu
Xtream
Improved account information dialog
Stalker
EPG support for Live TV
Channel sorting
System & Platform
macOS version is now signed
Fixed Flatpak version (Linux)
Other Improvements
Fixed playback position saving when using VLC
Fixed M3U drag & drop issues from file system
Improved account information dialog (Xtream)
General UI consistency improvements across modules
IPTVnator v0.19
This is one of the biggest IPTVnator releases so far, with many fixes, refactorings, and features. A lot of reported issues were addressed in this version. I may still have missed something that was reported.
Thank you to everyone who contributed with ideas, bug reports, improvements, and PRs. Biggest kudos to everyone who supported the project with donations. Thank you!
Changes:
Home
Added custom playlist sorting with drag-and-drop reordering.
Added Global Search and Recent Items to the Home header.
Improved Global Search:
Enhanced UI with grouped and ungrouped views.
Added option to include/exclude hidden categories.
Improved globally recent items:
Added Stalker support.
Enhanced UI with grouped and ungrouped views.
Update and sync Turkish translations by @hasanbeder
M3U
Added lazy loading and improved handling for large playlists.
Added Favorites button directly in lists, including group views.
Added lazy loading in group view.
Improved global favorites behavior.
Restored EPG expired programs for catch-up/archive support.
Added resizable sidebar.
Xtream
Playback position is now persisted for started VOD and series content.
Added Download Manager.
Added sorting options for Live TV channels.
Added search in VOD/series categories.
Added sorting in VOD/series categories by name or date added.
Improved search flow: when returning from results, search phrase and results are preserved.
Added list view for series.
Added resizable sidebar.
Stalker
Playback position is now persisted for started VOD and series content.
Added Download Manager.
Added EPG support for Live TV channels.
When no category is selected, all VOD/series categories are now shown.
Added list view for series.
Added resizable sidebar.
Replaced Load more buttons with infinite scroll for Live TV channels.
Remote Control
Added support for Xtream and Stalker portals.
Added EPG info for the current program.
Added channel switching by entering channel number.
Website & Blog
Added a new landing page: https://4gray.github.io/iptvnator/
Added a new blog: https://4gray.github.io/iptvnator/blog
v0.18 Release Notes
Support the project
GitHub Sponsors https://github.com/sponsors/4gray
Buy me a coffee https://ko-fi.com/4gray
USDT (TRC20) TLz5rTS7QTxYGfRH1Pm6Hs9fewqstDM47c
Changelog:
General
feat: New playlist switcher UI a unified and cleaner way to switch between playlists
style: Global favorites moved to the header for quicker access
style: Sort and filter options merged into a single header menu
M3U
feat: Improved EPG download and parsing to better handle large EPG files
feat: Added a popup dialog showing EPG download progress
fix: Restored quality selector for the Video.js player
Xtream & Stalker
style: Improved look and feel of the details view for VODs and TV shows
fix: Fixed opening favorite items with embedded players
Xtream
feat: Category management (hide/show categories)
feat: Display item counts per category
feat: New separate view for recently added items
feat: Show recently added items when no category is selected
fix: Fixed empty categories issue
fix: Restored import progress counter
Stalker
feat: Added support for playlists that require device IDs and signatures
Some playlists are still not supported more testing data is needed
Before updating, please make sure to back up your playlists, credentials, URLs, and other important data.
What's Changed
refactor/merge-playlist-filter-and-sort-into-one-menu by @4gray in #694
chore: improve player error handling by @4gray in #698
feat(db): add shared database library with sql config by @4gray in #701
refactor(electron-backend): split DB event handlers into modules by @4gray in #702
refactor: move global favorites to header by @4gray in #703
refactor/streaming-sax-epg-parser by @4gray in #706
chore: update nx dependencies by @4gray in #708
feat/improve-stalker-support by @4gray in #709
style/visual-improvements-in-vod-and-serials-view by @4gray in #710
feat/epg-improvements by @4gray in #711
feat: enhance favorites button and series view with loading states and improved styling by @4gray in #712
Feat/category management xtream by @4gray in #715
e2e smoke tests by @4gray in #717
feat/introduce-playlist-switcher by @4gray in #721
fix/stalker-favorites by @4gray in #725
refactor/store-refactoring by @4gray in #724
fix/pre-release-fixes-v0-18 by @4gray in #726
ci: run workflows on master branch instead of nx by @4gray in #729
fix(vjs-player): replace HLS quality plugin and add plugin guards by @4gray in #730
v0.17.1
Bugfix Release
Fixed macOS ARM build issues
Use filename as channel title when importing from file
Improved readability of playlist metadata line
Keyboard hotkeys are now ignored while searching for channels
Restored context menu (cut / copy / paste / select all) for input fields
Resolved Linux sandbox startup issues (added troubleshooting section to README)
v0.17.0
This release brings a fresh look, smoother navigation, and several improvements across M3U, Xtream/Stalker, and the general UI. Plus, a major internal restructuring that sets the stage for faster development in the future.
iptvnator-v17
What's Changed
M3U Improvements
Display of the current EPG program directly inside the channel list
Updated look & feel for the EPG sidebar
Completely reworked UI for multi-EPG view
Visual refinements to the remote control mode
Ability to switch channels by typing the channel number on your keyboard
Xtream Codes / Stalker Portal
Unique look & feel for Stalker (STB) and Xtream Codes (XC) interfaces
More compact sidebar more space for channels and categories
Added option to refresh the Xtream playlist
General Updates
New empty start page with a redesigned header
Auto-refresh status indicator in playlist overview
New option to reuse a single MPV instance when switching channels (faster zapping & less resource usage)
Under the Hood
A lot changed behind the scenes to make future development easier and more stable:
Fully restructured repository into a monorepo, which is an important foundation for upcoming features
Updated dependencies across the project
Improved i18n and translation structure
Note: PWA and Docker images will follow shortly in separate builds.
v0.16.0
Xtream: New layout and EPG View
Xtream: Support youtube trailers
PWA: Updates in mobile layout
Stalker Portal: Category and search fix
Stalker & Xtream: Check playlist details from portal view
Stalker & Xtream: Show IMDB rating information on overview page
Stalker & Xtream: show stream URL in built-in video-player dialog
Language: Update Italian language by @bovirus and @Deltwin
Language: Add Turkish language support by @hasanbeder
Style: Material 3 update by @4gray
v0.15.1
Fixes and improvements
Fixed memory consumption issues, especially with larger playlists
Fixed an error with the default path to mpv/vlc if they were in the $PATH (macOS related)
Enhanced error display in stalker/xtream portal
Added playlist filter on the startup screen
Fixed issue displaying notification about EPG download even when no resources were specified
Improvements in translations
Dependency library updates
v0.15.0
Hey, it's time to say hello to v0.15
Here are the biggest changes:
added support for STB EMU / Stalker Portal
support for audio-only aka radio channels
VLC is supported now
search playlists in the overview by title
docker images for self-hosted deployment were updated
v0.14.0
What is new
The main feature of this release is Xtream Code IPTV support. The feature is also available in PWA, but works best in electron version of the app and combination with mpv player.
Changes:
Xtream Code IPTV support #53 #72 #125
possibility to specify custom path for mpv player #248
fixed an annoying bug that appeared when reopening mpv player #248
fixed bug related to user-agent handling #253
updated libraries used under the hood
v0.13.0
mpv player integration
This release contains one of the long awaited features (#214, #63, #90) - stream playback in a third-party mpv player.
Using this player will allow you to watch those playlists which for various reasons cannot be played within the browser/electron.
I would say it's currently in experimental mode and I'd be interested to get your feedback on whether this player should be more deeply integrated. For example, using mpv I could easily implement video recording.
You can activate the mpv player in the settings page. To use it, you need to have it installed on your system (read more).
0.12.0 (2023-03-19)
iptvnator-v0-12
First of all I want to say a huge thank you to everyone who took part in this release, those who tested the application and reported bugs, shared ideas, who put a star or shared a link and of course those who contributed.
In v0.12.0, a lot of seemingly "invisible work" aka refactoring has been done to unify the code that is used in the desktop version of the app and in the PWA. Sooner or later it was necessary to do this in order to develop the application further, for example the switch from NeDB to IndexedDB, state management update etc.
So unfortunately this version doesn't have some changes which I planned after previous release, such as all feature requests/issues related to EPG, but I will try to pay attention to them in next versions.
Important change
The storage location of playlists has been changed, now everything is stored in IndexedDB. So after the update you will see a panel offering to migrate playlists.
Features
add dockerfile and docker-compose for self-hosted deployment (4b97e3d)
add italian language, thanks to @bovirus (3e3f18c)
draggable channels in favorites list (ba41c8d)
export playlist as m3u (7e4d6b1)
persist window size (2ce60e0), closes #205
pwa: load a m3u playlist as a URL parameter #176 (344bd75)
import/export/remove all playlists from settings page
add cmd+q hotkey to close the app (macOS) (f3e00e7), closes #181
Bug Fixes
macos related window management improvements (b336680)
set epgSource as not required field (049ed6b), closes #175
Refactoring
switch to ngrx for state management
dependency update
migration from NeDB to IndexedDB
improved routing in PWA app
v0.11.1
This update includes a bug fix for red background in picture-in-picture mode, see #167.
Other changes:
the file:// protocol for local files can again be used in the EPG source field
ngx-uploader library has been replaced by the own implementation
v0.11.0
Hey
after a long period of time, I am happy to present a new release of the application, which includes the following changes:
iptvnator-v0_11_0
Multiple EPG sources
In the new version of the application, you can add more than one URL as a source of the EPG program.
Import playlist from plain text
Another playlist import option became available - import m3u(8) as text. Just copy the playlist to the clipboard and paste it into the application without having to save it to disk.
Multi-EPG view
The first version of multi-EPG view was developed, which is familiar to many users from set-top boxes. At this stage the view works in purely informative mode.
This&That
Improvements in PWA: A number of visual changes have been made to improve the experience of using the app on mobile devices.
Internalization: The localization of the project has been improved, but help is still needed with the translation into different languages.
The underlying libraries on which the app is built have been updated (angular, electron etc.)
What's Changed
Feature: Support multiple EPG sources by @4gray in #149
build(deps): bump moment from 2.29.2 to 2.29.4 by @dependabot in #150
build(deps-dev): bump electron from 16.2.2 to 16.2.6 by @dependabot in #147
build(deps-dev): bump semantic-release from 19.0.2 to 19.0.3 by @dependabot in #145
Update fr.json by @Unelio in #151
New Contributors
@Unelio made their first contribution in #151
0.10.0 (2022-04-24)
Bug Fixes
capitalize app name #117 (36d3eaa)
epg function to compare channel ids (c7de39e)
Features
add context menu with default actions (44e76e0), closes #96
add option to change aspect ratio (b8a3f76), closes #80
add option to select stream resolution (c23fe3a), closes #93
add pwa support (5a5085d)
auto-detect if OS is in dark mode (ad26588)
generate global playlist with all favorites (764201a), closes #97
integrate french localization (ab75a2f)
pwa: auto-generate playlist with global favorites (98ff7f4)
switch playlists from the sidebar (0bc71d4)
0.9.0 (2021-10-14)
Bug Fixes
search feature should not affect favorites list (ef52f77), closes #71
Features
add chinese translation (a497f05)
global subtitle display setting (4d2e175)
rearrange the display order of playlists (757c739), closes #77
0.8.0 (2021-07-17)
Features
add info popup with epg info for active channel (0eecfd1), closes #51
add support of specific user-agent and referer on channel level (a55f741), closes #57
0.7.0 (2021-05-24)
Bug Fixes
promise issue after channel switch #29 (d1f194a)
Features
auto-refresh playlists on app startup (e8ab576)
refresh playlist from file system or imported url (57cf247)
support of timeshift and catchup attributes in playlists (ced16a8)
0.6.0 (2021-04-10)
Bug Fixes
quit application via window close icon (24d5584), closes #33
Features
add "what is new" dialog (cc375a4)
add dark theme (0cf010a)
add dialog with detailed epg description (96e93c5)
set custom user agent for a playlist (a8167c4), closes #26
show channel logos in the list (41998ff), closes #28
0.5.0 (2021-02-28)
Bug Fixes
less strict url validation of playlist URL (4f366d9), closes #22
macOS corrupt icon fix, closes #21 (955bb27)
Features
add dialog about playlist details (9f951fa)
add german language (i18n) (7888e85)
add internationalization (0f8ca2a)
add russian language (i18n) (a93af69)
0.4.0 (2021-02-11)
Bug Fixes
default html5 player initialization fix (4a6b976)
Features
add ctrl+f as hotkey to focus search field (cad162d)
add epg worker with new ipc commands (418566f)
add moment.js based date pipe (4881ba8)
check for available update (68ccabb)
epg integration (2e861b6)
epg: epg program list with date navigation (fdbe02b)
favorite channels list (f02bbe3)
integrate epg feature (e896af0)
integrate epg worker & refactor app menu (3b97d74)
sort playlists by import date (d967b12)
validation of playlist url (da2fe5e)
Performance Improvements
destroy hls instance after view change (2e3681c)
0.2.0 (2020-09-27)
Features
add new video.js based player (1e852e3)
add settings page (1a44ecd)
video player configuration in app settings (05c0c25)
0.1.0 (2020-09-12)
Bug Fixes
playlist upload for mac os #6 (78ca56f)
Features
add new application icon (0ce0b1f)
open playlist from file system (861e480)
0.0.2 (2020-09-06)
Bug Fixes
define path to userData folder as db store (8e8c107)
enable copy-paste hotkeys for mac os (4357c17)
0.0.1 (2020-09-05)
Bug Fixes
full screen permissions (fff2aaa)
full screen permissions (f0d0fb1)
start_url fix in manifest file (e05b7eb)
start_url fix in manifest file (3929655)
update paths to make app installable (fd9fc53)
update paths to make app installable (4b7d1b5)
Features
add channel search function (d1b9461)
add channel search function (7a039af)
add favorites and tab based navigation (8d333d9)
add favorites and tab based navigation (c6e3e1f)
add icon, about dialog and menu (bcf49b8)
change sidebar mode (22f2bc1)
change sidebar mode (ca9f7a2)
electron based app (0feb657)
electron based app (998e7e9)
implement channel groups view (20e0a40)
implement channel groups view (773e1ed)
initial commit (79332aa)
initial commit (2f1701a)
list with recent playlists (1735026)
list with recent playlists (8ee96ee)
IPTVnator 0.24.0 programme guide, fullscreen browsing and stream info
Highlights
Programme guide, rebuilt
The M3U programme guide now follows your playlist's own channels and order, with groups and favorites one click away. Keep the player above the grid while you browse, click a channel to switch, or double-click to switch and close. Open the guide with G, hide channels without EPG and choose compact or comfortable rows. (#1560, closes #171)
Browse channels and episodes without leaving fullscreen
Press C or use the left edge of the video to open a searchable channel list. Series get season tabs and an episode list with artwork and watch progress too. With the default shared controls, switching channels, episodes or alternative movie sources keeps the player fullscreen. (#1519, #1620, #1509, closes #48)
See what is playing while it plays
The stream-info overlay shows resolution, frame rates, bitrates, audio details, buffer and dropped frames when the player can report them. Available in the built-in web players and experimental frame-copy Embedded MPV; unavailable values stay hidden. (#1578)
Nightly channel
Get builds from each merge through Settings About Update channel, or download them from the nightly repository. Stable remains the default.
27 features · 54 fixes · 1 performance improvement including local XMLTV files, Xtream catch-up downloads, automatic reconnects for embedded MPV, season artwork and recovery for sources missing after an older upgrade.
Read the release story on the blog, the full CHANGELOG, or the changes since v0.23.0.
Before updating, back up your playlists and important data. Desktop startup applies database updates and clears outdated metadata matches; allow the preparation screen to finish and avoid downgrading an upgraded profile.
Release v0.23.0
IPTVnator 0.23 offline downloads library, new player controls by default, alternative movie sources and endless catalogs
Highlights
Download manager with offline library
Downloads now separate active transfers from a grouped offline library, move missing files to Needs attention with Download again, and open movies and series in focused offline details with saved metadata. Series show only local episodes; View in portal returns to provider playback when the source can be recovered. Completed-file checks stay responsive on slow or unavailable storage. (#1313)
New player controls by default
The new player controls are now the default for the built-in web players one consistent bar with quality selection, external subtitles, subtitle delay and styling, speed, and picture-in-picture. They are touch-friendly too: tapping the video shows or hides the controls instead of pausing, and narrow players get a two-row layout. Prefer the old look? Switch back in Settings > Playback. (#1485, closes #1408)
Alternative sources for movies
Movies that exist in several of your playlists now show a "Sources" chip on the detail page. Switch playlist mid-film and playback continues from the same timecode, pin a preferred source per movie, and when a stream dies the error screen offers the alternatives instead of a dead end. Optional auto-switching is off by default. (#1286)
Catalogs scroll without pages
Xtream movie, series, and live catalogs now load continuously as you scroll instead of flipping through pages more items appear automatically as you near the bottom, and taller windows fill themselves on open. Opening a title and going back returns you to the exact spot in the list. In-category search and the in-portal search results follow the same continuous style. (#1392)
46 features · 76 fixes · 4 performance wins in this release the full story is in the release notes on the blog and in the CHANGELOG.
All features (46)
dashboard Continue Watching cards on the dashboard now open the detail page on click, just like movie cards no more accidental episode playback. Resuming the saved episode moved to a new menu on each card, next to "Mark as Watched" and "Remove from history". (#1469, closes #1441)
dashboard Dashboard source cards now warn when a portal subscription is about to lapse: an amber "Expires in N d" chip appears within a week of the expiry date, and an "Expired" chip once it has passed. Xtream expirations come from the same cached status check the playlist switcher uses; Stalker portals reuse the account info saved at import. (#1342)
dashboard The dashboard gains a "Because you watched" rail: TMDB recommendations seeded from your recently watched movies and series, showing only titles that actually exist in your imported libraries. It appears once at least five matches are found, can be turned off under Settings Dashboard, and requires the TMDB metadata opt-in (desktop app only). (#1419)
deps Linux desktops with client-side decoration support now show native rounded corners on the IPTVnator window. Desktop builds now run on Electron 43. (#1414)
downloads The download manager got a visual cleanup: "Ready to watch" cards are compact poster cards file actions live in the poster's menu, and clicking any card (episodes included) opens its offline detail. Queue rows show one primary action (pause/resume/retry) with cancel and remove in the menu, and all sections share one heading style with item counts. (#1448)
downloads Live-TV recordings made with the Embedded MPV player now live in the download manager: an in-progress row with elapsed time and Stop, a Recordings library with channel logos and the programs captured from the EPG at recording time, a focused detail page, and Needs attention when a file goes missing. Recordings interrupted by a crash survive as playable partials. (#1452)
downloads Downloads now separate active transfers from a grouped offline library, move missing files to Needs attention with Download again, and open movies and series in focused offline details with saved metadata. Series show only local episodes; View in portal returns to provider playback when the source can be recovered. Completed-file checks stay responsive on slow or unavailable storage. (#1313)
downloads Downloads can be paused and picked up later. A paused transfer keeps what it already fetched and continues from that point instead of starting over, and downloads cut short by a crash or a closed app come back as paused rather than lost. (#1263)
downloads Series downloads now let you queue several episodes in a row or add every available episode from the selected season. Already queued, paused, or downloaded episodes are skipped without duplicates, and the app reports the batch result. (#1357)
embedded-mpv Experimental Embedded MPV can draw video inside the app window instead of into a separate layer pinned on top of it, so menus, dialogs and the player controls stop being swallowed by the picture. Available on macOS (Apple Silicon), Windows and Linux x64; switching it on needs a restart. (#1263)
epg Channels whose guide never matched can be mapped by hand: right-click a channel in any list and pick "Map EPG channel" to attach it to a channel from your uploaded XMLTV guide. The mapping is remembered and used everywhere the guide is read M3U playlists, Xtream and Stalker portals alike. (#1263)
i18n IPTVnator speaks Hungarian, its 19th language contributed by @htibcsike. (#1263, closes #1192)
m3u MPEG-DASH channels play in the built-in player, ClearKey-encrypted ones included the keys are read from the playlist's #KODIPROP lines, whether they sit above or below the channel entry. Streams locked with Widevine or PlayReady still cannot be played, but they now say so instead of failing silently. (#1263, closes #86, closes #614, closes #656, closes #733, closes #752)
playback The shared player controls' subtitle menu now loads external subtitle files (.srt/.vtt in the built-in web players, plus .ass in Embedded MPV), adjusts the subtitle timing offset in ±0.5 s steps, and sets the subtitle text size and color size/color persist across sessions and are shared between engines. (#1471, closes #1408)
playback The built-in web players' shared controls gain a quality menu: multi-bitrate HLS and DASH streams can be pinned to a specific rendition ("1080p", "720p", ) or left on Auto, which keeps the player's adaptive selection. The menu appears only when the stream actually offers more than one quality, and the choice lasts for the current playback session. (#1470)
playback The new player controls are now the default for the built-in web players one consistent bar with quality selection, external subtitles, subtitle delay and styling, speed, and picture-in-picture. They are touch-friendly too: tapping the video shows or hides the controls instead of pausing, and narrow players get a two-row layout. Prefer the old look? Switch back in Settings > Playback. (#1485, closes #1408)
playback An optional new set of player controls that looks and behaves the same in the HTML5, Video.js and ArtPlayer players, with picture-in-picture and, in fullscreen, the name of what you are watching. Enable it in Settings Playback; left off, each of the three keeps its own controls exactly as before. (#1263)
playback The inline player on movie and series pages fills the whole content area like a theater: the video sits centered in black instead of leaving a strip of app background beside it. In the built-in web players, an optional ambient mode fills that space with a blurred, dimmed copy of the poster. (#1263)
playback A series playing inline on a wide window shows an "Up Next" rail beside the video: the rest of the season and the start of the next one, the current episode highlighted, watch progress on every card. Click one to jump straight to it. Built-in web players only; switch the rail off in Settings Playback. (#1263)
playlist The Add playlist dialog has a new "Auto-detect" method: paste whatever your provider sent you links, Xtream credentials, a MAC address with device IDs and IPTVnator recognizes the source type and fills the matching import form for you to review. Detection runs entirely inside the app; nothing you paste is sent anywhere. (#1445)
playlist M3U entries that are movie files now open in the same movie detail view the portals use: playback starts immediately with plot, cast, rating and artwork from TMDB below the player instead of the empty program guide, and closing the player reveals the full poster page. Requires TMDB metadata to be enabled; a toggle in Settings Metadata (TMDB) turns recognition off. (#1420)
portals Year, genre, and country on movie and series detail pages are now clickable (with TMDB metadata enabled): each chip opens a Discover page of popular titles for that facet, marked with what's already in your library matches jump straight to their detail page, the rest open the portal search. Works in Xtream and Stalker, like the existing actor and director chips. (#1453, closes #1449)
portals Movie and series details opened from the dashboard, global favorites, history, or a portal's favorites/recent tabs now offer a "View in portal" button below the main actions. It jumps straight to the title inside its own portal, with the matching category selected in the sidebar. (#1422)
portals Opening a series now lands on the season you'd actually continue: the earliest season with unwatched episodes, or the latest season once everything is watched instead of always starting at season 1. (#1469, closes #1441)
portals Series detail pages can now mark a whole season as watched (or unwatched) in one click the new button next to "Download season" works for both Xtream and Stalker portals. Handy when you start a show mid-way: mark the earlier seasons watched and the Play button jumps straight to your next unwatched episode. (#1447, closes #1442)
portals The series pages' season header now has a menu that marks the WHOLE series as watched (or unwatched) in one click, for both Xtream and Stalker portals. On Ministra portals that load seasons lazily, the app first fetches the remaining seasons and then marks everything so catching up on a show you started mid-way is a single action. (#1451, closes #1442)
portals Movies that exist in several of your playlists now show a "Sources" chip on the detail page. Switch playlist mid-film and playback continues from the same timecode, pin a preferred source per movie, and when a stream dies the error screen offers the alternatives instead of a dead end. Optional auto-switching is off by default. (#1286)
portals The movie page's Sources popup now always fits on screen only the source list scrolls, and it flips below the button in short windows and gains All / Available / HD+ / language filters ("Available" checks every source on first use). Expanded copies show the stream title with only what differs, availability results are remembered, and Favorites/Download became icon buttons with live progress. (#1359)
remote-control The mobile remote now works in live TV favorites and recently viewed per-portal and global for M3U, Xtream and Stalker: channel switching, number select, and now-playing status follow the on-screen list. The remote no longer shows a channel as playing after leaving the player, Stalker radio reports its status, and volume buttons grey out when an external player owns the audio. (#1399)
settings Settings sections are now separate pages with shareable URLs and a floating Save/Discard bar that appears only when you have unsaved changes; leaving settings with pending edits asks whether to save, discard, or keep editing. The EPG panel's "Open EPG settings" button now jumps straight to the EPG settings page. (#1384)
settings A new setting drops the country prefix from live channel names, turning "UK - BBC One" into "BBC One" in lists, the guide and the player. Movie and series titles are left alone, and names that only look like a prefix "Sky - Sports F1" stay intact. (#1263)
stalker Stalker portals now have an Account info dialog subscription status, tariff plan, expiry date with a days-left counter, login, and portal details. Open it from the header playlist menu, the dashboard source card, or the command palette, same as for Xtream. If the portal is unreachable, the data saved when the portal was added is shown instead. (#1330)
stalker Stalker portals that ask for a login and password now work: the import dialog gained username/password fields and the app completes the portal's do_auth step. When a portal refuses access, its own explanation is shown instead of a generic error, saved sessions resume without re-authenticating, and the keep-alive ping follows the portal's cadence. (#1354)
stalker Stalker portals now check the MAC address as you type it and fix hyphens or lowercase for you, with a warning when it sits outside the range most portals accept. Device IDs can optionally be generated from the MAC the way StbEmu does, and a portal that already has a different device ID on file finally says so instead of reporting damaged hardware. (#1370, closes #927, closes #860)
stalker Stalker movie and series catalogs now load continuously as you scroll portal pages append into one seamless list, tall windows fill themselves, and a failed page keeps what's loaded and offers a retry. The Live TV "all channels" grid and portal search follow the same style, and search can page past its first hundred results. Pagination is gone from the app entirely. (#1395)
stalker The Live TV section loads its full channel list up front: search covers every channel instead of only the page you are on, genres show how many channels they hold, and Live TV opens on a grid of all channels. Guide data for the visible rows loads in bulk, so it shows up without playing a channel first. (#1263)
stalker Stalker setup now accepts hosts or /c, discovers the working API endpoint and authentication mode, and rechecks edited connection details. Canceled or failed edits leave saved and active sessions unchanged. Completed edits reject old configuration requests and late responses. Timed-out authentication stays fenced until its transport settles. (#1391)
tmdb Settings Metadata (TMDB) now shows how many entries the metadata cache holds and how much space they take, with a button to empty it. Clearing costs nothing but the next few lookups enrichment refetches on demand. (#1244)
tmdb Series pages show whether a show has ended or is still returning, so you know before committing to it. Directors and creators became clickable avatar chips like the cast they open the person's page, where directing credits now sit alongside acting ones. (#1263)
ui Live channel rows now stack their action buttons vertically favorite on top, programme info below so the extra button costs no horizontal space. The programme-info button is now also available in the Xtream and Stalker channel sidebars, and its slot stays reserved while EPG data loads, so buttons never jump. (#1341, closes #1128)
ui On phone-sized screens the categories and filters panel no longer sits stacked above the content it is now a slide-in drawer, opened from a new button in the header and closed by picking an entry, tapping outside it, or pressing Escape. The content gets the whole screen while browsing. (#1332, closes #1100)
xtream Catch-up is available from Favorites and Recent, not just Live TV, so an archived programme is reachable wherever the channel is. The programme currently on air can also be restarted from the beginning. (#1263, closes #1138)
xtream Live channels with provider catch-up now show a small archive badge in the channel sidebar next to the channel name, on the "all channels" grid cards, and in the favorites and recently-viewed lists (including global favorites). Hovering it shows the catch-up window in days. (#1341, closes #1128)
xtream Xtream movie, series, and live catalogs now load continuously as you scroll instead of flipping through pages more items appear automatically as you near the bottom, and taller windows fill themselves on open. Opening a title and going back returns you to the exact spot in the list. In-category search and the in-portal search results follow the same continuous style. (#1392)
xtream Continue Watching resumes a series where you left it: opening one from the dashboard starts the exact episode at its saved position, and the series page offers "Play episode N" instead of always starting at the first one. Episodes launched in MPV or VLC count towards this too. (#1263)
xtream The movie sources popover now recognizes more language tags: prefixes with Unicode pipes, brackets or dashes ("EN ", "[EN] ", "EN - "), Cyrillic tags (" | ") and MULTI. It also reads the language off category names ("EN | Netflix"), and a tag welded to a title ("EN|Movie") no longer hides that copy from the other playlists' copies of the same movie. (#1417)
All fixes (76)
backup Backups carry hidden Xtream categories correctly. An export used to lose which categories you had hidden, and restoring such a backup then hid every category of that kind. (#1263, closes #1017)
components Confirmation dialogs are wider by default, so their action buttons sit side by side instead of wrapping into a vertical stack with longer translated labels. (#1448)
dashboard The dashboard hero now shows the same backdrop as the detail page. Stalker movies and series reuse the artwork saved when you opened them, and the metadata lookup behind the hero uses the release year and original title instead of the bare title so titles TMDB knows more than once ("") no longer come up empty. (#1362)
dashboard Movies and series you have opened before now show their artwork, rating and genres on the dashboard far more reliably, and seed the recommendations rail. Previously the dashboard searched TMDB by title alone, so common titles like "Inside Out" matched nothing it now reuses what the detail page already found. (#1423)
dashboard Trending cards, the "Similar" rail and actor filmographies no longer show a title as missing from your library when your playlists hold several versions of it. A catalog with both "Dune 1984" and "Dune 2021" used to keep whichever came first, so the other one lost its link even though you had it. (#1425)
database SQLite diagnostics now record only statement types, preventing playlist credentials and other private values from appearing in trace logs. (#1315)
deps Database workers now use updated SQLite bindings that avoid a crash during worker shutdown. (#1415)
downloads Downloads from portals that cut long connections no longer die with "aborted": the app now reconnects automatically and continues from where the transfer stopped. Resume also works on servers that send no ETag/Last-Modified the app re-checks a 256 KiB overlap against the saved partial before appending, and only gives up after repeated reconnects make no progress. (#1446)
downloads Xtream movie and episode downloads now keep their provider-compatible identity from the first request through legacy retries after source removal. Recoverable connection drops retain validated partials and show a credential-safe code; Retry resumes only with ETag or Last-Modified, otherwise it safely restarts. (#1329, closes #897, closes #1289)
electron-backend Cancelling a large Xtream import now stops database work even while it is running at full speed, instead of letting the import finish before processing the cancel request. (#1295)
electron The desktop remote-control server now blocks crafted static paths from escaping bundled web files on Windows. (#1267)
embedded-mpv Opening the volume, audio, subtitle, speed or aspect menu in the Embedded MPV player no longer makes the video jump or leave a black bar above the controls: the menus now unfold inside the control bar instead of floating over the video. (#1339, closes #1139)
embedded-mpv On Windows and Linux displays scaled above 100%, the Embedded MPV video was drawn toward the top-left corner at a fraction of its size, in windowed and fullscreen mode alike. The video now fills the player area correctly at any display scale and page zoom, with no need for a high-DPI compatibility workaround. (#1339, closes #1139, closes #1145)
epg A database error while looking up manual EPG channel mappings no longer breaks the request that triggered it. Searching for a channel in the "Map EPG channel" dialog, or saving and removing a mapping, now degrades gracefully instead of failing outright. (#1291)
epg A database error while reading or saving a manual EPG channel mapping no longer surfaces as a failed request. Looking up, saving, deleting, and searching mappings now fall back quietly, so a transient storage hiccup can no longer take down the EPG panel or the "Map EPG channel" dialog. (#1279)
favorites Favorites stop losing changes. The custom drag-and-drop order of an Xtream playlist's own favorites is saved again, and two favorites or history entries added at almost the same moment no longer quietly overwrite each other. (#1263, closes #1137)
i18n Translations across the app are clearer and more consistent in supported languages. (#1390)
m3u When a channel plays in MPV, VLC or the embedded MPV player, the custom User-Agent, Referer and Origin saved on the M3U playlist now reach the player. Per-channel #EXTVLCOPT headers still win; the playlist values only fill the gaps. VLC now also sends the Origin value as a real HTTP header, as MPV already did. (#1397, closes #1221)
m3u Playlists with very long stream URLs Pluto TV style lists that carry a session token in every link import in full again instead of collapsing into a single channel. (#1263, closes #1189)
matching Movies whose name is a short abbreviation AKA, RRR, IO, VFW, Y2K are no longer mistaken for a language tag and filed under their release year alone. They now match their own copies in your other playlists, so alternative sources, recommendations and pinned sources land on the right film instead of an unrelated one that happens to share that year. (#1426)
packaging Snap packages now launch correctly with the desktop runtime scripts required by their generated startup command. (#1406)
playback Unavailable streams no longer appear as unsupported codecs. When Video.js exposes a server error such as HTTP 404, the player shows that status; otherwise ambiguous source errors remain unidentified instead of guessing. (#1314, closes #1159)
playback The embedded MPV video no longer drifts out of its frame when the layout shifts around it for example when the channel sidebar or the EPG panel finishes loading after playback has started. The player now notices such moves and snaps the video back into place within half a second. (#1476, closes #1428)
playback MPV and VLC recovery actions now stay available, show precise opening, started, playing, and failure feedback, and prevent overlapping launches. The dock keeps Stop available when teardown is still needed and lets terminal errors be dismissed. (#1388)
playback The screen no longer dims or goes to sleep while a built-in player is playing video including on Linux desktops, where the system idle timer used to ignore the app. Pausing or stopping hands control back to the system immediately, and radio playback deliberately leaves the display free to sleep. Works in both the desktop app and the PWA. (#1405, closes #1095)
playback Playback keyboard shortcuts now work with the default player setup: Space/K (play/pause), F (fullscreen), / (seek 5s in VOD), / (volume), and M (mute) act on the built-in HTML5, Video.js, and ArtPlayer players without turning on shared player controls matching what the in-app shortcut list already promised. (#1398)
playback Switching the video player from the command palette or the settings page now takes effect immediately on an already-playing Xtream or Stalker stream instead of waiting for the player to be reopened. Playback also starts with the saved player right away, without briefly mounting the default engine first. (#1437)
playback MPEG-TS playback is now more reliable on newer Safari versions when streams contain audio timestamp gaps. (#1412)
playback External MPV and the embedded MPV frame-copy engine no longer truncate HTTP headers that contain commas most notably the Stalker MAG user agent. Strict portals validated that header and rejected live streams with HTTP 400, so channels that only worked in VLC now also play through MPV. Completes the same fix that landed for the native embedded MPV view. (#1323, closes #910)
playback When playback fails, IPTVnator now ranks useful next steps from the reported error, including another compatible built-in player, MPV/VLC, Retry, or another source. Trying a built-in recommendation affects only the current item and does not change the saved player setting. (#1374, closes #1159)
playback Playback recovery now removes old error actions as soon as a new source or player starts, even while Electron prepares stream headers. Stalker series playing inline now picks up refreshed episode names and navigation, and safely disables episode commands if the playing episode disappears. (#1374)
playback DASH playback now resets a failed media buffer before switching variants, avoiding repeated append failures and crashes on affected platforms. (#1411)
playback Playback recovery no longer crosses into a different selected channel, movie, or exact Stalker episode. Switching content while a stream resolves no longer restores stale playback or shows an error from the previous selection. (#1374, closes #1159)
playback Stalker streams that require the portal session now play in the built-in players (HTML5, Video.js, ArtPlayer), not only in VLC/MPV: the player's requests carry the portal cookie and token, scoped to that stream and dropped when the player closes or the channel changes. VOD, series and radio get the same headers live TV had also from Favorites and Recently Viewed. (#1335, closes #849, closes #910, closes #732)
playback HLS failures now use confirmed player evidence such as the failed stage, timeout, and HTTP status. Recoverable retries stay silent, and technical details no longer include raw provider error payloads. (#1316)
playback MPEG-TS playback errors now show exact engine evidence, including HTTP status, without exposing provider response details. Format, codec, truncated-stream, and MediaSource failures now produce more accurate fallback guidance. (#1327, closes #1159)
playback Shaka playback errors now use exact engine evidence, including subtitle parsing, preserve external-player fallback when browser prerequisites are missing, keep recoverable retries non-terminal, and omit provider URLs, credentials, and response data from technical details. (#1318)
playback The default web player now reports safer, more accurate streaming errors: confirmed network and encrypted-segment failures keep structured details, while ambiguous Video.js errors remain unknown instead of suggesting the wrong cause. (#1317)
playback The "Show subtitles" setting now works in the built-in players: turning it off hides subtitles a stream switched on by itself, and the preference finally applies on Xtream and Stalker pages too. Previously it only reached the M3U player, and even there Video.js and ArtPlayer ignored it. The player's own subtitle menu still overrides the setting for the current stream. (#1269, closes #1155)
playback Video.js now shows its own control bar (play/pause, seek, volume, quality, fullscreen) on Live TV channels. Previously live streams played with no visible controls at all, because switching to a live source rebuilt the video element and the controls never came back. (#1385)
playlist Opening an .m3u/.m3u8 file from the command line or by double-clicking it now actually imports the playlist previously nothing happened at all. Opening a playlist while IPTVnator is already running works too, and on macOS the file arrives through the system "open with" event. (#1299)
playlist IPTVnator now registers itself with the operating system as a handler for .m3u and .m3u8 files, so Finder, Explorer and Linux file managers offer it in "Open with" and a double-click actually opens the playlist. Installing or updating the app is enough no manual file-type setup. (#1301)
playlists One unreachable playlist no longer holds up the rest. Refreshes give up after 30 seconds and run a few at a time, so your other playlists still update, and the message on startup names how many actually failed instead of always claiming success. (#1263, closes #931)
portals Importing an Xtream backup now restores all preferred VOD sources together. If restoration or cleanup fails, the catalog stays retryable and remains blocked until the parked state is safely consumed, preventing stale replay from overwriting newer choices. (#1311)
portals Greek titles now match no matter which sigma the provider typed. A word-final and a medial at the end of a word are treated as the same letter, so finding a film in your other playlists, the "Similar" rail, actor filmographies and TMDB enrichment no longer miss a Greek movie purely because two catalogues spelled its last letter differently. (#1310)
portals In the self-hosted web version, a provider that accepted a connection and then went silent could hang a request until the operating system gave up, with no way to cancel it. Requests now time out on the same schedule as the desktop app, and a host that fails to answer twice is skipped for a short while instead of stalling every following request. (#1424)
portals Going back from a Stalker title you reached with "View in portal" now returns you to exactly where you were the same favorites or history tab, with the title still open instead of dropping you on the Live TV tab. (#1435)
portals Refreshing an Xtream source keeps your favorites, watch history, hidden categories and playback positions. Starting the same refresh twice at once from the header and from the sources page used to wipe them, because the second run saved an already-emptied catalog over the first run's copy. (#1431)
pwa The self-hosted web backend now gives each provider connection attempt enough time to fall back from an unreachable IPv6 route to working IPv4 common behind VPN containers like Gluetun instead of failing with a bare "Bad Gateway". Provider errors now name the underlying network code (for example ETIMEDOUT) in the app and in the container logs. (#1404, closes #1400)
pwa Self-hosted web backends started without CLIENT_URL now allow the documented http://localhost:4333 origin instead of the retired public demo URL, so a manual (non-Docker) deployment no longer fails every provider request with a CORS error. (cb37f62)
pwa The self-hosted web app now talks to Stalker portals exactly like the desktop app: MAG User-Agent, full STB cookie, serial-number header, and the JsHttpRequest marker every real client sends so portals that worked only in the desktop app now work in the PWA too. Portal credentials (MAC and session token) no longer travel in the portal request URL, keeping them out of server logs. (#1348)
search The search box no longer loses what you are typing when the page updates its address at the same moment switching a downloads filter and immediately typing used to wipe the term, and fast typing could snap back to an earlier word. (#1432)
search Searching for names that carry punctuation inside them "A&E", "X-Men", "L'Equipe" finds them anywhere in a title, including channels the provider prefixes, like "US: A&E". (#1263, closes #1161)
search Typing a space in the portal search box and pausing briefly no longer deletes the space continuing to type "Bein Sports" no longer collapses into "BeinSports". (#1474, closes #1338)
settings Launching IPTVnator a second time now brings the running window to the front instead of starting a rival copy that could not save anything a common reason settings appeared to reset on restart. If saving or loading settings does fail, the app now says so instead of silently showing defaults. (#1272, closes #1156, closes #102)
settings Unsaved settings edits no longer vanish silently when you close the window, quit the app, or reload the page. The desktop app now asks whether to save, discard, or keep editing the same dialog in-app navigation shows and only closes once your choice is applied; a failed save keeps the window open. In the browser, the native leave-page warning appears instead. (#1394)
stalker A Stalker portal is no longer re-probed and reclassified because something in front of it a proxy or firewall, not the portal answered with a short "Access denied" page. Only the portal's own authorization replies count now. (#1358)
stalker Stalker portals now receive channel commands exactly as a real set-top box sends them: already-encoded parts of a channel's cmd are no longer double-encoded, so strict portals and reseller panels that compare the command literally work again. Playing Stalker channels from Favorites or global collections now also handles portals that answer with relative stream paths. (#1334)
stalker Series opened from Favorites, Recent or the dashboard show their current episodes. One saved back when a single episode existed used to keep showing that one episode forever; the list is refreshed from the portal in the background instead. (#1263)
stalker Stalker portals are no longer classified by their URL shape: importing probes the real API endpoint (portal.php vs server/load.php) and checks whether the portal actually requires authentication. Canonical Ministra URLs finally load content, /c addresses resolve correctly, and misclassified existing portals repair themselves on first failure keeping favorites and history. (#1344, closes #850, closes #686, closes #755)
stalker Stalker Live TV now shows the currently airing programme even on portals whose bulk EPG only lists upcoming shows: channel rows fall back to a per-channel short-EPG lookup, and the EPG panel merges "what's on now" into the schedule instead of showing future programmes only. (#1386)
playback Stalker live TV plays again in the embedded MPV player. The MAG250 user agent contains a comma (KHTML, like Gecko), which MPV splits in its comma-separated --http-header-fields list, truncating X-User-Agent so strict portals reject the stream with HTTP 400. Commas and backslashes in header values are now escaped on the Windows/Linux and macOS embedded-MPV paths. (#1321)
stalker Stalker portals whose server redirects to https or to another port no longer lose their session mid-request. Since 0.22 such redirects silently dropped the portal's MAC cookie and auth token, so categories failed to load and streams never reached any player. Downgrade redirects from https to plain http still strip credentials, so a secure session is never sent in cleartext. (#1322, closes #1158)
stalker Stalker VOD series now report progress correctly when portals return boolean series flags, keep episode progress separate between shows, and resume positions saved by earlier versions. (#1315)
stalker Stalker channels that the portal serves directly now start without an extra link request to the portal, so they open faster and no longer fail when that request does. Channels the portal does proxy still get their temporary link, and radio stations the portal proxies now get one too instead of playing a URL the portal never meant to serve. (#1364)
tmdb Movies whose provider ships a dead or wrong TMDB id are enriched again. The id is weighed against the title and release year: a dead one falls back to the title search, a stale one that clearly points at another film loses to it, and a working id is no longer thrown away just because the provider spells the title differently. (#1239)
tmdb Series detail pages now list the cast of the whole show instead of only its newest season, so actors who left partway through stop disappearing from long-running shows while people who joined for the current season still show up. (#1242)
tmdb Titles that providers dress up with language or quality tags "|ALB| Fallout", "4K-DE - The Pitt (2025)", "Breaking Bad-eng" now match against TMDB, so they get artwork, plot and cast like the rest of the catalog. Shows split into one entry per season also pull the season that entry really contains. (#1263)
ui IPTVnator is usable on a phone again. The navigation bar no longer sits off screen, category and channel lists take the full width instead of squeezing the content into a sliver, the video keeps a usable share of the screen, and the M3U channel list can be reopened after hiding it. (#1326, closes #1100)
ui Narrow EPG channel rows now keep the current programme, progress, and enabled channel actions visible instead of dropping useful context. (#1312)
window-controls On Windows, the minimize, maximize and close buttons disappeared for good after leaving fullscreen video playback the only way to get them back was to restart the app. They now reappear as soon as you exit fullscreen, and the maximize button no longer gets stuck on the wrong icon afterwards. (#1178)
workspace The playlist dropdown in the header shows a "Playlist info" entry for the active playlist again, next to "Account info" and "Add playlist" it had disappeared when playlist actions moved into the per-row menu. (#1328)
workspace The playlist sync overlay no longer shows a bare "Syncing playlist" card when an Xtream playlist is loaded from the local library. Reading the saved catalog from this device now reports its own phase, so the overlay always shows a source badge and explains what is happening remote fetch or local read. (#1345)
xtream Portals sitting behind Cloudflare or a similar firewall connect again. Those setups answered the app with a challenge page instead of data, so "Test connection" failed on portals that worked fine in every other player; requests now identify themselves the way an ordinary IPTV player does. (#1263)
xtream Series pages no longer show a raw image link under the season tabs when the provider fills the season description with a cover URL. URL-only descriptions are dropped, and with TMDB metadata enabled the missing season description is filled from TMDB instead. (#1382)
xtream Xtream movies remain playable when a portal omits extended VOD metadata, using catalog stream details to build the playback URL. (#1303)
Performance (4)
m3u Importing large M3U playlists is faster because IPTVnator no longer rewrites the entire playlist when loading saved favorites. (#1232)
m3u Cancelling a large M3U refresh now stops its background worker before parsed channels can be copied or saved, keeping the interface responsive and leaving the existing playlist unchanged. (#1268)
portals Unreachable Xtream and Stalker portals no longer cost a 30-second wait per request. After a host fails to answer twice, further requests to it fail immediately for 30 seconds, so browsing a dead portal stops filling the screen with long spinners. Retrying, testing the connection, or editing the portal address contacts it again right away. (#1421)
stalker Detail pages for anything that is not a series a movie, a live channel, a VOD item that only looks like a series no longer fire an episode-list request before they can show anything, so they open faster on every route in, from browsing and search to Favorites, Recent and the dashboard. (#1263)
What's Changed merged pull requests (232)
fix(tmdb): fall back to original language for missing trailers too by @4gray in #1136
feat(portals): back button on the in-portal search page by @4gray in #1142
fix(xtream): send player-style User-Agent to avoid WAF challenge by @sh3rencr in #1170
fix(favorites): persist custom drag-and-drop order for Xtream favorites by @4gray in #1143
fix(theme): make scrollbars follow the app theme instead of the OS color scheme by @4gray in #1179
fix(lint): quote eslint globs so Linux CI lints the full web-backend and database trees by @4gray in #1177
fix(e2e): stop saveSettings hanging on a spurious form-submit navigation wait by @4gray in #1180
feat(embedded-mpv): frame-copy rendering engine (experimental, macOS Apple Silicon) by @4gray in #1169
feat(embedded-mpv): Linux port of the frame-copy rendering engine (headless EGL) by @4gray in #1171
feat(embedded-mpv): Windows frame-copy port (WGL + named shm) by @4gray in #1175
feat(player-controls): shared engine-agnostic controls layer (flag off) [1/7] by @larsemig in #1148
refactor(embedded-mpv): split session controller into focused collaborators [2/7] by @larsemig in #1149
feat(embedded-mpv): use shared controls for frame-copy by @4gray in #1193
feat(html-player): add feature-flagged shared controls by @4gray in #1194
feat(videojs): add feature-flagged shared controls by @4gray in #1195
feat(artplayer): add feature-flagged shared controls by @4gray in #1196
feat(settings): add shared web player controls toggle by @4gray in #1198
feat(playback): add shared picture-in-picture controls by @4gray in #1199
feat: add strip country prefix setting by @Alanon202 in #1162
feat(xtream): resume the latest series episode by @MahdiHrm in #1187
feat(packaging): ship Linux embedded MPV frame-copy runtime by @4gray in #1200
fix(packaging): preserve Flatpak Electron ELF for Zypak by @4gray in #1205
feat: add catch-up functionality from global favourites & catch-up of currently live programme by @Alanon202 in #1166
fix(playback): position embedded MPV native view correctly on scaled displays by @4gray in #1206
ci(release): make test draft releases traceable and self-cleaning by @4gray in #1202
fix: redact sensitive log data by @4gray in #1182
fix(m3u): parse playlists with URLs longer than 2084 characters by @4gray in #1204
feat: manual EPG-to-channel mapping with mapping fallback by @Alanon202 in #1165
feat(about): show build commit next to the app version by @4gray in #1208
refactor(database): split EPG mapping schema out of oversized schema.ts by @SalemOurabi in #1213
fix(playback): route MKV sources as Matroska by @4gray in #1210
feat(epg): manual EPG mapping for Stalker portals by @4gray in #1173
fix(embedded-mpv): stop native-view video jump by moving control menus into the dock by @4gray in #1207
feat(matching): strip appended language/quality tags in title normalization by @4gray in #1211
fix(epg): harden three latent edges from the #1165 manual-mapping review by @4gray in #1214
fix(portal): remove redundant catalog type badges by @4gray in #1217
fix(stalker): preserve is_series episode metadata by @4gray in #1218
fix(catchup): parse negative sub-hour XMLTV offsets correctly by @SalemOurabi in #1216
feat(stalker): full Live TV channel list complete search, count badges, all-channels grid by @4gray in #1209
feat(playback): theater stage and opt-in ambient fill for the inline portal player by @4gray in #1223
feat(tmdb): clickable director/creator chips and directing credits on person pages by @4gray in #1227
fix(search): find punctuation-joined words like "A&E" anywhere in titles by @4gray in #1172
fix(tmdb): resolve season number from title markers for per-season series slices by @4gray in #1229
Add download pause and resume support by @genrichh93-ui in #1147
feat(playback): show media title overlay in fullscreen shared controls by @4gray in #1228
feat(m3u): DASH + ClearKey playback via Shaka Player by @4gray in #1225
fix(backup): export and restore hidden Xtream categories by real xtream IDs by @4gray in #1224
fix(playlist): bound playlist downloads and isolate startup auto-update by @4gray in #1233
fix(playlists): report failed playlists in the startup auto-refresh toast by @4gray in #1235
feat(m3u): support #KODIPROP lines placed before #EXTINF by @4gray in #1234
feat(i18n): add Hungarian translation (hu) by @4gray in #1236
feat(playback): Up Next episode rail for the inline series player by @4gray in #1231
fix(ci): restore green master pipeline (hu locale drift, CodeQL upload) by @4gray in #1237
ci: cancel superseded PR runs, skip docs-only builds, lint affected on PRs by @4gray in #1226
feat(tmdb): series production-status chip and person death dates by @4gray in #1240
docs(tmdb): record the TMDB capability roadmap by @4gray in #1238
perf(stalker): skip wasted series-seasons request for non-series items by @4gray in #1241
fix(stalker): refresh stale embedded-series snapshots from favorites and dashboard by @4gray in #1253
chore(release): author release notes in .changes instead of reconstructing them by @4gray in #1256
fix(playlists): serialize per-playlist collection writes to prevent lost updates by @4gray in #1255
fix(ci): classify release-tools in the coverage policy by @4gray in #1260
ci(release): gate PRs on an authored release note by @4gray in #1257
feat(release): manifest-driven screenshot capture with fail-closed mock-data guards by @4gray in #1261
fix(tmdb): stop a broken provider tmdb_id from suppressing enrichment by @4gray in #1239
feat(tmdb): metadata cache panel with a clear button in settings by @4gray in #1244
chore(release): drop the superseded v0.20 screenshot script by @4gray in #1262
fix(window-controls): derive window-state pushes from events so controls reappear after fullscreen by @4gray in #1178
fix(tmdb): series cast was the latest season only, not the show by @4gray in #1242
fix(m3u): avoid persisting hydrated favorites by @4gray in #1232
fix(deps): patch transitive runtime CVEs via pnpm overrides by @4gray in #1258
chore(deps): bump actions/upload-pages-artifact from 3 to 5 by @dependabot[bot] in #1248
chore(deps): bump codecov/codecov-action from 6 to 7 by @dependabot[bot] in #1246
perf(m3u): stop cancelled refresh workers by @4gray in #1268
fix(playback): make the "Show subtitles" setting reach the web players by @4gray in #1269
chore(deps): bump the npm minor/patch group across 44 packages by @4gray in #1270
ci(deps): bump checkout/upload-artifact/download-artifact majors by @4gray in #1264
build(docker): move image to node 24 and install pnpm without corepack by @4gray in #1265
refactor(deps): drop uuid for a shared crypto-based id helper by @4gray in #1266
test(electron): harden runtime boundary coverage by @4gray in #1267
refactor(settings): split the settings page into per-section facades by @4gray in #1274
test(perf): add request-scoped M3U benchmark profiling by @4gray in #1275
docs(release): backfill curated 0.23.0 release notes, fix the notes CLI -- trap by @4gray in #1263
refactor(electron-backend): split four files under the max-lines limit by @4gray in #1278
fix(perf): make process memory captures comparison-safe by @4gray in #1280
feat(mock-data): add shared screenshot-safe poster catalog by @4gray in #1271
test(settings): split the settings spec along the facade seams by @4gray in #1277
fix(epg): await mapping queries so lookups fail soft by @4gray in #1279
test(performance): add formal M3U import benchmark by @4gray in #1287
refactor(electron-backend): split the last four files over the max-lines cap by @4gray in #1288
test(performance): deflake the real-timer event-loop delay spec by @4gray in #1293
fix(packaging): stop the Linux frame-copy probe timing out on cold sandboxes by @4gray in #1294
fix(electron-backend): process zero-delay database cancellation by @4gray in #1295
fix(epg): make manual EPG mapping lookups actually fail soft by @4gray in #1291
fix(electron-backend): make test suite and lint host-agnostic on Windows checkouts by @4gray in #1176
fix(settings): stop settings silently reverting on restart by @4gray in #1272
chore(deps): bump github/codeql-action from 3 to 4 by @dependabot[bot] in #1282
chore(deps): bump actions/deploy-pages from 4 to 5 by @dependabot[bot] in #1283
test(performance): add end-to-end Xtream benchmark harness by @4gray in #1300
chore(deps): bump actions/cache from 4 to 6 by @dependabot[bot] in #1281
chore(deps): bump actions/setup-node from 4 to 7 by @dependabot[bot] in #1285
chore(deps): bump softprops/action-gh-release from 2 to 3 by @dependabot[bot] in #1284
fix(e2e): reap data directories abandoned by earlier runs by @4gray in #1296
refactor(portals): share external-button and position-writer logic by @4gray in #1298
fix(playlist): open playlists handed over by the OS by @4gray in #1299
test(performance): bound worker sampling finalization by @4gray in #1302
feat(packaging): register IPTVnator as the .m3u/.m3u8 handler by @4gray in #1301
test(performance): stabilize Xtream benchmark startup by @4gray in #1304
test(performance): preserve delayed worker ELD samples by @4gray in #1305
test(performance): harden Xtream startup retry by @4gray in #1307
chore(lint): hold tests to their own max-lines ceiling by @4gray in #1306
fix(xtream): keep sparse VOD details playable by @4gray in #1303
test(performance): prevent renderer heartbeat omission by @4gray in #1308
feat(portals): find the same movie in your other playlists by @4gray in #1286
fix(portals): reach a word-final sigma from either case by @4gray in #1310
fix(portals): restore fresh-import pins atomically by @4gray in #1311
fix(playback): avoid false codec diagnostics by @4gray in #1314
fix(playback): structure HLS diagnostics by @4gray in #1316
fix(skills): align repository guidance with implementation by @4gray in #1315
fix(ui): preserve EPG in narrow channel rows by @4gray in #1312
fix(playback): structure Video.js diagnostics by @4gray in #1317
fix(playback): structure Shaka diagnostics by @4gray in #1318
fix(packaging): add verified source mirror fallback by @4gray in #1325
fix(playback): escape commas in mpv http header fields by @wretchwatson in #1321
fix(playback): escape commas in mpv header fields on the TS paths by @4gray in #1323
fix(playback): structure MPEG-TS diagnostics by @4gray in #1327
fix(stalker): keep session headers on same-host redirects by @4gray in #1322
feat(downloads): redesign download manager by @4gray in #1313
fix(ui): make the workspace usable on phone-sized screens by @4gray in #1326
fix(workspace): restore playlist info entry in header playlist dropdown by @4gray in #1328
test(stalker): enforce portal auth in the mock and cover the full-portal flow by @4gray in #1324
test(playlist): fix flaky refresh-preparation worker-event spec by @4gray in #1331
fix(downloads): resume interrupted Xtream VOD transfers by @4gray in #1329
test(e2e): pin the phone-layout invariants from #1326 by @4gray in #1333
fix(stalker): send cmd in the reference MAG wire format by @4gray in #1334
feat(ui): turn the phone context panel into an off-canvas drawer by @4gray in #1332
docs(release): backfill 0.23 notes for embedded MPV scaling and dock-menu fixes by @4gray in #1339
feat(stalker): add account info dialog for Stalker portals by @4gray in #1330
feat(playback): forward portal Cookie/Authorization to built-in players by @4gray in #1335
ci(nx): enforce synchronized dependency updates by @4gray in #1343
fix(workspace): report a local phase while reading the cached Xtream catalog by @4gray in #1345
feat(dashboard): subscription-expiry warning badge on source cards by @4gray in #1342
fix(pwa): bring the Stalker transport to parity with Electron by @4gray in #1348
feat(stalker): endpoint probing + behavior-based portal mode with lazy repair by @4gray in #1344
fix(dashboard): give the hero the identity the detail view matched with by @4gray in #1362
feat(portals): rework the VOD sources popup and action row by @4gray in #1359
fix(build): include shared UI stylesheets in Nx cache inputs by @4gray in #1360
fix(stalker): anchor auth-failure body detection and share it across transports by @4gray in #1358
feat(downloads): queue season episode downloads by @4gray in #1357
chore(deps): bump angularx-qrcode from 21.0.4 to 21.0.5 by @dependabot[bot] in #1351
fix(stalker): only mint a temporary link when the row asks for one by @4gray in #1364
feat(stalker): protocol-correct auth lifecycle by @4gray in #1354
chore(deps): update Nx to 22.7.2 by @4gray in #1365
feat(stalker): identity hardening by @4gray in #1370
chore(deps-dev): bump angular-eslint from 21.3.1 to 21.4.0 by @dependabot[bot] in #1350
chore(deps): bump github/codeql-action from 4 to 4.37.4 in the actions-minor-patch group by @dependabot[bot] in #1371
chore(deps): bump axios from 1.18.1 to 1.19.0 by @dependabot[bot] in #1367
docs(stalker): reconcile the Stalker docs after the API-compatibility series by @4gray in #1375
feat(playback): recommend recovery actions by @4gray in #1374
test(stalker): isolate auth e2e state by worker by @4gray in #1378
fix(build): prevent Vite dev transform overflow by @4gray in #1379
chore(deps-dev): bump electron from 41.7.2 to 41.10.3 by @dependabot[bot] in #1377
chore(deps): bump pnpm/action-setup from 4 to 6.0.9 by @dependabot[bot] in #1372
fix(xtream): drop URL-only season overviews and fall back to TMDB by @4gray in #1382
fix(stalker): fall back to short EPG when bulk EPG misses the current programme by @4gray in #1386
fix(playback): keep Video.js controls on the live MPEG-TS path by @4gray in #1385
feat(settings): per-section pages with unsaved-changes bar by @4gray in #1384
chore(deps): align Angular packages on 21.2.19 by @4gray in #1383
feat(xtream): catch-up badge for live channels with archive by @4gray in #1341
feat(xtream): replace catalog pagination with infinite scroll (1/2) by @4gray in #1392
fix(playback): clarify external player launch feedback by @4gray in #1388
feat(stalker): append portal pages on scroll and drop pagination everywhere (2/2) by @4gray in #1395
fix(settings): protect unsaved edits on window close, quit, and reload by @4gray in #1394
feat(stalker): discover portal endpoints on add and edit by @4gray in #1391
fix(playback): make playback keyboard shortcuts work without shared controls by @4gray in #1398
fix(m3u): forward playlist-level custom headers to external players by @4gray in #1397
feat(remote-control): cover live collections, honest volume, status resets by @4gray in #1399
chore(deps): align Nx packages on 22.7.7 by @4gray in #1396
refactor(stalker): drop unused limit state from selection feature by @4gray in #1402
fix(pwa): tolerate broken IPv6 routes and surface provider error codes by @4gray in #1404
chore(deps-dev): bump the nx-version-updates group across 1 directory with 11 updates by @dependabot[bot] in #1401
fix(packaging): restore Snap desktop runtime by @4gray in #1406
chore(deps): bump the actions-minor-patch group with 2 updates by @dependabot[bot] in #1403
ci(deps): split sensitive dependency updates by @4gray in #1409
fix(playback): update Shaka Player to 5.2.4 by @4gray in #1411
fix(playback): update mpegts.js to 1.8.1 by @4gray in #1412
chore(deps): update epg-parser to 0.5.0 by @4gray in #1413
chore(deps): bump the npm-minor-patch group across 1 directory with 11 updates by @dependabot[bot] in #1416
chore(deps): bump better-sqlite3 from 12.9.0 to 13.0.3 by @dependabot[bot] in #1415
chore(deps-dev): bump electron from 41.10.3 to 43.3.0 by @dependabot[bot] in #1414
fix(playback): keep the display awake while built-in players play video by @4gray in #1405
feat(dashboard): add TMDB "Because you watched" recommendations rail by @4gray in #1419
feat(xtream): recognize more language tags in VOD multi-source by @4gray in #1417
refactor(portals): compact credential-free logging for failed Stalker requests by @4gray in #1418
ci(embedded-mpv): add pinned mirrors to the Linux runtime source download by @4gray in #1427
feat(portals): add "View in portal" action to inline collection details by @4gray in #1422
perf(portals): fast-fail requests to portal hosts that stopped answering by @4gray in #1421
fix(dashboard): keep every catalog row per title key when matching by @4gray in #1425
fix(search): keep in-flight typing when the page rewrites its query params by @4gray in #1432
fix(matching): keep abbreviation titles out of bare-year keys by @4gray in #1426
feat(playlist): open recognized M3U movies in the VOD detail view by @4gray in #1420
refactor(portals): extract the destructive Xtream refresh into one flow by @4gray in #1431
refactor(portals): split the Stalker collection detail component by @4gray in #1433
fix(portals): return from a portal handoff without losing the collection view by @4gray in #1435
fix(dashboard): reuse the detail view's TMDB identity for activity rows by @4gray in #1423
fix(playback): apply saved player changes to mounted web players by @4gray in #1437
fix(portals): time out and fast-fail PWA proxy requests to dead hosts by @4gray in #1424
test(playback): stub the inline player in the VOD details spec by @4gray in #1440
test(playback): drive embedded MPV controller specs on a fake clock by @4gray in #1434
refactor(playback): extract web player diagnostic/recovery controller by @4gray in #1444
feat(downloads): align manager cards, queue rows, and headings with the rail design language by @4gray in #1448
feat(portals): mark a full season as watched in one click by @4gray in #1447
feat(portals): mark a whole series as watched in one click by @4gray in #1451
fix(downloads): reconnect interrupted transfers and resume without validators by @4gray in #1446
fix(i18n): fix translation with ChatGPT 5.6 Sol by @aiddroid in #1390
feat(playlist): auto-detect import method that parses pasted provider messages by @4gray in #1445
feat(portals): make year, genre and country metadata clickable (#1449) by @4gray in #1453
chore(deps): bump the npm-minor-patch group with 8 updates by @dependabot[bot] in #1459
chore(deps): bump github/codeql-action from 4.37.6 to 4.37.7 in the actions-minor-patch group by @dependabot[bot] in #1463
chore(deps-dev): bump @angular-devkit/schematics from 21.2.19 to 21.2.21 by @dependabot[bot] in #1460
chore(deps-dev): bump @angular/cli from 21.2.19 to 21.2.21 by @dependabot[bot] in #1462
chore(deps): bump ngx-indexed-db from 21.0.0 to 22.0.0 by @4gray in #1472
feat(playback): add quality selection to shared player controls by @4gray in #1470
feat(downloads): track live-TV recordings in the download manager by @4gray in #1452
feat(dashboard): detail-first Continue Watching cards with quick actions by @4gray in #1469
docs(agents): re-run pnpm install after the checkout moves by @4gray in #1473
fix(search): keep a trailing space when the trimmed q echo lands after the debounce by @4gray in #1474
chore(deps): coordinated security sweep for open Dependabot alerts by @4gray in #1475
feat(playback): advanced subtitle support in shared player controls by @4gray in #1471
fix(playback): re-sync embedded MPV bounds on position-only layout shifts by @4gray in #1476
feat(release): announcement formats, highlight cards, and draft verification by @4gray in #1480
ci(embedded-mpv): keep Windows runtime pin available by @4gray in #1495
feat(playback): make the shared player controls the default (#1408) by @4gray in #1485
Release v0.22.0
v0.22 is one of the biggest IPTVnator releases so far. The embedded MPV player expands from macOS to Windows and Linux, detail pages for movies and series got a full redesign, and the app can now enrich your VOD & series content with TMDB metadata posters, cast, trailers and more. On top of that: a built-in desktop updater, global search across all your sources, and a reworked live EPG timeline.
Highlights
Embedded MPV player now available on Windows and Linux (experimental)
TMDB metadata enrichment (opt-in): plots, cast, trailers, similar titles, actor pages
Redesigned VOD & series detail pages with a browse watch layout and season tabs
Desktop auto-updater the app now updates itself from GitHub releases
Global search across all sources, including M3U playlists
Live EPG panel reworked into a timeline with an optional vertical list view
Catch-up/archive playback improvements for Xtream
Custom title bar with window controls on Windows and Linux
Extensive Electron security hardening
Embedded MPV Player now on Windows & Linux (Experimental)
The embedded MPV player introduced for macOS in v0.21 is now available on all three platforms:
Windows: libmpv rendering directly inside the app window (bundled, no extra install)
Linux: playback via the system mpv player embedded into the app window (X11/XWayland; requires mpv on PATH)
Series navigation (next/previous episode) inside the embedded player
Switch to embedded MPV directly from the command palette
Stability hardening across the board: EOF detection, safer polling, better error visibility, and the display no longer goes to sleep during playback
The macOS embedded player also received a round of fixes and polish based on v0.21 feedback.
TMDB Metadata Enrichment (opt-in)
Movie and series detail pages for Xtream and Stalker portals can now be enriched with TMDB data:
Plot, genres, ratings, director and cast with photos, artwork and YouTube trailers
"Similar" rail: TMDB recommendations matched against your catalog across all your portals
Trending on the dashboard: a TMDB-powered trending rail with enriched hero artwork
Real episode names, descriptions and stills for each season
Actor pages: click any cast member to see their bio and filmography, linked back to your catalog or portal search
Localized to your app language (falls back to the original language when a translation is missing), cached locally
Enrichment is off by default and requires a personal TMDB API key (free registration at themoviedb.org). Enter your key and enable the feature under Settings Metadata (TMDB) titles are sent to TMDB for matching.
Redesigned Movie & Series Detail Pages
Detail pages now have two states:
Browse: hero section with poster, metadata and actions, episodes below
Watch: the hero collapses, the inline player takes the full content width, and details move below the episodes
Season tabs with smart auto-selection (jumps to the season you're watching or resuming)
Grid/list toggle for episodes, remembered across sessions
Esc or "Close player" returns to browse without losing your place
Desktop Auto-Updater
IPTVnator now checks GitHub releases and can update itself no more manual downloads
Release notes for the current version are shown in the settings
Fixed a crash in the packaged updater (#1103)
Global Search
New workspace-wide search across all your sources Xtream, Stalker and M3U playlists
Fixed live search (Ctrl+F) opening the wrong channel or category
EPG & Catch-up
Live EPG panel reworked into a horizontal timeline under the player
New optional vertical list view for the live EPG panel
EPG sources can now be scoped per playlist
Compressed XMLTV responses are now decoded correctly
Catch-up (Xtream): active archive playback state shown in the EPG, timeshift URL variants resolved automatically, stream output format auto-selected, active archive program highlighted
Catch-up "Watch" button now works from the unified live tab, with clear errors when a stream can't be resolved
Dashboard
Configurable dashboard rails choose what you want to see
New "Recently added" live channels rail
New "Trending" rail powered by TMDB (when metadata enrichment is enabled)
Faster startup and rail loading
Xtream & Stalker
Sort and filter the VOD/series catalog by IMDb rating
New "all channels" grid for Live TV
Improved compatibility with more portal variants
Stalker: full playlist loading for authenticated routes
PWA: Xtream connection details are now saved properly
UI & Desktop
Custom title bar with window controls on Windows and Linux
Live channels sidebar no longer shares its width with the navigation panel
Sources page visual polish
Security
Extensive Electron hardening: stricter renderer isolation and navigation rules
Scoped trust controls for EPG sources
Blocked private-network redirects for portal probes
Under the Hood
Large test-coverage push (unit + E2E) and CI now enforces lint and file-size limits on every PR
Major internal refactorings: typed Electron bridge contract, split EPG/player services, dead code cleanup
Dependency updates: Angular 21.2.17, axios 1.16.0
Remote control: volume now applies to built-in M3U players
Release v0.21.0
v0.21 focuses on quality-of-life improvements, performance, and playback experience improvements across the app.
This release also introduces one of the most requested features for macOS users: an experimental embedded MPV player built directly into the app no additional installation required.
iptvnator-v0 21-wide-changelog
Highlights
Experimental embedded MPV player for macOS
Toggleable Live TV sidebar and EPG panel
Improved command palette
Better Recently Viewed & Favorites experience
Performance and loading time improvements
Multiple Xtream, Stalker, and M3U fixes
macOS Embedded MPV Player (Experimental)
[macOS only]
IPTVnator now includes an experimental embedded MPV player directly inside the app.
No additional software required just install and use IPTVnator.
This is an early experimental version and feedback is very welcome.
Layout & Navigation
Toggleable sidebar panel for Live TV channels for a more focused viewing experience
Toggle/collapse EPG panel
Command Palette Improvements
Change player directly from command palette
Added section with 5 recently used actions
Favorites & Recently Viewed
Fixed issue where Live TV items appeared favorited by default
Channels can now be favorited directly from Recently Viewed
Remove individual channels from Recently Viewed via context menu
Renamed "GLOBAL Favorites" to simply "Favorites"
Playback & Playlist Management
Fixed MPV/VLC custom path fallback handling
Added manual refresh for playlists added from filesystem
Fixed playlist refresh handling for file-based playlists
Module Improvements
M3U
Cover size setting (XL / L / M)
Sorting for All Channels:
by name
by original playlist order
Improved channel drag & drop ghost styling
Xtream
Better unavailable portal handling
Added clear button to playlist form
Fixed search when no category is selected
Stalker
Fixed 14 items issue
UI & UX Improvements
Improved category count badge styling
Improved No results found screen styling
Performance & Internal Improvements
Performance improvements to reduce loading times
Database WAL improvements
Favorites lookup optimizations
Refactored settings component
Additional facade/internal refactors
Localization
Added missing translation strings for all supported languages
Other Fixes & Improvements
Fixed loading screen issues in download manager
Fixed reset Recently Viewed for M3U module
Release v0.20.0
v0.20 brings a major UI overhaul and improves the overall experience across all modules.
The app now features a unified design for M3U, Xtream, and Stalker, along with a new dashboard that shifts the focus from playlists to content. Navigation, favorites, and search have been reworked to be more consistent and intuitive.
Support the project
If you like IPTVnator and want to support further development:
GitHub Sponsors: https://github.com/sponsors/4gray
Ko-fi: https://ko-fi.com/4gray
Highlights
Unified UI across all modules (M3U, Xtream, Stalker)
New Dashboard as a content-first starting point
Reworked Favorites & Recently Viewed
New Command Palette (Cmd/Ctrl + K)
Dashboard & Navigation
New dashboard screen with basic widgets
Content-oriented start instead of playlist-first approach
Configurable:
Can be disabled
Choose startup view (default vs last opened)
Consistent look & feel across all playlists
Scope-aware search depending on current view
UI & Settings
Reworked settings page
App follows system theme by default
New UI customization options:
Toggle dashboard visibility
Toggle external player bar
External player bar:
Control player directly from the app
Can be hidden in settings
Favorites & History
Reworked Favorites and Recently Viewed:
Channel sorting
Drag & drop support
Integrated EPG view
Fully integrated across all modules
Playlist Management
Reworked Add Playlist dialog:
Unified dialog with tabs (M3U / Xtream / Stalker)
Xtream: option to clear form
Fixed drag & drop import for M3U files
Search & Discovery
Consistent category search across all modules
Xtream:
Category search
Preserve hidden categories after refresh
Module Improvements
M3U
Fully redesigned layout:
Two-column layout for categories & channels
Groups view replaces accordions
Improved consistency:
Sorting
Category management
Channel info dialog available via context menu
Xtream
Improved account information dialog
Stalker
EPG support for Live TV
Channel sorting
System & Platform
macOS version is now signed
Fixed Flatpak version (Linux)
Other Improvements
Fixed playback position saving when using VLC
Fixed M3U drag & drop issues from file system
Improved account information dialog (Xtream)
General UI consistency improvements across modules
IPTVnator v0.19
This is one of the biggest IPTVnator releases so far, with many fixes, refactorings, and features. A lot of reported issues were addressed in this version. I may still have missed something that was reported.
Thank you to everyone who contributed with ideas, bug reports, improvements, and PRs. Biggest kudos to everyone who supported the project with donations. Thank you!
Changes:
Home
Added custom playlist sorting with drag-and-drop reordering.
Added Global Search and Recent Items to the Home header.
Improved Global Search:
Enhanced UI with grouped and ungrouped views.
Added option to include/exclude hidden categories.
Improved globally recent items:
Added Stalker support.
Enhanced UI with grouped and ungrouped views.
Update and sync Turkish translations by @hasanbeder
M3U
Added lazy loading and improved handling for large playlists.
Added Favorites button directly in lists, including group views.
Added lazy loading in group view.
Improved global favorites behavior.
Restored EPG expired programs for catch-up/archive support.
Added resizable sidebar.
Xtream
Playback position is now persisted for started VOD and series content.
Added Download Manager.
Added sorting options for Live TV channels.
Added search in VOD/series categories.
Added sorting in VOD/series categories by name or date added.
Improved search flow: when returning from results, search phrase and results are preserved.
Added list view for series.
Added resizable sidebar.
Stalker
Playback position is now persisted for started VOD and series content.
Added Download Manager.
Added EPG support for Live TV channels.
When no category is selected, all VOD/series categories are now shown.
Added list view for series.
Added resizable sidebar.
Replaced Load more buttons with infinite scroll for Live TV channels.
Remote Control
Added support for Xtream and Stalker portals.
Added EPG info for the current program.
Added channel switching by entering channel number.
Website & Blog
Added a new landing page: https://4gray.github.io/iptvnator/
Added a new blog: https://4gray.github.io/iptvnator/blog
v0.18 Release Notes
Support the project
GitHub Sponsors https://github.com/sponsors/4gray
Buy me a coffee https://ko-fi.com/4gray
USDT (TRC20) TLz5rTS7QTxYGfRH1Pm6Hs9fewqstDM47c
Changelog:
General
feat: New playlist switcher UI a unified and cleaner way to switch between playlists
style: Global favorites moved to the header for quicker access
style: Sort and filter options merged into a single header menu
M3U
feat: Improved EPG download and parsing to better handle large EPG files
feat: Added a popup dialog showing EPG download progress
fix: Restored quality selector for the Video.js player
Xtream & Stalker
style: Improved look and feel of the details view for VODs and TV shows
fix: Fixed opening favorite items with embedded players
Xtream
feat: Category management (hide/show categories)
feat: Display item counts per category
feat: New separate view for recently added items
feat: Show recently added items when no category is selected
fix: Fixed empty categories issue
fix: Restored import progress counter
Stalker
feat: Added support for playlists that require device IDs and signatures
Some playlists are still not supported more testing data is needed
Before updating, please make sure to back up your playlists, credentials, URLs, and other important data.
What's Changed
refactor/merge-playlist-filter-and-sort-into-one-menu by @4gray in #694
chore: improve player error handling by @4gray in #698
feat(db): add shared database library with sql config by @4gray in #701
refactor(electron-backend): split DB event handlers into modules by @4gray in #702
refactor: move global favorites to header by @4gray in #703
refactor/streaming-sax-epg-parser by @4gray in #706
chore: update nx dependencies by @4gray in #708
feat/improve-stalker-support by @4gray in #709
style/visual-improvements-in-vod-and-serials-view by @4gray in #710
feat/epg-improvements by @4gray in #711
feat: enhance favorites button and series view with loading states and improved styling by @4gray in #712
Feat/category management xtream by @4gray in #715
e2e smoke tests by @4gray in #717
feat/introduce-playlist-switcher by @4gray in #721
fix/stalker-favorites by @4gray in #725
refactor/store-refactoring by @4gray in #724
fix/pre-release-fixes-v0-18 by @4gray in #726
ci: run workflows on master branch instead of nx by @4gray in #729
fix(vjs-player): replace HLS quality plugin and add plugin guards by @4gray in #730
v0.17.1
Bugfix Release
Fixed macOS ARM build issues
Use filename as channel title when importing from file
Improved readability of playlist metadata line
Keyboard hotkeys are now ignored while searching for channels
Restored context menu (cut / copy / paste / select all) for input fields
Resolved Linux sandbox startup issues (added troubleshooting section to README)
v0.17.0
This release brings a fresh look, smoother navigation, and several improvements across M3U, Xtream/Stalker, and the general UI. Plus, a major internal restructuring that sets the stage for faster development in the future.
iptvnator-v17
What's Changed
M3U Improvements
Display of the current EPG program directly inside the channel list
Updated look & feel for the EPG sidebar
Completely reworked UI for multi-EPG view
Visual refinements to the remote control mode
Ability to switch channels by typing the channel number on your keyboard
Xtream Codes / Stalker Portal
Unique look & feel for Stalker (STB) and Xtream Codes (XC) interfaces
More compact sidebar more space for channels and categories
Added option to refresh the Xtream playlist
General Updates
New empty start page with a redesigned header
Auto-refresh status indicator in playlist overview
New option to reuse a single MPV instance when switching channels (faster zapping & less resource usage)
Under the Hood
A lot changed behind the scenes to make future development easier and more stable:
Fully restructured repository into a monorepo, which is an important foundation for upcoming features
Updated dependencies across the project
Improved i18n and translation structure
Note: PWA and Docker images will follow shortly in separate builds.
v0.16.0
Xtream: New layout and EPG View
Xtream: Support youtube trailers
PWA: Updates in mobile layout
Stalker Portal: Category and search fix
Stalker & Xtream: Check playlist details from portal view
Stalker & Xtream: Show IMDB rating information on overview page
Stalker & Xtream: show stream URL in built-in video-player dialog
Language: Update Italian language by @bovirus and @Deltwin
Language: Add Turkish language support by @hasanbeder
Style: Material 3 update by @4gray
v0.15.1
Fixes and improvements
Fixed memory consumption issues, especially with larger playlists
Fixed an error with the default path to mpv/vlc if they were in the $PATH (macOS related)
Enhanced error display in stalker/xtream portal
Added playlist filter on the startup screen
Fixed issue displaying notification about EPG download even when no resources were specified
Improvements in translations
Dependency library updates
v0.15.0
Hey, it's time to say hello to v0.15
Here are the biggest changes:
added support for STB EMU / Stalker Portal
support for audio-only aka radio channels
VLC is supported now
search playlists in the overview by title
docker images for self-hosted deployment were updated
v0.14.0
What is new
The main feature of this release is Xtream Code IPTV support. The feature is also available in PWA, but works best in electron version of the app and combination with mpv player.
Changes:
Xtream Code IPTV support #53 #72 #125
possibility to specify custom path for mpv player #248
fixed an annoying bug that appeared when reopening mpv player #248
fixed bug related to user-agent handling #253
updated libraries used under the hood
v0.13.0
mpv player integration
This release contains one of the long awaited features (#214, #63, #90) - stream playback in a third-party mpv player.
Using this player will allow you to watch those playlists which for various reasons cannot be played within the browser/electron.
I would say it's currently in experimental mode and I'd be interested to get your feedback on whether this player should be more deeply integrated. For example, using mpv I could easily implement video recording.
You can activate the mpv player in the settings page. To use it, you need to have it installed on your system (read more).
0.12.0 (2023-03-19)
iptvnator-v0-12
First of all I want to say a huge thank you to everyone who took part in this release, those who tested the application and reported bugs, shared ideas, who put a star or shared a link and of course those who contributed.
In v0.12.0, a lot of seemingly "invisible work" aka refactoring has been done to unify the code that is used in the desktop version of the app and in the PWA. Sooner or later it was necessary to do this in order to develop the application further, for example the switch from NeDB to IndexedDB, state management update etc.
So unfortunately this version doesn't have some changes which I planned after previous release, such as all feature requests/issues related to EPG, but I will try to pay attention to them in next versions.
Important change
The storage location of playlists has been changed, now everything is stored in IndexedDB. So after the update you will see a panel offering to migrate playlists.
Features
add dockerfile and docker-compose for self-hosted deployment (4b97e3d)
add italian language, thanks to @bovirus (3e3f18c)
draggable channels in favorites list (ba41c8d)
export playlist as m3u (7e4d6b1)
persist window size (2ce60e0), closes #205
pwa: load a m3u playlist as a URL parameter #176 (344bd75)
import/export/remove all playlists from settings page
add cmd+q hotkey to close the app (macOS) (f3e00e7), closes #181
Bug Fixes
macos related window management improvements (b336680)
set epgSource as not required field (049ed6b), closes #175
Refactoring
switch to ngrx for state management
dependency update
migration from NeDB to IndexedDB
improved routing in PWA app
v0.11.1
This update includes a bug fix for red background in picture-in-picture mode, see #167.
Other changes:
the file:// protocol for local files can again be used in the EPG source field
ngx-uploader library has been replaced by the own implementation
v0.11.0
Hey
after a long period of time, I am happy to present a new release of the application, which includes the following changes:
iptvnator-v0_11_0
Multiple EPG sources
In the new version of the application, you can add more than one URL as a source of the EPG program.
Import playlist from plain text
Another playlist import option became available - import m3u(8) as text. Just copy the playlist to the clipboard and paste it into the application without having to save it to disk.
Multi-EPG view
The first version of multi-EPG view was developed, which is familiar to many users from set-top boxes. At this stage the view works in purely informative mode.
This&That
Improvements in PWA: A number of visual changes have been made to improve the experience of using the app on mobile devices.
Internalization: The localization of the project has been improved, but help is still needed with the translation into different languages.
The underlying libraries on which the app is built have been updated (angular, electron etc.)
What's Changed
Feature: Support multiple EPG sources by @4gray in #149
build(deps): bump moment from 2.29.2 to 2.29.4 by @dependabot in #150
build(deps-dev): bump electron from 16.2.2 to 16.2.6 by @dependabot in #147
build(deps-dev): bump semantic-release from 19.0.2 to 19.0.3 by @dependabot in #145
Update fr.json by @Unelio in #151
New Contributors
@Unelio made their first contribution in #151
0.10.0 (2022-04-24)
Bug Fixes
capitalize app name #117 (36d3eaa)
epg function to compare channel ids (c7de39e)
Features
add context menu with default actions (44e76e0), closes #96
add option to change aspect ratio (b8a3f76), closes #80
add option to select stream resolution (c23fe3a), closes #93
add pwa support (5a5085d)
auto-detect if OS is in dark mode (ad26588)
generate global playlist with all favorites (764201a), closes #97
integrate french localization (ab75a2f)
pwa: auto-generate playlist with global favorites (98ff7f4)
switch playlists from the sidebar (0bc71d4)
0.9.0 (2021-10-14)
Bug Fixes
search feature should not affect favorites list (ef52f77), closes #71
Features
add chinese translation (a497f05)
global subtitle display setting (4d2e175)
rearrange the display order of playlists (757c739), closes #77
0.8.0 (2021-07-17)
Features
add info popup with epg info for active channel (0eecfd1), closes #51
add support of specific user-agent and referer on channel level (a55f741), closes #57
0.7.0 (2021-05-24)
Bug Fixes
promise issue after channel switch #29 (d1f194a)
Features
auto-refresh playlists on app startup (e8ab576)
refresh playlist from file system or imported url (57cf247)
support of timeshift and catchup attributes in playlists (ced16a8)
0.6.0 (2021-04-10)
Bug Fixes
quit application via window close icon (24d5584), closes #33
Features
add "what is new" dialog (cc375a4)
add dark theme (0cf010a)
add dialog with detailed epg description (96e93c5)
set custom user agent for a playlist (a8167c4), closes #26
show channel logos in the list (41998ff), closes #28
0.5.0 (2021-02-28)
Bug Fixes
less strict url validation of playlist URL (4f366d9), closes #22
macOS corrupt icon fix, closes #21 (955bb27)
Features
add dialog about playlist details (9f951fa)
add german language (i18n) (7888e85)
add internationalization (0f8ca2a)
add russian language (i18n) (a93af69)
0.4.0 (2021-02-11)
Bug Fixes
default html5 player initialization fix (4a6b976)
Features
add ctrl+f as hotkey to focus search field (cad162d)
add epg worker with new ipc commands (418566f)
add moment.js based date pipe (4881ba8)
check for available update (68ccabb)
epg integration (2e861b6)
epg: epg program list with date navigation (fdbe02b)
favorite channels list (f02bbe3)
integrate epg feature (e896af0)
integrate epg worker & refactor app menu (3b97d74)
sort playlists by import date (d967b12)
validation of playlist url (da2fe5e)
Performance Improvements
destroy hls instance after view change (2e3681c)
0.2.0 (2020-09-27)
Features
add new video.js based player (1e852e3)
add settings page (1a44ecd)
video player configuration in app settings (05c0c25)
0.1.0 (2020-09-12)
Bug Fixes
playlist upload for mac os #6 (78ca56f)
Features
add new application icon (0ce0b1f)
open playlist from file system (861e480)
0.0.2 (2020-09-06)
Bug Fixes
define path to userData folder as db store (8e8c107)
enable copy-paste hotkeys for mac os (4357c17)
0.0.1 (2020-09-05)
Bug Fixes
full screen permissions (fff2aaa)
full screen permissions (f0d0fb1)
start_url fix in manifest file (e05b7eb)
start_url fix in manifest file (3929655)
update paths to make app installable (fd9fc53)
update paths to make app installable (4b7d1b5)
Features
add channel search function (d1b9461)
add channel search function (7a039af)
add favorites and tab based navigation (8d333d9)
add favorites and tab based navigation (c6e3e1f)
add icon, about dialog and menu (bcf49b8)
change sidebar mode (22f2bc1)
change sidebar mode (ca9f7a2)
electron based app (0feb657)
electron based app (998e7e9)
implement channel groups view (20e0a40)
implement channel groups view (773e1ed)
initial commit (79332aa)
initial commit (2f1701a)
list with recent playlists (1735026)
list with recent playlists (8ee96ee)