Local IPTV client for desktop. No cloud, no server, everything runs on your machine.
- M3U import — load channels from local files or remote URLs
- Xtream Codes import — connect to Xtream Codes API servers
- XMLTV EPG import — load electronic program guide data
- Channel browsing — list, search, filter by group
- Favorites — star channels for quick access
- Recent history — track recently watched channels
- Local playback — HLS / MPEG-TS stream playback via built-in proxy
- Settings — local key-value preferences
| Layer | Technology |
|---|---|
| Desktop framework | Tauri 2 |
| Frontend | React 18 + TypeScript + Vite |
| Backend | Rust (integrated in src-tauri) |
| Database | SQLite via rusqlite |
| XML parsing | quick-xml |
| HTTP | reqwest |
| Stream proxy | warp |
| Video playback | hls.js + mpegts.js |
apps/
desktop/ # Tauri 2 desktop app
src/ # React frontend
src-tauri/ # Rust backend
src/
commands/ # Tauri command handlers (API boundary)
core/ # Business logic, parsers, models
platform/ # DB, filesystem, HTTP, stream proxy
migrations/ # SQLite migration scripts
- Rust (stable)
- Node.js ≥ 18
- pnpm ≥ 8
- Platform dependencies for Tauri: see Tauri prerequisites
cd apps/desktop
pnpm install
pnpm tauri devOr from repository root:
make install
make devcd apps/desktop
pnpm tauri buildOr from repository root:
make buildcd apps/desktop/src-tauri
cargo testOr from repository root:
make rust-testmake version-checkchecks version consistency across:apps/desktop/package.jsonapps/desktop/src-tauri/Cargo.tomlapps/desktop/src-tauri/tauri.conf.json
make version-sync VERSION=x.y.zupdates these three files together.- Tag push (
v*.*.*) triggers GitHub Action release build and publishes artifacts to GitHub Release. workflow_dispatchonDesktop Release Buildcan build manual test versions (optionally as prerelease).workflow_dispatchonVersion Check and Updatecan sync version files and auto-commit updates.- App settings page includes built-in update check, which compares current app version with latest GitHub Release and provides download link.
Frontend (React)
│ invoke()
▼
commands/ ← Tauri boundary: DTOs, validation
│
▼
core/ ← Business logic
├── parsers/ ← M3U, Xtream, XMLTV parsing
├── models/ ← Domain types
└── services/ ← Orchestration
│
▼
platform/ ← Infrastructure
├── db/ ← SQLite connection, migrations, repositories
├── http/ ← Remote content fetching
├── fs/ ← File system paths
└── proxy/ ← Local HTTP proxy for CORS-free streaming
All Tauri commands return Result<T, AppError>. Errors are serialized as { kind, message } to the frontend.
Recording, timeshift, catch-up, multi-view, DRM, VOD/Series, user accounts, cloud sync.
MIT