Version: 2.3.0: Reverse Proxy Servers, EPG Fixes & Faster Import Movies
Xtream AI 2.3.0 introduces a new class of server in your cluster, the reverse proxy, so the real IPs of your main and load balancers never travel out to the internet. This release also lands a batch of EPG fixes, removes the hourly Nginx restart that some panels experienced with SSL enabled, brings backups down from hours to minutes, and delivers a large speed-up on the Import Movies flow.
New Features
- 🛡️ Reverse Proxy Servers (Hide Your Cluster Behind One or More Proxies): A brand-new server role, proxy, installs like a load balancer but never hosts content: it sits in front of the cluster and takes every client connection in its place, so the addresses of your main and your load balancers are never exposed. You decide how far the hiding goes from a single selector in Settings → Reverse Proxy:
- Off: proxies stay trusted but are not used for routing. Playlists and streams still carry your real IPs, exactly like a setup with no proxy at all. Perfect for a staged rollout.
- Main only: the proxy takes over the main server's public address. Load balancers keep serving under their own IPs. Ideal when the priority is to keep the panel and API off the map.
- Full: panel, API, playlists, live streams, VOD and widgets all enter through a proxy. The load balancers still do the work, but the client never learns their addresses. The "hidden cluster" mode.
- Balancing — DNS (default): each client enters through the proxy that its DNS lookup resolves to and every stream stays on that proxy. Spread the load by publishing several A records for your domain, or by using the DNS list on the main with one entry per proxy domain. Simple and cache-friendly.
- Balancing — Load: whenever a stream is opened on a load balancer, the main picks the proxy with the lowest outgoing traffic at that moment, honoring each proxy's GeoIP rules. Spreads load more evenly across proxies without touching DNS.
- Strict origins: a single switch that actually enforces the hidden-cluster promise. With Strict on, the real servers silently drop any streaming-port connection that does not come from a proxy, from another server of your cluster, or from Xtream AI. Anyone with an old IP gets a timeout. If every proxy stops reporting for 5 minutes, Strict lifts itself on its own, so an outage on the proxy layer never takes your service down.
Improvements
- 🧱 Reworked Code Protection Layer (Fewer Bugs, Faster Backups): The layer that protects the engine's compiled code has been redesigned from the ground up. In the previous generation, that layer was directly responsible for three long-standing pain points that had nothing to do with your setup or your servers: Nginx restarted itself every hour on any panel with SSL enabled on its domain (a workaround we had to keep in place for years), the EPG pipeline was unable to complete every task it was supposed to run, and full panel backups could take hours to finish. The new layer keeps the same protection guarantees while removing all three symptoms in a single stroke.
- No more hourly Nginx restart on SSL panels. Nginx stays up for as long as the OS keeps it up, streams no longer take the tiny hiccup at the top of each hour, and long-lived HLS players stop losing their segment window on the restart boundary.
- EPG runs to completion. Jobs that used to abort silently now finish their pass, so guides are consistently in place and the "now playing" card in the panel matches what viewers actually see.
- Backups finish in a fraction of the time. Panels where a full backup used to run for hours now complete in minutes, both for scheduled runs and for the on-demand button.
- 📥 Import Movies, Rebuilt for Very Large Catalogs (100k+ Titles in Minutes, Clean New UI): The Import Movies flow has been reworked end-to-end. What used to be an all-or-nothing form that could choke your browser on a big provider list is now a workspace built to move through six-figure catalogs comfortably.
- Handles 100k+ titles in minutes, without freezing your browser: the results list is virtualized (only the rows visible on screen are painted) and the initial build runs in chunks that yield to the event loop between batches. Scrolling, typing in the search box and toggling filters stay smooth even on a 100.000-title playlist. The enrichment pass keeps running in the background while you already search, filter and pick titles, so you are never waiting on a loading spinner to start working.
- New facet rail with the filters that actually matter: a dedicated left column lets you narrow the list down instantly by In your catalog (Not owned / Owned / All, defaulting to what's missing from your library), Year, Rating (≥ 6 / ≥ 7 / ≥ 8 / ≥ 9), Image quality (SD / HD / Full HD / 4K, taken from the source file), plus Language, Category, TMDB match and a Data quality switch that surfaces only the entries with a missing poster or a suspicious title. Every filter combines with the others, and the visible counts update live as the catalog is enriched.
- "Already imported" now actually works: the analyze step correctly recognizes titles you already have in your catalog by TMDB id, source URL and normalized title. Before, every title was shown as "Not owned" and there was no way to see at a glance what would be duplicated. The default Not owned facet is now trustworthy, so by default only the movies that are truly new to your catalog show up ready to import.
- Filter presets: save your current combination of filters as a preset and reapply it in one click. Useful when you have a recurring workflow (for example "Only 4K movies from 2023 onward with rating ≥ 7 and no poster") that you run against every new provider you plug in.
- Large imports finish cleanly: importing thousands of movies in a single run no longer gets cut short with a misleading Import failed message halfway through. The screen now shows you the actual result of the run, movie by movie, from start to finish.
- Analyze is faster on repeat runs: a shared TMDB memoization layer means that a second analyze on the same or a similar provider list skips the round-trips that were already answered, so re-analyzing a very large playlist finishes noticeably quicker.
- Consistent language between Analyze and Import: the language you pick for Analyze now carries over to the Import step, so descriptions, titles and translations arrive in the same language you were previewing.