Live TV, VOD & recordings — all in one
This project is under active development. Expect bugs, incomplete features, and rough edges. I'm still fully testing, and there are a lot of outstanding actions — use at your own risk.
I created this app because I was a bit disappointed in the IPTV clients on Linux, SteamOS, and Android TV. Despite there being some good clients available, there are always some kind of issues with them, or you need to pay for basic functionality. On the other hand, managing a large number of channels was also problematic. Hence my attempt to create something better. Of course, at the end it's worse, but I tried :) This has been made with a lot of open source software, e.g: QT, mpv, ffmpeg, etc. All credits to all those projects.
Author: Schelstraete Bart | www.schelstraete.org
- Xtream Codes API and M3U playlist support
- High-quality playback via libmpv with hardware-accelerated decoding
- Channel categories with search and filtering
- Channel Groups — create custom playlists, add channels via built-in search picker
- Recently Added filter — highlights channels added in the last 7 days
- Horizontal poster rows with category browsing
- Series support with season/episode picker
- Audio track selection for multi-language VOD content
- Picture-in-Picture (PIP) — draggable floating mini-player for live TV when navigating away
- Chromecast casting — cast live TV and VOD to any Chromecast device on the network
- Automatic device discovery via mDNS
- Local HLS proxy (ffmpeg remux, no transcoding overhead)
- Auto-next episode for series, resume local playback on stop
- Enable/disable in Settings
- Favourites-first sorting — favourite channels always appear at the top
- XMLTV parser with automatic EPG updates (configurable interval, default 6h)
- Full TV Guide grid with programme details popup
- Record from EPG — one-click recording with confirmation dialog
- EPG recording padding — configurable start-early / end-late (0–5 minutes)
- Now/Next programme display in the player for live TV
- Channel search within the guide
- Live and scheduled recording via FFmpeg
- In-player stream recording — record directly from the video player
- Record from EPG with programme title capture
- Schedule recordings with custom start time (day, hour, minute picker)
- EPG padding — start recording early, end late (configurable in Settings)
- Recordings saved to
~/Videos/iptvXS/(configurable) - Storage quota (default 2 GB) with visual usage bar
- Delete recording
- Google Drive upload with resumable chunked uploads and cross-session resume
- Retry failed uploads directly from the Recordings view
- Auto-delete local files after successful Google Drive upload
- Automatic subtitle search via OpenSubtitles
- Built-in subtitle track picker for embedded subtitles
- Configurable subtitle language (primary + secondary), size, text color, and background
- Subtitle timing adjustment in the player
- GPU-accelerated video processing presets (Off / Light / Medium / Strong)
- Debanding to remove color banding artifacts
- High-quality scaling via ewa_lanczossharp with sigmoid upscaling
- Denoising via hqdn3d filter for cleaner picture
- Hardware decoding modes (Auto Safe / Auto / Software)
- Deinterlace toggle for interlaced content
- 7 built-in themes: Midnight, Ocean, Forest, Sunset, Nord, Light, High Contrast
- High Contrast theme with
textOnAccenttoken for maximum readability - Consistent accent-aware text across all buttons, badges, and dropdowns
- Theme persists across sessions
- Automatic tracking of watched channels, movies, and series
- Browse history sorted by most recent, grouped by type
- Remove individual entries or clear all history
- One-click replay from history
- D-pad/controller navigation throughout the entire UI
- External controller support — USB and Bluetooth gamepads via SDL2 HIDAPI
- D-pad debounce (120ms) prevents cursor double-jumping
- GameScope Google Drive auth — Steam overlay browser integration with hint dialog
- Optimized for Steam Deck's display and input
- Screensaver inhibition during video playback
- Available as a Flatpak for easy installation
- Works in both Desktop Mode and Game Mode
- Version check — automatic check for updates
- Database statistics — server, channel, movie, series, recording counts
- Logo cache management — auto-prune (30 days), configurable max size (100 MB – 2 GB), clear button
- Database reset with full reconnection of all repositories
- Auto-sync channels and EPG (configurable interval, default 6 hours)
- Configurable stream buffer time
- Close-to-tray option
- Application log with auto-refresh, level filtering, and search
- Database maintenance — automatic daily cleanup of old EPG data, orphaned entries, and disabled server channels with manual trigger in Settings
Coming soon
# Download from GitHub Releases
wget https://github.com/bschelst/iptvXS/releases/latest/download/iptvxs.flatpak
# Install
flatpak install --user iptvxs.flatpak# Download from GitHub Releases
wget https://github.com/bschelst/iptvXS/releases/latest/download/iptvXS-x86_64.AppImage
# Make executable and run
chmod +x iptvXS-x86_64.AppImage
./iptvXS-x86_64.AppImageDownload iptvXS-windows-x64.zip or iptvXS-setup-x64.exe from GitHub Releases.
- Qt 6.5+ (Core, Quick, QuickControls2, Sql, Network, Concurrent, OpenGL, Widgets, DBus)
- Qt5Compat.GraphicalEffects (for rounded corner clipping)
- libmpv
- FFmpeg
- SDL2 (Linux only, for controller support)
- CMake 3.22+
- C++20 compiler
git clone https://github.com/bschelst/iptvXS.git
cd iptvXS
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel $(nproc)./build/app/iptvXS- Install the Flatpak in Desktop Mode
- Add iptvXS as a non-Steam game in Steam
- Configure Steam Input (recommended layout):
| Controller | Action |
|---|---|
| D-pad | Navigate lists and grids |
| A button | Select / Play |
| B button | Go back |
| L1 / R1 | Previous / Next section |
| Left stick | Scroll |
- Go to Servers in the sidebar
- Click Add Server
- Enter your Xtream Codes credentials (server URL, username, password) or M3U playlist URL
- Optionally add an EPG URL (XMLTV format)
- Sync the server to fetch channels, VOD, and series
| Key | Action |
|---|---|
| Space | Play / Pause |
| F / F11 | Toggle fullscreen |
| Escape | Exit player / Exit fullscreen |
| Left / Right | Seek ±10 seconds |
| Up / Down | Volume up / down |
| M | Mute / Unmute |
| PgUp / PgDown | Previous / Next sidebar section |
iptvXS/
├── app/ # Qt/QML application
│ ├── qml/ # QML UI files
│ │ ├── views/ # Main views (Channels, VOD, Player, EPG, etc.)
│ │ ├── components/ # Reusable components (Sidebar, TopBar, Dialogs)
│ │ └── themes/ # Theme definitions (7 themes)
│ ├── viewmodels/ # C++ ViewModels (MVVM pattern)
│ └── controller_input_bridge.* # SDL2 gamepad input (Linux/Steam Deck)
├── core/ # Core library (no UI dependency)
│ ├── api/ # Xtream Codes & OpenSubtitles clients
│ ├── cache/ # Logo cache manager with auto-prune
│ ├── cast/ # Chromecast: mDNS discovery, Cast V2 protocol, HLS proxy
│ ├── db/ # SQLite repositories (14 tables, migrations, maintenance)
│ ├── gdrive/ # Google Drive OAuth & resumable upload
│ ├── models/ # Data models
│ ├── net/ # HTTP client & speed test runner
│ ├── parser/ # M3U & XMLTV parsers
│ ├── player/ # libmpv wrapper
│ └── recording/ # FFmpeg recording manager
├── tests/ # Unit tests (GoogleTest)
├── packaging/
│ ├── flatpak/ # Flatpak manifest
│ ├── linux/ # AppStream metainfo, desktop file, AppImage
│ └── windows/ # Inno Setup installer
└── .github/workflows/ # CI: Flatpak + AppImage + Windows builds
Schelstraete Bart — www.schelstraete.org — GitHub
Contributions are welcome! Please open an issue or submit a pull request.
