LiveSince 2026

Linux · Windows · macOS · Android

Product, architecture, desktop and Android

JoTV

An IPTV player for desktop and Android that stays fast on catalogs of tens of thousands of channels, and protects the user's account from provider blocks.

  • Cold start to Home, 68k-item catalog (was 1.7 s)

  • Janky frames scrolling 12k channels (was 27%)

  • Automated tests, Rust and Kotlin

  • Platforms from two codebases

JoTV Mobile live TV with the program guide

01/Problem

IPTV playlists are huge and messy: tens of thousands of channels, movies and series, names in mixed Arabic spellings, and servers that answer slowly or not at all.

Most players freeze while loading, and worse, they keep retrying a server that already rate-limited the account, which turns a short pause into a long ban.

02/Constraints

  • 01One product on Linux, Windows, macOS and Android phones and tablets.
  • 02Usable within a second, even with a provider-sized catalog.
  • 03Never put the user's IPTV account at risk.
  • 04Arabic and English, right to left, dark and light.

03/Architecture

Apps

  • Desktop · Svelte 5
  • Android · Jetpack Compose

Playback

  • MPV
  • Media3 / ExoPlayer
  • picture-in-picture

Core

  • Xtream + M3U parsers
  • provider guard
  • program guide
  • search

Storage

  • SQLite (Rust)
  • Room (Kotlin)
  • image cache
Two native codebases, one policy. The desktop core is Rust under Tauri v2; the Android app is Kotlin. Parsers, the provider guard and the guide schedule follow the same rules on both.

04/Decisions

  1. A circuit breaker for the provider, not blind retries

    Panels answer a lock or rate limit with odd codes (461, 469, 429) and extend the block when hit again. After such an answer the app holds that host back for 10, 20, 40, 80, 160, then 240 minutes. One good answer resets it; Try again lifts the pause but keeps the escalation.

    Trade-off: Sometimes the user waits when the server has already recovered. Losing the account is worse.

  2. Start fast by doing less at start

    HTTP clients are created lazily, the database opens while the activity starts, the hero shows from the local catalog and upgrades when artwork arrives, and Home queries got their own indexes. Cold start went from 1.7 s to 0.75 s on a 68k-item catalog.

    Trade-off: Measured on an emulator against a provider-sized fake catalog, so the numbers are relative, not a phone benchmark.

  3. Search that knows Arabic spelling

    Channel names mix أ/ا/إ, ة/ه and ى/ي. Search normalizes both sides, so typing a name the way you say it finds the channel the way the provider wrote it.

05/Screens

Live TV: 12,000 channels with now and next
Live TV: 12,000 channels with now and next

06/Stack

RustTauri v2Svelte 5MPVSQLiteKotlinJetpack ComposeMedia3RoomHiltCoil

Next systemHiraa
Mohammed Yousef Ali | Systems Architect for real businesses