All ten
SarmaPlayer logo

SarmaPlayer

Managed IPTV platform

Product, architecture, all clients, infrastructure and operations

Live, paid

A managed player for IPTV subscribers, built as a platform rather than an app: native TV and mobile clients, a zero-install web player, an owner dashboard and a staff operator console. Playlists are ingested and normalised server-side, devices carry cryptographic identities, and entitlements verify offline so a flaky line never locks a paying viewer out of their screen.

Android TVFire TVAndroidiOSWebOperator console
6client surfaces
4interface languages
~700test cases
4.8 MBTV app footprint

Screens

Key engineering

cryptographic device identityoffline licence verificationadaptive playbackprogramme-guide normalisationmulti-service release automationapp size budgetingcross-platform player behaviour

Under the hood

Architecture

One API behind many clients. Ingest and normalisation happen server-side, so every surface consumes the same shaped data instead of each client re-deriving it, and slow background work is kept off the request path.

Data & state

A relational core for accounts, entitlements and the channel map, with a cache in front of the read-heavy paths. Device identity and entitlement state are also held on the device, so playback does not depend on the server being reachable.

Runs on

Containerised services with backups to object storage. Five client surfaces and the API ship together through a purpose-built release CLI, gated by the test suite — the coordination is as much of the work as the code.

Operational risk

Upstream sources are the unreliable part, so their work is queued, retried and reconciled: a bad source degrades the programme guide rather than the playback. Offline verification means a server problem never locks out someone who has paid.

Stack

TV & mobile
KotlinJetpack Compose TVMedia3 / ExoPlayerSwiftSwiftUIAVPlayerVLCKitRoomDataStore
Web
ReactViteTailwindhls.jsmpegts.jsi18next
Backend
Node 24Hono 4DrizzleZodBetter AuthBullMQffmpegundici
Data
PostgreSQL 16Redis 7R2 backups
Infra
Cloudflare PagesR2DockerGitHub Actionscustom release CLI

What it took

  • Licensing has to survive a bad connection. Devices carry a cryptographic identity and entitlements verify on the device itself, so a viewer who has paid keeps watching when the line wobbles mid-stream.
  • Playback is four different problems. A TV remote, a phone, a browser and a set-top box each need their own player behaviour, codec handling and recovery strategy, unified behind one account and one library.
  • Programme guides never agree. Several sources are reconciled into one channel map with fuzzy matching, because no two providers name the same channel the same way.
  • Five services, one release. TV, mobile, web, dashboard and API ship together through a purpose-built CLI, with roughly 700 tests gating the pipeline — a coordination problem as real as any feature.