A fast, native desktop app for validating IPTV playlists.
Built with Tauri v2 — runs on macOS, Windows, and Linux.
Open M3U files from disk or URL, connect to Xtream Codes or Stalker portal accounts, or batch-load an entire folder of playlists.
Scans every channel and tells you what's alive, dead, geoblocked, DRM-protected, or audio-only. Uses ffmpeg to capture stream thumbnails and detect codec, resolution, FPS, and bitrate. Flags label mismatches and duplicates automatically.
Results stream in live with an ETA and throughput counter. When the scan finishes, a health report panel slides in with per-group scoring. Pause and resume at any time, or compare results across scan history.
Supports HTTP/HLS, RTSP, and RTMP streams. Route checks through a proxy if needed.
Click any channel to see its thumbnail, or open the lightbox to browse screenshots with arrow keys. Filter by group, status, or regex search. Double-click a channel to play it in VLC, IINA, or whatever you have installed.
Export results as CSV, M3U (alive only, split by group, or renamed), or a full JSON scan log. Export everything, just alive channels, or your current selection.
Liquid Glass vibrancy on macOS, native menus on every platform, keyboard shortcuts, dark/light/system theme, and desktop notifications when scans finish. Handles playlists with thousands of channels without breaking a sweat.
- Rust (latest stable)
- Bun (JavaScript runtime and package manager)
- ffmpeg + ffprobe — optional but recommended for thumbnails and codec detection
# Clone the repo
git clone https://github.com/kristofferR/IPTVChecker.git
cd IPTVChecker
# Install frontend dependencies
bun install
# (Optional) Download ffmpeg/ffprobe binaries for your platform
bun run setup:ffmpeg
# Run in development mode
bun tauri dev# Production build (creates platform-specific installer)
bun tauri buildDeterministic local scan/check throughput benchmark (mock local HTTP stream server):
# Runs Rust backend benchmark binary
bun run perf:backend-scan -- --channels 2000 --concurrency 16 --timeout-secs 2.0 --payload-kb 600Outputs JSON with:
time_to_first_result_msthroughput_channels_per_sectotal_elapsed_ms- status buckets (
alive,drm,dead,geoblocked,errors)
src/ Frontend (React + TypeScript)
├── components/ UI components (Toolbar, ChannelTable, FilterBar, etc.)
├── hooks/ React hooks (useScan, useSettings, useScreenshot)
└── lib/ Types, Tauri IPC wrappers, formatting, sort/filter logic
src-tauri/src/ Backend (Rust)
├── engine/ Core logic: parser, checker, ffmpeg, proxy, resume, disk
├── commands/ Tauri IPC commands: playlist, scan, export, settings
├── models/ Data types: Channel, ChannelResult, AppSettings, etc.
├── state.rs App state management
└── error.rs Error types
| Layer | Technology |
|---|---|
| Framework | Tauri v2 |
| Backend | Rust (tokio, reqwest, serde) |
| Frontend | React 19, TypeScript, Vite 7 |
| Styling | Tailwind CSS v4 |
| Table | @tanstack/react-virtual |
| Icons | lucide-react |